CLASS zxmas DEFINITION
  PUBLIC
  FINAL
  CREATE PUBLIC .

  PUBLIC SECTION.
    INTERFACES
      if_oo_adt_classrun.
    TYPES ty_puzzle TYPE SORTED TABLE OF int8 WITH UNIQUE KEY table_line.

    METHODS find_invalid_number
      RETURNING VALUE(invalid_number) TYPE i.
    METHODS set_preamble_length
      IMPORTING preamble_length TYPE i.
    METHODS set_puzzle
      IMPORTING i_puzzle TYPE string.

    METHODS find_encryption_weakness
      IMPORTING invalid_number  TYPE i
      RETURNING VALUE(weakness) TYPE i.

  PROTECTED SECTION.
  PRIVATE SECTION.
    DATA preamble_length TYPE i.
    DATA preamble TYPE STANDARD TABLE OF int8 WITH EMPTY KEY.
    DATA puzzle TYPE STANDARD TABLE OF int8 WITH EMPTY KEY.

    METHODS build_puzzle_input
      RETURNING
        VALUE(puzzle) TYPE string.
    METHODS is_valid
      IMPORTING
        pointer      TYPE i
      RETURNING
        VALUE(valid) TYPE abap_boolean.
    METHODS find_contiguous_set
      IMPORTING invalid_number TYPE i
      RETURNING VALUE(set)     TYPE ty_puzzle.
ENDCLASS.

