Powered by AppSignal & Oban Pro

Day 1

day1.livemd

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

  1. 使用 Stream 替代部分 Enum 來減少中間資料結構:

    input
    |> Stream.map(&amp;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)
  2. 使用並行處理來加速:

    input
    |> Task.async_stream(&amp;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(&amp;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(&amp;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