{ "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import networkx as nx\n", "\n", "with open('5/input', 'r') as f:\n", " data=f.readlines()\n", "\n", "read_rules = True\n", "sequences =[]\n", "#was expecting fancier things\n", "rules = nx.DiGraph()\n", "\n", "for ln,line in enumerate([line.strip() for line in data]):\n", " if read_rules:\n", " if len(line) == 0:\n", " read_rules = False\n", " continue\n", " left,right = line.split('|')\n", " rules.add_edge(left,right)\n", " else:\n", " sequences.append(line.split(','))" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "def test_sequence(sequence):\n", " for lidx,left in enumerate(sequence):\n", " if rules.has_node(left):\n", " for right in sequence[lidx:]:\n", " if rules.has_node(right):\n", " if rules.has_edge(right,left):\n", " return False\n", " return True" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "5087" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sum([int(sequence[len(sequence)//2]) for sequence in sequences if test_sequence(sequence)])" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[['91', '76', '94', '81', '45', '78', '21'],\n", " ['34',\n", " '76',\n", " '63',\n", " '42',\n", " '31',\n", " '41',\n", " '83',\n", " '56',\n", " '15',\n", " '53',\n", " '23',\n", " '28',\n", " '79',\n", " '71',\n", " '94',\n", " '77',\n", " '91',\n", " '49',\n", " '74'],\n", " ['57',\n", " '25',\n", " '69',\n", " '86',\n", " '61',\n", " '37',\n", " '29',\n", " '74',\n", " '94',\n", " '45',\n", " '53',\n", " '84',\n", " '83',\n", " '21',\n", " '91',\n", " '34',\n", " '76',\n", " '16',\n", " '66',\n", " '85',\n", " '82'],\n", " ['91',\n", " '57',\n", " '98',\n", " '86',\n", " '21',\n", " '85',\n", " '78',\n", " '54',\n", " '34',\n", " '82',\n", " '76',\n", " '29',\n", " '45',\n", " '84',\n", " '99',\n", " '46',\n", " '61',\n", " '16',\n", " '66',\n", " '25',\n", " '89'],\n", " ['79',\n", " '99',\n", " '58',\n", " '49',\n", " '22',\n", " '78',\n", " '89',\n", " '35',\n", " '63',\n", " '19',\n", " '12',\n", " '28',\n", " '11',\n", " '71',\n", " '65',\n", " '53',\n", " '17'],\n", " ['12', '23', '61', '74', '91', '34', '53'],\n", " ['76',\n", " '53',\n", " '17',\n", " '49',\n", " '79',\n", " '63',\n", " '56',\n", " '15',\n", " '28',\n", " '91',\n", " '58',\n", " '34',\n", " '22',\n", " '74',\n", " '77'],\n", " ['41',\n", " '91',\n", " '15',\n", " '31',\n", " '79',\n", " '29',\n", " '83',\n", " '58',\n", " '94',\n", " '17',\n", " '56',\n", " '76',\n", " '63'],\n", " ['41',\n", " '63',\n", " '54',\n", " '65',\n", " '84',\n", " '66',\n", " '99',\n", " '78',\n", " '28',\n", " '85',\n", " '89',\n", " '46',\n", " '35',\n", " '45',\n", " '79',\n", " '82',\n", " '77'],\n", " ['23', '35', '58', '98', '49', '12', '11'],\n", " ['84', '56', '41', '46', '28', '98', '79'],\n", " ['84', '76', '23', '53', '25'],\n", " ['16', '77', '75', '41', '12', '11', '42', '58', '89'],\n", " ['46', '82', '84', '16', '41', '65', '45', '98', '56', '78', '99'],\n", " ['54',\n", " '71',\n", " '77',\n", " '35',\n", " '11',\n", " '41',\n", " '89',\n", " '16',\n", " '65',\n", " '21',\n", " '46',\n", " '85',\n", " '49',\n", " '56',\n", " '79'],\n", " ['15',\n", " '35',\n", " '79',\n", " '78',\n", " '41',\n", " '89',\n", " '28',\n", " '49',\n", " '77',\n", " '56',\n", " '71',\n", " '17',\n", " '19',\n", " '75',\n", " '98'],\n", " ['57',\n", " '76',\n", " '37',\n", " '17',\n", " '83',\n", " '91',\n", " '81',\n", " '49',\n", " '86',\n", " '58',\n", " '69',\n", " '74',\n", " '11',\n", " '15',\n", " '22',\n", " '31',\n", " '61',\n", " '94',\n", " '25'],\n", " ['46',\n", " '65',\n", " '25',\n", " '98',\n", " '99',\n", " '61',\n", " '45',\n", " '82',\n", " '89',\n", " '81',\n", " '85',\n", " '69',\n", " '21',\n", " '37',\n", " '35',\n", " '54',\n", " '78',\n", " '86',\n", " '76'],\n", " ['89',\n", " '12',\n", " '83',\n", " '74',\n", " '11',\n", " '77',\n", " '28',\n", " '15',\n", " '71',\n", " '63',\n", " '35',\n", " '19',\n", " '79'],\n", " ['12', '19', '28', '23', '74', '89', '77'],\n", " ['98',\n", " '85',\n", " '77',\n", " '37',\n", " '99',\n", " '41',\n", " '25',\n", " '35',\n", " '19',\n", " '16',\n", " '65',\n", " '81',\n", " '66',\n", " '89',\n", " '61',\n", " '57',\n", " '75',\n", " '84',\n", " '21',\n", " '46',\n", " '82'],\n", " ['11',\n", " '49',\n", " '91',\n", " '94',\n", " '76',\n", " '15',\n", " '23',\n", " '31',\n", " '34',\n", " '71',\n", " '28',\n", " '79',\n", " '42',\n", " '17',\n", " '63',\n", " '69',\n", " '22'],\n", " ['23', '94', '74', '91', '31', '69', '25', '53', '15', '81', '22'],\n", " ['75', '85', '98', '37', '63'],\n", " ['78',\n", " '54',\n", " '37',\n", " '82',\n", " '41',\n", " '16',\n", " '46',\n", " '71',\n", " '99',\n", " '66',\n", " '75',\n", " '56',\n", " '21',\n", " '84',\n", " '65'],\n", " ['34', '53', '71', '58', '86', '81', '57'],\n", " ['85',\n", " '19',\n", " '77',\n", " '82',\n", " '98',\n", " '56',\n", " '49',\n", " '75',\n", " '41',\n", " '89',\n", " '71',\n", " '17',\n", " '12',\n", " '79',\n", " '35'],\n", " ['23',\n", " '22',\n", " '37',\n", " '76',\n", " '15',\n", " '31',\n", " '86',\n", " '94',\n", " '82',\n", " '61',\n", " '74',\n", " '58',\n", " '57'],\n", " ['22', '45', '91', '25', '42', '83', '15', '61', '66'],\n", " ['35', '25', '45', '57', '75'],\n", " ['81',\n", " '75',\n", " '77',\n", " '46',\n", " '25',\n", " '37',\n", " '84',\n", " '85',\n", " '89',\n", " '16',\n", " '78',\n", " '19',\n", " '66',\n", " '69',\n", " '98',\n", " '35',\n", " '21',\n", " '82',\n", " '61',\n", " '57',\n", " '65'],\n", " ['58',\n", " '41',\n", " '77',\n", " '15',\n", " '42',\n", " '71',\n", " '12',\n", " '35',\n", " '53',\n", " '83',\n", " '19',\n", " '74',\n", " '63',\n", " '75',\n", " '22',\n", " '89',\n", " '79'],\n", " ['11',\n", " '23',\n", " '49',\n", " '19',\n", " '42',\n", " '94',\n", " '34',\n", " '56',\n", " '75',\n", " '53',\n", " '22',\n", " '83',\n", " '28',\n", " '15',\n", " '31',\n", " '71',\n", " '17'],\n", " ['35',\n", " '53',\n", " '17',\n", " '22',\n", " '77',\n", " '12',\n", " '75',\n", " '83',\n", " '11',\n", " '41',\n", " '71',\n", " '23',\n", " '56'],\n", " ['41',\n", " '85',\n", " '79',\n", " '11',\n", " '65',\n", " '49',\n", " '77',\n", " '75',\n", " '17',\n", " '42',\n", " '99',\n", " '28',\n", " '71',\n", " '35',\n", " '89',\n", " '63',\n", " '78',\n", " '22',\n", " '19'],\n", " ['45',\n", " '85',\n", " '35',\n", " '66',\n", " '75',\n", " '63',\n", " '98',\n", " '84',\n", " '89',\n", " '21',\n", " '78',\n", " '54',\n", " '82',\n", " '25',\n", " '77',\n", " '16',\n", " '19',\n", " '41',\n", " '99'],\n", " ['53',\n", " '74',\n", " '25',\n", " '83',\n", " '23',\n", " '54',\n", " '29',\n", " '81',\n", " '86',\n", " '82',\n", " '22',\n", " '57',\n", " '61',\n", " '94',\n", " '76',\n", " '91',\n", " '69',\n", " '34',\n", " '31'],\n", " ['65', '75', '16', '78', '99', '35', '98'],\n", " ['86',\n", " '91',\n", " '11',\n", " '57',\n", " '53',\n", " '29',\n", " '23',\n", " '69',\n", " '83',\n", " '81',\n", " '31',\n", " '17',\n", " '71'],\n", " ['71',\n", " '17',\n", " '42',\n", " '63',\n", " '41',\n", " '74',\n", " '58',\n", " '22',\n", " '53',\n", " '56',\n", " '28',\n", " '83',\n", " '79',\n", " '91',\n", " '34',\n", " '15',\n", " '19',\n", " '23',\n", " '94'],\n", " ['34',\n", " '37',\n", " '23',\n", " '29',\n", " '54',\n", " '57',\n", " '94',\n", " '61',\n", " '84',\n", " '45',\n", " '22',\n", " '69',\n", " '83'],\n", " ['21', '79', '12', '98', '42', '16', '78', '11', '28'],\n", " ['28',\n", " '49',\n", " '86',\n", " '58',\n", " '81',\n", " '69',\n", " '53',\n", " '74',\n", " '17',\n", " '57',\n", " '12',\n", " '91',\n", " '11',\n", " '23',\n", " '25',\n", " '22',\n", " '42',\n", " '76',\n", " '83',\n", " '29',\n", " '31',\n", " '94',\n", " '34'],\n", " ['84',\n", " '78',\n", " '75',\n", " '35',\n", " '19',\n", " '65',\n", " '69',\n", " '21',\n", " '85',\n", " '81',\n", " '66',\n", " '25',\n", " '99',\n", " '16',\n", " '77',\n", " '98',\n", " '45'],\n", " ['77', '94', '28', '49', '31'],\n", " ['11',\n", " '58',\n", " '74',\n", " '83',\n", " '41',\n", " '34',\n", " '19',\n", " '75',\n", " '42',\n", " '49',\n", " '12',\n", " '23',\n", " '15',\n", " '71',\n", " '94',\n", " '53',\n", " '22'],\n", " ['86',\n", " '74',\n", " '49',\n", " '71',\n", " '28',\n", " '22',\n", " '63',\n", " '83',\n", " '15',\n", " '34',\n", " '17',\n", " '58',\n", " '91',\n", " '23',\n", " '53',\n", " '69',\n", " '12',\n", " '31',\n", " '11',\n", " '76',\n", " '42'],\n", " ['98',\n", " '85',\n", " '75',\n", " '99',\n", " '63',\n", " '35',\n", " '16',\n", " '65',\n", " '71',\n", " '37',\n", " '77',\n", " '82',\n", " '79',\n", " '41',\n", " '19',\n", " '54',\n", " '89',\n", " '66',\n", " '21',\n", " '78',\n", " '84',\n", " '45',\n", " '56'],\n", " ['29', '45', '85', '91', '94', '78', '81'],\n", " ['56', '19', '46', '15', '35', '22', '71'],\n", " ['46',\n", " '66',\n", " '29',\n", " '61',\n", " '16',\n", " '65',\n", " '57',\n", " '54',\n", " '76',\n", " '89',\n", " '98',\n", " '21',\n", " '25',\n", " '91',\n", " '45',\n", " '85',\n", " '99',\n", " '78',\n", " '37'],\n", " ['76',\n", " '31',\n", " '94',\n", " '84',\n", " '15',\n", " '61',\n", " '83',\n", " '57',\n", " '58',\n", " '91',\n", " '25',\n", " '34',\n", " '37',\n", " '53',\n", " '66',\n", " '81',\n", " '22'],\n", " ['94',\n", " '29',\n", " '61',\n", " '74',\n", " '69',\n", " '34',\n", " '31',\n", " '91',\n", " '37',\n", " '84',\n", " '86',\n", " '25',\n", " '15',\n", " '83',\n", " '23',\n", " '81',\n", " '21'],\n", " ['74',\n", " '25',\n", " '12',\n", " '58',\n", " '29',\n", " '69',\n", " '61',\n", " '94',\n", " '53',\n", " '42',\n", " '57',\n", " '49',\n", " '11',\n", " '86',\n", " '23'],\n", " ['41',\n", " '84',\n", " '85',\n", " '78',\n", " '45',\n", " '21',\n", " '99',\n", " '35',\n", " '75',\n", " '57',\n", " '54',\n", " '77',\n", " '66'],\n", " ['79', '56', '89', '77', '78'],\n", " ['91',\n", " '31',\n", " '66',\n", " '81',\n", " '69',\n", " '46',\n", " '76',\n", " '16',\n", " '82',\n", " '25',\n", " '29',\n", " '21',\n", " '84',\n", " '98',\n", " '85',\n", " '45',\n", " '61',\n", " '74',\n", " '54'],\n", " ['77',\n", " '78',\n", " '17',\n", " '28',\n", " '54',\n", " '35',\n", " '16',\n", " '82',\n", " '99',\n", " '65',\n", " '41',\n", " '89',\n", " '71',\n", " '12',\n", " '63',\n", " '98',\n", " '19',\n", " '46',\n", " '66',\n", " '56',\n", " '79'],\n", " ['49', '53', '23', '69', '74'],\n", " ['22', '17', '41', '65', '77', '31', '83', '79', '19', '49', '53'],\n", " ['77',\n", " '15',\n", " '23',\n", " '17',\n", " '12',\n", " '22',\n", " '42',\n", " '65',\n", " '79',\n", " '71',\n", " '75',\n", " '11',\n", " '89',\n", " '49',\n", " '41'],\n", " ['17', '28', '77', '65', '12', '71', '79', '75', '31'],\n", " ['99',\n", " '81',\n", " '45',\n", " '21',\n", " '82',\n", " '84',\n", " '57',\n", " '54',\n", " '86',\n", " '78',\n", " '66',\n", " '29',\n", " '25'],\n", " ['22',\n", " '69',\n", " '83',\n", " '31',\n", " '71',\n", " '76',\n", " '17',\n", " '79',\n", " '94',\n", " '86',\n", " '34',\n", " '42',\n", " '63',\n", " '53',\n", " '12'],\n", " ['75',\n", " '61',\n", " '69',\n", " '84',\n", " '46',\n", " '16',\n", " '19',\n", " '45',\n", " '35',\n", " '86',\n", " '78',\n", " '54',\n", " '25',\n", " '21',\n", " '82',\n", " '85',\n", " '57'],\n", " ['57',\n", " '58',\n", " '23',\n", " '53',\n", " '83',\n", " '42',\n", " '94',\n", " '76',\n", " '61',\n", " '15',\n", " '22',\n", " '45',\n", " '34',\n", " '31',\n", " '29',\n", " '81',\n", " '86',\n", " '37',\n", " '25',\n", " '84',\n", " '66'],\n", " ['99',\n", " '81',\n", " '57',\n", " '69',\n", " '82',\n", " '45',\n", " '89',\n", " '85',\n", " '46',\n", " '61',\n", " '86',\n", " '21',\n", " '78',\n", " '16',\n", " '37',\n", " '76',\n", " '66',\n", " '34',\n", " '29'],\n", " ['83',\n", " '53',\n", " '74',\n", " '41',\n", " '22',\n", " '11',\n", " '58',\n", " '12',\n", " '77',\n", " '79',\n", " '71',\n", " '56',\n", " '65',\n", " '17',\n", " '35',\n", " '49',\n", " '75',\n", " '42',\n", " '19',\n", " '15',\n", " '28',\n", " '89',\n", " '23'],\n", " ['56',\n", " '58',\n", " '49',\n", " '83',\n", " '11',\n", " '17',\n", " '71',\n", " '42',\n", " '53',\n", " '76',\n", " '77',\n", " '15',\n", " '63',\n", " '12',\n", " '31',\n", " '79',\n", " '74',\n", " '91',\n", " '41'],\n", " ['69',\n", " '23',\n", " '34',\n", " '29',\n", " '66',\n", " '82',\n", " '16',\n", " '25',\n", " '31',\n", " '21',\n", " '57',\n", " '91',\n", " '81',\n", " '54',\n", " '74',\n", " '86',\n", " '94',\n", " '84',\n", " '61',\n", " '45',\n", " '83',\n", " '53',\n", " '37'],\n", " ['45',\n", " '85',\n", " '46',\n", " '21',\n", " '75',\n", " '54',\n", " '63',\n", " '77',\n", " '79',\n", " '56',\n", " '82',\n", " '41',\n", " '71'],\n", " ['56',\n", " '82',\n", " '46',\n", " '54',\n", " '98',\n", " '99',\n", " '65',\n", " '19',\n", " '35',\n", " '45',\n", " '85',\n", " '41',\n", " '84',\n", " '25',\n", " '16',\n", " '89',\n", " '78',\n", " '37',\n", " '63'],\n", " ['19',\n", " '71',\n", " '42',\n", " '46',\n", " '12',\n", " '85',\n", " '63',\n", " '89',\n", " '56',\n", " '49',\n", " '79',\n", " '41',\n", " '99',\n", " '11',\n", " '77'],\n", " ['85',\n", " '77',\n", " '78',\n", " '99',\n", " '61',\n", " '41',\n", " '75',\n", " '89',\n", " '57',\n", " '37',\n", " '65',\n", " '25',\n", " '54'],\n", " ['54',\n", " '66',\n", " '57',\n", " '69',\n", " '21',\n", " '78',\n", " '25',\n", " '85',\n", " '81',\n", " '29',\n", " '86',\n", " '61',\n", " '65',\n", " '99',\n", " '37',\n", " '98',\n", " '16',\n", " '89',\n", " '46',\n", " '76',\n", " '45'],\n", " ['99', '66', '57', '89', '41', '65', '16'],\n", " ['42',\n", " '35',\n", " '17',\n", " '19',\n", " '28',\n", " '11',\n", " '15',\n", " '74',\n", " '94',\n", " '77',\n", " '71',\n", " '22',\n", " '75',\n", " '83',\n", " '53'],\n", " ['46',\n", " '29',\n", " '57',\n", " '65',\n", " '45',\n", " '86',\n", " '81',\n", " '61',\n", " '84',\n", " '78',\n", " '98',\n", " '66',\n", " '35',\n", " '69',\n", " '25',\n", " '37',\n", " '82',\n", " '21',\n", " '85',\n", " '89',\n", " '76',\n", " '16',\n", " '99'],\n", " ['58',\n", " '56',\n", " '31',\n", " '22',\n", " '75',\n", " '15',\n", " '77',\n", " '34',\n", " '11',\n", " '79',\n", " '19',\n", " '17',\n", " '49',\n", " '23',\n", " '71',\n", " '28',\n", " '63',\n", " '12',\n", " '53',\n", " '74',\n", " '83'],\n", " ['41', '42', '99', '65', '12'],\n", " ['21',\n", " '37',\n", " '16',\n", " '99',\n", " '31',\n", " '82',\n", " '81',\n", " '61',\n", " '85',\n", " '34',\n", " '86',\n", " '29',\n", " '76',\n", " '45',\n", " '57'],\n", " ['22', '28', '75', '74', '63', '41', '65', '56', '89', '15', '79'],\n", " ['65',\n", " '19',\n", " '63',\n", " '35',\n", " '98',\n", " '12',\n", " '85',\n", " '28',\n", " '21',\n", " '75',\n", " '78',\n", " '17',\n", " '89',\n", " '77',\n", " '46',\n", " '54',\n", " '99',\n", " '16',\n", " '11'],\n", " ['42', '49', '71', '23', '76', '94', '53'],\n", " ['49',\n", " '63',\n", " '76',\n", " '53',\n", " '15',\n", " '28',\n", " '42',\n", " '83',\n", " '58',\n", " '71',\n", " '29',\n", " '11',\n", " '34',\n", " '22',\n", " '94',\n", " '74',\n", " '69',\n", " '31',\n", " '79',\n", " '23',\n", " '12',\n", " '86',\n", " '17'],\n", " ['82',\n", " '56',\n", " '45',\n", " '19',\n", " '21',\n", " '79',\n", " '61',\n", " '99',\n", " '89',\n", " '63',\n", " '77',\n", " '85',\n", " '54'],\n", " ['83',\n", " '49',\n", " '74',\n", " '12',\n", " '75',\n", " '77',\n", " '58',\n", " '35',\n", " '53',\n", " '79',\n", " '94',\n", " '17',\n", " '56']]" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "incorrect_sequences=[sequence for sequence in sequences if not test_sequence(sequence)]\n", "incorrect_sequences" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "from functools import cmp_to_key\n", "\n", "def comparator(x, y):\n", " # If both elements are in the graph\n", " if x in rules.nodes and y in rules.nodes:\n", " if rules.has_edge(x, y): # x must come before y\n", " return -1\n", " elif rules.has_edge(y, x): # y must come before x\n", " return 1\n", " # If one or both elements are missing, treat them as equal\n", " return 0\n", "\n", "sorted_incorrect = [sorted(sequence, key=cmp_to_key(comparator)) for sequence in incorrect_sequences]" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "4971" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sum([int(sequence[len(sequence)//2]) for sequence in sorted_incorrect if test_sequence(sequence)])" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" } }, "nbformat": 4, "nbformat_minor": 2 }