瀏覽代碼

🙃

master
Roderic Day 5 年之前
父節點
當前提交
00afdb8d79
共有 3 個文件被更改,包括 26 次插入6 次删除
  1. +16
    -5
      y2019/intcode.py
  2. +2
    -1
      y2019/p02.py
  3. +8
    -0
      y2019/p09.py

+ 16
- 5
y2019/intcode.py 查看文件

@@ -1,20 +1,26 @@
import collections
import itertools
import re


def parse(string):
return [int(n) for n in re.findall(r'-?\d+', string)]
memory = collections.defaultdict(int)
memory.update(enumerate(int(n) for n in re.findall(r'-?\d+', string)))
return dict(memory)


def get_parameters(ns, pos, modes, N, writes):
def get_parameters(ns, pos, modes, N, writes, relbase):
for c in writes:
# paradox: return immediate mode to use positionally outside
modes[ord(c) - ord('a')] = '1'
modes[ord(c) - ord('a')] += '-special'

for mode, x in zip(modes, ns[pos:][:N]):
for mode, x in zip(modes, [ns[y] for y in range(pos, pos + N)]):
yield {
'0': lambda: ns[x],
'1': lambda: x,
'2': lambda: ns[x + relbase],
'0-special': lambda: x,
'2-special': lambda: x + relbase,
}[mode]()

yield pos + N
@@ -27,7 +33,8 @@ def compute(ns, in_iter):
in_iter = itertools.cycle([in_iter])

pos = 0
consume = lambda n, writes='': get_parameters(ns, pos, modes, n, writes)
relbase = 0
consume = lambda n, writes='': get_parameters(ns, pos, modes, n, writes, relbase)

while True:
op = ns[pos] % 100
@@ -70,6 +77,10 @@ def compute(ns, in_iter):
a, b, c, pos = consume(3, 'c')
ns[c] = int(a == b)

elif op == 9:
a, pos = consume(1)
relbase += a

elif op == 99:
return


+ 2
- 1
y2019/p02.py 查看文件

@@ -6,7 +6,8 @@ from intcode import compute, parse

def check(noun, verb):
ns = parse(text)
ns[1:3] = [noun, verb]
ns[1] = noun
ns[2] = verb
list(compute(ns, 2))
return ns[0]


+ 8
- 0
y2019/p09.py 查看文件

@@ -0,0 +1,8 @@
import re
import sys

from intcode import compute

text = sys.stdin.read()
print(next(compute(text, 1)))
print(next(compute(text, 2)))

Loading…
取消
儲存