Powered by AppSignal & Oban Pro
Would you like to see your link here? Contact us

Advent of Code 2024

advent_of_code_2024.livemd

Advent of Code 2024

Mix.install([
  {:smaoc, path: "/Users/netto/apps/libs/smaoc"}
])

Day one

solution_module = Smaoc.Solution
solution_module = Smaoc.Solution.Day1

defmodule solution_module do
  defp parse_input(input) do
    input 
    |> String.split("\n", trim: true)
    |> Enum.map(fn row ->
      row
        |> String.split()
        |> Enum.map(&String.to_integer/1)
        |> List.to_tuple
    end)
    |> Enum.unzip()
  end

  def solve(:part1, input) do
    {l1, l2} = parse_input(input)

    l1
    |> Enum.sort()
    |> Enum.zip(Enum.sort(l2))
    |> Enum.reduce(0, fn {n1, n2}, acc -> acc + abs(n1-n2) end)
  end

  def solve(:part2, input) do
    {l1, l2} = parse_input(input)
    
    frequency_map = l2
      |> Enum.group_by(&(&1))
      |> Enum.into(%{}, fn {n, g} -> {n, length(g)} end)

    Enum.reduce(l1, 0, & &2 + &1 * Map.get(frequency_map, &1 , 0))
  end
end
year = "2024"
day = "1"
run_config = ["example", "part1", "part2"]

