| import collections | import collections | ||||
| import os | import os | ||||
| import re | import re | ||||
| import subprocess | |||||
| import sys | import sys | ||||
| from pathlib import Path | from pathlib import Path | ||||
| response = requests.get(url, cookies=cookies) | response = requests.get(url, cookies=cookies) | ||||
| response.raise_for_status() | response.raise_for_status() | ||||
| Path(path).write_bytes(response.content) | Path(path).write_bytes(response.content) | ||||
| def md5(strings): | |||||
| cmd = ['md5'] + [c for s in strings for c in ['-s', s]] | |||||
| out = subprocess.check_output(cmd).decode() | |||||
| return re.findall(r'"(.+)"\) = (.+)', out) |
| import re | |||||
| import sys | |||||
| pos = 0 | |||||
| ori = 1 | |||||
| seen = set() | |||||
| ans2 = None | |||||
| for turn, steps in re.findall(r'(R|L)(\d+)', sys.stdin.read()): | |||||
| ori *= {'R': 1j, 'L': -1j}[turn] | |||||
| for _ in range(int(steps)): | |||||
| pos += ori | |||||
| if ans2 is None and pos in seen: | |||||
| ans2 = abs(pos.real) + abs(pos.imag) | |||||
| seen.add(pos) | |||||
| ans1 = abs(pos.real) + abs(pos.imag) | |||||
| print(ans1) | |||||
| print(ans2) |
| import sys | |||||
| import toolkit | |||||
| def travel(text, start, image): | |||||
| grid, _, _ = toolkit.read_image(image) | |||||
| pos = {v: k for k, v in grid.items()}[start] | |||||
| for line in text.splitlines(): | |||||
| for step in map(moves.get, line): | |||||
| if grid[pos + step].strip(): | |||||
| pos += step | |||||
| yield grid[pos] | |||||
| text = sys.stdin.read() | |||||
| moves = {'U': -1j, 'L': -1, 'R': 1, 'D': 1j} | |||||
| keypad1 = ''' | |||||
| 123 | |||||
| 456 | |||||
| 789 | |||||
| ''' | |||||
| keypad2 = ''' | |||||
| 1 | |||||
| 234 | |||||
| 56789 | |||||
| ABC | |||||
| D | |||||
| ''' | |||||
| print(''.join(travel(text, '5', keypad1))) | |||||
| print(''.join(travel(text, '7', keypad2))) |
| import sys | |||||
| grid = [line.split() for line in sys.stdin.readlines()] | |||||
| ans1 = 0 | |||||
| for line in grid: | |||||
| a, b, c = sorted(map(int, line)) | |||||
| ans1 += a + b > c | |||||
| print(ans1) | |||||
| ans2 = 0 | |||||
| for col in zip(*grid): | |||||
| for line in zip(*[iter(col)] * 3): | |||||
| a, b, c = sorted(map(int, line)) | |||||
| ans2 += a + b > c | |||||
| print(ans2) |
| import re | |||||
| import sys | |||||
| from collections import Counter | |||||
| def decode(string, n): | |||||
| def replacer(match): | |||||
| char = match.group(0) | |||||
| return chr((ord(char) + n - ord('a')) % 26 + ord('a')) | |||||
| return re.sub(r'\w', replacer, string) | |||||
| text = sys.stdin.read() | |||||
| ans1 = 0 | |||||
| for line in text.splitlines(): | |||||
| name, sid, checksum = re.match(r'^(.+)-(\d+)\[(.+)\]$', line).groups() | |||||
| by_count = ''.join(dict(Counter(sorted(name)).most_common())) | |||||
| calc = by_count.replace('-', '')[:5] | |||||
| if calc == checksum: | |||||
| ans1 += int(sid) | |||||
| decoded = decode(name, int(sid)) | |||||
| if 'north' in decoded: | |||||
| ans2 = sid | |||||
| print(ans1) | |||||
| print(ans2) |
| import itertools | |||||
| import sys | |||||
| import toolkit | |||||
| text = sys.stdin.read().strip() | |||||
| password1 = [] | |||||
| password2 = ['_' for _ in range(8)] | |||||
| for i in itertools.count(): | |||||
| strings = [f'{text}{1000 * i + k}' for k in range(1000)] | |||||
| for string, digest in toolkit.md5(strings): | |||||
| if digest.startswith('00000'): | |||||
| print(string, digest) | |||||
| password1.append(digest[5]) | |||||
| if digest[5] in '01234567' and password2[int(digest[5])] == '_': | |||||
| password2[int(digest[5])] = digest[6] | |||||
| if len(password1) >= 8 and '_' not in password2: | |||||
| break | |||||
| print(''.join(password1[:8])) | |||||
| print(''.join(password2[:8])) |