Roderic Day 5年前
コミット
ffb487b898
2個のファイルの変更40行の追加2行の削除
  1. +5
    -2
      y2019/intcode.py
  2. +35
    -0
      y2019/p07.py

+ 5
- 2
y2019/intcode.py ファイルの表示

@@ -1,3 +1,4 @@
import itertools
import re


@@ -19,9 +20,11 @@ def get_parameters(ns, pos, modes, N, writes):
yield pos + N


def compute(ns, inp):
def compute(ns, in_iter):
if isinstance(ns, str):
ns = parse(ns)
if isinstance(in_iter, int):
in_iter = itertools.cycle([in_iter])

pos = 0
consume = lambda n, writes='': get_parameters(ns, pos, modes, n, writes)
@@ -43,7 +46,7 @@ def compute(ns, inp):

elif op == 3:
a, pos = consume(1, 'a')
ns[a] = inp
ns[a] = next(in_iter)

elif op == 4:
a, pos = consume(1)

+ 35
- 0
y2019/p07.py ファイルの表示

@@ -0,0 +1,35 @@
import sys
import itertools
from intcode import compute


ns = sys.stdin.read()


def solve(ns, phases):
out = 0
for n in phases:
out = list(compute(ns, iter([n, out])))[-1]
return out

print(max(solve(ns, phases) for phases in itertools.permutations(range(5))))


def solve2(ns, phases):
feedback = []
iter_phases = iter(phases)
iter_feed = iter(feedback)
loop = itertools.cycle([
compute(ns, itertools.chain([next(iter_phases), 0], iter_feed)),
compute(ns, itertools.chain([next(iter_phases)], iter_feed)),
compute(ns, itertools.chain([next(iter_phases)], iter_feed)),
compute(ns, itertools.chain([next(iter_phases)], iter_feed)),
compute(ns, itertools.chain([next(iter_phases)], iter_feed)),
])
try:
for machine in loop:
feedback.append(next(machine))
except StopIteration:
return feedback[-1]

print(max(solve2(ns, phases) for phases in itertools.permutations(range(5, 10))))

読み込み中…
キャンセル
保存