inputs = %{
  "puzzle" =>
    "15131   78158\n32438   35057\n12503   57702\n73808   43128\n57168   71761\n97870   29344\n18072   79079\n55097   92997\n36615   67927\n63626   85851\n19535   91599\n20386   53482\n32817   55364\n90111   84813\n81180   13958\n20278   82963\n71822   70030\n36650   74064\n96658   93643\n48953   12223\n87910   32104\n15586   46936\n59112   47057\n36552   32104\n54311   15545\n14521   35085\n46924   41818\n79287   17659\n91525   46171\n77523   63000\n14229   61327\n20514   77151\n30019   35029\n78834   57168\n96186   92129\n99772   60459\n62659   23209\n44811   97907\n41778   46924\n39724   54539\n56672   11103\n37872   44088\n67848   46924\n55337   58014\n48137   34267\n57761   47261\n90770   82701\n87830   32104\n14118   43916\n64511   97016\n67927   26386\n76032   55621\n46116   43948\n96284   26386\n51398   32104\n52363   45099\n84966   24105\n29725   47057\n92179   73851\n77151   57702\n31670   23131\n83560   34930\n62543   62129\n88635   55364\n14456   87507\n62848   35057\n31081   15535\n20287   11590\n58199   55876\n78634   63263\n21931   62559\n96294   23071\n18891   21157\n54875   35057\n40666   75460\n68475   71547\n93112   57702\n17780   50710\n89025   82701\n10487   77363\n14442   67828\n18287   10668\n73030   47436\n88998   81809\n47512   43866\n49438   52980\n62202   13958\n42062   33002\n35797   54746\n61308   74313\n98706   85679\n51049   29787\n96082   47057\n82102   77395\n91642   37908\n86709   16527\n11536   39339\n57804   77151\n58098   58014\n29840   37272\n68500   77570\n18840   17486\n42529   62129\n74868   62855\n48556   44088\n64424   35057\n87547   70030\n25349   55364\n24698   95115\n29610   37403\n10024   93643\n80179   44088\n86009   67277\n75396   28216\n18309   37500\n14754   67927\n98264   13958\n28294   77151\n50417   96240\n27171   12050\n79907   32187\n94597   73714\n36251   58014\n42293   43948\n22552   46924\n18765   85646\n65758   37771\n16028   74814\n15096   32104\n27990   62738\n91867   23131\n48177   62129\n43833   67927\n91992   96240\n25767   58014\n56422   35328\n39281   87024\n85701   70030\n40915   95206\n25378   23022\n17827   44745\n74880   31126\n51583   56967\n14996   82701\n24393   64040\n13557   31621\n87102   77151\n57922   50349\n18436   82701\n36961   68507\n33558   18947\n29752   24528\n88141   99508\n65521   66940\n98636   24754\n83809   23131\n13839   85851\n81470   35057\n93818   69550\n72210   82295\n10853   84284\n78121   55200\n28208   85199\n75892   13111\n62655   18720\n59696   86838\n18410   26693\n82521   30547\n68047   85199\n59444   62129\n73400   82753\n52751   25250\n94229   67927\n44728   45424\n84688   47457\n54885   53247\n66708   85987\n16610   19000\n52212   47057\n33467   90494\n11933   34797\n11426   23370\n98122   11318\n24974   98740\n89866   61735\n63042   84601\n97878   62129\n86324   88329\n93550   65587\n21893   32872\n32422   82701\n97593   95724\n79956   43017\n18574   66940\n69417   70030\n20527   62986\n32901   78479\n76892   14216\n80784   20119\n70030   46924\n45455   19210\n84089   55364\n51290   32104\n78084   35819\n19446   43664\n83281   82701\n88850   60032\n41737   26655\n28334   87060\n57007   63359\n35230   79052\n97142   62408\n71663   44088\n21967   56111\n73266   70030\n37751   73992\n71909   10908\n49256   76543\n87879   10005\n18958   99715\n33674   26386\n88578   16115\n38184   92129\n23162   94507\n94689   27138\n50188   23236\n73498   92740\n80946   14521\n20434   62129\n96199   54539\n97269   74914\n75164   56409\n63802   46857\n85851   39471\n13886   21128\n82608   43875\n47631   35057\n41955   83525\n41722   49739\n80210   73310\n72032   29229\n99588   19663\n75340   68873\n72016   64274\n87488   54539\n54539   89609\n92646   49227\n92493   92129\n51219   62129\n94294   66940\n35339   82701\n60625   25516\n71044   38554\n65428   57974\n47057   38596\n79756   64175\n25694   69619\n96457   13207\n13870   77151\n61984   33464\n14480   55364\n31924   14216\n33548   35819\n66463   52868\n36209   21830\n38146   62515\n43109   93643\n39326   73266\n67802   83861\n80246   93894\n32312   70030\n67288   20405\n11591   84936\n17019   49240\n45637   58014\n63060   82442\n96782   87050\n49139   57325\n13278   38425\n10622   58014\n70609   55364\n37494   57385\n50253   77151\n30770   88060\n48235   27041\n77045   46924\n36713   60284\n36647   73266\n21913   37190\n84907   76623\n83140   58014\n40049   38908\n96240   49588\n91375   20178\n44851   53224\n85957   77812\n31141   62129\n73469   75003\n54379   73141\n90253   26386\n37361   83861\n77965   86183\n44088   98740\n65748   44088\n92167   27474\n34050   39710\n53845   35057\n39439   70030\n56254   80666\n81736   35057\n22481   41619\n94515   47057\n40865   47438\n94090   94307\n25243   99699\n70472   44088\n92113   36000\n84122   44088\n75877   47057\n46967   98088\n89199   62129\n45284   61031\n25894   24258\n81546   49603\n18098   62129\n35845   58264\n30136   84643\n79351   85199\n91114   29608\n10796   73266\n80157   13958\n13776   34799\n32867   82701\n72659   83316\n70346   32104\n82707   26071\n93643   88453\n56487   73266\n17461   80601\n74189   35819\n89473   80231\n89648   29082\n21185   91451\n45756   24922\n13958   92570\n49766   46924\n71014   15764\n78218   47624\n36683   52276\n12805   18935\n89940   75569\n92619   62002\n26109   85199\n85199   47057\n74790   77094\n61077   44984\n21011   24325\n91299   35819\n13145   92130\n74616   25253\n68242   57168\n88099   29422\n98816   50970\n92627   32104\n60619   54539\n18592   99696\n97961   85199\n37971   86471\n76808   65290\n26960   44025\n21159   18065\n21820   51610\n87396   13958\n51739   69215\n36150   67927\n36428   77167\n81368   85546\n36684   74331\n87943   57127\n83934   39052\n93369   57168\n25759   23805\n90295   85638\n33748   35057\n23965   56026\n18136   47566\n97136   87779\n11751   98740\n77584   72651\n47535   14216\n35157   40935\n38666   20886\n49584   34431\n70553   57619\n41660   90498\n34861   70030\n97329   82739\n83411   32104\n74970   72228\n36340   26425\n40870   92129\n96019   35057\n35996   62535\n35750   17289\n44648   26386\n14216   68378\n41202   76995\n28670   44197\n12646   99599\n30412   91461\n18596   74757\n38836   73266\n63846   70555\n84175   23131\n36177   25567\n76440   41764\n89469   30895\n28950   43948\n93707   70030\n93976   73909\n15262   31486\n86652   23131\n65454   88787\n76119   46924\n44343   98685\n29424   46693\n97543   32104\n73497   76030\n87093   58014\n49551   16528\n45191   73266\n21283   34339\n27141   73266\n20255   57702\n48823   35838\n74136   57964\n18194   80112\n37794   96240\n46775   98740\n52309   42291\n12317   39213\n98269   96240\n82747   89172\n28972   54579\n40842   85851\n24862   46924\n90115   29514\n97189   85851\n60429   85233\n35563   99130\n42174   69145\n62129   12281\n87307   72432\n54431   47057\n32208   43948\n36159   92837\n92813   16218\n30956   87764\n81881   16847\n82389   14216\n81627   46027\n12133   59074\n83315   88230\n17677   82701\n11309   32104\n24911   35927\n77700   98147\n43948   53055\n82304   22718\n94870   55364\n67575   85199\n49305   93182\n15751   15044\n66060   26171\n30935   41610\n28356   32565\n18811   12256\n64019   23131\n34225   17638\n15964   13958\n21017   44088\n34116   81436\n52676   32857\n95338   16079\n78527   46924\n93795   85851\n12924   64525\n85065   79359\n45073   47356\n30072   43948\n98834   32104\n57372   73266\n83929   79432\n90423   82701\n22832   98740\n48430   59406\n73629   93643\n26263   94506\n94074   14216\n26414   98740\n56951   55364\n50559   43948\n63550   31546\n90368   63317\n32146   46924\n47438   57185\n58449   43948\n47368   85851\n32574   15690\n83798   92129\n14115   48770\n81573   66940\n51307   52219\n13174   47057\n36828   67828\n38526   44088\n44179   54539\n52115   89989\n78802   62495\n34661   14805\n32323   59466\n27132   30442\n79104   63409\n63502   46386\n97485   55364\n93125   45846\n22160   14216\n94150   21543\n16960   75856\n41717   62129\n16797   13241\n16286   31406\n81133   73266\n62615   36776\n38433   47057\n17558   77268\n31164   99409\n98740   37183\n16053   46924\n83861   14216\n89754   14216\n90249   14216\n45631   44427\n79425   67927\n41085   82701\n61288   93605\n66018   98413\n22664   49595\n48544   78826\n24552   57029\n13795   59246\n17199   69353\n33038   93573\n37670   50912\n22237   40613\n93548   92536\n71344   90698\n95400   97202\n16457   29422\n79172   12325\n87249   25678\n32398   57782\n42920   65021\n20491   17593\n29343   15560\n51134   56929\n87045   18964\n16859   67927\n50451   23131\n88013   99947\n79869   26386\n17158   13958\n47399   93686\n32349   20008\n88683   69537\n49926   93643\n86432   89768\n82719   35057\n56739   92864\n95877   43633\n69037   59576\n95747   72337\n15660   23131\n13684   67506\n87807   24977\n45695   44088\n14570   23131\n45507   96958\n79826   46189\n86233   96377\n57051   96244\n16227   70718\n66940   87229\n16621   77709\n67736   19049\n36049   43120\n27324   13585\n89099   46924\n80234   73266\n30105   82570\n42497   85199\n20275   47057\n84842   67828\n18545   31766\n22010   89576\n44172   33974\n11085   32612\n48341   28004\n94313   14216\n65788   46924\n27317   92981\n68318   70030\n56329   60704\n29327   91745\n53630   57702\n24518   82701\n96364   81945\n95503   47057\n41188   40000\n16708   20405\n31294   30878\n33264   98085\n64245   96240\n14497   26073\n77398   21420\n16427   72248\n26395   46924\n22620   93997\n17321   12686\n26035   72607\n58951   54463\n38225   30571\n89267   35057\n30825   66365\n98399   67169\n80743   46924\n80557   91342\n35024   72939\n53184   15700\n71001   47443\n97339   33591\n96913   78805\n42578   73266\n53465   82681\n74719   75723\n96923   58014\n92916   71872\n26229   14521\n42662   96240\n81620   47057\n46956   29400\n39197   98476\n30330   45605\n57702   20507\n82062   62129\n37754   10380\n97560   40495\n45988   54539\n42413   38989\n58786   26969\n41724   60576\n55364   69527\n64004   44088\n87772   31704\n65614   23131\n44781   53388\n78305   40217\n32629   36036\n78238   51508\n61460   14216\n46112   96240\n61748   90420\n41222   62129\n14622   23131\n12228   54539\n95242   60673\n46228   69114\n80525   75711\n45245   46098\n67491   58014\n52166   83687\n38396   67828\n31358   43948\n55034   37772\n56827   46924\n79835   93798\n89347   58014\n82227   18043\n63832   32104\n62004   10083\n26506   92531\n69651   29640\n72433   82716\n40513   63891\n18717   92129\n30405   23131\n74331   44088\n72157   67849\n74767   54539\n30847   35819\n18242   20586\n69756   67844\n72005   57702\n92985   86192\n35084   52372\n73020   92992\n48804   93643\n75034   57702\n67280   55364\n13826   44088\n58014   28935\n26965   41912\n32785   70621\n67828   88974\n24669   12565\n83563   46791\n24440   98740\n85814   99882\n96689   89250\n83424   99433\n86597   92129\n35057   19703\n90254   75605\n27503   45668\n80689   57779\n85142   43542\n47144   32104\n81029   55196\n88306   85851\n44736   91531\n44675   70030\n56611   75708\n99455   48355\n76675   46015\n58779   43948\n87090   93643\n28546   78920\n60401   31361\n25679   91728\n40839   57168\n36746   43948\n79132   82701\n66132   61087\n68819   36117\n36538   12235\n27205   76760\n24399   23139\n44240   45473\n35819   96240\n12508   99554\n76682   43948\n92401   85296\n86766   41706\n96643   27209\n53030   85851\n10426   29096\n47697   20405\n68686   82701\n55276   98740\n88787   14521\n68667   54484\n88551   82701\n86242   93860\n33643   17327\n19228   49220\n94076   63820\n66464   95977\n32020   57329\n39310   47057\n45805   82325\n62915   96018\n13011   60296\n88834   40986\n82701   44460\n79163   37444\n57767   47909\n21571   56724\n48453   66228\n92533   20251\n71231   43948\n26769   54336\n71828   96240\n14891   30317\n92462   74559\n57405   62129\n64689   45242\n14673   75437\n37392   12408\n88004   68886\n11897   85851\n35121   19747\n65978   46924\n59214   35819\n69160   82701\n86199   78031\n84182   79283\n46746   70030\n93280   31194\n78233   42061\n31751   44088\n92129   41105\n81082   44088\n69123   85851\n20505   66320\n41538   43948\n64819   28581\n20294   73266\n48547   31547\n47633   15882\n96892   58776\n22150   41774\n18701   93643\n61229   42035\n78415   32104\n66928   65236\n35556   79431\n33671   62129\n96468   87478\n50427   58131\n25039   99100\n80962   32104\n69045   62129\n32104   75645\n59924   23131\n18240   70030\n88763   58014\n60348   43980\n20717   51159\n81946   79855\n20510   68239\n37273   43948\n99008   54986\n13046   53592\n87961   14216\n16856   87339\n13289   29653\n81110   65830\n25077   66583\n53154   96594\n22799   77151\n44901   98740\n80985   40597\n39889   66837\n32167   67057\n46469   19487\n42664   77151\n28717   67927\n48319   23742\n20405   63271\n99160   68742\n37312   86445\n49441   84577\n42459   77403\n76352   25777\n42818   73266\n96351   89012\n55426   69362\n44989   93643\n68109   67066\n87896   81830\n73110   89259\n41918   35819\n46805   73266\n61826   43948\n32096   54757\n26386   22428\n70847   17131\n63265   63742\n66807   18158\n29422   36229\n56355   37525\n22577   46924\n99518   44088\n16441   66929\n26818   76171\n18649   85851\n76731   61187\n30590   91024\n90428   58160\n16076   67927\n13553   37915\n91615   32416\n36190   63670\n49749   49989\n62226   58313\n25075   46700\n30720   89560\n20085   28489\n95853   74174\n94343   35819\n18518   80833\n98111   86331\n63474   33979\n24642   67927\n76558   23131\n26475   58014\n80306   58014\n92346   48193\n20270   95402\n23131   43948\n23638   60254\n86655   57352\n58258   45523\n34945   61572\n33250   96240\n84692   11925\n74810   80726\n50681   52269\n79610   73266\n30424   17447\n14983   82701\n37491   93643\n36576   73266\n31400   92479\n74498   62129\n19311   85090\n78393   54666\n44638   35057\n71239   35819\n33836   77370\n87014   35057\n49752   31956\n89676   85199\n31538   14521\n54931   18949\n78700   85199\n57624   83620\n55476   42249\n36922   23131\n83133   96903\n33766   38715\n90922   92129\n84184   85199\n84873   98740\n30986   46301\n66208   66981\n76128   44088\n54499   46924\n11089   73266\n63966   66921\n24165   60756\n65766   13958\n98485   92129\n31557   32104\n62423   44088\n54888   52459\n61829   75842\n26964   63459\n63722   32104\n71060   45395\n60721   85952\n14154   56940\n71805   82701\n74964   80051\n23705   85348\n27306   30788\n57026   35057\n95790   30087\n47055   67481\n20026   75622\n92097   12792\n22924   38758\n30454   42427\n77910   99903\n20644   30998\n51589   39385\n83392   76104\n92902   93643\n44609   42484\n82287   20771\n88814   15393\n39082   73266\n37969   85199\n57693   96633\n43012   93643\n29944   78876\n68317   66940\n33738   58014\n17794   98740\n41165   47180\n14871   41373\n42771   43164\n82391   29055\n79484   53019\n58189   29804\n19422   82701\n48923   83734\n76839   85851\n71377   23080\n50558   44088\n25393   45650\n39296   84954\n84189   57168\n85258   22386\n30912   13039\n77881   48653\n67451   46924\n47082   89946\n91778   85851\n99760   37363\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})
solution_module = Smaoc.Solution
solution_module = Smaoc.Solution.Day2

defmodule solution_module do
  defp parse_input(input) do
    input
    |> String.split("\n", trim: true)
    |> Enum.map(fn row ->
        row
        |> String.split()
        |> Enum.map(&amp;String.to_integer/1)
      end)
  end

  defguardp is_asc(n1, n2) when n2 - n1 > 0 and n2 - n1 < 4
  defguardp is_desc(n1, n2) when n1 - n2 > 0 and n1 - n2 < 4

  defp valid?(row, skipped \\ false, dir \\ nil)
  defp valid?(_, _, :fail), do: false
  defp valid?([_], _, _), do: true
  defp valid?([n1 , n2], skipped, dir), do:
    not skipped or calc_dir(n1, n2, dir) != :fail

  defp valid?([n1, n2, n3 | rest], false, nil) do
     (
       valid?([n2, n3 | rest], false, calc_dir(n1, n2)) 
       or
       valid?([n3 | rest], true, calc_dir(n1, n3))
       or
       valid?([n3 | rest], true, calc_dir(n2, n3))
     )
  end
  
  defp valid?([n1, n2, n3 | rest], false, dir) do
     (
       valid?([n2, n3 | rest], false, calc_dir(n1, n2, dir)) 
       or
       valid?([n3 | rest], true, calc_dir(n1, n3, dir))
     )
  end
  
  defp valid?([n1, n2 | rest], true, dir), do:
     valid?([n2 | rest], true, calc_dir(n1, n2, dir))

  defp calc_dir(n1, n2, dir \\ nil)
  defp calc_dir(n1, n2, nil) when is_asc(n1, n2), do: :asc
  defp calc_dir(n1, n2, nil) when is_desc(n1, n2), do: :desc
  defp calc_dir(n1, n2, :asc) when is_asc(n1, n2), do: :asc
  defp calc_dir(n1, n2, :desc) when is_desc(n1, n2), do: :desc
  defp calc_dir(_ ,_, _), do: :fail
  
  def solve(:part1, input) do
    input
    |> parse_input()
    |> Enum.count(&amp;valid?(&amp;1, _skipped = true))
  end

  def solve(:part2, input) do
    input
    |> parse_input()
    |> Enum.count(&amp;valid?/1)
  end
end

year = "2024"
day = "2"
run_config = ["example", "puzzle", "part1", "part2"]

inputs = %{
  "puzzle" =>
    "20 21 24 25 27 29 27\n60 61 62 64 64\n15 18 21 22 25 26 30\n5 8 11 14 16 19 20 26\n20 22 20 23 24\n89 91 92 95 98 95 96 95\n3 5 7 10 11 14 13 13\n82 85 83 84 86 90\n82 83 84 81 86\n27 28 28 30 33\n2 4 4 6 9 10 13 11\n64 65 65 68 69 72 72\n60 63 63 64 65 67 71\n14 17 17 20 21 27\n16 19 21 25 26\n57 59 63 65 62\n86 89 91 95 95\n2 5 8 10 14 18\n10 13 14 17 19 23 29\n17 18 24 26 29\n28 29 36 38 35\n53 56 58 61 68 69 70 70\n7 10 13 16 22 24 28\n68 70 73 80 81 84 89\n28 27 28 30 33 35 37\n90 89 91 93 95 94\n6 5 7 8 11 11\n33 32 34 35 39\n20 18 19 21 22 23 26 33\n27 26 24 27 28\n10 8 5 8 7\n10 8 10 13 15 17 14 14\n77 75 78 79 80 77 81\n9 8 9 6 12\n9 8 10 11 14 14 17 18\n6 3 4 5 7 7 9 6\n92 90 92 94 94 94\n88 87 87 90 93 97\n58 55 56 57 57 62\n12 11 14 15 18 19 23 25\n85 82 86 88 86\n57 55 58 60 64 64\n27 25 28 32 35 36 40\n20 19 20 24 29\n42 40 41 46 49\n4 2 5 12 14 17 15\n9 6 8 9 11 17 17\n32 31 32 34 40 43 45 49\n10 8 14 17 18 24\n62 62 65 68 69 72 75\n16 16 17 18 21 24 22\n4 4 5 8 11 13 13\n40 40 42 43 46 49 53\n16 16 19 22 29\n44 44 46 47 48 46 47 50\n26 26 29 31 29 30 32 30\n80 80 82 85 84 85 85\n6 6 3 4 6 9 13\n44 44 46 45 48 51 58\n68 68 68 69 72\n78 78 79 79 82 79\n6 6 8 10 10 10\n47 47 50 50 52 54 55 59\n2 2 2 4 7 9 10 17\n17 17 20 24 26 27 30\n84 84 86 90 87\n37 37 41 43 43\n50 50 51 55 57 60 64\n11 11 15 16 18 20 26\n27 27 29 31 33 39 41\n36 36 43 44 41\n51 51 53 55 58 64 64\n51 51 56 59 61 63 64 68\n70 70 77 79 80 82 83 88\n60 64 65 66 67\n49 53 54 57 56\n80 84 85 86 89 92 92\n26 30 32 33 35 38 42\n28 32 34 37 39 41 43 48\n79 83 84 85 83 86\n5 9 11 12 15 12 14 11\n58 62 64 62 62\n25 29 28 31 34 35 39\n38 42 43 40 43 46 52\n85 89 91 91 93 95 96\n8 12 15 15 12\n18 22 24 27 27 30 32 32\n33 37 39 40 40 43 45 49\n19 23 23 26 31\n66 70 71 73 75 76 80 83\n46 50 52 55 59 57\n46 50 51 53 56 60 62 62\n79 83 87 89 91 95\n22 26 30 31 34 39\n19 23 26 28 31 33 40 41\n11 15 17 18 20 25 26 25\n45 49 54 55 57 59 62 62\n57 61 63 68 69 73\n43 47 48 54 59\n72 77 79 82 83 84 87 88\n6 11 12 13 15 18 21 20\n76 81 82 84 87 87\n17 23 26 29 30 34\n70 75 77 80 83 86 89 94\n61 67 65 67 69\n77 84 86 89 90 92 89 87\n23 30 27 28 29 29\n24 29 31 28 32\n15 22 24 21 26\n15 21 22 23 23 26\n84 91 92 93 96 97 97 96\n23 28 28 30 31 31\n9 14 15 15 16 18 22\n50 57 59 60 60 65\n79 85 89 91 94 95\n6 11 14 18 16\n71 76 80 82 84 84\n17 24 28 30 33 34 38\n40 45 46 50 53 60\n70 76 78 81 86 87 88\n44 51 56 57 60 63 60\n13 18 19 24 26 28 28\n81 86 93 94 95 99\n1 6 8 11 12 17 22\n12 9 8 7 8\n65 62 60 58 58\n58 55 52 49 47 43\n99 98 95 92 91 84\n20 17 15 14 11 9 12 9\n15 13 11 8 11 10 9 12\n86 83 80 81 79 79\n76 74 71 69 67 68 64\n45 44 41 40 38 37 38 32\n48 46 45 45 43 42\n92 90 88 85 83 82 82 83\n68 66 66 63 60 60\n44 41 41 38 37 34 30\n90 87 84 84 82 80 77 72\n19 18 16 15 11 10\n98 97 96 95 91 88 89\n54 53 51 50 49 45 45\n57 56 52 50 49 45\n60 58 56 53 52 48 45 39\n89 88 87 81 79 76 75 73\n92 89 88 86 83 78 75 78\n50 49 47 40 38 36 36\n53 50 48 43 42 38\n93 90 85 82 77\n23 26 25 23 20\n68 71 69 68 67 70\n38 40 37 35 33 31 29 29\n79 81 78 76 74 71 69 65\n97 99 98 95 88\n10 11 8 6 8 7\n79 80 83 81 82\n5 8 5 2 3 1 1\n47 49 48 50 46\n33 34 32 33 30 25\n24 27 27 24 22\n15 17 14 12 12 13\n29 30 27 27 27\n93 96 94 94 92 89 85\n18 19 16 14 14 9\n55 57 56 52 50 48 47\n41 44 40 39 36 38\n52 55 52 48 45 43 41 41\n17 20 18 14 10\n70 72 70 66 60\n86 87 84 77 75 73\n46 47 45 44 41 36 35 36\n78 79 78 73 73\n80 83 81 74 72 70 68 64\n17 18 11 9 4\n14 14 11 9 8 6\n89 89 86 85 83 81 83\n72 72 69 66 66\n99 99 97 96 94 90\n87 87 85 84 82 81 74\n55 55 57 55 52 49\n89 89 90 87 88\n30 30 27 24 27 26 26\n77 77 78 76 75 74 70\n67 67 66 69 67 64 57\n76 76 75 75 74 73 72 70\n24 24 23 23 20 19 20\n51 51 51 48 47 44 42 42\n92 92 89 86 83 83 79\n74 74 74 71 68 62\n89 89 87 84 80 78 76 75\n79 79 76 72 73\n48 48 47 43 43\n91 91 88 87 86 84 80 76\n90 90 89 85 83 77\n29 29 27 26 23 17 14\n92 92 86 84 85\n38 38 32 30 29 26 24 24\n24 24 17 15 11\n55 55 48 45 38\n83 79 76 74 73 71 70\n85 81 79 78 77 79\n54 50 48 45 45\n50 46 45 44 41 37\n85 81 80 79 76 74 68\n83 79 78 77 80 78\n56 52 55 53 55\n43 39 38 41 39 39\n51 47 46 48 44\n20 16 13 12 14 8\n99 95 93 92 92 89\n95 91 88 85 83 83 82 84\n87 83 82 82 79 77 76 76\n91 87 85 84 82 82 80 76\n17 13 12 11 9 9 4\n43 39 38 37 33 32 30 28\n58 54 53 49 48 47 49\n93 89 88 84 81 78 78\n83 79 78 76 75 71 70 66\n89 85 81 79 76 70\n91 87 82 81 80 79 77\n87 83 76 75 73 75\n28 24 18 16 15 13 12 12\n77 73 72 66 63 62 58\n85 81 79 72 69 66 61\n34 28 26 25 23 20\n81 76 74 71 68 67 66 69\n94 87 85 82 79 77 77\n93 86 83 80 76\n44 38 35 32 30 24\n45 39 36 39 38\n18 13 14 11 14\n51 44 46 44 44\n33 27 30 29 27 23\n44 38 35 34 36 30\n38 31 28 28 26 23 21\n90 83 82 80 80 82\n51 46 45 42 40 37 37 37\n17 10 9 6 6 2\n83 77 76 73 73 72 71 66\n64 58 54 52 51 50\n58 52 49 45 42 44\n35 30 26 23 23\n35 28 24 22 21 20 16\n31 26 22 21 18 17 14 9\n20 13 11 6 3 2 1\n92 86 83 80 77 71 72\n78 72 69 62 60 59 59\n56 51 48 41 38 34\n72 65 63 61 58 52 50 45\n36 34 34 35 39\n62 62 59 61 61\n23 17 16 15 15 14 11 10\n16 20 22 24 31 34 38\n1 7 9 8 10 11\n81 78 80 79 81 82 87\n15 18 20 21 23 26 30 34\n20 20 17 14 13 16 14 10\n7 11 13 16 15 15\n39 39 39 36 33 33\n39 43 45 46 51 53 60\n21 15 13 11 8 7 6 2\n15 20 22 23 25 22 23 29\n34 34 28 25 28\n32 30 27 27 24 25\n52 54 51 49 47 46 45 46\n46 49 49 48 47 43\n42 43 44 46 48 50 54\n90 90 91 91 93 94 94\n96 93 90 83 82 80 78 76\n49 56 57 59 62 66 66\n71 69 70 74 75 76 83\n54 52 54 57 63 64 65 70\n78 71 66 65 62 61\n67 71 73 74 81 82 82\n23 17 16 16 11\n88 84 83 79 73\n59 59 63 66 66\n66 62 62 59 55\n69 71 68 66 63 62 55 50\n48 48 45 43 41 35 32 26\n19 15 14 11 9 9 9\n60 59 58 55 51 45\n10 14 17 17 20 23 27\n77 77 74 72 73 71 70 63\n73 73 72 75 75\n15 22 24 23 25 27 28 28\n90 90 92 91 93\n64 67 67 65 64 62\n97 93 91 89 85 88\n42 42 38 35 32 32\n76 74 77 74 71\n71 68 67 64 63 62 64\n13 15 13 11 7 6 5 2\n67 67 71 72 73 70\n20 17 19 19 20 21\n69 74 75 76 79\n39 35 33 30 28 26 29 29\n68 66 63 62 59 52 52\n25 19 17 14 13 9 7 10\n53 53 56 63 63\n43 39 37 34 33 31 27\n31 33 35 35 36\n32 35 38 39 39\n28 30 33 36 42 39\n51 49 52 55 58 63\n20 16 12 9 5\n38 33 30 29 26 23\n56 56 57 61 64 66 68\n57 60 63 62 65 72\n26 19 18 17 16 13 9 7\n27 33 36 41 43 46 50\n85 85 86 89 92 94 92\n43 44 51 54 57\n68 74 78 81 84 86 88 92\n54 58 60 62 64 64 66 66\n32 28 26 24 26 24 22 15\n4 3 4 7 7 10 17\n6 11 13 15 17 23\n30 34 36 40 40\n83 87 90 91 93 91\n58 58 56 55 54 51 52 54\n64 66 65 63 56\n14 17 15 15 16\n22 18 16 14 13 11\n66 61 62 61 63\n68 67 64 66 67 71\n25 31 34 32 31\n58 62 63 64 65 67 69 75\n44 45 43 36 35 34 31 27\n55 60 67 69 68\n31 29 28 31 33\n69 75 77 79 82 82 89\n90 90 92 94 94 98\n57 57 55 53 56 54\n42 36 35 38 37 36 33 26\n57 57 60 65 67 68 72\n55 58 57 52 49 47\n88 88 90 91 91\n51 51 54 54 55 56\n18 22 25 27 30 33 37 43\n58 65 66 69 72 74 78 76\n40 39 36 32 29 28 25\n70 66 64 61 60 63\n13 15 18 21 24 27 34 34\n76 79 72 71 70 73\n72 68 66 64 64 61\n13 12 13 15 17 18 22 26\n86 82 82 81 80 79 77 71\n37 37 35 34 29 28 28\n61 62 65 68 68 68\n24 25 23 24 24\n81 81 80 77 71 70 69 65\n27 27 34 36 37 40 43 50\n52 49 47 50 49 48 47 47\n66 69 76 79 83\n54 54 52 47 44 43 40\n85 87 87 86 84 82 80 75\n21 15 11 8 7 3\n54 54 53 53 51 49 45\n56 49 52 50 47 44 44\n85 83 80 82 78\n53 54 58 60 62 63\n86 89 88 89 85\n44 50 53 53 56 58\n44 48 50 53 53 56 62\n14 16 14 12 10 6\n57 56 58 59 62 66 67 67\n83 82 84 87 89 91 91 91\n20 13 9 7 4 2 2\n3 4 6 6 8 9 11 16\n83 83 87 88 93\n60 61 64 67 70 73 76 74\n37 36 41 44 46 48 49 49\n91 91 88 87 86 86 84 81\n66 68 61 59 56 56\n11 9 12 14 18 19\n39 34 31 31 30 33\n33 33 31 30 28 26 19\n25 27 24 22 18 17 15 17\n52 52 54 53 52\n20 25 25 26 30\n33 36 35 32 29 27 27\n34 30 27 25 25\n10 8 9 10 13 10 11 14\n34 41 44 45 51 51\n4 4 6 7 10 14\n34 31 34 38 40 41 44 43\n17 13 10 9 10 9 6 5\n75 71 70 65 61\n56 55 53 52 49 46 42 38\n56 52 45 42 40 39 38 39\n17 21 24 24 25 28\n59 53 51 50 51 48 47 43\n95 89 86 82 76\n12 12 10 7 5 3 3\n22 24 23 24 23\n82 80 79 78 75 75 75\n64 65 66 69 72 76 82\n93 87 85 85 85\n22 22 22 20 18 20\n73 72 74 77 80 83 85 88\n42 44 46 45 43\n15 15 18 17 18 19 24\n39 43 44 43 42\n79 83 84 88 85\n16 20 23 20 24\n16 13 11 8 9 8\n22 25 25 26 28 32\n43 47 49 50 52 51 52 57\n19 16 15 13 13 9\n76 83 84 82 86\n24 24 25 28 30 30 33 38\n20 16 15 10 7 7\n19 24 27 31 34 36 41\n43 47 51 52 53 55 56\n63 62 64 66 72 73 77\n10 8 11 12 14 16 18 18\n70 70 69 68 65 61\n6 10 12 16 20\n81 85 86 87 89 92 92\n51 48 46 45 42 41 38 34\n24 29 31 32 33 30\n68 68 68 71 74 77 80 77\n5 7 8 10 12 16 18 15\n59 59 62 63 66 67 68 71\n18 21 24 31 32 33 36 42\n22 26 29 30 34\n38 42 44 45 47 49\n44 38 35 32 25 20\n20 14 12 11 11 9 7 3\n57 61 62 64 66 71 70\n75 75 71 69 66\n30 25 22 17 16 15 11\n34 34 30 27 25 22 25\n13 16 15 12 10 6 2\n35 34 36 35 30\n11 11 10 9 8\n53 51 48 42 41 42\n84 83 84 82 82\n90 92 90 89 89 89\n72 76 76 78 80 78\n81 86 88 91 94 95 95 92\n30 32 34 36 33 35\n22 26 28 31 32 38 40\n79 73 66 63 62 65\n47 43 40 34 32\n20 17 18 21 25\n63 60 66 69 72 73\n71 76 78 81 85\n29 31 31 32 34 31\n35 36 35 33 30 26 19\n64 68 70 71 68 70 72 73\n66 60 55 53 50 49 46 46\n17 18 15 12 10 6 6\n79 75 72 69 65 62\n7 12 15 19 22 25\n42 42 38 37 33\n12 8 5 5 4 3 2 5\n71 68 66 65 64 63 62 62\n6 3 5 8 10 12 11\n93 86 85 84 82 84\n31 32 30 31 31\n53 53 56 59 62 61 65\n26 26 29 35 37\n13 14 13 15 19\n33 30 31 33 35 35 34\n53 60 67 68 71 72\n93 91 87 85 84 83 84\n38 38 40 42 43 46 48 53\n33 39 41 44 51 58\n43 43 40 36 34 29\n50 52 54 53 52 45\n26 19 17 14 14\n66 62 59 60 61\n9 12 16 19 22 22\n89 88 86 83 82 80 78\n25 26 29 32 33\n61 58 56 54 52\n15 12 10 7 6 5\n44 41 39 37 35 33\n80 79 76 75 72\n55 54 51 48 45\n72 69 66 63 62 61\n49 50 53 54 57 59 61\n88 86 84 81 78 76 74 73\n45 44 41 38 37 36 35 32\n77 80 83 86 88 90 92\n92 89 88 85 84\n48 49 51 54 56 58\n92 91 88 85 83 82 80 77\n28 27 26 23 22 19 17\n28 27 24 21 19 18 16\n58 61 63 64 66 67 69 71\n52 55 57 60 62 64 65 67\n20 19 16 15 12\n28 27 26 23 20 17\n66 64 61 58 57\n27 24 22 19 16 14 13 10\n16 18 20 23 25 28 30 32\n85 87 88 90 91 92\n81 79 77 76 74 72\n30 31 33 35 38 40 41\n9 10 12 13 16 17 19\n32 30 28 26 24 22\n40 43 46 49 50 51 53\n15 16 19 22 23 25 28 31\n53 51 48 46 43 41\n65 66 69 72 75\n33 34 35 36 37 39 42\n67 70 72 74 77 78\n23 22 20 19 18 16 15 14\n22 21 18 17 15 14 12\n14 13 10 9 8 5\n35 34 32 29 26 23 22 19\n86 84 82 79 78 77 76 74\n34 37 39 40 41 44 46 48\n66 68 71 74 77 78 79\n73 71 70 69 67\n47 46 44 43 41 40\n22 21 19 17 16 15\n78 80 83 86 89 90 91 93\n41 38 36 33 32 29 27\n70 72 73 76 79 80 83 86\n63 64 66 69 70 73 74\n26 25 22 19 16 14 13\n42 39 37 35 34 31\n3 6 8 9 12 15 18\n58 56 55 52 51 48 46 44\n9 10 12 14 16 18 19 21\n93 91 90 88 86 85 82 79\n86 84 83 80 78 77 76\n71 68 65 64 61\n53 51 50 48 46 43\n34 37 38 41 42\n63 60 58 55 54 52 49\n40 37 36 35 33 30\n36 37 40 42 45 47 49 50\n58 60 63 66 69\n8 10 13 15 18 19 21 23\n3 4 7 8 10 12 13 15\n26 23 22 21 20\n85 87 90 93 94\n12 15 18 21 22 23 24\n89 91 93 95 96 97\n50 49 46 44 42 41 38 35\n43 41 40 38 35 34 33\n65 66 68 70 72 73 74\n20 17 15 14 11\n63 65 68 69 70 72 74\n66 65 64 63 61 59\n31 32 33 35 37 38 39\n48 47 44 42 41 39\n38 40 41 44 47 48\n92 90 89 87 85\n62 61 60 59 57 54 51\n17 20 22 24 27 29 31\n89 87 86 83 81 78\n47 50 53 54 57\n22 19 16 13 11 10\n50 48 45 44 41 39 36 33\n75 78 81 82 85\n78 76 75 72 69\n45 43 42 41 39 38\n45 48 50 53 54 56\n35 34 31 30 28 27 24\n54 57 60 62 63\n50 51 52 55 57 58 59 61\n49 47 46 44 43\n51 49 46 43 41 38 37 34\n43 42 39 37 35 33 31 28\n31 33 36 37 39\n24 25 27 28 29 31 33 34\n6 9 10 13 14 17 20 21\n79 80 82 83 86 89 90\n29 28 25 22 19 17\n56 53 52 51 50 49 48 47\n10 7 6 5 4 3 1\n87 88 90 91 92\n12 9 6 4 3 1\n19 17 14 12 10\n22 24 26 29 31\n96 94 91 90 87 86\n37 40 41 42 43 46 49 51\n39 36 35 33 32 29\n24 27 28 29 32 33 35 38\n42 39 36 33 31\n68 69 71 73 74 76 79 80\n43 44 46 47 49 51 53\n44 41 40 38 37 35\n66 67 69 71 73 74\n48 46 43 40 38 35\n24 23 22 20 19 18 16\n27 30 31 33 34 35\n74 77 78 79 80 81\n7 10 13 16 19\n7 9 11 12 13 16\n50 48 47 44 43 40 38 36\n24 22 19 18 15 14 13\n31 30 27 26 25 23\n65 62 60 58 55 53 50 49\n68 66 63 62 60 59 58 55\n36 33 31 30 27 26 23\n42 41 40 37 34 31 29 26\n31 29 27 25 24\n86 84 81 78 77 75 73 72\n9 12 14 17 19 20 22\n64 65 67 69 71 74 77 79\n94 93 90 87 86\n50 47 44 41 40 38 37\n15 13 12 11 10 8\n36 33 30 27 26 25 22 19\n80 81 82 83 84 87\n14 11 10 9 6\n12 11 9 8 6 4\n37 40 43 44 46 49 50\n34 35 37 39 41 44\n80 81 82 85 87\n55 58 59 60 63\n57 59 61 63 66 67\n83 84 85 87 89 90\n86 84 82 80 78 75 74\n60 59 56 53 51\n27 26 23 21 20 19\n13 14 17 19 20\n66 65 64 61 60 57 56 54\n62 63 65 67 69\n85 86 89 91 94\n6 7 9 11 12 15 17\n9 11 14 17 20 21\n86 83 80 79 78 75 72 71\n52 53 56 57 60 63 64 66\n38 35 33 31 30 28 25\n47 44 42 39 37 34 31\n97 94 93 91 89 88\n68 69 72 74 76 77 79\n69 66 65 64 61 58 57\n38 36 33 30 27 25 22\n11 14 16 18 20 22\n35 32 30 27 24 21 19 16\n86 87 89 90 91 92 93\n7 9 11 13 15\n78 81 83 85 87 88 91\n48 49 51 52 53 56 57 59\n36 39 42 43 44 45 46 47\n48 51 52 53 55 56\n79 76 75 73 71 68 65 63\n15 14 13 10 7 5 4 2\n83 82 80 78 77 74\n19 18 16 15 12 9 7 4\n95 93 90 87 84 82 79 76\n49 46 44 42 41 39 37 36\n49 48 47 46 44\n35 36 39 41 43\n2 4 5 8 9 10 12 14\n25 22 20 18 16 14\n67 64 61 59 56\n64 67 70 73 75 76 78 81\n54 51 49 46 43 42 39 38\n95 94 93 91 88 87 84 81\n64 65 68 70 71 74 76 77\n73 71 68 66 63 61 59\n81 79 78 75 74 71 69 67\n62 60 58 55 54 53 50\n79 82 83 84 85\n52 55 56 58 59 60 62 65\n44 45 46 47 48 50 52 55\n42 44 47 48 51\n54 52 50 49 48\n17 15 13 11 9 8 6 3\n76 79 81 82 84 85\n60 63 64 67 69 70 73 75\n18 19 20 22 24\n25 28 30 32 35 38 40 42\n66 67 69 71 72 73 75\n17 20 23 26 29 32 34 37\n78 76 75 72 70\n53 51 48 46 43 40 37\n94 91 88 86 85 82 81 78\n71 73 74 75 76 78 80 82\n80 78 75 73 71 69 66 63\n37 36 33 31 30 29 28\n35 38 40 43 46 47\n35 38 41 42 44\n34 33 31 28 27 24\n82 79 78 77 76 74\n27 29 31 33 36 37 40\n17 18 19 22 25 27 30 31\n75 77 78 79 82 84\n21 19 18 15 12 10\n49 52 54 57 60 61 62\n51 54 55 58 60 62\n69 68 65 62 59 57 55\n64 61 60 57 55 53 50\n74 71 69 66 64 61 59\n55 53 50 49 47 46 45 43\n69 72 73 76 78 81 82\n74 72 71 69 66 64 61 58\n32 29 28 25 23 21 18 17\n79 82 85 88 89 92 93 95\n49 52 54 55 58 60 62 65\n88 85 84 81 78 77\n25 26 29 31 32\n66 69 70 71 73 76\n49 51 53 54 57 58\n36 38 41 43 44 45 48 49\n97 96 93 90 88 86 85 83\n41 40 39 37 35 32 29\n57 59 60 61 62 64 67\n37 35 34 32 29\n52 51 48 45 44 43\n12 13 14 15 16 19\n8 9 11 12 13 14 17 18\n71 73 74 76 77 80\n34 32 30 28 27 24\n41 43 44 46 49 51\n17 19 21 24 27 29 32\n22 20 19 16 13 10 9 6\n94 92 90 89 86\n38 35 33 32 30 28 25\n28 29 30 33 36 37 38\n91 88 87 86 83 82 81 79\n37 38 39 41 44 46\n80 77 75 73 72 70 69\n76 77 79 82 84 85\n22 25 27 29 32 33\n57 55 54 52 51 49 46 45\n66 67 70 71 74\n65 62 60 59 58 57 56\n10 9 8 6 3 2\n66 63 61 59 57 54 52\n42 45 47 49 52\n86 83 80 79 77\n57 59 62 63 66 68 69\n13 14 17 20 21 22\n60 58 56 55 52\n89 88 86 83 81 79\n76 73 72 69 67 66\n42 39 38 36 35\n72 74 77 80 82 83 84 87\n56 57 59 62 65 67\n45 46 47 48 49 51 54\n76 77 80 83 86 87\n14 11 9 6 3\n75 78 81 84 87 89\n57 59 62 63 66 67 68 69\n54 57 60 62 63 65 66 69\n29 30 32 34 37 40 41\n77 79 81 84 86 88\n37 39 40 42 43\n82 79 76 74 71 70 68\n46 44 43 42 41 40 39 38\n9 10 12 14 17 20\n48 49 51 52 53 54\n44 46 49 51 52 55\n32 31 29 28 26\n44 46 48 50 52 54\n57 58 61 63 65\n40 42 45 46 49 51\n62 59 56 53 52\n52 53 55 56 58\n64 65 66 69 71 72 73 74\n31 29 26 24 23\n48 46 45 43 40\n29 31 34 35 38\n67 68 69 72 74 76 78\n66 64 62 61 60 57 54\n38 37 34 33 32 29 28\n7 9 12 14 17 20 21\n73 72 71 69 68 65 62\n15 16 18 19 20 21 23 25\n90 89 86 84 81 78 76\n75 78 79 80 81 82\n95 94 91 90 89\n90 92 94 95 96 97 99\n73 70 68 67 64\n19 17 15 13 11 10 7 4\n76 79 82 85 87 90\n75 76 78 81 83 85\n77 79 81 83 85\n89 87 86 84 81 80 79 76\n58 61 62 63 66 67 69\n20 23 25 27 30\n42 40 38 36 34 32\n68 65 64 63 62\n35 37 40 41 44 45\n35 36 39 41 42\n66 63 61 60 58 57 54\n70 67 64 61 58 55\n88 90 93 95 97 98 99\n75 76 79 82 84 85 86\n83 80 77 75 72 70 69\n76 74 72 70 68 67\n14 15 18 20 22 25 26 27\n15 17 18 19 22\n10 9 8 7 4\n16 19 21 24 27\n36 35 32 30 27 25\n40 37 34 32 31\n42 39 38 36 34\n76 74 73 70 67 65 64 62\n30 28 25 22 19 17 15 14\n58 57 54 51 49 48 45 42\n18 17 16 15 14 13\n30 29 26 25 22\n62 63 66 67 68 69 72\n69 72 75 76 79\n23 21 20 17 14 13 11 8\n35 34 31 30 27\n90 88 85 84 81 78\n98 95 93 91 88\n81 80 78 76 73 70 68\n77 78 81 82 83 86\n75 77 78 79 81\n21 20 17 15 13 12\n41 43 44 46 49 51 53 56\n32 34 35 38 41 43 44\n89 87 84 82 79 77\n35 38 39 40 43 46 47\n35 37 40 42 45\n80 79 77 74 72 70 69\n67 68 71 72 73 75 76 79\n9 10 13 15 16 19 22\n31 32 34 36 37 39\n81 78 76 75 72 69 68 66\n10 11 13 16 19 21 24\n57 60 61 64 66\n62 59 58 56 55 54 51\n1 3 6 7 9 10 12\n13 16 17 18 19 20 21 23\n51 50 48 46 45\n32 35 38 41 43 45\n91 90 87 84 81 79 77 74\n64 67 69 70 72 73\n37 40 42 43 45\n48 51 54 55 58 61\n46 49 51 53 54\n43 46 49 50 53\n51 54 56 59 61\n57 60 62 63 64 66 67 69\n44 42 41 40 38\n53 51 48 47 45 42 40 38\n72 73 74 76 79 81\n25 22 19 17 15 13 10\n22 19 18 17 15 14 12\n37 35 34 32 31\n76 74 72 70 67 64 61 59\n60 61 64 66 68 70\n8 10 12 13 16\n99 97 95 92 89 86 84\n87 84 83 82 80 79\n80 78 75 74 72 70 68\n86 84 81 79 78 77 74 73\n87 88 89 91 92 94 97\n39 36 35 33 31\n52 49 47 45 44 43\n45 42 40 39 37 34\n68 70 72 74 77\n87 89 90 91 94\n61 58 56 53 51 48 45 43\n75 78 81 84 87 90\n44 47 50 52 54 57\n82 85 88 91 93 94\n3 5 8 11 14 17 18 19\n53 50 49 46 43\n87 85 82 80 77 75 72 71\n70 67 65 64 63 60 59\n28 29 31 33 36 38\n76 77 78 80 83 86 87 89\n41 42 45 46 48 51\n47 46 43 42 40 37 36\n86 85 82 80 79 78 77 75\n32 29 28 27 24 21\n3 5 8 9 10 12\n11 14 15 18 20 21\n28 31 34 36 39\n25 24 22 21 20 17\n67 68 69 71 73 75 77\n48 46 43 42 39 38 37\n23 26 27 30 33 36\n68 70 73 74 75 76 77\n83 85 88 91 93 96\n55 54 51 50 48\n46 48 49 51 52 55 58 59\n35 37 40 41 44\n61 64 65 66 67 68 70 73\n3 4 7 10 11 13 16\n99 97 94 93 91 90\n45 42 40 37 34\n26 27 30 32 33 36 37\n34 32 31 28 25 22\n91 92 94 97 98 99\n55 58 60 63 64 66 67 70\n15 17 18 21 22\n58 60 63 64 65 66\n28 31 34 35 37 40 42\n63 66 69 70 71 72 75\n51 53 54 55 57 58 59\n79 82 85 88 91 93 94\n20 22 24 27 28\n67 66 63 61 60 58 55\n46 43 41 40 37 34 31 30\n38 35 33 32 29 28 26 23\n58 56 55 54 53 50\n83 86 89 92 95 96\n12 14 16 17 18 20 21\n68 65 63 62 60 59 57 54\n90 88 85 84 82 81 80 79\n59 56 53 52 50 48 47\n27 28 31 32 35 36 37\n81 79 77 74 73 70\n56 55 54 53 52 50 49\n40 41 44 46 49\n71 74 77 80 82 84 85 86\n40 43 46 49 50\n69 67 66 63 60 59\n35 36 38 40 42 43 45\n20 18 17 15 13 11 10 7\n32 29 27 24 23 22 20 18\n77 78 80 81 82\n25 23 21 19 16 15\n85 86 87 88 90\n18 20 21 24 26 27 30\n1 4 5 7 10\n81 82 85 87 90 93 96 98\n27 24 21 18 15\n82 85 87 89 92 94 96 99\n49 51 52 53 56 59 60\n80 79 76 73 71 69 66\n66 63 62 59 56\n65 64 61 58 56 55 52\n45 48 49 52 54 55 58\n82 81 78 77 75 73 71 70\n66 64 63 60 58 57 55\n62 59 56 54 51 49 46\n7 6 5 4 2\n32 31 28 25 22 19 18\n78 80 83 84 85 88 89\n56 57 59 61 63\n53 50 48 47 46 45 44 42\n83 82 81 80 78\n28 31 32 35 37 38 40\n4 5 7 9 10 12 15\n44 47 48 50 53 54\n51 53 54 56 57 60\n2 5 7 10 13 15 17 20\n24 25 26 28 31 33\n24 27 29 32 35 37\n87 88 90 92 95 98\n47 49 50 53 55 57 60\n87 85 83 82 81 80 78\n3 5 8 10 12 14 16 17\n27 29 31 34 35 36 37 39\n10 12 15 16 18 20 21\n36 37 39 42 43 44\n75 76 77 80 82 83\n76 77 78 80 81 84 85 86\n23 21 20 17 15 12 10 8\n86 83 80 78 77 74 72\n82 80 79 76 73 72\n62 65 66 67 70\n94 92 90 88 85 83 81 80\n47 45 43 42 40 37 36\n32 35 37 40 41 42 43\n77 78 81 83 85 86 89 90\n20 19 18 16 13\n37 40 42 45 46 49\n31 32 35 36 38 39\n62 64 66 68 69 70 71 73\n83 84 87 90 91\n4 5 7 9 12 13 16\n59 60 61 64 65 68\n61 59 56 54 52 49 48 45\n26 25 23 22 19 16\n69 72 74 76 77\n75 78 79 82 83 85 86\n67 68 69 70 72 74 75 78\n68 65 62 61 59\n20 21 22 23 24 25 27 29\n30 28 26 25 23 21\n72 70 68 65 62 59 56\n69 70 72 75 78 79\n12 14 17 18 20 21 22\n13 16 18 20 21 22 24 27\n82 83 86 87 89 90 93\n45 48 51 54 55 58\n77 78 81 82 85 88 90 93\n87 88 89 91 94 97\n44 42 41 38 35 33\n39 36 34 32 31\n37 39 41 42 45 48 51 54\n72 75 78 79 81\n64 67 70 71 73 76\n60 57 55 54 51 48 46\n29 28 26 23 21 18 15\n16 15 12 9 8\n71 70 67 64 62 61\n6 8 9 10 12 13 16 19\n42 40 38 35 34 33\n80 82 83 85 87\n41 38 37 35 34 33 30\n54 57 59 61 64 65 67\n",
  "example" => "7 6 4 2 1\n1 2 7 8 9\n9 7 6 2 1\n1 3 2 4 5\n8 6 4 4 1\n1 3 6 7 9"
}

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})