для друзей Андрея
Эта страницы содержит авторские идеи решений задач Новогоднего контеста, который прошёл 1 января 2026 года. Если вы ещё не решали задачи, то советую сначала порешать их (даже если не участвовали в самом контесте), и только потом читать разборы. Для этого зарегистрируйтесь на главной 2026.andgein.ru. Там же можно прочитать, что вообще такое этот наш Новогодний контест.
Несмотря на то что здесь нет готовых программ, ниже вы найдёте содержимое уровней и идеи решений для всех задач, а значит, огромное количество спойлеров. Будьте аккуратны!
Внимание! На этой странице есть ответы ко всем задачам. Пожалуйста, если вы уже посмотрели ответ, не отправляйте его от своего имени на проверку. Дорешивать задачи можно и нужно, но не путём копирования ответов с этой страницы :-)
Перейти к разбору конкретной задачи:
В этой задаче надо было составить арифметическое выражение заданной длины (или короче), значение которого равно заданному целому числу. В выражении при этом было нельзя использовать определённые символы — например, некоторые цифры и символ «+». Заданное целое число, ограничение на длину и набор запрещённых символов менялись от уровня к уровню: на первом уровне, к примеру, нужно было получить 2026 из выражения не длиннее 7 символов, не используя цифры 2, 0 и 6.
Правильность ответа проверялась с помощью
питоновской функции eval(),
в которую были добавлены ограничения: нельзя было импортировать модули, вызывать функции и обращаться к атрибутам.
Первые несколько уровней можно было решить вручную, достаточно было использовать простые операции сложения, вычитания, умножения и возведения в степень.
| № | Значение | Запрещенные символы | Макс. длина | Пример ответа | Ещё короче |
|---|---|---|---|---|---|
| 1 | 2026 | 2 0 6 | 7 | 1989+37 | |
| 2 | 4096 | 4 0 9 6 8 | 5 | 2**12 | |
| 3 | 32768 | 3 2 7 6 8 | 5 | 2**15 | |
| 4 | 4 | 0 2 3 4 5 6 7 8 9 | 7 | 1+1+1+1 | ~1*~1 |
| 5 | 2026 | 0 2 3 4 5 6 7 8 9 | 18 | (1+1)**11-11*(1+1) | 11*~1^-1<<11 |
| 6 | 2026 | 0 1 3 4 5 6 7 8 9 | 15 | 2222-222+22+2+2 | 2^22*-~22<<2 |
| 7 | 387420489 | (нет) | 4 | 9**9 | |
Для более сложных уровней можно было написать перебор, стартующий с всевозможных целых чисел, которые можно составить из «разрешённых» цифр, и генерирующий все выражения длин 1, 2, 3, и так далее путём составления всё более сложных и сложных выражений. Важно не запутаться в приоритетах, но LLM отлично пишет такой код.
В некоторых уровнях можно было также добавить дробные числа или числа в экспоненциальной записи (4e6), чтобы
найти оптимальное выражение. Сделать это просто: достаточно лишь добавить такие числа в набор стартовых чисел,
с которых начинается перебор.
Кроме того, полезно начать использовать операцию логического отрицания к числу ~.
Например, ~1 == -2 (объяснение, почему так).
| № | Значение | Запрещенные символы | Макс. длина | Пример ответа | Ещё короче |
|---|---|---|---|---|---|
| 8 | 4 | 0 2 3 4 5 6 7 8 9 | 5 | ~1*~1 | |
| 9 | 2026 | 0 2 3 4 5 6 7 8 9 | 13 | 11*~1+(1<<11) | 11*~1^-1<<11 |
| 10 | 2026 | 0 1 3 4 5 6 7 8 9 | 12 | 2|22*-~22<<2 | |
| 11 | 77777 | 0 1 6 7 9 | 9 | 38888.5*2 или 233332//3 | 8e4-2223 |
| 12 | 3333333 | 0 1 2 3 7 8 9 | 10 | 666666.6*5 | 5e6*4//6 |
| 13 | 3703629630 | 0 1 2 3 4 7 8 9 | 11 | 66666*55555 | |
| 14 | 267557741 | 0 3 4 5 6 7 8 9 | 11 | 121*2211221 | |
| 15 | 10692 | 0 2 3 4 5 6 7 9 | 9 | 1881+8811 | ~8*-1188 |
| 16 | 3704479 | 0 1 2 3 4 7 8 9 | 10 | 6556.6*565 | |
| 17 | 22896 | 0 1 2 4 5 6 7 9 | 12 | 8883888//388 | |
| 18 | 88507 | 0 1 3 4 6 7 9 | 9 | 222+88285 | 85^88558 |
| 19 | -150 | 0 2 4 5 6 7 9 | 9 | 1183-1333 | 38-188 |
Следующая группа уровней была посвящена шестнадцатеричной системе счисления, ведь она позволяет составлять выражения вообще без использования цифр! Решение тем не менее не меняется, достаточно лишь добавить и шестнадцатеричные числа в список стартовых, если уж никакие цифры, кроме нуля, использовать нельзя. Ноль нужен, так как шестнадцатеричные числа в питоне записываются как 0xBEA.
| № | Значение | Запрещенные символы | Макс. длина | Пример ответа | Ещё короче |
|---|---|---|---|---|---|
| 20 | 65535 | 6 5 3 4 8 | 6 | 0xffff | |
| 21 | 3134175981 | 1 2 3 4 5 6 7 8 9 | 10 | 0xbacfbaed | |
| 22 | 68522 | 1 2 3 4 5 6 7 8 9 | 12 | 0xfef+0xfbbb | |
| 23 | 52216 | 1 2 3 4 5 6 7 8 9 | 13 | 0xebfb&0xcbfc | ~-~-0xcbfa |
| 24 | 2060 | 1 2 3 4 5 6 7 8 9 | 14 | 0xfc0c&0xd0aae | 0xa*0xce |
| 25 | 2717 | 1 2 3 4 5 6 7 8 9 | 13 | 0xddfdf&0xabd | 0xaab-0xe |
| 26 | 52620 | 1 2 3 4 5 6 7 8 9 | 14 | 0xadfbc&0xedcd | 0xbd+0xcccf |
| 27 | 54356248353 | 1 2 3 4 5 6 7 8 9 | 14 | 0xfbdf*0xcdcff | |
| 28 | -89152 | 1 2 3 4 5 6 7 8 9 | 15 | 0xba0ce-0xcfd0e | -0xbba0-0xa0a0 |
| 29 | 42012 | 1 2 3 4 5 6 7 8 9 | 12 | 0xaa0^0xaebc | 0xc*0xdad |
| 30 | 2026 | 1 2 3 4 5 6 7 8 9 y o u w a n t d e c a f ? I W A N T D E C A F ! | 26 | (-~0-~0)**0xb-0xb*(-~0-~0) | ~0<<0xb^-0xb-0xb |
Но что делать, если запрещено использовать все цифры и даже ноль? Здесь на помощь придёт константа True,
ведь True == 1 («Why is bool a subclass of int?»)!
Таким образом, можно составить выражения, используя только True:
например, (True+True<<True+True)+True == 9. Для этого нужно составить выражение,
используя только единицы, а затем заменить все единицы на «True». Ну а для этого у нас уже готов код!
Надо лишь упростить список стартовых чисел до [1] — ничего, кроме единицы, теперь использовать нельзя.
Для простоты и ускорения процесса можно генерировать выражения не только из единиц, но из единиц и двоек, а двойку
затем заменить на -~True (не забыв избавиться от иногда получающихся двойных минусов «--» и заменив их на плюсы).
| № | Значение | Запрещенные символы | Макс. длина | Пример ответа |
|---|---|---|---|---|
| 31 | 1 | 0 1 2 3 4 5 6 7 8 9 | 4 | True |
| 32 | 2 | 0 1 2 3 4 5 6 7 8 9 / | 6 | -~True |
| 33 | 6 | 0 1 2 3 4 5 6 7 8 9 / | 13 | ~True*~-~True |
| 34 | 52 | 0 1 2 3 4 5 6 7 8 9 / | 35 | ~True*~True^True-~True<<~True*~True |
| 35 | 10 | 0 1 2 3 4 5 6 7 8 9 - / | 22 | True+~True*~True<<True |
| 36 | 841 | 0 1 2 3 4 5 6 7 8 9 / | 38 | (~-~True^~True<<~True*~True)**(-~True) |
| 37 | 863 | 0 1 2 3 4 5 6 7 8 9 / | 38 | ~(~-~True<<-~True)**(True-~True)>>True |
| 38 | 602 | 0 1 2 3 4 5 6 7 8 9 / | 52 | -~True^~-~True*~(True-~True<<True-~True)<<True-~True |
| 39 | 1508 | 0 1 2 3 4 5 6 7 8 9 / | 50 | ~True*(~True^~(~-~True<<~True*~True)<<~True*~True) |
| 40 | 1403 | 0 1 2 3 4 5 6 7 8 9 / | 53 | ~(~-~True<<True-~True)*(~-~True^-True<<~True*~-~True) |
| 41 | 1286 | 0 1 2 3 4 5 6 7 8 9 / | 50 | ~True*~-~True^True+~True*~True<<(True<<True-~True) |
| 42 | 1885 | 0 1 2 3 4 5 6 7 8 9 | 46 | ~(-~-~True<<-~True)*~(~-~True<<-~True)**-~True |
| 43 | 636 | 0 1 2 3 4 5 6 7 8 9 | 40 | ~(~-~True+~True<<-~True-~-~True)<<-~True |
| 44 | 774 | 0 1 2 3 4 5 6 7 8 9 | 36 | ~-~True*~-~(~True)**(-~True<<-~True) |
| 45 | 819 | 0 1 2 3 4 5 6 7 8 9 | 43 | (~-~True)**(-~True<<-~True)+~True>>-~-~True |
| 46 | 1536 | 0 1 2 3 4 5 6 7 8 9 | 25 | -~-~True<<~-~True*~-~True |
| 47 | 2435 | 0 1 2 3 4 5 6 7 8 9 | 59 | -~-~True^True+-~True*~-~True*~-~True<<-~True-~-~True+-~True |
| 48 | 2061 | 0 1 2 3 4 5 6 7 8 9 | 45 | True^(-~-~True^True<<~-~True*~-~True)<<-~True |
| 49 | 2089 | 0 1 2 3 4 5 6 7 8 9 | 55 | True^-~True-~-~True+(~True)**(-~True<<-~True)<<-~-~True |
| 50 | 2108 | 0 1 2 3 4 5 6 7 8 9 | 46 | (True^~-~True<<-~-~True)**-~True+~True<<-~True |
| 51 | 573 | 0 1 2 3 4 5 6 7 8 9 | 35 | ~-~True+(~-~True<<-~-~True)**-~True |
Последние уровни были посвящены случаю, когда запрещена и буква «e», а, значит, написать True больше нельзя...
В этом случае единицу нужно заменить на not[].
Ну а если и квадратные скобки запрещены, то на not() или ()==() — ограничения были достаточно мягкими.
| № | Значение | Запрещенные символы | Макс. длина | Пример ответа |
|---|---|---|---|---|
| 52 | 919 | 0 1 2 3 4 5 6 7 8 9 E e | 85 | (not[])+~(not[])*~((not[])<<~(not[])*~(not[]))*((not[])-~(not[]))**((not[])-~(not[])) |
| 53 | 1942 | 0 1 2 3 4 5 6 7 8 9 E e | 68 | ~(not[])^(~-~(not[]))**((not[])+~(not[])*~(not[]))<<(not[])-~(not[]) |
| 54 | 2506 | 0 1 2 3 4 5 6 7 8 9 E e | 75 | (not[])+~(not[])*~((not[])+~(not[])*~(not[]))**(~(not[])*~(not[]))<<(not[]) |
| 55 | 656 | 0 1 2 3 4 5 6 7 8 9 E e | 53 | -~(~-~(not[]))**(~(not[])*~(not[]))<<(not[])-~(not[]) |
| 56 | 1047 | 0 1 2 3 4 5 6 7 8 9 E e | 70 | ~((~-~(not[])^(not[])<<(not[])+~(not[])*~-~(not[]))<<(not[])-~(not[])) |
| 57 | 797 | 0 1 2 3 4 5 6 7 8 9 E e | 75 | ~-~(not[])^~((not[])-~(not[])<<(not[])-~(not[]))<<(not[])+~(not[])*~(not[]) |
| 58 | 2540 | 0 1 2 3 4 5 6 7 8 9 E e | 71 | ~(~(not[])<<~(not[])*~-~(not[]))*((not[])+~(not[])*~(not[])<<-~(not[])) |
| 59 | 2127 | 0 1 2 3 4 5 6 7 8 9 E e | 85 | ((not[])+~(not[])*(~(not[])^(not[])<<~(not[])*~-~(not[]))<<~(not[])*~(not[]))-(not[]) |
| 60 | 1991 | 0 1 2 3 4 5 6 7 8 9 E e | 72 | ~(~(~(~(not[])<<~(not[])*~(not[]))<<(not[])-~(not[]))<<(not[])-~(not[])) |
| 61 | 1190 | 0 1 2 3 4 5 6 7 8 9 E e | 78 | (not[])-~-~(not[])*~-~(not[])*(~(not[])^(not[])<<~(not[])*~-~(not[]))<<(not[]) |
| 62 | 467 | 0 1 2 3 4 5 6 7 8 9 E e ' " ! @ # $ % [ ] { } | 76 | ~(~(()==())<<(()==())-~(()==()))*~(~(()==())<<~(()==())*~(()==()))-~(()==()) |
| 63 | 1474 | 0 1 2 3 4 5 6 7 8 9 E e ' " ! @ # $ % [ ] { } | 68 | -~(()==())^~(~-~(()==())<<(()==())-~(()==()))<<~(()==())*~-~(()==()) |
| 64 | 741 | 0 1 2 3 4 5 6 7 8 9 E e ' " ! @ # $ % [ ] { } | 84 | ~-~(()==())*((()==())^((()==())^~(()==())<<~(()==())*~(()==()))<<(()==())-~(()==())) |
| 65 | 235 | 0 1 2 3 4 5 6 7 8 9 E e ' " ! @ # $ % [ ] { } | 66 | ((()==())+~(()==())*~(()==()))*~(~-~(()==())<<~(()==())*~(()==())) |
| 66 | 2330 | 0 1 2 3 4 5 6 7 8 9 E e ' " ! @ # $ % [ ] { } | 94 | ~-~(()==())*~-~(()==())*((()==())-~(()==())^(()==())<<((()==())<<(()==())-~(()==())))-(()==()) |
| 67 | 680 | 0 1 2 3 4 5 6 7 8 9 E e ' " ! @ # $ % [ ] { } | 61 | (-(()==())<<~-~(()==())*~-~(()==()))//~-~(()==())<<-~(()==()) |
| 68 | 1360 | 0 1 2 3 4 5 6 7 8 9 E e ' " ! @ # $ % [ ] { } | 69 | (-(()==())<<~-~(()==())*~-~(()==()))//~-~(()==())<<(()==())-~(()==()) |
| 69 | 1835 | 0 1 2 3 4 5 6 7 8 9 E e ' " ! @ # $ % [ ] { } | 90 | ~(~((()==())<<~(()==())*~(()==()))*((()==())-~(()==()))**((()==())-~(()==()))<<-~(()==())) |
| 70 | 1564 | 0 1 2 3 4 5 6 7 8 9 E e ' " ! @ # $ % [ ] { } | 83 | (()==())+~((()==())+~(()==())*~(()==()))**((()==())+~(()==())*~(()==()))//~(()==()) |
| 71 | 2687 | 0 1 2 3 4 5 6 7 8 9 E e ' " ! @ # $ % [ ] { } | 78 | ~(~((()==())+~(()==())*~(()==())<<-~(()==()))<<(()==())+~(()==())*~-~(()==())) |
Примечание: операции вида ~(not[]) работают, но вызывают предупреждение в современном питоне:
>>> ~(not[])
<stdin>:1: DeprecationWarning: Bitwise inversion '~' on bool is deprecated and will be removed in Python 3.16. This returns the bitwise inversion of the underlying int object and is usually not what you expect from negating a bool. Use the 'not' operator for boolean negation or ~int(x) if you really want the bitwise inversion of the underlying int.
-2
К счастью, на дворе 2026, а питон 3.16 выйдет только в 2027 ;-)
Примечание 2: во время контеста участники нашли элегантный способ получать числовые константы:
b'"'[b''<b'']*b'K'[b''<b'']-b'\n'[b''<b'']
Кайф!
В этой задаче нужно было отгадать последовательность чисел, загаданную в игре «Быки и коровы», если известны все попытки отгадать её и количество быков/коров в каждой попытке.
Если возможных вариантов несколько, то в качестве небольшого усложнения надо было найти лексикографически минимальный.
Я не знаю способа решить эту задачу лучше перебора (расскажите, если знаете!). Более того, существующие LLM с возможностью запускать код неплохо справляются перебирать ответы и находить правильный. Единственная проблема, которая может возникнуть, — ограничение по времени. Нам нужно перебирать достаточно эффективно, чтобы успеть пройти все уровни за пять часов контеста! В этом и заключалась основная сложность этой задачи.
Как и в других задачах, первые уровни можно пройти вручную — в них загаданная последовательность восстанавливается однозначно (если предположить, что чисел больше десятки в ней нет).
Для более сложных уровней подойдёт тривиальный перебор всех возможных загаданных последовательностей и проверка каждой из них.
MAX_NUMBER = 10
NUMBER_COUNT = 4
for secret in itertools.permutations(range(1, MAX_NUMBER), NUMBER_COUNT):
if is_valid(secret):
return secret
def is_valid(secret: list[int]) -> bool:
for numbers, bulls, cows in guesses:
if score(secret, numbers) != (bulls, cows):
return False
return True
def score(secret: list[int], guess: list[int]) -> tuple[int, int]:
bulls = sum(1 for i in range(len(secret)) if secret[i] == guess[i])
common = len(set(secret) & set(guess))
return bulls, common - bulls
Для ускорения этого перебора можно было реализовать перебор с возвратом (backtracking) —
постепенно добавлять по одному числу в secret и поддерживать количество «быков»
и «коров», которые уже набрались для каждой заданной попытки. Если хотя бы для одной они превышают
необходимое количество, перебор останавливается, и мы переходим к следующим вариантам.
Такой подход позволяет отсечь большое количество «мёртвых» ветвей перебора.
Но самое быстрое из известных мне решений переформулирует условие как SAT-задачу и использует один из существующих фреймворков для решения таких задач: например, Google OR-Tools или Microsoft Z3. Биндинги для этих библиотек существуют под многие языки программирования, а решение выглядит как объявление нужного количества переменных и формулирование всех ограничений. Например, в случае с Z3:
s = z3.Solver()
x = [z3.Int(f"x_{i}") for i in range(K)]
for xi in x:
s.add(And(xi >= 1, xi <= N))
s.add(Distinct(x))
for numbers, bulls, cows in guesses:
add_guess_constraints(s, x, numbers, bulls, cows)
Посмотреть, как можно написать add_guess_constraints()
def add_guess_constraints(solver, secret_vars, guess: list[int], bulls: int, cows: int):
K = len(secret_vars)
# Counting Bulls: positions where secret[i] == guess[i]
bull_bools = [secret_vars[i] == guess[i] for i in range(K)]
bull_count = z3.Sum([z3.If(b, 1, 0) for b in bull_bools])
solver.add(bull_count == bulls)
# Counting Cows
exists_in_secret = []
for value in guess:
# 1 if the value is in the secret, 0 otherwise
value_exists_in_secret = z3.Sum([z3.If(secret_vars[i] == value, 1, 0) for i in range(K)])
exists_in_secret.append(value_exists_in_secret)
total_common = z3.Sum(exists_in_secret)
solver.add(total_common == bulls + cows)
Для поиска же минимального решения можно воспользоваться встроенным в z3 оптимизатором — z3.Optimize(),
но в моих экспериментах он показал себя медленнее (YMMV!) следующего подхода:
давайте переберём короткие префиксы в лексикографическом порядке (начнём с «1 2», затем «1 3», и так далее),
зафиксируем их в нашем ответе и пробуем найти любое (необязательно минимальное!) решение с помощью z3.Solver().
Если находится, а с предыдущими префиксами не находилось, значит, мы нашли минимально возможный префикс! Продолжим наращивать его,
пока не найдём ответ.
| № | Описание уровня | Ответ |
|---|---|---|
| 1 | 5 попыток, каждая из 4 чисел | 8 6 1 4 |
| 2 | 6 попыток, каждая из 4 чисел | 4 2 1 6 |
| 3 | 1 попытка из 4 чисел | 5 1 8 2 |
| 4 | 3 попытки, каждая из 4 чисел | 3 5 7 1 |
| 5 | 4 попытки, каждая из 4 чисел | 1 5 4 2 |
| 6 | 3 попытки, каждая из 4 чисел | 3 2 6 7 |
| 7 | 4 попытки, каждая из 4 чисел | 1 7 4 3 |
| 8 | 6 попыток, каждая из 4 чисел | 3 8 6 5 |
| 9 | 8 попыток, каждая из 4 чисел | 10 8 6 7 |
| 10 | 3 попытки, каждая из 4 чисел | 4 1 3 6 |
| 11 | 4 попытки, каждая из 4 чисел | 1 2 6 8 |
| 12 | 4 попытки, каждая из 4 чисел | 2 4 9 8 |
| 13 | 3 попытки, каждая из 4 чисел | 1 3 4 8 |
| 14 | 4 попытки, каждая из 4 чисел | 5 6 8 9 |
| 15 | 4 попытки, каждая из 4 чисел | 1 7 8 4 |
| 16 | 6 попыток, каждая из 5 чисел | 8 9 7 6 3 |
| 17 | 5 попыток, каждая из 5 чисел | 2 8 5 9 7 |
| 18 | 3 попытки, каждая из 5 чисел | 1 3 4 2 10 |
| 19 | 3 попытки, каждая из 5 чисел | 6 7 4 8 9 |
| 20 | 4 попытки, каждая из 5 чисел | 1 6 4 10 11 |
| 21 | 6 попыток, каждая из 5 чисел | 3 5 7 9 8 |
| 22 | 3 попытки, каждая из 5 чисел | 1 7 8 9 10 |
| 23 | 3 попытки, каждая из 5 чисел | 1 3 4 8 9 |
| 24 | 5 попыток, каждая из 5 чисел | 1 4 8 5 10 |
| 25 | 5 попыток, каждая из 5 чисел | 4 3 9 1 5 |
| 26 | 6 попыток, каждая из 5 чисел | 1 6 5 2 4 |
| 27 | 6 попыток, каждая из 5 чисел | 4 5 11 6 8 |
| 28 | 2 попытки, каждая из 6 чисел | 1 2 5 8 11 12 |
| 29 | 6 попыток, каждая из 6 чисел | 3 4 10 9 7 11 |
| 30 | 7 попыток, каждая из 6 чисел | 5 10 11 4 9 12 |
| 31 | 3 попытки, каждая из 6 чисел | 1 3 2 8 9 5 |
| 32 | 7 попыток, каждая из 5 чисел | 8 7 9 10 1 |
| 33 | 4 попытки, каждая из 6 чисел | 1 3 10 6 9 4 |
| 34 | 5 попыток, каждая из 6 чисел | 1 3 4 7 5 9 |
| 35 | 3 попытки, каждая из 5 чисел | 1 5 7 4 3 |
| 36 | 8 попыток, каждая из 5 чисел | 1 2 10 9 3 |
| 37 | 5 попыток, каждая из 5 чисел | 1 2 8 11 13 |
| 38 | 5 попыток, каждая из 6 чисел | 2 8 1 14 5 4 |
| 39 | 10 попыток, каждая из 6 чисел | 16 13 6 10 4 11 |
| 40 | 9 попыток, каждая из 7 чисел | 10 3 14 13 12 7 17 |
| 41 | 10 попыток, каждая из 7 чисел | 3 8 5 19 7 14 16 |
| 42 | 9 попыток, каждая из 8 чисел | 15 3 4 6 8 19 22 21 |
| 43 | 8 попыток, каждая из 8 чисел | 1 13 5 3 6 9 7 18 |
| 44 | 13 попыток, каждая из 9 чисел | 18 2 20 22 13 10 23 8 26 |
| 45 | 11 попыток, каждая из 9 чисел | 2 5 22 6 25 20 26 23 28 |
| 46 | 60 попыток, каждая из 4 чисел | 60 9 11 55 |
| 47 | 53 попытки, каждая из 5 чисел | 2 7 10 11 12 |
| 48 | 55 попыток, каждая из 6 чисел | 2 102 113 227 62 185 |
| 49 | 42 попытки, каждая из 7 чисел | 6 86 47 87 164 192 309 |
| 50 | 40 попыток, каждая из 8 чисел | 1 2 3 8 6 9 10 166 |
| 51 | 24 попытки, каждая из 10 чисел | 6 10 24 15 1 27 2 25 18 28 |
| 52 | 25 попыток, каждая из 10 чисел | 2 3 27 13 16 4 11 22 25 19 |
| 53 | 25 попыток, каждая из 10 чисел | 21 7 20 29 4 1 22 8 16 6 |
| 54 | 24 попытки, каждая из 10 чисел | 2 5 11 16 25 22 18 14 30 21 |
| 55 | 20 попыток, каждая из 10 чисел | 5 7 8 9 14 19 2 16 25 15 |
| 56 | 23 попытки, каждая из 10 чисел | 6 18 5 15 9 22 11 30 17 24 |
| 57 | 22 попытки, каждая из 10 чисел | 21 8 30 19 28 29 14 22 25 1 |
| 58 | 21 попытка, каждая из 10 чисел | 11 12 24 9 13 17 28 21 26 19 |
| 59 | 24 попытки, каждая из 10 чисел | 27 3 11 1 26 6 10 19 25 28 |
| 60 | 23 попытки, каждая из 10 чисел | 29 22 23 13 21 3 6 18 4 25 |
| 61 | 10 попыток, каждая из 10 чисел | 13 1 11 7 14 18 21 25 28 30 |
| 62 | 12 попыток, каждая из 10 чисел | 8 25 27 9 19 28 16 30 13 31 |
| 63 | 12 попыток, каждая из 10 чисел | 5 7 27 9 8 23 12 2 30 28 |
| 64 | 13 попыток, каждая из 10 чисел | 6 9 10 11 13 22 21 23 29 30 |
| 65 | 10 попыток, каждая из 10 чисел | 7 4 8 15 14 18 24 27 26 30 |
| 66 | 16 попыток, каждая из 10 чисел | 10 3 8 16 11 15 20 21 13 30 |
| 67 | 12 попыток, каждая из 10 чисел | 6 5 8 13 10 9 21 17 28 30 |
| 68 | 12 попыток, каждая из 10 чисел | 3 17 2 6 22 24 27 25 30 31 |
| 69 | 13 попыток, каждая из 10 чисел | 3 1 8 10 9 21 29 16 19 30 |
| 70 | 14 попыток, каждая из 10 чисел | 27 14 13 2 7 11 22 17 25 30 |
| 71 | 39 попыток, каждая из 12 чисел | 20 35 61 38 42 80 30 25 55 31 86 46 |
| 72 | 46 попыток, каждая из 12 чисел | 73 43 6 97 63 45 15 78 85 74 11 100 |
| 73 | 46 попыток, каждая из 12 чисел | 25 3 39 71 48 82 53 57 60 64 97 89 |
| 74 | 35 попыток, каждая из 12 чисел | 7 27 65 46 9 53 3 21 45 63 88 43 |
| 75 | 43 попытки, каждая из 12 чисел | 1 19 7 28 61 75 36 67 90 94 82 10 |
| 76 | 44 попытки, каждая из 12 чисел | 79 5 26 64 68 23 75 78 80 93 95 97 |
| 77 | 44 попытки, каждая из 12 чисел | 1 59 90 5 25 11 93 12 98 27 88 96 |
| 78 | 30 попыток, каждая из 12 чисел | 12 21 19 75 24 27 30 41 42 44 16 84 |
| 79 | 33 попытки, каждая из 12 чисел | 57 4 40 65 61 38 59 82 67 68 87 88 |
| 80 | 37 попыток, каждая из 12 чисел | 25 58 71 27 31 77 19 7 37 65 93 78 |
| 81 | 59 попыток, каждая из 14 чисел | 37 32 11 19 54 48 66 57 83 8 74 82 39 15 |
| 82 | 58 попыток, каждая из 14 чисел | 5 4 28 72 42 44 79 50 8 80 38 94 99 93 |
| 83 | 50 попыток, каждая из 14 чисел | 4 28 37 44 31 59 60 66 35 83 79 81 99 19 |
| 84 | 54 попытки, каждая из 14 чисел | 21 36 8 14 69 46 61 94 9 81 76 77 72 83 |
| 85 | 54 попытки, каждая из 14 чисел | 11 83 23 31 65 33 47 29 97 62 93 98 100 68 |
| 86 | 66 попыток, каждая из 14 чисел | 21 70 17 49 74 80 63 86 38 71 64 10 91 26 |
| 87 | 50 попыток, каждая из 14 чисел | 9 14 33 95 71 43 54 73 82 55 96 97 99 81 |
| 88 | 66 попыток, каждая из 14 чисел | 6 25 88 14 81 38 69 21 2 93 58 74 56 57 |
| 89 | 70 попыток, каждая из 14 чисел | 5 4 38 44 67 40 37 57 50 41 69 21 46 11 |
| 90 | 54 попытки, каждая из 14 чисел | 36 25 5 26 54 24 18 51 2 55 97 21 74 80 |
В этой задаче надо было написать достаточно короткую программу на известнейшем
эзотерическом языке программирования брейнфак.
Программа должна выводить одну строчку, но строчка эта должна зависеть от того (и только от того!), что подали программе
на вход. Например, при вводе строки «what» программа должна вывести «contest»,
а при вводе «where» — «2026.andgein.ru».
На обычном языке программирования такая программа выглядела бы элементарно:
input_line = read_line()
if input_line == "what":
print("contest")
if input_line == "where":
print("2026.andgein.ru")
К сожалению (или к счастью!) брейнфак не позволяет ни считывать сразу целую строчку, ни сравнивать строки, ни выводить их. Вместо этого он оперирует отдельными ячейками памяти или байтами (почитайте про язык в интернете, если раньше не работали с ним). В нём есть и другие особенности, но даже с этими наша программа вынуждена выглядеть как-то так:
# Skip first two characters, because they are always "wh"
input_character = read_character()
input_character = read_character()
input_character = read_character()
if input_character == "a": # "what" branch
print("c")
print("o")
... # Print all characters of "contest" one by one
if input_character == "e": # "where" branch
print("2")
print("0")
... # Print all characters of "2026.andgein.ru" one by one
Другой сложностью языка является то, что и сравнения if input_character == "a" в нём нет.
Вместо этого мы должны вычесть из байта, ответственного за хранение input_character
число 97 (ASCII-код буквы a) и затем результат сравнить с нулём, так как это единственное сравнение,
доступное в языке. Поэтому проще всего будет отсортировать буквы, с которыми мы хотим сравнить
input_character, и сравнить с ними по очереди путём постепенного вычитания:
# Skip first two characters, because they are always "wh"
input_character = read_character()
input_character = read_character()
input_character = read_character()
input_character -= 97 # ASCII code of "a"
if input_character == 0: # "what" branch
print("c")
print("o")
... # Print all characters of "contest" one by one
input_character -= 4 # ASCII code of "e" is 101, and 101 - 97 = 4
if input_character == 0: # "where" branch
print("2")
print("0")
... # Print all characters of "2026.andgein.ru" one by one
Осталось понять, что делать, если строчек больше, чем две, и некоторые из них отличаются в первом символе, а некоторые — например, в третьем. Ну что ж, ничего не поделаешь! Давайте сначала прочитаем первый символ, обработаем все возможные варианты для него, а дальше, если нужно, прочитаем остальное и снова обработаем все сценарии, пока не пойдём, что же надо выводить. Этих идей вместе с аккуратной реализацией и умением относительно эффективно выводить нужные строчки хватало, чтобы пройти 20 первых уровней, а то и больше.
| № | Что выводить | Макс. длина | Возможная программа |
|---|---|---|---|
| 1 |
2026 | 61 | -[----->+<]>-.--.++.++++. (25 символов) |
| 2 |
0 → 1 1 → 0 | 231 | ,>+>++++++[-<<-------->>]<<[>>-[----->+<]>---.<<[-]]>[>-[----->+<]>--.<] (72 символа) |
| 3 |
happy → new year merry → christmas | 673 | ,>+>++++++++[-<<------------->>]<<[>>--[----->+<]>---.+++++.++++++++++.---------.++++++++++.+.-------.------------.--[--->+<]>--.<<]>[>+[------->++<]>.---------.[--->+<]>.+[---->+<]>++.--[->++++<]>+.--[->+++<]>.----.--[--->+<]>---.<] (233 символа) |
| 4 |
eyes → coal nose → carrot arms → sticks buttons → rocks | 749 | ,>+>++++++++[-<<------------>>]<<-[>+<-[>+<---[>>--[----->+<]>---.--.--[--->+<]>---..---.+++++.<<]>[>--[----->+<]>---.++++++++++++.--------------.+++++++++++.<]<[-]]>[>+[--------->++<]>.---.------------.++++++++.++++++++.<]<[-]]>[>+[--------->++<]>+.+.-----------.------.++++++++.++++++++.<] (291 символ) |
| 5 |
German → Frohe Weihnachten Spanish → Feliz Navidad Italian → Buon Natale | 1146 | ,>+>+++++++[-<<---------->>]<<-[>+<--[>>-[------->+<]>---.--[-->+++<]>-.+++++++.---.-[--->+<]>++.++[---->+<]>+.[-->+++++<]>--.[----->+++<]>-.+[--->+<]>.[------>+<]>.-----.---.+++.<<]>[>----[---->+<]>+++.++[----->+<]>+.------.-.-[->+++++<]>-.[-->+++++<]>--.[----->+++<]>-.--[--->+<]>-.+[->+++<]>++.+++++++++++.-------.<]<]>[>-[------->+<]>---.--[++++>---<]>-.---.-------.---.--[--->+<]>-.---[->+++<]>.++[->++++<]>+.++++.-.++++++.-------------.++.+++++.++++++++++++.+++[->+++<]>.+++++++++.<] (489 символов) |
| 6 |
United States → Santa Claus United Kingdom → Father Christmas Russia → Ded Moroz Netherlands → Sinterklaas Norway → Julenissen Finland → Joulupukki Germany → Weihnachtsmann | 2136 | ,>+>+++++++[-<<---------->>]<<[>+<-[>+<-------[>+<----[>>,,,,,,,>+>+++++[-<<--------------->>]<<[>>-[--->+<]>--.++++++++++++++.+++++++++++++.++++++.+[->+++<]>++.-[--->+<]>.+[->++<]>+.+[--->+<]>.-----------.--[--->+<]>.--.<<]>[>-[------->+<]>---.[------>+<]>.--[--->+<]>-.------------.---.+++++++++++++.[-->+++++<]>+++.+[->++<]>+.+[-->+++<]>++.++++++++++.---------.++++++++++.+.-------.------------.--[--->+<]>--.<]<<<]>[>++++[++++>---<]>+.[-->+++<]>-.-.-[--->+<]>-.++++++[->++<]>+.[--->+<]>.+++.---.-[--->+<]>.<]<]>[>,>+>++++++++++[-<<---------->>]<<-[>>-[------->+<]>+.-[----->+<]>.---------.-------.+++++++++.-----.++++++++++..++++[->+++<]>.+++++++++.<<]>[>-[--->+<]>--.+[---->+++++<]>.+++++.++++++.+++[->+++<]>.+++++++++++++.-------.+.-----------..--[--->+<]>--.<]<<]<[-]]>[>-[--->+<]>++.++[->++++<]>+.++++.-.++++++.-------------.++.+++++.++++++++++++.-.------.------------.+++++++++++++..<]<]>[>-[------->+<]>+.[-->+++<]>.++++++.---------.+++++++++.-----.+++++.----------..--.<] (982 символа) |
| 7 |
hey jude → beatles one → u2 smells like teen spirit → nirvana | 698 | ,>+>++++++++[-<<------------->>]<<[>+<-------[>>+[------->++<]>.-----.+++++++++.++++.[->+++<]>-.+++++++++++++.-------------.<<]>[>----[-->+++++<]>-.+[++>---<]>+.<]<]>[>--[----->+<]>----.+++.----.--[--->+<]>-.--------.-------.[--->+<]>----.<] (241 символ) |
| 8 |
what → contest where → 2026.andgein.ru when → 1 january 2026 | 1074 | ,,,>+>++++++++[-<<------------>>]<<-[>>,>+>++++++++++[-<<----------->>]<<[>>-[----->+<]>-.--.++.++++.--------.++[->++<]>+.+++++++++++++.----------.+++.--.++++.+++++.[----->++<]>++.[--->++<]>--.+++.<<]>[>-[----->+<]>--.-[--->++<]>.-[--->++<]>.---------.+++++++++++++.+++++++.[->+++<]>++.--[--->+<]>---.+++++++.-[---->+<]>++.[-->+++<]>++.--.++.++++.<]<<<]>[>--[----->+<]>---.++++++++++++.-.++++++.+++[->+++<]>.[--->+<]>----.+.<] (426 символов) |
| 9 |
18:00 → getting ready 21:00 → warm-up chatter 23:30 → countdown hype 00:00 → cheers and chaos 02:00 → philosophical conversations | 2428 | ,>+>++++++[-<<-------->>]<<[>+<-[>>,>+>+++++++[-<<------->>]<<[>>--[----->+<]>---.++++++++++++.++++++.-------.++++++.++[->+++<]>++.+++++++++++.++++++++.---------.-[->+++++<]>-.-[--->++<]>--.[--->+<]>+.---------.-----------.<<]>[>------[-->+++<]>.-[->+++<]>-.--[--->+<]>---.-----.+[----->++<]>+.+[--->++<]>+.-----.[------->++<]>.+[->+++<]>.+++++.-------.--[--->+<]>-..+++[->+++<]>.+++++++++++++.<]<<<]>[>+[----->+++<]>.--.[--->+<]>---..-----------.+++++.-------.-[--->+<]>--.---[----->++<]>.-------------.----.+++.+[--->+<]>++.<]<]>[>,>+>++++++[-<<-------->>]<<[>>+[------->++<]>++.--------.+.+++.+++.++++.----.+.--------.+.------.--.+++++++++++.[++>---<]>--.+[->+++<]>.++++++++++++.-.++++++++.+[->+++<]>.+++++++++++++.+.++[->+++<]>++.--[--->+<]>-.-----------.++++++.-.+++++.<<]>[>--[----->+<]>---.+++++.---..+++++++++++++.+.+[---->+<]>+++.[--->+<]>+.+++++++++++++.----------.-[--->+<]>-.+[->+++<]>.+++++.-------.++++++++++++++.++++.<]<<] (937 символов) |
| 10 |
january 1 → sleepy victory january 2 → mild denial january 3 → inbox shock january 4 → routine reboot january 5 → okay, new year mode on | 2473 | ,,,,,,,,,>+>+++++++[-<<------->>]<<[>+<-[>+<-[>+<-[>>+[------->++<]>+.----.----------.+[--->+<]>+++.-[-->+++++<]>.------------.+[----->+<]>+.---------.[--->+<]>.+[---->+<]>++.--[->++++<]>+.--[->+++<]>.----.--[--->+<]>---.[-->+++++<]>+++.+[----->+<]>.++.-----------.+.--[--->+<]>-.+++++[->+++<]>.-.<<]>[>+[--------->++<]>.---.++++++.-.-----------.+++++.---------.--[--->+<]>-.---[----->++<]>.-------------.---.+++++++++++++..+++++.<]<]>[>--[----->+<]>+++.+++++.------------.+++++++++++++.+++++++++.[---->+<]>++.---[->++++<]>-.-----------.+++++++.------------.++++++++.<]<]>[>+[------->++<]>-.----.+++.--------.-[--->+<]>-.+[->+++<]>+.+.+++++++++.-----.--------.+++++++++++.<]<]>[>+[--------->++<]>+.-------.-------..+++++++++++.+++++++++.-[---->+<]>++.--[->++++<]>--.[------>+<]>.------.-[--->+<]>--.-----.+++.+++++++.<] (819 символов) |
| 11 |
violin → string flute → woodwind trumpet → brass drum → percussion piano → keyboard | 1132 | ,>+>++++++++++[-<<---------->>]<<[>+<--[>+<----------[>+<----[>>+[--------->++<]>+.+.--.---------.+++++.-------.<<[-]]>[>--[----->+<]>----.[--->+<]>----.+++[->+++<]>++.--[--->+<]>--..<]<]>[>--[----->+<]>+++++.------.[--->+<]>++.---[->+++<]>.+++++++++++++.--------------.--[--->+<]>---.--------------.<]<]>[>------[-->+++<]>.--------..-----------.+[--->+<]>.+[->+++<]>+.+++++.----------.<]<]>[>+[------->++<]>++.-----------.+++++++++++++.++++[->+++<]>+.-[--->+<]>-.--..----------.++++++.-.<] (490 символов) |
| 12 |
mercury → 1 venus → 2 earth → 3 mars → 4 jupiter → 5 saturn → 6 uranus → 7 neptune → 8 | 588 | ,>+>++++++++++[-<<---------->>]<<-[>+<-----[>+<---[>+<-[>+<-----[>+<--[>>-[----->+<]>-.<<[-]]>[>-[----->+<]>++++.<]<[-]]>[>-[----->+<]>+++.<]<[-]]>[>-[----->+<]>+++++.<]<[-]]>[>,>+>++++++++[-<<------------>>]<<-[>>-[----->+<]>--.<<[-]]>[>-[----->+<]>+.<]<<[-]]<[-]]>[>-[----->+<]>++.<]<[-]]>[>-[----->+<]>.<] (308 символов) |
| 13 |
pawn → 1 knight → 3 bishop → 3 rook → 5 queen → 9 | 346 | ,>+>+++++++[-<<-------------->>]<<[>+<---------[>+<-----[>+<-[>>-[----->+<]>++.<<[-]]>[>+[--------->+<]>.<]<[-]]>[>-[----->+<]>--.<]<[-]]>[>-[----->+<]>.<]<[-]]>[>-[----->+<]>.<] (178 символов) |
| 14 |
a → alpha b → beta g → gamma d → delta e → epsilon z → zeta i → iota l → lambda o → omicron | 837 | ,>+>++++++++[-<<------------>>]<<-[>+<-[>+<--[>+<-[>+<--[>+<--[>+<---[>+<---[>>----[-->+++<]>.---[->+++<]>.[--->+<]>---.+[->+++<]>++.<<]>[>+[------->++<]>+.--.----.------.-[--->+<]>----.---.-.<]<]>[>+[------->++<]>--.-----------.++++++++++++.-----------.++.---.<]<[-]]>[>--[----->+<]>+++.++++++.+++++.+[->+++<]>++.<]<]>[>+[----->+++<]>.------.++++++++++++..------------.<]<[-]]>[>--[----->+<]>-.+++++++++++.+++.----------.+++.+++.-.<]<[-]]>[>--[----->+<]>--.+.+++++++.++++++++.+[->+++<]>++.<]<]>[>--[----->+<]>----.+++.[--->+<]>---.+[->+++<]>++.<]<]>[>--[----->+<]>-----.+++++++++++.++++.--------.-------.<] (607 символов) |
| 15 |
january → february february → march march → april april → may may → june june → july july → august august → september september → october october → november november → december december → january | 1451 | ,>+>++++++++[-<<------------>>]<<-[>+<---[>+<--[>+<----[>+<---[>+<-[>+<-[>>+[------->++<]>+.------------.-[--->+<]>--.-----.-------------.+++.+++++++++++++.<<]>[>+[------->++<]>.+.+++++++.+[->+++<]>.++++++++.-----------.+++.+++++++++++++.<]<]>[>--[----->+<]>--.+.--.++.++++++++.-----------.+++.+++++++++++++.<]<[-]]>[>,,>+>++++++++[-<<-------------->>]<<--[>>--[----->+<]>++++.+++++++++++.-------.---------.<<[-]]>[>--[----->+<]>-----.-[++>-----<]>.++.---------.+++.<]<<[-]]<[-]]>[>,>+>++++++++[-<<------------>>]<<-[>>,>+>+++++++++[-<<------------>>]<<[>>--[----->+<]>++++.+++++++++++.---------.-[--->+<]>.<<]>[>--[----->+<]>-----.--[--->+<]>.++[->+++<]>++.--[--->+<]>--.--.+.<]<<[-]<[-]]>[>--[----->+<]>.-.---.[--->+<]>----.+++.[->+++<]>++.--[--->+<]>---.+++++++.<]<<[-]]<[-]]>[>+[------->++<]>-.------------.--[--->+<]>---.++++[->+++<]>+.+++++.<]<]>[>--[----->+<]>++++.---------.+++++++++++++.+++++++.[->+++<]>++.--[--->+<]>---.+++++++.<]<]>[>,>+>++++++++[-<<-------------->>]<<[>>+[--------->++<]>+.++++[->+++<]>.+++++++++++.++++.+++[->+++<]>.++++++++.-----------.+++.+++++++++++++.<<]>[>+[------->++<]>-.------------.+[--->+<]>+++.<]<<[-]] (1144 символа) |
| 16 |
USD → United States EUR → Eurozone JPY → Japan GBP → United Kingdom AUD → Australia | 821 | ,>+>++++++++[-<<-------->>]<<-[>+<----[>+<--[>+<---[>>-[--->+<]>.--[--->+<]>---.-----.+++++++++++.+++[->+++<]>.-.-[--->+<]>-.----[->+++<]>-.[--->+<]>+++.+[->+++<]>++.--[--->+<]>-.+++[->+++<]>.[--->+<]>----.<<]>[>-[------->+<]>+.--[--->++++<]>+.-[++>-----<]>.[----->++<]>+.+++++++++++++.<]<]>[>-[--->+<]>.--[--->+<]>---.-----.+++++++++++.+++[->+++<]>.-.-[--->+<]>-.--[-->+++++<]>.-----[-->+++<]>.+++++.-------.---.+++++++++++.--.<]<]>[>++++[++++>---<]>++.-[----->+<]>+.---.---.-[--->+<]>.[->+++<]>+.-.---------.<]<]>[>----[---->+<]>++.------[->++<]>-.--.+.--.+++[->+++<]>++.+++++++++++.---.--------.<] (600 символов) |
| 17 |
banana → yellow strawberry → red kiwi → green blueberry → blue grape → purple | 478 | ,>+>+++++++[-<<-------------->>]<<[>+<-----[>+<----[>>+[--------->++<]>.-------------.-.<<[-]]>[>+[----->+++<]>.+++++++++++.-------------..+++++++++.<]<[-]]>[>+[------->++<]>++.+++++.---.--.----.-------.<]<[-]]>[>,>+>++++++++[-<<------------>>]<<-[>>--[----->+<]>----.++++++++++.+++++++++.++[->+++<]>.<<]>[>----[-->+++<]>-.--[->+++<]>.+++++++..+++.++++++++.<]<<[-]] (365 символов) |
| 18 |
Inception → 2010 The Matrix → 1999 Interstellar → 2014 Titanic → 1997 Parasite → 2019 | 370 | ,>+>++++++++[-<<--------->>]<<-[>+<-------[>>,>+>++++++++[-<<------------->>]<<[>>-[----->+<]>--.++++++++..--.<<[-]]>[>-[----->+<]>--.++++++++...<]<<[-]<[-]]>[>-[----->+<]>-.--.+.++++++++.<]<[-]]>[>,,>+>+++++++++[-<<----------->>]<<[>>-[----->+<]>-.--.+.+++.<<[-]]>[>-[----->+<]>-.--.+.-.<]<<[-]] (296 символов) |
| 19 |
AAPL → Apple MSFT → Microsoft GOOGL → Alphabet AMZN → Amazon TSLA → Tesla | 599 | ,>+>++++++++[-<<-------->>]<<-[>+<------[>+<------[>>-[--->+<]>-.-[----->+++<]>.[--->+<]>----.-------.-----------.<<]>[>++[---------->+<]>.+[--->++++<]>+.------.-[--->+<]>----.---.++++.----.---------.-[--->+<]>---.<]<]>[>----[---->+<]>++.[--->+<]>+.++++.--------.-------.+.+++.[--->+<]>---.<]<]>[>,>+>++++++++[-<<-------->>]<<-[>>----[---->+<]>++.[--->+<]>++.------------.+[----->+<]>.[->+++<]>+.-.<<]>[>----[---->+<]>++.-[++++>---<]>..----.-------.<]<<[-]] (457 символов) |
| 20 |
4 → tetrahedron 6 → cube 8 → octahedron 12 → dodecahedron 20 → icosahedron | 626 | ,>+>+++++++[-<<------->>]<<[>+<-[>+<--[>+<--[>>+[------->++<]>+.------------.-[--->+<]>--.+[->+++<]>++.+++++++.---.-.++++++++++++++.---.-.<<]>[>--[----->+<]>---.-[--->+<]>-.+[->+++<]>.+++.<]<]>[>--------[-->+++<]>.+++[->+++<]>.[--->+<]>---.--.+++[->+++<]>++.+++++++.---.-.++++++++++++++.---.-.<]<]>[>--[----->+<]>+++.------.++++++++++++.++++.++[->+++<]>++.+++++++.---.-.++++++++++++++.---.-.<]<]>[>--[----->+<]>--.+++++++++++.-----------.+.--.--.+++++++.---.-.++++++++++++++.---.-.<] (483 символа) |
Дальнейшие уровни могли потребовать ещё несколько оптимизаций. Давайте разберём те, которые использовал я (возможно, вам они не понадобились, если вы написали остальные части более оптимально!).
1. При выводе строчки (например, «contest») нужно сначала получить байт 99 (ASCII-код буквы c),
затем 111 (o), 110 (n) и так далее. Очевидно, что почти всегда нужно переиспользовать одну
и ту же ячейку, так как если там уже записано 111, то получить 110 очень просто — надо просто вычесть единицу,
а это одна инструкция в брейнфаке. Но как написать самую короткую программу для получения 111 из 99?
Для этого давайте заранее для всех пар байтов A и B найдём достаточно короткую программу, переводящую
число A в B. Начнём с тривиальных программ — состоящих из многих инкрементов «+» и декрементов «-».
Затем используем факт, что если есть программа, переводящая A в C, и программа, переводящая C в B, то их
сумма переводит A в B. Напоследок, воспользуемся простым умножением. Например, [--->+++++++<]
умножает число на 7/3 — то есть 6 перевод в 14, а 27 в 63.
Применяя такие операции, будем улучшать наши программы до тех пор, пока они улучшаются. А затем используем их как для вывода строк, так и для вычитания перед сравнением.
2. Бывает, что строчки, которые надо вывести, одинаково начинаются или одинаково заканчиваются. Тогда можно сэкономить, выведя общий префикс/общий суффикс вне ветвлений.
3. Бывает, что общая логика генерации программы вставляет зануления [-], ненужные сдвиги <>
или другие вещи, которые в итоге не нужны. Удалим их в самом конце, убедившись, что программа всё ещё ведёт себя ожидаемо.
Для этого придётся написать интерпретатор брейнфака, но, к счастью, он занимает десять строчек пишется LLM-кой или импортируется библиотекой.
| № | Что выводить | Макс. длина | Возможная программа |
|---|---|---|---|
| 21 |
lift → elevator lorry → truck boot → trunk petrol → gasoline biscuit → cookie | 481 | ,>+>+++++++[-<<-------------->>]<<[>+<----------[>>+[----->+++<]>.------.--[--->+<]>--.----.---.---.+++++.---------.<<]>[>,>+>+++++++[-<<--------------->>]<<[>>--------[-->+++<]>.--.+++.+[->+++<]>+.++++++++.<<]>[>--[----->+<]>-.+++++++.-------.[--->+<]>-.[->+++<]>-.--[--->+<]>-.-----.+++.<]<<[-]]<[-]]>[>,>+>+++++++[-<<--------------->>]<<[>>--------[-->+++<]>.--.+++.-------.---.<<[-]]>[>--[----->+<]>---.++++++++++++..----.--.----.<]<<[-]] (442 символа) |
| 22 |
New York → UTC-5 London → UTC+0 Tokyo → UTC+9 Sydney → UTC+10 Dubai → UTC+4 | 382 | -[--->+<]>.-.[----->+<]>-.,>+>++++++[-<<----------->>]<<--[>+<--------[>+<--[>+<-----[>>++[------>+<]>.++++++++++++++.<[-]<[-]]>[>++[------>+<]>.++++++.-.<[-]][-]<[-]]>[>++[------>+<]>++.++++++++.<[-]][-]<[-]]>[>++[------>+<]>.+++++.<[-]][-]<[-]]>[>++[------>+<]>.+++++++++.<[-]] (279 символов) |
| 23 |
32 F → 0 C 68 F → 20 C 86 F → 30 C 104 F → 40 C 14 F → -10 C | 356 | ,>+>+++++++[-<<------->>]<<[>+<--[>+<---[>>-[----->+<]>.<[-]<[-]]>[>-[----->+<]>-.<[-]][-]<[-]]>[[-]][-]<[-]]>[>,>+>++++++[-<<-------->>]<<[>>++[------>+<]>++.++++.<[-]<[-]]>[>-[----->+<]>+.<[-]]<<[-]]>>>>-[----->+<]>---.[--->++<]>.+[->++<]>+. (243 символа) |
| 24 |
hydrogen → 1 helium → 2 carbon → 6 oxygen → 8 iron → 26 copper → 29 zinc → 30 krypton → 36 silver → 47 tin → 50 iodine → 53 xenon → 54 gold → 79 mercury → 80 lead → 82 uranium → 92 plutonium → 94 | 853 | ,>+>+++++++++[-<<----------->>]<<[>+<----[>+<-[>+<-[>+<--[>+<-[>+<-[>+<--[>+<-[>+<---[>+<-[>+<-[>+<---[>>-[----->+<]>.---.<<[-]]>[>-[----->+<]>++.-.<]<[-]]>[>+[--------->+<]>.-------.<]<[-]]>[>-[----->+<]>++.-----.<]<[-]]>[>-[----->+<]>+.+++.<]<[-]]>[>+[--------->+<]>.-----.<]<[-]]>[>-[----->+<]>+++++.<]<[-]]>[>-[----->+<]>+++++.--------.<]<[-]]>[>-[----->+<]>+++++.------.<]<[-]]>[>-[----->+<]>.+++.<]<[-]]>[>,>+>++++++++++[-<<----------->>]<<-[>>-[----->+<]>-.++++.<<[-]]>[>-[----->+<]>++.--.<]<<[-]]<[-]]>[>,>+>++++++++++[-<<---------->>]<<-[>>-[----->+<]>--.<<[-]]>[>-[----->+<]>-.<]<<[-]]<[-]]>[>-[----->+<]>++++.++.<]<[-]]>[>,>+>++++++++[-<<------------>>]<<-[>>-[----->+<]>-.+++++++.<<[-]]>[>-[----->+<]>+++.<]<<[-]] (725 символов) |
| 25 |
H → Hydrogen He → Helium C → Carbon O → Oxygen Fe → Iron Cu → Copper Ag → Silver Au → Gold | 729 | ,>+>++++++++[-<<-------->>]<<-[>+<--[>+<---[>+<--[>>-[--->+<]>------.+[-->+++<]>.+.-[->+++<]>-.--.+++++++++.<<]>[>,>+<[>>-[------->+<]>-.-[->+++++<]>++.+++++++.---.++++++++++++.--------.<<]>[>-[------->+<]>-.[------->+<]>+.--[->+++<]>-.++++++++++++++.---.--------.--.+++++++++.<]<<[-]]<[-]]>[>-[------->+<]>.+[->+++++<]>.---.-.<]<]>[>,>+<[>>++++[++++>---<]>.+[--->+<]>+++.+..-----------.+++++++++++++.<<]>[>++++[++++>---<]>.-[-->+++<]>--.--[--->+<]>---.++++[->+++<]>.+++++++++++++.-.<]<<[-]]<[-]]>[>,>+>++++++++[-<<------------->>]<<+[>>-[------->+<]>--.[--->+<]>++.---.--------.<<]>[>-[--->+<]>--.+[---->+++++<]>.+++.++++++++++.+[->+++<]>.+++++++++++++.<]<<[-]] (662 символа) |
| 26 |
tennis → racket soccer → ball boxing → gloves archery → bow hockey → stick | 389 | ,>+>++++++++[-<<------------>>]<<-[>+<-[>+<------[>+<-----------[>>+[--------->++<]>.+++[->+++<]>++.++.++++++++.------.[--->+<]>---.<<]>[>--[----->+<]>----.-.+++++++++++..<]<[-]]>[>+[--------->++<]>+.+.-----------.------.++++++++.<]<[-]]>[>+[----->+++<]>.+++++.+++.+++++++.+[->+++<]>.[--->+<]>----.<]<]>[>--[----->+<]>----.+++++++++++++.++++++++.<] (348 символов) |
| 27 |
phoenix → greek kitsune → japanese anubis → egyptian kelpie → scottish | 475 | ,>+>++++++++[-<<------------>>]<<-[>+<----------[>>+[----->+++<]>.+++++++++++.-------------..++++++.<<[-]]>[>,>+>++++++++++[-<<---------->>]<<-[>>--[----->+<]>++++.---------.-[++>-----<]>.[----->++<]>+.+++++++++++++.---------.[--->+<]>----.++++[->+++<]>.<<]>[>+[--------->++<]>+.+++[->+++<]>+.++++++++++++.+++++..-----------.++++++++++.-----------.<]<<[-]]<]>[>--[----->+<]>-.++.+[--->+<]>+.---------.++++.-----------.--------.+++++++++++++.<] (443 символов) |
| 28 |
python → 1991 javascript → 1995 rust → 2010 go → 2009 | 226 | ,>+>++++++++[-<<------------->>]<<+[>+<---[>+<------[>>-[----->+<]>-.--.+.-.<<[-]]>[>-[----->+<]>--.++++++++..--------.<]<[-]]>[>-[----->+<]>--.++++++++..----.<]<[-]]>[>-[----->+<]>-.--..+++++++++.<] (199 символов) |
| 29 |
python → snake go → gopher rust → gear cog java → steaming coffee cup javascript → yellow JS badge | 632 | ,>+>++++++++[-<<------------->>]<<+[>+<---[>+<------[>>+[----->+++<]>.--.----.--[--->+<]>---.[-->+++++<]>+++.+[->+++<]>.++++++++++++.--------.<<]>[>+[--------->++<]>+.-----.-------------.++++++++++.------.<]<[-]]>[>,,,,>+<[>>----[-->+++<]>-.--[->+++<]>.+++++++..+++.++++++++.+[---->+<]>++.+++++[->++<]>.+++++++++.+[--->+<]>++++.[--->+<]>++.-.+++.+++.--.<<]>[>+[--------->++<]>+.+.+++[->+++<]>.----.++++++++++++.----.+++++.-------.-[--->+<]>--.+[->+++<]>.++++++++++++.---------..-..--[--->+<]>-.+[->+++<]>.-[--->+<]>-.-----.<]<<]<]>[>+[----->+++<]>.++++++++.+.--------.---.+++++++++++++.<] (588 символов) |
| 30 |
Gryffindor → bravery Hufflepuff → loyalty Ravenclaw → wisdom Slytherin → ambition | 431 | ,>+>+++++++[-<<---------->>]<<-[>+<-[>+<----------[>>--[----->+<]>-----.++++++++++++.-----------.+++++++.+++++++++++.-----------.++++++.-.<<[-]]>[>------[-->+++<]>.+[->+++<]>+.++++++++++.+++[->+++<]>++.+++++++++++.--.<]<]>[>+[------->++<]>--.+++.++++++++++.---[->+++<]>-.+++++++++++.++++++++.+++++.<]<]>[>--[----->+<]>----.[--->+<]>----.+++[->+++<]>++.+[--->+<]>.+[->+++<]>.+++++++++++++.+++++++.<] (398 символов) |
| 31 |
pi → 3.14159 e → 2.71828 phi → 1.61803 tau → 6.28318 | 348 | ,>+>++++++++++[-<<---------->>]<<-[>+<-----------[>>-[----->+<]>+++.--------.++++.++++++.-----.--.+++++++.<<[-]]>[>,>+>++++++++[-<<------------->>]<<[>>-[----->+<]>.-----.+++.+++.---.++++.++++.<<[-]]>[>-[----->+<]>--.---.++++++++.-----.+++++++.--------.+++.<]<<[-]]<[-]]>[>-[----->+<]>-.----.+++++++++.------.+++++++.------.++++++.<] (333 символов) |
| 32 |
.jpg → photograph .png → picture .svg → vector image .wav → audio .epub → ebook .yaml → config .md → markdown text .csv → comma-separated values .mp4 → video .ttf → font .ico → icon | 1242 | ,,>+>+++++++++[-<<----------->>]<<[>+<--[>+<----[>+<-[>+<---[>+<---[>+<---[>+<-[>+<---[>>--[----->+<]>---.++++++++++++.-.--------.+++.--.<<[-]]>[>--[----->+<]>-----.--[--->+<]>.+[->+++<]>++.+++++.++++++.<]<]>[>--[----->+<]>.+++++++++.-.++++++.<]<[-]]>[>----[-->+++++<]>.+[->+++<]>.--.-[--->+<]>--.-----.+++.[-->+++++<]>+++.-[--->++<]>-.++++.------------.++++++.--.<]<]>[>+[------->++<]>++.-------.------.-[--->+<]>--.+.---.-------------.<]<]>[>,>+>++++++++++[-<<---------->>]<<[>>----[-->+++++<]>.[------>+<]>.-----.+.++++++++++.<<]>[>+[------->++<]>-.------------.--[--->+<]>---.-------.-------.+++++++++++.++++++++.---------.-[->+++++<]>-.---[->++++<]>.+++[->+++<]>.[--->+<]>+.----.<]<<[-]]<[-]]>[>+[------->++<]>++.--------.+++++++.+++++.-----.--------.+++++++++++.+++[->+++<]>++.-[++>-----<]>.--------.<]<]>[>--[----->+<]>+++.------.++++++++++++.-.<]<[-]]>[>--[----->+<]>-.---.+++++++++++++..----.<]<[-]]>[>--[----->+<]>---.++++++++++++.--..------------.-[-->+<]>---.+[--->++<]>-.++++[->+++<]>.+++++++++++.[----->++<]>+.--[--->+<]>---.+++[->+++<]>++.--[--->+<]>-.+++[->+++<]>.-.-[--->+<]>-.--[->++++<]>--.[->+++<]>-.+++++++++++.+++++++++.++[->+++<]>.[--->+<]>----.<] (1170 символов) |
| 33 |
triangle → 3 square → 4 pentagon → 5 hexagon → 6 | 163 | ,>+>++++++++[-<<------------->>]<<[>+<--------[>+<---[>>-[----->+<]>.<<[-]]>[>-[----->+<]>+.<]<[-]]>[>-[----->+<]>++.<]<[-]]>[>-[----->+<]>+++.<] (145 символов) |
| 34 |
3 → triangle 4 → square 5 → pentagon 6 → hexagon | 376 | ,>+>+++++[-<<---------->>]<<-[>+<-[>+<-[>>--[----->+<]>++.---.[--->+<]>+.--[->+++<]>-.++++++.++++++++.-.<<]>[>+[------->++<]>++.-----------.+++++++++.++++++.+[->+++<]>++.++++++.++++++++.-.<]<]>[>+[--------->++<]>+.--.++++.[->+++<]>++.--[--->+<]>---.-------------.<]<]>[>--------[-->+++<]>.--.---------.--------.+++++++++++++.-------.+++++.-------.<] (349 символов) |
| 35 |
200 → OK 201 → Created 204 → No Content 301 → Moved Permanently 302 → Found 400 → Bad Request 401 → Unauthorized 403 → Forbidden 404 → Not Found 500 → Server Error 502 → Bad Gateway 503 → Service Unavailable | 1692 | ,>+>+++++[-<<---------->>]<<[>+<-[>+<-[>>,,>+>++++++[-<<-------->>]<<[>+<--[>>-[--->+<]>--.[----->+++<]>.+++++++++++++.++++.[------>+<]>.------.++.--[--->+<]>-.----[->+++<]>+.--[--->+<]>---.-------------.+[--->+<]>.[->+++<]>-.++++++++.+++.-----------.+.++++++++++.-------.<<]>[>----[---->+<]>+++.[-->+++<]>--.+++.-[--->+<]>-.+++[->++<]>+.-[------>+<]>.--[--->+<]>-.+++[->+++<]>.[--->+<]>.-[->+++<]>-.+[--->+<]>+++.<]<]>[>-[--->+<]>--.[----->+++<]>.+++++++++++++.++++.+[->+++<]>.+++++++++++++.[-->+++++<]>+++.++[->++<]>+.-[++++>---<]>-..---.+++.<]<<<]>[>,,>+>++++++[-<<-------->>]<<[>+<-[>+<--[>>-[--->+<]>-------.-[--->+<]>.+++++.[---->+<]>+++.+++[->++<]>.+[--->+<]>++.++++++.-------.----------.<<]>[>-[------->+<]>---.+[--->+<]>++.+++.++++[->+++<]>.+++++++.-----..+.+++++++++.<]<]>[>-[--->+<]>.--[--->+<]>---.-------------.--[--->+<]>.-.------------.+++++++.+++.---------.-[--->+<]>++.---[->+++<]>.-.<]<]>[>----[---->+<]>+++.[-->+++<]>--.+++.-[--->+<]>-.[-->+++++<]>++.+[----->+++<]>.++++++++++++.++++.++[->+++<]>.[--->+<]>----.+.<]<<]<[-]]>[>,,>+>+++++++[-<<------->>]<<[>>-[------->+<]>---.+[--->+<]>++.++++++.-------.----------.<<]>[>++[---------->+<]>.[--->+<]>.+++++++.+[->+++<]>.-.-[--->+<]>-.[-->+++++<]>.[---->+++++<]>+.+++++++++++++.-----.------------.+++++++++++++.---------.+++++++++.++++++.--------.-[--->+<]>.<]<<[-]]<[-]]>[>,,>+>++++++[-<<-------->>]<<[>+<-[>>-[--->+<]>-------.-[--->+<]>.[--->+<]>-----.+[->++<]>+.+[--->+<]>+++.-.++++++.+++[->+++<]>.+++++++++.++++++.<<]>[>++++[++++>---<]>.+[++++>---<]>-.-------------.----.--[--->+<]>-.+++[->+++<]>.-.<]<]>[>-[--->+<]>------.----.<]<<] (1602 символа) |
| 36 |
monet → impressionism picasso → cubism kahlo → surrealism van gogh → post-impressionism dali → surrealism kandinsky → abstract pollock → abstract expressionism cezanne → post-impressionism rothko → color field hopper → realism | 1338 | ,>+>+++++++++[-<<----------->>]<<[>+<-[>+<----[>+<---[>+<--[>+<---[>+<--[>>+[------->++<]>++.-.++++.+.[++>---<]>-.[--->+++++++<]>.++++.+++.++.-------------.[--->+<]>----..----------.++++++.-.-----.++++++++++.------.<<]>[>--[----->+<]>---.++++++++++++.---.+++.+++.[-->+++++<]>+++.++[->+++<]>.+++.----.+++++++.--------.<]<]>[>,>+>+++++++[-<<--------------->>]<<[>>--[----->+<]>-----.+.[--->+<]>---.+.--.+++[->+++<]>++.++.-[--->+<]>--.[---->+<]>+++.+[->+++<]>++.[--->+<]>+.--------.++.-------------.[--->+<]>----..----------.++++++.-.-----.++++++++++.------.<<]>[>--[----->+<]>---.-[--->+<]>-.+[->+++<]>.+++++++.++++++++++.------.<]<<]<[-]]>[>--[----->+<]>+++.++++.+++.++.-------------.[--->+<]>----..----------.++++++.-.-----.++++++++++.------.<]<]>[>,,>+>++++++++[-<<------------->>]<<[>>--[----->+<]>-----.+.[--->+<]>---.+.--.+++[->+++<]>++.++.-[--->+<]>--.<<]>[>+[--------->++<]>+.++.---..-------------.----.+++++++++++.---.++++++++++.------.<]<<]<[-]]>[>+[--------->++<]>.-------------.----.+++++++++++.---.++++++++++.------.<]<[-]]>[>+[--------->++<]>+.++.---..-------------.----.+++++++++++.---.++++++++++.------.<]<[-]]>[>+[------->++<]>++.-.++++.+.[++>---<]>-.[--->+++++++<]>.++++.+++.++.-------------.[--->+<]>----..----------.++++++.-.-----.++++++++++.------.<] (1269 символов) |
| 37 |
voyager 1 → interstellar cassini → saturn new horizons → pluto | 292 | ,>+>+++++++++[-<<----------->>]<<[>+<-----------[>>--[----->+<]>+++.+++++.++++++.+++[->+++<]>.+++++++++++++.+.+.+++[->+++<]>.+++++++..-----------.--[--->+<]>---.<<]>[>+[------->++<]>++.----.+++++++++.-.-----.<]<[-]]>[>+[--------->++<]>+.++[->+++<]>++.--[--->+<]>-.+.---.----.<] (277 символов) |
| 38 |
AA → 1.5V AAA → 1.5V 9V → 9V CR2032 → 3V | 247 | ,>+>+++++++[-<<-------->>]<<-[>+<--------[>>-[----->+<]>.<[-]<[-]]>[>-[----->+<]>--.---.+++++++.<[-]][-]<[-]]>[>+[--------->+<]>.<[-]]>>>>+[--->++<]>. (150 символов) |
| 39 |
hearts → red diamonds → red clubs → black spades → black | 272 | ,>+>+++++++++[-<<----------->>]<<[>+<-[>+<----[>>--[----->+<]>----.++++++++++.-----------.++.++++++++.<<[-]]>[>+[--------->++<]>.-------------.-.<]<[-]]>[>+[--------->++<]>.-------------.-.<]<[-]]>[>--[----->+<]>----.++++++++++.-----------.++.++++++++.<] (254 символа) |
| 40 |
tokyo → mega vienna → large reykjavik → small new york → mega shanghai → mega berlin → large lisbon → medium zurich → medium oslo → small | 658 | ,>+>+++++++[-<<-------------->>]<<[>+<----------[>+<--[>+<-[>+<---[>+<-[>+<-[>+<--[>>+[------->++<]>-.--------.-.+++++.++++++++++++.--------.<<[-]]>[>+[------->++<]>--.-----------.--[--->+<]>---.-----------.--.<]<]>[>+[------->++<]>-.--------.++.------.<]<[-]]>[>+[------->++<]>-.--------.++.------.<]<[-]]>[>+[--------->++<]>+.------.------------.+++++++++++..<]<[-]]>[>+[--------->++<]>+.------.------------.+++++++++++..<]<[-]]>[>+[------->++<]>-.--------.++.------.<]<[-]]>[>+[------->++<]>-.--------.-.+++++.++++++++++++.--------.<]<[-]]>[>+[------->++<]>--.-----------.--[--->+<]>---.-----------.--.<] (607 символов) |
| 41 |
baguette → france naan → india pita → middle east focaccia → italy tortilla → mexico brioche → france injera → ethiopia pretzel → germany | 821 | ,>+>+++++++[-<<-------------->>]<<[>+<----[>+<---[>+<-----[>+<--[>>+[------->++<]>-.--------.[--->+<]>+.[->+++<]>+.------.++++++++++++.<<]>[>,>+>+++++++[-<<--------------->>]<<[>>+[----->+++<]>.--.+++++++++++++.-----.------------.+++++++++++++.[--->+<]>-.<<]>[>+[------->++<]>-.----.-----..++++++++.-------.--[--->+<]>-.+[->+++<]>++.----.--[--->+<]>--.+.<]<<[-]]<[-]]>[>--[----->+<]>+++.+++++.----------.+++++.--------.<]<[-]]>[>--[----->+<]>-.[--->+<]>---.------------.+.++++++.+.-------.--------.<]<]>[>--[----->+<]>+++.+++++++++++.+[->+++<]>++.+++++++++++.-[--->+<]>.<]<]>[>--[----->+<]>.++++++++++++.+++[->+++<]>++.+++++++++++++.-----------.++.<] (650 символов) |
| 42 |
heart → circulatory lungs → respiratory kidneys → urinary liver → digestive stomach → digestive pancreas → endocrine brain → nervous skin → integumentary spleen → lymphatic | 1066 | ,>+>+++++++[-<<-------------->>]<<[>+<------[>+<---[>+<-[>+<----[>>,>+>+++++++++[-<<------------>>]<<+[>+<-----[>>--[----->+<]>--.+++++.--.--.[--->+<]>----.+.-----------.[->++++++<]>.+[->+++<]>.<<]>[>+[------->++<]>--.-[--->+<]>.[->+++<]>++.+++.--------.-------.--[--->+<]>-.-----------.------.<]<]>[>--[----->+<]>+++.+++++.++++++.+++[->+++<]>.++.--[--->+<]>--.--------.--------.+++++++++.++++++.+[->+++<]>++.--[--->+<]>---.+++++++.<]<<<]>[>--[----->+<]>-.+++++++++.----------.+++++++++++.------------.-[--->+<]>----.---------.+++++.---------.<]<]>[>,>+>+++++++[-<<--------------->>]<<[>>+[--------->++<]>.-------------.[--->+<]>----.---.-------.+++++++++.+++[->+++<]>++.--[--->+<]>-.-----.+++.+++++++.<<]>[>--[----->+<]>--.+++++.--.--.[--->+<]>----.+.-----------.[->++++++<]>.+[->+++<]>.<]<<]<]>[>----[-->+++++<]>-.---.---------.+++++.-------------.--[--->+<]>---.+++++++.<]<]>[>--[----->+<]>---.++++++.+++++++++.++++[->+++<]>+.-[--->+<]>-.---------.-----------.--[--->+<]>-.-----.+++.+++++++.<]<]>[>+[------->++<]>.---------.+++++++++++++.++++.-------.++++++.--.<] (1066 символов) |
| 43 |
+ → add - → subtract * → multiply / → divide | 305 | ,>+>++++++[-<<------->>]<<[>+<-[>+<--[>>--[----->+<]>--.+++++.[->++++++<]>.[------>+<]>.-----.+.<<]>[>+[--------->++<]>+.++.+[->+++<]>.[--->+<]>--.--.+++[->+++<]>++.++.-[--->+<]>--.<]<]>[>--[----->+<]>-----.+++..<]<[-]]>[>+[------->++<]>-.++++++++.---------.++++++++.-----------.+++++++.----.-[--->+<]>.<] (305 символов) |
| 44 |
titan → saturn ganymede → jupiter triton → neptune enceladus → saturn charon → pluto phobos → mars deimos → mars | 552 | ,>+>+++++++++[-<<----------->>]<<[>+<-[>+<-[>+<--[>+<---------[>>,>+>+++++++[-<<--------------->>]<<[>>+[------->++<]>.---------.+++++++++++.++++.+.-------.---------.<<[-]]>[>+[--------->++<]>+.++[->+++<]>++.--[--->+<]>-.+.---.----.<]<<[-]<[-]]>[>+[------->++<]>-.------------.--[--->+<]>---.+.<]<]>[>--[----->+<]>++++.+++++++++++.-----.-------.+++++++++++.+++[->+++<]>.+++++++++++++.<]<]>[>+[--------->++<]>+.++[->+++<]>++.--[--->+<]>-.+.---.----.<]<]>[>+[------->++<]>-.------------.--[--->+<]>---.+.<]<]>[>+[------->++<]>++.----.+++++++++.-.-----.<] (552 символов) |
| 45 |
git status → what changed? git add → remember this git commit → lock in a snapshot git push → send it away git pull → get latest from others | 978 | ,,,,,>+>++++++++[-<<------------>>]<<-[>+<--[>+<-------------[>>------[-->+++<]>.+[->+++<]>.-------.--[--->+<]>-.[---->+<]>+++.+[->+++<]>.+++++.-------.+++++++++++++.-------.--.-.-[--->++<]>---.<<]>[>,,>+>+++++++++[-<<------------>>]<<[>>+[--------->++<]>+.++++[->+++<]>.+++++++++.----------.-[--->+<]>-.-[--->++<]>-.+++++++++++.[---->+<]>+++.[--->+<]>+.+[--->+<]>+.-[->+++<]>-.+[--->+<]>+++.<<]>[>+[----->+++<]>.--.[--->+<]>---.[---->+<]>+++.++[--->++<]>.-----------.--[--->+<]>-.+++[->+++<]>.[--->+<]>----.+.[---->+<]>+++.++[->+++<]>.++++++++++++.---.--.[->+++++<]>-.+++++[->+++<]>.+++++.------------.---.+++++++++++++.+.<]<<]<]>[>+[------->++<]>--.+++.------------.++++++++.-[++>---<]>+.-[--->++<]>-.+++++.-[->+++++<]>-.[--->+<]>+.-[--->+<]>.---[->++++<]>-.-----.-------------.-[++>-----<]>.+++.-----------.+++++++.+++++.<]<]>[>+[--------->++<]>.-------------.++++++++.--------.++++++++.-----------.+++.+++++++++++++.[-->+++++<]>+++.---[->++++<]>.------------.+.++++++++++.<] (978 символов) |
| 46 |
greenland → atlantic madagascar → indian fiji → pacific iceland → atlantic sri lanka → indian hawaii → pacific new guinea → pacific sumatra → indian canary islands → atlantic | 703 | ,>+>+++++++++[-<<----------->>]<<[>+<---[>+<-[>+<-[>+<-[>+<----[>+<-[>>--[----->+<]>+++.+++++.----------.+++++.--------.+++++++++++++.<<[-]]>[>+[------->++<]>++.[----->++<]>+.++.++++++.---.+++.------.<]<]>[>--[----->+<]>+++.+++++.----------.+++++.--------.+++++++++++++.<]<[-]]>[>--[----->+<]>-----.--[--->+<]>-.--------.-----------.+++++++++++++.++++++.-----------.------.<]<]>[>+[------->++<]>++.[----->++<]>+.++.++++++.---.+++.------.<]<]>[>--[----->+<]>-----.--[--->+<]>-.--------.-----------.+++++++++++++.++++++.-----------.------.<]<]>[>+[------->++<]>++.[----->++<]>+.++.++++++.---.+++.------.<]<]>[>--[----->+<]>-----.--[--->+<]>-.--------.-----------.+++++++++++++.++++++.-----------.------.<] (703 символа) |
| 47 |
cerulean → #007BA7 vermillion → #E34234 chartreuse → #7FFF00 ultramarine → #3F00FF crimson → #DC143C indigo → #4B0082 turquoise → #40E0D0 gold → #FFD700 salmon → #FA8072 magenta → #FF00FF | 823 | --[------->++<]>-.,>+>+++++++++[-<<----------->>]<<[>+<----[>+<--[>+<----[>+<------[>+<-[>+<-[>>++++[++++>---<]>++.-[---->+++<]>.+.--.+.+.<[-]<[-]]>[>-[----->+<]>.[--->++++<]>++.++[--->++<]>..[-->+++<]>--..<[-]][-]<[-]]>[>-[----->+<]>+.----.--[-->+++<]>.[--->++<]>++.--[-->+++<]>-.+[--->++<]>++.<[-]][-]<[-]]>[>-[------->+<]>---.-----.---------.--------.+++++++.-----.<[-]][-]<[-]]>[>-[------->+<]>---..++[--->++<]>..[-->+++<]>--..<[-]][-]<[-]]>[>-[----->+<]>+.++++++++++++++.[--->++<]>++++..++++++++.------.<[-]][-]<[-]]>[>-[------->+<]>---..--.-------------.-------..<[-]][-]<[-]]>[>,>+>++++++++++[-<<---------->>]<<-[>+<---[>>++++[++++>---<]>+.-.++[--->++<]>+++.+++.-.[--->++++<]>-.<[-]<[-]]>[>-[----->+<]>++++.+++++++++++++++...++[--->++<]>..<[-]][-]<[-]]>[>-[----->+<]>---..+++++++.+++++++++++.-.----------.<[-]]<<[-]] (823 символа) |
| 48 |
( → )
) → (
[ → ]
] → [
{ → }
} → {
> → <
< → >
| 322 | ,>+>+++++[-<<-------->>]<<[>+<-[>+>+++[-<<------>>]<<-[>+<--[>+>++++[-<<------->>]<<-[>+<--[>+>+++++[-<<------>>]<<[>>--[-->+++++<]>.<<[-]]>[>--[-->+++<]>.<]<[-]]>[>-[--->+<]>++++++.<]<[-]]>[>-[--->+<]>++++++++.<]<[-]]>[>----[---->+<]>---.<]<[-]]>[>----[---->+<]>-.<]<[-]]>[>++[------>+<]>---.<]<[-]]>[>++[------>+<]>--.<] (322 символа) |
| 49 |
Hippogriff → XXX Acromantula → XXXX Phoenix → XXXX Niffler → XXX Basilisk → XXXX Chinese Fireball → XXXXX Gnome → XX | 265 | -[--->+<]>+++..,>+>++++++++[-<<-------->>]<<-[>+<-[>+<-[>+<----[>+<-[>+<------[>>-[--->+<]>+++..<[-]<[-]]>[>-[--->+<]>+++.<[-]][-]<[-]]>[>-[--->+<]>+++.<[-]][-]<[-]]>[[-]][-]<[-]]>[>-[--->+<]>+++...<[-]][-]<[-]]>[>-[--->+<]>+++..<[-]][-]<[-]]>[>-[--->+<]>+++..<[-]] (265 символов) |
| 50 |
2+2 → 4 2*2 → 4 3+3 → 6 3*3 → 9 4+4 → 8 4*4 → 16 | 231 | ,>+>+++++[-<<---------->>]<<[>+<-[>>,>+>++++++[-<<------->>]<<[>>-[----->+<]>+++++.<<[-]]>[>-[----->+<]>--.+++++.<]<<[-]<[-]]>[>,>+>++++++[-<<------->>]<<[>>-[----->+<]>+++.<<[-]]>[>+[--------->+<]>.<]<<[-]]<[-]]>[>-[----->+<]>+.<] (231 символ) |
Примечание: во всех уровнях можно написать ещё более короткую программу, ответы выше — не предел!
В задаче надо было всего лишь распознать и сосчитать лего-человечков на таких вот картинках:
Во-первых, задачу можно было решить вручную! По моим оценкам на это должно было уйти часа два-три, но, кажется, некоторые команды наловчились делать это быстрее :-) Дальше поговорим об автоматическом решении.
Глобально, вроде, ничего сложного — надо лишь построить небольшой пайплайн по распознаванию объектов на изображении. Существенное количество первых уровней не содержали на себе ничего, кроме лего-человечков, поэтому если вы научились отделять их от фона, вы уже могли набрать существенное количество баллов.
Однако позже лего-человечки появлялись вместе с другими игрушками, так что хочется отличать их. Всего разных человечков было не так много, поэтому можно было попробовать написать код для автоматического вырезания их с фона и поворачиванию, а затем вручную разметить, что из этого лего-человечек, а что нет.
А можно было взять дата-сет из лего-человечков и обучить классификатор на распознавание именно таких объектов. Например, вот этот дата-сет отлично распознаёт все фигурки (кроме, правда, скелета — тот распознаётся примерно в 50% случаев).
Для классификации объектов можно было выбрать любую подходящую модель. Я выбрал YOLOv8, а обучение в современных фреймворках, к счастью, делается в три строчки:
from ultralytics import YOLO
model = YOLO('yolov8n.pt')
dataset_yaml_path = "path/to/lego/dataset/data.yaml"
results = model.train(data=dataset_yaml_path, epochs=100, imgsz=640)
print("Training Complete!")
print("Your new .pt file is located in the 'runs' folder created in this directory.")
print("Look for: runs/detect/train/weights/best.pt")
На чём обучать модель? Можно и на современном процессоре, но чтобы уложиться в ограниченное время контеста, я арендовал виртуальный сервер с относительно простой для этих целей GPU (RTX 4000 ADA) и меньше чем за $1 в час натренировал модель. Для ещё большей скорости можно взять, например, H100 или H200 — на таком небольшом дата-сете они должны справиться за минуты.
Останется правильно выстроить пайплайн:
model.predict(...) с правильно подобранными параметрами.
Например, я рекомендую agnostic_nms=True, imgsz=2048 и iou=0.5.
Если тоже используете YOLO, то подробнее о параметрах читайте в документации.
PNG-файл разрезали на кусочки равного размера (например, по 4713 байтов), а кусочки перемешали. Восстановите порядок кусочков и посмотрите, что изображено на картинке.
Оказывается, картинку можно восстановить однозначно, даже если количество кусочков достаточно большое! Начнём, однако, со случая, когда кусочков немного. В этом случае можно просто перебрать все возможные перестановки и выбрать те из них, в которых получается правильный PNG-файл.
Посмотреть картинки уровней 1–4
| № | Кусочков | Вопрос | Восстановленная картинка |
|---|---|---|---|
| 1 | 3 | How many birds are on the wire? | ![]() |
| 2 | 4 | How many cars are preparing for the race? | ![]() |
| 3 | 5 | What's a title of this famous book? | ![]() |
| 4 | 8 | How many fish are in the aquarium? | ![]() |
В следующих уровнях количество кусочков увеличивается до 18, 38 и даже 113, и просто перебрать все перестановки не получится. Однако достаточно вспомнить, что PNG-файл состоит из кусочков — «чанков», каждый из которых содержит контрольную сумму CRC32. Если один чанк оказывается на стыке двух кусочков нашего разрезанного файла, то можно быстро узнать, могут ли эти кусочки стоять рядом — достаточно проверить, что контрольная сумма в чанке посчитана верна.
Запустим перебор с возвратом, который будет пробовать добавить какой-нибудь кусочек к уже склееному началу файла. Начать файл легко — в первом кусочек должен быть заголовок PNG-файла (восемь фиксированных байтов) и чанк IHDR, содержащий, среди прочего, размеры картинки в пикселях. Переберём кандидатов на место следущего кусочка, и проверим контрольную сумму в чанке на стыке. Если она совпадает, то с большой вероятностью это и есть правильный кусочек, можно перебирать дальше, потом ещё дальше, и так далее, пока картинка полностью не восстановится.
Посмотреть картинки уровней 5–9
| № | Кусочков | Вопрос | Восстановленная картинка |
|---|---|---|---|
| 5 | 18 | How many donuts are on a plate? | ![]() |
| 6 | 36 | How many clouds are in the sky? | ![]() |
| 7 | 38 | How many slices of pizza weren't eaten? | ![]() |
| 8 | 73 | How many chairs are on the image? | ![]() |
| 9 | 113 | How many eyes does the robot have? | ![]() |
Но что делать, если один чанк занимает сразу несколько кусочков? Тогда нужно перебрать сразу несколько кусочков, чтобы собрать один чанк и проверить его контрольную сумму, а этого мы себе позволить уже не можем...
В этом случае поможет чтение информации непосредственно о пикселях из чанков IDAT. Дело в том, что если склеивать кусочки в неправильном порядке, то картинка будет восстанавливаться корретно (по крайней мере пока мы не дочитаем до конца чанка и не проверим CRC), но выглядеть она будет как-то так:
Обратите внимание на нижние строчки пикселей — это мы приклеили неправильный кусочек! Наличие такого «шума» можно определить автоматически и на основании него откинуть соответствующий кусочек.
Посмотреть картинки уровней 10+
| № | Кусочков | Вопрос | Восстановленная картинка |
|---|---|---|---|
| 10 | 30 | How many blue carriages are on a train? | ![]() |
| 11 | 269 | How many fire blocks are on the image? | ![]() |
| 12 | 398 | How many candles are on the cake? | ![]() |
| 13 | 537 | How many buttons does the snowman have? | ![]() |
| 14 | 356 | How many cups are on the table? | ![]() |
| 15 | 567 | How many steps are on the staircase? | ![]() |
Важно отметить, что во многих уровнях не нужно восстанавливать всю картинку, достаточно восстановить половину или две трети. Если время от времени в переборе сохранять ту часть картинки, что уже восстановлена, то ответ можно получить значительно раньше.
Пожалуйста, не отправляйте увиденный ответ от своего имени.
Если вы хотите дорешивать задачи, нажмите на крестик и не смотрите ответы.