Day 1
Mix.install([
{:smaoc, git: "https://github.com/nettinho/smaoc"}
])
Section
solution_module = Smaoc.Solution
solution_module = Smaoc.Solution.Day1
defmodule solution_module do
defp parse_input(input) do
String.split(input, "\n", trim: true)
end
def solve(:part1, input) do
parse_input(input)
|> Enum.map(&String.split/1)
|> Enum.map(fn [l, r] -> {String.to_integer(l), String.to_integer(r)} end)
|> Enum.unzip()
|> then(fn {left, right} ->
Enum.zip(Enum.sort(left), Enum.sort(right))
end)
|> Enum.map(fn {l, r} -> abs(l - r) end)
|> Enum.sum()
end
def solve(:part2, input) do
parse_input(input)
|> Enum.map(&String.split/1)
|> Enum.map(fn [l, r] -> {String.to_integer(l), String.to_integer(r)} end)
|> Enum.unzip()
|> then(fn {left, right} ->
right_counts = Enum.frequencies(right)
# For each number in left list, multiply by its count in right list and sum
Enum.reduce(left, 0, fn num, acc ->
acc + num * Map.get(right_counts, num, 0)
end)
end)
end
end
year = "2024"
day = "1"
run_config = ["example", "puzzle", "part2"]
inputs = %{
"puzzle" =>
"40885 43247\n14780 86274\n35132 49508\n87895 32621\n66398 24390\n52630 25877\n45307 76591\n95628 97627\n72163 78355\n98522 95603\n57216 46881\n12008 48861\n38298 46535\n71855 82832\n92585 80435\n84001 97081\n78292 93078\n45636 33525\n76512 39046\n38323 22697\n83810 44855\n72603 28080\n24058 37268\n84303 57220\n59027 24106\n83282 84119\n61006 11658\n48062 35044\n32563 46719\n55138 30334\n10567 37567\n81222 61384\n13268 78355\n30412 81803\n74112 64130\n23816 43397\n10379 78355\n22512 21557\n21238 37493\n48732 74561\n71895 26129\n56261 18604\n17877 18949\n70389 94076\n80057 96329\n21557 18949\n12217 25877\n26078 55331\n77271 25331\n47793 96985\n12269 13064\n62657 84119\n96321 84119\n82752 89583\n81963 70388\n90356 21557\n12989 37248\n31629 14924\n84196 25877\n99279 89358\n83388 93359\n87044 17718\n63169 87744\n18604 74439\n36258 46049\n77508 84042\n40422 54372\n19555 18949\n91277 84290\n35969 94076\n15013 80200\n62843 25877\n24017 65701\n12515 64862\n30232 64130\n29869 21557\n82872 89105\n95672 80363\n24933 38916\n34243 89505\n68462 52549\n96776 57706\n53204 61533\n47848 29624\n64295 38621\n43397 81963\n33348 65619\n42797 79314\n46970 55790\n64130 36712\n78973 18682\n11811 89105\n70144 72795\n60439 99936\n33188 44855\n44794 63445\n64487 74453\n29210 56570\n85284 64877\n15941 54838\n12638 59602\n71556 43397\n37118 89105\n40251 92731\n96915 38715\n74031 77797\n82730 55500\n75744 46765\n68296 18604\n21074 65320\n42344 33525\n51236 29049\n35237 37858\n34979 31877\n67772 36971\n70033 11658\n92368 72885\n23124 19427\n30156 71641\n98873 91217\n88742 92389\n53071 21977\n42296 13098\n38666 73919\n57537 62354\n64018 92354\n67363 36755\n80697 38916\n26673 18949\n89179 89105\n54756 55505\n95654 54756\n89583 20247\n99104 78355\n79209 18604\n46486 87051\n72428 36242\n10807 52070\n89298 46971\n50792 28232\n20641 70188\n90989 94076\n77243 46765\n87396 20705\n37135 70494\n52276 87895\n22392 92389\n87930 51527\n74396 79256\n41186 56338\n85460 20553\n54443 72978\n96972 83495\n97212 95603\n45317 16267\n66712 18861\n49480 94076\n27742 60961\n52974 33525\n61612 71105\n66454 96813\n38784 38916\n23687 55494\n63118 78733\n72636 46049\n24692 91487\n54819 19994\n62251 21557\n45283 71423\n64825 38193\n84476 61929\n13775 47012\n81961 46807\n67639 57706\n94076 46330\n54505 94523\n29135 56680\n37829 64021\n55481 66745\n93407 99911\n27387 59602\n16316 46049\n52989 32947\n30300 90834\n96691 88496\n50902 87895\n83296 87895\n72410 35220\n51363 34458\n91717 10796\n64537 12657\n88755 11658\n45699 50898\n30771 82731\n63430 51105\n50823 21043\n82701 49653\n97163 46049\n48484 71098\n81052 84119\n23703 34678\n30764 15014\n29297 68139\n59207 60019\n66528 91452\n55532 54756\n25453 69548\n59653 25877\n90287 47410\n48075 26955\n78969 18604\n55265 76729\n86321 24731\n96233 97949\n31974 83219\n27966 94794\n80442 46568\n21740 92389\n98826 78355\n26698 82227\n76170 87054\n42337 21885\n81201 38916\n19761 15098\n84205 13064\n13613 23769\n88615 45110\n13523 64130\n38319 83138\n23343 75063\n63668 80130\n28390 39710\n75452 95254\n64133 11658\n32729 59602\n27597 43397\n14645 61228\n53895 83392\n60500 25974\n32543 84119\n92447 45477\n49617 85739\n75583 80029\n56258 27759\n99839 40669\n72815 78733\n38916 36352\n51214 18604\n47885 98104\n32642 94800\n73000 59347\n16754 83263\n90536 48052\n79852 84119\n13650 33525\n55116 59736\n90651 29522\n66518 18949\n34334 33835\n27778 94076\n78355 89436\n91829 43098\n64666 25877\n76956 92389\n96508 56920\n65975 69579\n10219 77527\n68098 18604\n64683 56823\n39480 45980\n67400 49455\n25362 77706\n59884 83985\n89331 32583\n17464 92389\n46765 79772\n80429 70686\n75020 33562\n17587 86747\n22495 53411\n39536 92389\n71776 36731\n45502 51921\n63998 36899\n89415 59602\n69064 25877\n41093 30360\n48759 58701\n54045 40775\n50518 21557\n95603 31315\n67892 92389\n86428 63327\n85370 50557\n41708 38916\n92731 62284\n10822 36755\n78716 46049\n51330 27663\n17767 20695\n64635 34897\n24939 54756\n19247 49834\n48407 21557\n58280 10118\n22150 38916\n94724 98669\n41156 52398\n12933 13064\n14798 94877\n96578 75715\n16390 33406\n83613 17013\n26427 92731\n86261 57616\n55500 95467\n22438 78668\n28148 57578\n74628 89298\n69431 36154\n84934 57706\n78222 88948\n40203 44855\n95824 81963\n87612 37822\n86008 14536\n34950 13064\n79865 28147\n17977 45817\n41655 11658\n80291 99017\n18341 49398\n20326 21330\n88558 84119\n77515 92389\n53170 16659\n65402 40633\n86348 92731\n62880 33525\n43085 23662\n26255 84119\n68679 78355\n20680 89105\n41869 90570\n36755 87895\n88224 99558\n31011 70779\n48194 89571\n24295 81053\n33935 59602\n53641 16580\n65434 12017\n52986 92389\n50983 18949\n75500 42852\n66784 37272\n92828 31527\n35072 64837\n80004 30334\n59855 55500\n41236 29683\n33734 55674\n39326 79934\n89736 66991\n29674 36755\n13988 89105\n25452 36949\n25830 90250\n30749 97379\n55595 73711\n80015 78733\n46482 35803\n22441 70976\n83981 65606\n88886 41409\n80574 18142\n12249 13064\n50289 95603\n79419 54756\n15661 72521\n80673 84119\n69043 94076\n28503 21557\n64430 59602\n30967 11658\n97752 13064\n75830 37442\n77618 93363\n65582 30567\n85245 49428\n97479 94076\n25364 88853\n67585 33525\n98910 21883\n35979 89105\n52886 87287\n17863 78355\n22714 81064\n34811 59602\n38601 46049\n66998 65637\n31071 78733\n20567 46049\n40407 94076\n12892 11405\n31776 38172\n26514 39922\n39642 66587\n25678 34984\n19056 25293\n87532 64307\n64371 85073\n10968 67935\n65069 16722\n93669 55573\n60859 67382\n62237 18346\n61226 94909\n81848 38240\n82676 20061\n54249 87895\n87292 39960\n42644 92389\n16350 16618\n99118 21557\n51272 43033\n38402 98892\n85461 54756\n61362 96724\n24044 33525\n98345 37921\n67157 45435\n17552 44855\n81992 59236\n11264 13064\n72774 64292\n17886 11658\n20209 49320\n24857 44622\n99609 30334\n18885 67872\n80153 64130\n27830 46505\n37359 59634\n44934 44855\n14379 43397\n66228 26867\n20491 81979\n86485 84119\n58166 56484\n73309 32741\n10925 94076\n49366 54756\n98878 28287\n14322 57798\n47069 76103\n55454 91571\n45958 68493\n55575 11658\n16363 27741\n58187 40905\n23393 15695\n59560 94076\n89253 84932\n12730 46049\n95981 65450\n70509 23086\n98199 11658\n68591 95603\n35805 88443\n18949 92731\n88496 87718\n56554 38916\n88620 87391\n25248 23555\n19568 10760\n51184 21360\n58905 59602\n28442 33525\n39611 59602\n36193 47764\n78412 25877\n74747 63838\n22062 89105\n31290 87895\n66038 30334\n43742 71616\n51315 89583\n62161 94076\n66298 72033\n36504 56312\n89120 44193\n44855 36463\n40309 89105\n67018 84119\n17084 78355\n33056 43397\n94747 55560\n48638 89583\n58066 88496\n87610 37187\n29519 33525\n81807 52362\n82071 40364\n83446 37822\n81783 36755\n55551 13064\n42209 92731\n92668 87895\n39922 95544\n76542 13064\n10262 71080\n67785 93885\n11516 92389\n27577 44855\n54442 57706\n51045 84160\n59565 34872\n39633 42239\n46072 12710\n30120 46765\n59077 81963\n84068 87895\n60948 32043\n95681 13560\n72549 82551\n70229 21557\n36283 27626\n22094 92731\n59880 29771\n80666 82984\n37383 86982\n72308 89583\n33417 59602\n73406 18827\n63702 55500\n79774 88496\n97747 39685\n62678 50117\n78866 89105\n69149 96648\n29042 87895\n90227 88789\n87641 55500\n63192 55500\n30083 48350\n85297 38819\n84747 87895\n62515 18170\n66600 65778\n46177 37822\n58444 78355\n52094 37822\n53041 18604\n83139 37732\n75245 86956\n65199 81963\n67759 34172\n24523 46765\n75526 13064\n95112 57292\n16812 69210\n27150 54561\n27889 51717\n52492 55821\n32298 94076\n26294 59602\n88528 11658\n81091 89583\n87724 27555\n70541 21557\n57373 59602\n78806 84119\n74832 78733\n11140 97263\n62816 74748\n32877 29296\n10238 86451\n31062 73826\n51197 46049\n52200 49056\n41732 90778\n65795 13064\n90342 78355\n34815 76310\n26516 36763\n17103 90361\n40355 34228\n50437 69070\n84732 40165\n48130 78355\n93840 88496\n14080 11658\n84434 89298\n13007 29744\n43180 24165\n33073 33525\n10295 94076\n93767 23698\n71093 45135\n67993 54756\n49864 61081\n60508 46765\n34881 98619\n93568 30507\n98353 38149\n61161 92731\n31392 69457\n48181 52523\n46328 19551\n96120 49917\n37307 66109\n97434 18949\n18083 46765\n22829 30863\n54346 17712\n72465 43084\n85457 31308\n39615 57706\n88086 47808\n87853 78355\n65205 59304\n63806 98367\n16130 46049\n93811 76839\n11658 58781\n11059 13064\n30334 21557\n98075 75251\n38840 42057\n16869 43570\n48134 94076\n86863 33525\n57110 90741\n42166 11661\n68342 64879\n77189 49516\n63900 92731\n22149 25877\n89606 26251\n52446 78355\n27625 36637\n71459 91162\n19948 54756\n97897 81963\n85920 11679\n55822 51743\n99753 87895\n27995 30208\n13429 71381\n60106 16565\n53834 84119\n93853 37169\n53323 59480\n33029 92389\n80026 92731\n89105 37822\n11275 38916\n82101 88746\n48838 44974\n51083 77339\n87508 78733\n37822 54756\n87603 71023\n77306 79170\n83607 64349\n83628 76824\n12915 31734\n77700 18949\n17702 92664\n50702 21297\n45775 62545\n81452 37912\n94769 46049\n13620 16941\n94683 25877\n82623 92731\n80395 61300\n10653 38916\n56540 38167\n79668 89105\n38566 17462\n91843 87895\n78605 21767\n67485 91900\n47946 89583\n54429 22347\n63188 18604\n85345 43397\n38114 81963\n27218 46765\n72837 46049\n36077 60086\n88380 68655\n39742 29860\n17501 26973\n29661 54756\n51541 20932\n28729 94983\n26871 70376\n98273 15417\n82624 64992\n98186 80150\n27968 36679\n46837 35204\n25813 36755\n68485 11658\n14834 94076\n22454 76789\n37887 32688\n98524 51577\n84451 89105\n99009 38916\n38532 89298\n12678 18949\n25877 18949\n23896 23826\n12218 72862\n34248 79137\n51047 37761\n97852 42343\n16247 22628\n15050 44855\n13038 64072\n39868 66349\n40990 18604\n28143 27197\n11020 73243\n71945 29713\n22240 89105\n27820 92731\n29887 22203\n56300 87573\n49237 46049\n49919 57706\n11718 26784\n63374 25533\n60444 96604\n12093 15962\n18306 92731\n82153 95299\n19454 57706\n44998 92389\n45293 18949\n68856 30470\n11652 46833\n30844 70059\n43444 43397\n28164 57706\n87763 46049\n94693 41449\n89550 39922\n79299 30437\n43134 86312\n67305 73204\n27615 17932\n85654 49561\n79020 32416\n78421 77300\n70200 87895\n45245 31951\n64748 52679\n40947 36086\n19515 60372\n67789 18949\n87852 43899\n25001 84119\n40289 18604\n59127 18882\n33525 81963\n16309 35229\n78462 79899\n19556 90831\n61608 94076\n54207 36755\n55989 70595\n42913 67767\n67418 71203\n17039 75627\n40677 57706\n31180 78733\n62301 46064\n70449 21986\n15052 98462\n43937 89583\n79748 31183\n18003 27572\n87092 74102\n87409 25877\n26143 49593\n61212 44855\n43152 76536\n12649 82906\n63812 29471\n78144 75384\n59517 52147\n15233 38916\n73570 69462\n48245 46049\n15819 65861\n89028 87895\n92052 92731\n23310 84119\n62520 69403\n36709 39760\n36430 55500\n25597 32313\n71964 92206\n83244 18271\n36627 89298\n70665 38916\n49870 84119\n22588 63437\n68848 30220\n82588 39922\n63625 61633\n21187 48646\n29737 24993\n69239 11916\n11889 89298\n73088 84119\n78733 59383\n31265 88496\n88211 48581\n87455 42448\n11960 25087\n53972 58504\n16265 25841\n13251 56027\n73138 21076\n28359 59093\n33177 54756\n47196 57143\n80349 25682\n95415 11742\n15655 99423\n66525 76330\n83450 94076\n95823 96837\n43757 13064\n34705 40310\n90783 78355\n25428 28621\n46367 63456\n18089 38916\n76473 30769\n11910 36020\n43638 26539\n75625 38379\n62348 97177\n82387 48449\n44037 36755\n84511 39170\n75679 53432\n39351 67137\n66054 64647\n15588 98396\n65735 27809\n37902 69851\n77961 21699\n15735 18604\n77113 87895\n91902 92605\n57057 22257\n63906 95907\n82051 92731\n42181 38916\n16732 71090\n17701 51743\n25457 55500\n13393 54756\n96544 91431\n38792 38916\n94574 78355\n68775 98785\n93232 92389\n61662 54374\n54708 86765\n79658 84119\n49112 10069\n95167 25895\n76188 33198\n45398 84855\n57706 84119\n12662 81867\n69016 54756\n52910 69110\n12999 35674\n82487 11783\n60875 78355\n40312 74151\n52594 93840\n56685 41957\n96212 62251\n68811 59602\n23542 21557\n96807 71740\n64831 21557\n90696 39123\n38101 89105\n48154 93393\n13362 54756\n95198 25877\n96581 94076\n31691 86075\n28300 39152\n27811 48895\n67518 77140\n80733 18949\n90602 19561\n15775 77709\n23653 95732\n58159 37822\n74420 85001\n94548 50484\n42953 44855\n13547 95603\n84993 54756\n65944 54951\n99745 88496\n13181 18949\n59275 46765\n28719 70279\n59602 13064\n28875 13064\n97957 99852\n64524 78355\n57293 54756\n93579 96608\n10508 18949\n61695 46765\n51942 30334\n93397 25877\n92389 37401\n47272 52436\n87034 89105\n45142 33525\n75524 34213\n14318 46049\n33072 22919\n20324 68087\n93889 57763\n46049 43397\n47403 69469\n18848 46049\n32268 87797\n30141 82280\n28160 27404\n84119 17978\n13064 31603\n85278 92731\n18995 42077\n58994 91117\n40648 50594\n70979 48461\n32475 64802\n25216 71018\n20315 87895\n82394 46049\n44063 75255\n23454 70789\n59598 78733\n77905 43405\n53440 80075\n79083 94076\n57022 43326\n54297 32463\n10686 46049\n19336 98633\n23358 75943\n23651 54756\n43246 53725\n51993 78355\n52484 56220\n91569 81079\n36966 32813\n98090 36755\n57712 98202\n41880 92731\n28125 63190\n95710 21557\n22924 87895\n65478 18949\n16351 29022\n59838 84119\n77564 57175\n53670 94076\n67248 24236\n51743 92731\n21296 43397\n70800 59771\n52036 13051\n18593 83332\n83855 43397\n20306 54756\n58385 43502\n68684 75847\n98153 38453\n67237 72168\n25854 59466\n",
"example" => "3 4\n4 3\n2 5\n1 3\n3 9\n3 3"
}
response =
for part <- ["part1", "part2"], input_key <- ["puzzle", "example"] do
{part, input_key}
end
response =
response
|> Enum.filter(fn {part, input_key} ->
part in run_config and input_key in run_config
end)
|> Enum.map(fn {part, input_key} ->
[
part,
input_key,
part |> String.to_atom() |> solution_module.solve(inputs[input_key]) |> inspect
]
end)
Smaoc.Response.new(%{response: response, run_config: run_config, year: year, day: day})
Playground
# right = [4, 3, 5, 3, 9, 3]
# Enum.filter(right, fn x -> x == 3 end)
# Enum.frequencies(right)
如何優化程式碼以處理更大規模的輸入資料? - pt. 1
-
使用
Stream
替代部分Enum
來減少中間資料結構:input |> Stream.map(&String.split/1) |> Stream.map(fn [l, r] -> {String.to_integer(l), String.to_integer(r)} end) |> Enum.unzip() |> then(fn {left, right} -> Stream.zip(Enum.sort(left), Enum.sort(right)) |> Stream.map(fn {l, r} -> abs(l - r) end) |> Enum.sum() end)
-
使用並行處理來加速:
input |> Task.async_stream(&String.split/1, ordered: false) |> Stream.map(fn {:ok, [l, r]} -> {String.to_integer(l), String.to_integer(r)} end) |> Enum.unzip() |> then(fn {left, right} -> Task.async_stream( Enum.zip(Enum.sort(left), Enum.sort(right)), fn {l, r} -> abs(l - r) end, ordered: false ) |> Stream.map(fn {:ok, diff} -> diff end) |> Enum.sum() end)
Zero shot anwser by Cloude-3.5-sonnet - 2024/12/05
Pt. 1
defmodule ListDistance do
def calculate_distance(input) do
{left, right} =
input
|> Enum.map(&parse_line/1)
|> Enum.unzip()
left
|> Enum.sort()
|> Enum.zip(Enum.sort(right))
|> Enum.map(fn {a, b} -> abs(a - b) end)
|> Enum.sum()
end
defp parse_line(line) do
line
|> String.split()
|> Enum.map(&String.to_integer/1)
|> List.to_tuple()
end
end
# 使用範例
input = ["3 4", "4 3", "2 5", "1 3", "3 9", "3 3"]
distance = ListDistance.calculate_distance(input)
Pt. 2
defmodule Solution do
def calculate_similarity(left, right) do
# Count occurrences in right list
right_counts = Enum.frequencies(right)
# For each number in left list, multiply by its count in right list and sum
Enum.reduce(left, 0, fn num, acc ->
acc + (num * Map.get(right_counts, num, 0))
end)
end
end