CLASS zxmas IMPLEMENTATION.

  METHOD build_puzzle_input.
    puzzle =
    |30\n| &&
    |16\n| &&
    |33\n| &&
    |40\n| &&
    |41\n| &&
    |25\n| &&
    |2\n| &&
    |29\n| &&
    |37\n| &&
    |4\n| &&
    |11\n| &&
    |1\n| &&
    |42\n| &&
    |10\n| &&
    |21\n| &&
    |13\n| &&
    |48\n| &&
    |28\n| &&
    |19\n| &&
    |5\n| &&
    |46\n| &&
    |49\n| &&
    |24\n| &&
    |8\n| &&
    |34\n| &&
    |3\n| &&
    |6\n| &&
    |30\n| &&
    |7\n| &&
    |22\n| &&
    |9\n| &&
    |12\n| &&
    |14\n| &&
    |15\n| &&
    |16\n| &&
    |27\n| &&
    |4\n| &&
    |11\n| &&
    |60\n| &&
    |10\n| &&
    |17\n| &&
    |56\n| &&
    |13\n| &&
    |18\n| &&
    |19\n| &&
    |20\n| &&
    |21\n| &&
    |23\n| &&
    |29\n| &&
    |24\n| &&
    |25\n| &&
    |39\n| &&
    |47\n| &&
    |71\n| &&
    |34\n| &&
    |22\n| &&
    |26\n| &&
    |28\n| &&
    |30\n| &&
    |14\n| &&
    |15\n| &&
    |27\n| &&
    |31\n| &&
    |32\n| &&
    |35\n| &&
    |38\n| &&
    |37\n| &&
    |48\n| &&
    |33\n| &&
    |36\n| &&
    |40\n| &&
    |64\n| &&
    |41\n| &&
    |66\n| &&
    |49\n| &&
    |42\n| &&
    |58\n| &&
    |45\n| &&
    |83\n| &&
    |29\n| &&
    |75\n| &&
    |60\n| &&
    |44\n| &&
    |51\n| &&
    |53\n| &&
    |46\n| &&
    |68\n| &&
    |69\n| &&
    |70\n| &&
    |62\n| &&
    |113\n| &&
    |65\n| &&
    |71\n| &&
    |76\n| &&
    |95\n| &&
    |73\n| &&
    |74\n| &&
    |78\n| &&
    |139\n| &&
    |86\n| &&
    |106\n| &&
    |80\n| &&
    |82\n| &&
    |89\n| &&
    |119\n| &&
    |112\n| &&
    |90\n| &&
    |133\n| &&
    |159\n| &&
    |99\n| &&
    |127\n| &&
    |140\n| &&
    |147\n| &&
    |169\n| &&
    |135\n| &&
    |136\n| &&
    |212\n| &&
    |144\n| &&
    |149\n| &&
    |160\n| &&
    |208\n| &&
    |188\n| &&
    |222\n| &&
    |162\n| &&
    |166\n| &&
    |170\n| &&
    |179\n| &&
    |181\n| &&
    |292\n| &&
    |189\n| &&
    |268\n| &&
    |358\n| &&
    |226\n| &&
    |393\n| &&
    |243\n| &&
    |284\n| &&
    |271\n| &&
    |337\n| &&
    |302\n| &&
    |332\n| &&
    |280\n| &&
    |304\n| &&
    |293\n| &&
    |309\n| &&
    |322\n| &&
    |328\n| &&
    |336\n| &&
    |341\n| &&
    |349\n| &&
    |345\n| &&
    |415\n| &&
    |471\n| &&
    |370\n| &&
    |711\n| &&
    |432\n| &&
    |469\n| &&
    |762\n| &&
    |497\n| &&
    |514\n| &&
    |523\n| &&
    |608\n| &&
    |573\n| &&
    |582\n| &&
    |584\n| &&
    |589\n| &&
    |597\n| &&
    |602\n| &&
    |615\n| &&
    |658\n| &&
    |650\n| &&
    |669\n| &&
    |677\n| &&
    |719\n| &&
    |863\n| &&
    |954\n| &&
    |1179\n| &&
    |802\n| &&
    |1369\n| &&
    |1890\n| &&
    |1344\n| &&
    |1216\n| &&
    |1239\n| &&
    |1308\n| &&
    |1037\n| &&
    |1181\n| &&
    |1756\n| &&
    |1266\n| &&
    |1569\n| &&
    |1173\n| &&
    |1186\n| &&
    |1604\n| &&
    |1612\n| &&
    |1695\n| &&
    |1319\n| &&
    |1327\n| &&
    |1623\n| &&
    |1396\n| &&
    |1521\n| &&
    |1665\n| &&
    |1839\n| &&
    |2547\n| &&
    |2041\n| &&
    |2210\n| &&
    |2253\n| &&
    |2420\n| &&
    |2835\n| &&
    |2218\n| &&
    |2356\n| &&
    |2364\n| &&
    |2359\n| &&
    |2965\n| &&
    |2868\n| &&
    |2492\n| &&
    |3733\n| &&
    |3537\n| &&
    |2646\n| &&
    |2984\n| &&
    |4765\n| &&
    |2715\n| &&
    |2723\n| &&
    |5343\n| &&
    |2917\n| &&
    |3186\n| &&
    |3918\n| &&
    |3880\n| &&
    |4251\n| &&
    |4405\n| &&
    |4428\n| &&
    |5481\n| &&
    |4720\n| &&
    |7455\n| &&
    |4715\n| &&
    |5591\n| &&
    |4856\n| &&
    |8833\n| &&
    |5138\n| &&
    |5207\n| &&
    |5901\n| &&
    |9128\n| &&
    |7699\n| &&
    |5361\n| &&
    |5909\n| &&
    |5632\n| &&
    |7128\n| &&
    |5640\n| &&
    |11046\n| &&
    |8278\n| &&
    |7066\n| &&
    |8131\n| &&
    |13600\n| &&
    |8966\n| &&
    |9120\n| &&
    |9143\n| &&
    |20012\n| &&
    |14179\n| &&
    |15902\n| &&
    |13681\n| &&
    |9994\n| &&
    |10063\n| &&
    |10345\n| &&
    |26247\n| &&
    |15052\n| &&
    |10993\n| &&
    |11001\n| &&
    |11270\n| &&
    |11272\n| &&
    |11541\n| &&
    |16209\n| &&
    |12706\n| &&
    |13771\n| &&
    |15197\n| &&
    |15344\n| &&
    |26885\n| &&
    |17097\n| &&
    |21604\n| &&
    |21615\n| &&
    |18263\n| &&
    |21333\n| &&
    |20987\n| &&
    |20057\n| &&
    |27091\n| &&
    |20339\n| &&
    |23051\n| &&
    |20408\n| &&
    |21338\n| &&
    |21994\n| &&
    |43982\n| &&
    |22263\n| &&
    |22271\n| &&
    |39591\n| &&
    |25043\n| &&
    |25312\n| &&
    |35401\n| &&
    |44389\n| &&
    |28968\n| &&
    |35605\n| &&
    |32441\n| &&
    |35360\n| &&
    |37154\n| &&
    |56739\n| &&
    |42320\n| &&
    |38320\n| &&
    |40465\n| &&
    |42679\n| &&
    |40396\n| &&
    |43601\n| &&
    |42402\n| &&
    |42671\n| &&
    |41746\n| &&
    |57631\n| &&
    |57484\n| &&
    |60917\n| &&
    |44534\n| &&
    |47314\n| &&
    |78785\n| &&
    |114145\n| &&
    |54280\n| &&
    |69364\n| &&
    |100155\n| &&
    |61409\n| &&
    |80640\n| &&
    |95059\n| &&
    |92991\n| &&
    |75474\n| &&
    |82211\n| &&
    |78716\n| &&
    |80066\n| &&
    |80861\n| &&
    |82142\n| &&
    |82798\n| &&
    |96951\n| &&
    |84148\n| &&
    |84417\n| &&
    |122326\n| &&
    |115197\n| &&
    |91848\n| &&
    |125395\n| &&
    |98814\n| &&
    |101594\n| &&
    |173844\n| &&
    |145557\n| &&
    |115689\n| &&
    |140125\n| &&
    |156335\n| &&
    |142049\n| &&
    |154190\n| &&
    |155540\n| &&
    |214174\n| &&
    |158272\n| &&
    |166946\n| &&
    |158782\n| &&
    |162208\n| &&
    |181612\n| &&
    |198487\n| &&
    |167215\n| &&
    |183231\n| &&
    |238607\n| &&
    |186011\n| &&
    |190662\n| &&
    |214503\n| &&
    |207537\n| &&
    |200408\n| &&
    |302333\n| &&
    |241719\n| &&
    |257738\n| &&
    |346997\n| &&
    |408934\n| &&
    |352957\n| &&
    |356759\n| &&
    |300321\n| &&
    |350177\n| &&
    |313812\n| &&
    |558059\n| &&
    |317054\n| &&
    |320990\n| &&
    |369745\n| &&
    |393548\n| &&
    |348827\n| &&
    |557167\n| &&
    |440969\n| &&
    |619387\n| &&
    |376673\n| &&
    |908236\n| &&
    |514220\n| &&
    |502741\n| &&
    |617375\n| &&
    |499457\n| &&
    |542040\n| &&
    |983009\n| &&
    |604735\n| &&
    |614133\n| &&
    |671167\n| &&
    |649148\n| &&
    |621311\n| &&
    |763293\n| &&
    |630866\n| &&
    |998283\n| &&
    |697663\n| &&
    |638044\n| &&
    |878157\n| &&
    |742375\n| &&
    |940426\n| &&
    |1152264\n| &&
    |1041497\n| &&
    |943710\n| &&
    |1013677\n| &&
    |1148605\n| &&
    |1130323\n| &&
    |1002198\n| &&
    |1044781\n| &&
    |1104192\n| &&
    |1113590\n| &&
    |1146775\n| &&
    |1320315\n| &&
    |1259355\n| &&
    |1633064\n| &&
    |1252177\n| &&
    |1287192\n| &&
    |1268910\n| &&
    |1335707\n| &&
    |1328529\n| &&
    |1380419\n| &&
    |1581754\n| &&
    |1516201\n| &&
    |1620532\n| &&
    |1686085\n| &&
    |2411619\n| &&
    |2057300\n| &&
    |2576774\n| &&
    |1945908\n| &&
    |2015875\n| &&
    |3462109\n| &&
    |2106390\n| &&
    |2158371\n| &&
    |2425200\n| &&
    |2217782\n| &&
    |2372945\n| &&
    |2595062\n| &&
    |2528265\n| &&
    |2511532\n| &&
    |3631993\n| &&
    |2521087\n| &&
    |3486809\n| &&
    |2597439\n| &&
    |2664236\n| &&
    |4457440\n| &&
    |4003208\n| &&
    |3639054\n| &&
    |6059548\n| &&
    |5252525\n| &&
    |4613314\n| &&
    |4578387\n| &&
    |5544109\n| &&
    |5887309\n| &&
    |4233657\n| &&
    |6143525\n| &&
    |4583571\n| &&
    |4264761\n| &&
    |4738869\n| &&
    |4590727\n| &&
    |5261675\n| &&
    |4884477\n| &&
    |5032619\n| &&
    |5039797\n| &&
    |6153080\n| &&
    |6897893\n| &&
    |10882394\n| &&
    |6084248\n| &&
    |6236493\n| &&
    |10820064\n| &&
    |7903815\n| &&
    |7642262\n| &&
    |7872711\n| &&
    |8498418\n| &&
    |8812044\n| &&
    |8817228\n| &&
    |8972526\n| &&
    |8824384\n| &&
    |8848332\n| &&
    |8855488\n| &&
    |9630524\n| &&
    |9003630\n| &&
    |12526739\n| &&
    |9623346\n| &&
    |11116867\n| &&
    |10294294\n| &&
    |9917096\n| &&
    |16907445\n| &&
    |14012323\n| &&
    |13726510\n| &&
    |12320741\n| &&
    |14582666\n| &&
    |15546077\n| &&
    |13878755\n| &&
    |15514973\n| &&
    |15776526\n| &&
    |18889622\n| &&
    |22157263\n| &&
    |17315646\n| &&
    |17784570\n| &&
    |18626976\n| &&
    |17672716\n| &&
    |17703820\n| &&
    |17851962\n| &&
    |14144619\n| &&
    |19253870\n| &&
    |29655281\n| &&
    |19540442\n| &&
    |19917640\n| &&
    |23929419\n| &&
    |24499762\n| &&
    |26047251\n| &&
    |33628488\n| &&
    |36926586\n| &&
    |26465360\n| &&
    |26199496\n| &&
    |28023374\n| &&
    |29393728\n| &&
    |29921145\n| &&
    |29659592\n| &&
    |36330796\n| &&
    |31460265\n| &&
    |31817335\n| &&
    |35636532\n| &&
    |31848439\n| &&
    |31996581\n| &&
    |33398489\n| &&
    |33685061\n| &&
    |56844226\n| &&
    |34062259\n| &&
    |38794312\n| &&
    |48429181\n| &&
    |44417402\n| &&
    |50965122\n| &&
    |49976670\n| &&
    |56496343\n| &&
    |52246747\n| &&
    |52664856\n| &&
    |54222870\n| &&
    |56120641\n| &&
    |55593224\n| &&
    |63277600\n| &&
    |59053320\n| &&
    |63058081\n| &&
    |68148131\n| &&
    |63308704\n| &&
    |69321593\n| &&
    |107475483\n| &&
    |63845020\n| &&
    |65395070\n| &&
    |67460748\n| &&
    |67083550\n| &&
    |111706781\n| &&
    |72856571\n| &&
    |78479661\n| &&
    |87223493\n| &&
    |92846583\n| &&
    |111500952\n| &&
    |100941792\n| &&
    |124644474\n| &&
    |104911603\n| &&
    |117500470\n| &&
    |106887726\n| &&
    |109816094\n| &&
    |217291577\n| &&
    |136165275\n| &&
    |184961218\n| &&
    |122898340\n| &&
    |152618563\n| &&
    |127153724\n| &&
    |174559033\n| &&
    |166336862\n| &&
    |184563352\n| &&
    |129240090\n| &&
    |239193433\n| &&
    |134544298\n| &&
    |151336232\n| &&
    |179421453\n| &&
    |165703154\n| &&
    |171326244\n| &&
    |180070076\n| &&
    |197758186\n| &&
    |205853395\n| &&
    |207829518\n| &&
    |302502137\n| &&
    |263318999\n| &&
    |232714434\n| &&
    |216703820\n| &&
    |388030064\n| &&
    |259063615\n| &&
    |285880530\n| &&
    |470443882\n| &&
    |250052064\n| &&
    |263784388\n| &&
    |404896587\n| &&
    |437216762\n| &&
    |280576322\n| &&
    |294943244\n| &&
    |300247452\n| &&
    |305870542\n| &&
    |337029398\n| &&
    |604733884\n| &&
    |345124607\n| &&
    |486429717\n| &&
    |351396320\n| &&
    |377828262\n| &&
    |456821801\n| &&
    |625700929\n| &&
    |424533338\n| &&
    |449418254\n| &&
    |466755884\n| &&
    |475767435\n| &&
    |1092456813\n| &&
    |509115679\n| &&
    |789692001\n| &&
    |657266862\n| &&
    |544995308\n| &&
    |513836452\n| &&
    |714857660\n| &&
    |631972642\n| &&
    |575519566\n| &&
    |580823774\n| &&
    |595190696\n| &&
    |637276850\n| &&
    |932220094\n| &&
    |786447652\n| &&
    |696520927\n| &&
    |953185601\n| &&
    |1067253491\n| &&
    |729224582\n| &&
    |970658253\n| &&
    |942523319\n| &&
    |900300773\n| &&
    |873951592\n| &&
    |975871563\n| &&
    |980592336\n| &&
    |1141088321\n| &&
    |1022952131\n| &&
    |1243061034\n| &&
    |1058831760\n| &&
    |1218100624\n| &&
    |1310048356\n| &&
    |1212796416\n| &&
    |1844609845\n| &&
    |1277344701\n| &&
    |1156343340\n| &&
    |1176014470\n| &&
    |1232467546\n| &&
    |1333797777\n| &&
    |1425745509\n| &&
    |1639044246\n| &&
    |1603176174\n| &&
    |1752176713\n| &&
    |1671747901\n| &&
    |1629525355\n| &&
    |1774252365\n| &&
    |1896903723\n| &&
    |2703090210\n| &&
    |2448697640\n| &&
    |1956463899\n| &&
    |2003544467\n| &&
    |2081783891\n| &&
    |2215175100\n| &&
    |2234846230\n| &&
    |2551898401\n| &&
    |2445263962\n| &&
    |2332357810\n| &&
    |3727912871\n| &&
    |3000953185\n| &&
    |2433688041\n| &&
    |2388810886\n| &&
    |2658213055\n| &&
    |2566265323\n| &&
    |2936973951\n| &&
    |3028921683\n| &&
    |3232701529\n| &&
    |4345601363\n| &&
    |3381702068\n| &&
    |4106610175\n| &&
    |4131749953\n| &&
    |4414141701\n| &&
    |4316630121\n| &&
    |3960008366\n| &&
    |4038247790\n| &&
    |4085328358\n| &&
    |4218719567\n| &&
    |4781440423\n| &&
    |6029874868\n| &&
    |4801111553\n| &&
    |7782393608\n| &&
    |7367376876\n| &&
    |5417732569\n| &&
    |7086281543\n| &&
    |4999953364\n| &&
    |4822498927\n| &&
    |4955076209\n| &&
    |13116156411\n| &&
    |7114250041\n| &&
    |7022302309\n| &&
    |6261623212\n| &&
    |8452389491\n| &&
    |7341710434\n| &&
    |7419949858\n| &&
    |7998256156\n| &&
    |9414095065\n| &&
    |8401958479\n| &&
    |8045336724\n| &&
    |8123576148\n| &&
    |8839359343\n| &&
    |8304047925\n| &&
    |9218672931\n| &&
    |9582551976\n| &&
    |9623610480\n| &&
    |16709892023\n| &&
    |12782346972\n| &&
    |12114203405\n| &&
    |14578686689\n| &&
    |15872339349\n| &&
    |9777575136\n| &&
    |11084122139\n| &&
    |11216699421\n| &&
    |19486080618\n| &&
    |17241317822\n| &&
    |13283925521\n| &&
    |13603333646\n| &&
    |30313225669\n| &&
    |14761660292\n| &&
    |17620631410\n| &&
    |16168912872\n| &&
    |16884696067\n| &&
    |16349384649\n| &&
    |25568057580\n| &&
    |20666674115\n| &&
    |17143407268\n| &&
    |26292443999\n| &&
    |18801224907\n| &&
    |19206162456\n| &&
    |19401185616\n| &&
    |20861697275\n| &&
    |20994274557\n| &&
    |36349569724\n| &&
    |22300821560\n| &&
    |23061500657\n| &&
    |24539235428\n| &&
    |24368047660\n| &&
    |30702780039\n| &&
    |29772246518\n| &&
    |32382291702\n| &&
    |28045585813\n| &&
    |33970016059\n| &&
    |30930573164\n| &&
    |31111044941\n| &&
    |32518297521\n| &&
    |33053608939\n| &&
    |41660948672\n| &&
    |40262882891\n| &&
    |35944632175\n| &&
    |36544592884\n| &&
    |38005104543\n| &&
    |43162518835\n| &&
    |38007387363\n| &&
    |43923197932\n| &&
    |47600736085\n| &&
    |41855971832\n| &&
    |43295096117\n| &&
    |45362322217\n| &&
    |46668869220\n| &&
    |48907283088\n| &&
    |70523402064\n| &&
    |52413633473\n| &&
    |57817832331\n| &&
    |58976158977\n| &&
    |63984182103\n| &&
    |59156630754\n| &&
    |62041618105\n| &&
    |73316491830\n| &&
    |85451875972\n| &&
    |76012491906\n| &&
    |89170165979\n| &&
    |73949736718\n| &&
    |105964816037\n| &&
    |149962228624\n| &&
    |74549697427\n| &&
    |79861076375\n| &&
    |79863359195\n| &&
    |81930585295\n| &&
    |85151067949\n| &&
    |88524841052\n| &&
    |239132394603\n| &&
    |92031191437\n| &&
    |122960341080\n| &&
    |110948901193\n| &&
    |101320916561\n| &&
    |119859450436\n| &&
    |137865509445\n| &&
    |121017777082\n| &&
    |159100804667\n| &&
    |180514513464\n| &&
    |121198248859\n| &&
    |135358109935\n| &&
    |260825850525\n| &&
    |177333408467\n| &&
    |148499434145\n| &&
    |307600238812\n| &&
    |195747946286\n| &&
    |154410773802\n| &&
    |154413056622\n| &&
    |300293749547\n| &&
    |313513861289\n| &&
    |161793944490\n| &&
    |268358884581\n| &&
    |467926917911\n| &&
    |250318785542\n| &&
    |193352107998\n| &&
    |202980092630\n| &&
    |350161002908\n| &&
    |380313501097\n| &&
    |221180366997\n| &&
    |240877227518\n| &&
    |242216025941\n| &&
    |256375887017\n| &&
    |415476691684\n| &&
    |373866621462\n| &&
    |256556358794\n| &&
    |316204718292\n| &&
    |445692293048\n| &&
    |537385085289\n| &&
    |302912490767\n| &&
    |410969415416\n| &&
    |355146052488\n| &&
    |543789718285\n| &&
    |443670893540\n| &&
    |364774037120\n| &&
    |382974311487\n| &&
    |913619210959\n| &&
    |601493868094\n| &&
    |396332200628\n| &&
    |414532474995\n| &&
    |819558914510\n| &&
    |585954404117\n| &&
    |462057594515\n| &&
    |497253114535\n| &&
    |463396392938\n| &&
    |658058543255\n| &&
    |702248651842\n| &&
    |905728488055\n| &&
    |559468849561\n| &&
    |572761077086\n| &&
    |611702411282\n| &&
    |619117209059\n| &&
    |667686527887\n| &&
    |685886802254\n| &&
    |699244691395\n| &&
    |719920089608\n| &&
    |738120363975\n| &&
    |747748348607\n| &&
    |761106237748\n| &&
    |779306512115\n| &&
    |880227426022\n| &&
    |858389795143\n| &&
    |955801050189\n| &&
    |810864675623\n| &&
    |1033649684054\n| &&
    |1056721964096\n| &&
    |925453987453\n| &&
    |1178586058620\n| &&
    |1075098804220\n| &&
    |1149283195192\n| &&
    |1132229926647\n| &&
    |1171171260843\n| &&
    |1184463488368\n| &&
    |1286803736946\n| &&
    |1191878286145\n| &&
    |1230819620341\n| &&
    |1305004011313\n| &&
    |1353573330141\n| &&
    |1433635150861\n| &&
    |1619496032891\n| &&
    |1540412749863\n| &&
    |1558613024230\n| &&
    |1508854586355\n| &&
    |1590171187738\n| &&
    |1637696307258\n| &&
    |3023806338599\n| &&
    |1943094602270\n| &&
    |1982035936466\n| &&
    |2476175272156\n| &&
    |2380102815533\n| &&
    |1982175951549\n| &&
    |2000552791673\n| &&
    |2310815985267\n| &&
    |3610922435874\n| &&
    |2281513121839\n| &&
    |2303401187490\n| &&
    |2457974997789\n| &&
    |2422697906486\n| &&
    |4285437123956\n| &&
    |4964495766015\n| &&
    |2535823631654\n| &&
    |2658577341454\n| &&
    |2787208481002\n| &&
    |2942489737216\n| &&
    |4282065913512\n| &&
    |3619732243724\n| &&
    |3148784211968\n| &&
    |3099025774093\n| &&
    |4839224819144\n| &&
    |3619872258807\n| &&
    |4292991936816\n| &&
    |3925130538736\n| &&
    |3964211888015\n| &&
    |4661615937372\n| &&
    |3982728743222\n| &&
    |4817336753493\n| &&
    |4303953979163\n| &&
    |4584914309329\n| &&
    |4704211028325\n| &&
    |8210567662692\n| &&
    |4726099093976\n| &&
    |6091273949184\n| &&
    |4958521538140\n| &&
    |5194400973108\n| &&
    |5601067078670\n| &&
    |5323032112656\n| &&
    |8942764356380\n| &&
    |13246718335543\n| &&
    |6562221980940\n| &&
    |10559588616810\n| &&
    |8437209012300\n| &&
    |6247809986061\n| &&
    |6718898032900\n| &&
    |8651229632712\n| &&
    |9779315282437\n| &&
    |14083269261600\n| &&
    |8922733426155\n| &&
    |7946940631237\n| &&
    |8286682722385\n| &&
    |18065998004822\n| &&
    |8888868288492\n| &&
    |11570842098717\n| &&
    |9289125337654\n| &&
    |12914778691017\n| &&
    |14523800504825\n| &&
    |9684620632116\n| &&
    |10152922511248\n| &&
    |18177993626146\n| &&
    |10517433085764\n| &&
    |13974261745368\n| &&
    |11885254093596\n| &&
    |26889040436385\n| &&
    |13281120013840\n| &&
    |14509162612177\n| &&
    |32149267266422\n| &&
    |18954642098064\n| &&
    |40972309697985\n| &&
    |14665838664137\n| &&
    |16233623353622\n| &&
    |17631561263353\n| &&
    |16835808919729\n| &&
    |22402687179360\n| &&
    |32140723875530\n| &&
    |17175551010877\n| &&
    |18573488920608\n| &&
    |19041790799740\n| &&
    |18973745969770\n| &&
    |19442047848902\n| &&
    |19837543143364\n| &&
    |32155361768178\n| &&
    |20202053717880\n| &&
    |34807112274230\n| &&
    |33620480762201\n| &&
    |44025977969126\n| &&
    |26394416705773\n| &&
    |25166374107436\n| &&
    |31344971531906\n| &&
    |27790282626017\n| &&
    |29175001276314\n| &&
    |30899462017759\n| &&
    |44023905979639\n| &&
    |31501647583866\n| &&
    |33639584633907\n| &&
    |38811289113134\n| &&
    |34011359930606\n| &&
    |48520522542783\n| &&
    |35749039931485\n| &&
    |65141232217773\n| &&
    |36149296980647\n| &&
    |37547234890378\n| &&
    |46764028595787\n| &&
    |38415793818672\n| &&
    |69192352076562\n| &&
    |83327634817013\n| &&
    |55569417982087\n| &&
    |55009165992110\n| &&
    |63941651596151\n| &&
    |52956656733453\n| &&
    |51560790813209\n| &&
    |54184699331790\n| &&
    |54341375383750\n| &&
    |62244433549665|.
  ENDMETHOD.

  METHOD find_invalid_number.
    DATA(pointer) = preamble_length + 1.

    WHILE pointer <= lines( puzzle ).
      IF is_valid( pointer ) = abap_false.
        invalid_number = puzzle[ pointer ].
        RETURN.
      ENDIF.
      pointer += 1.
    ENDWHILE.
  ENDMETHOD.

  METHOD set_preamble_length.
    me->preamble_length = preamble_length.
  ENDMETHOD.

  METHOD is_valid.
    DATA(number) = puzzle[ pointer ].
    DATA(start) = pointer - lines( preamble ).

    LOOP AT puzzle ASSIGNING FIELD-SYMBOL(<p1>) FROM start.
      LOOP AT puzzle ASSIGNING FIELD-SYMBOL(<p2>) FROM start.
        IF <p1> + <p2> = number AND <p1> <> <p2>.
          valid = abap_true.
          RETURN.
        ENDIF.
      ENDLOOP.
    ENDLOOP.
  ENDMETHOD.

  METHOD set_puzzle.
    SPLIT i_puzzle AT cl_abap_char_utilities=>newline INTO TABLE DATA(stream).
    preamble = VALUE #( FOR i = 1 UNTIL i > preamble_length ( CONV int8( stream[ i ] ) ) ).
    puzzle = VALUE #( FOR i = 1 UNTIL i > lines( stream ) ( CONV int8( stream[ i ] ) ) ).
  ENDMETHOD.

  METHOD if_oo_adt_classrun~main.
    set_preamble_length( 25 ).
    set_puzzle( build_puzzle_input( ) ).
    DATA(invalid_number) = find_invalid_number( ).
    DATA(weakness) = find_encryption_weakness( invalid_number ).

    out->write( |invalid number: { invalid_number }| ).
    out->write( |encyption weakness: { weakness } | ).
  ENDMETHOD.

  METHOD find_contiguous_set.
    DATA(pointer) = 0.
    DATA(sum) = 0.

    WHILE pointer <= lines( puzzle ).
      DO.
        sum += puzzle[ pointer + sy-index ].
        IF sum = invalid_number.
          INSERT LINES OF puzzle FROM pointer + 1 TO pointer + sy-index INTO TABLE set.
          RETURN.
        ENDIF.
        IF sum > invalid_number.
          EXIT.
        ENDIF.
      ENDDO.
      pointer += 1.
      CLEAR sum.
    ENDWHILE.

  ENDMETHOD.

  METHOD find_encryption_weakness.
    DATA(set) = find_contiguous_set( invalid_number ).
    weakness = set[ 1 ] + set[ lines( set ) ].
  ENDMETHOD.

ENDCLASS.
