cinpush
main:
gte Hans 1s Leopold
jnz Leopold done
mov 1s Hans
gte Gertrude Hans Leopold
jnz Leopold done
mov Gertrude ShabbySam
mov Hans Gertrude
mov ShabbySam Hans
gte Alberto Gertrude Leopold
jnz Leopold done
mov Alberto ShabbySam
mov Gertrude Alberto
mov ShabbySam Gertrude
done:
mov 10 ShabbySam
gte 1s ShabbySam Leopold
jz Leopold undo_u
mov 30 ShabbySam
gte 1s ShabbySam Leopold
jz Leopold undo_d
undo_r:
POP!! 1
"shuffle" f
"shuffle" f
"shuffle" b
"shuffle" b
"shuffle" l
"shuffle" f
"shuffle" f
"shuffle" b
"shuffle" b
jmp end
undo_u:
POP!! 1
"shuffle" f
"shuffle" f
"shuffle" f
"shuffle" b
"shuffle" b
"shuffle" b
"shuffle" l
"shuffle" l
"shuffle" l
"shuffle" f
"shuffle" b
jmp end
undo_d:
POP!! 1
"shuffle" f
"shuffle" b
"shuffle" l
"shuffle" f
"shuffle" f
"shuffle" f
"shuffle" b
"shuffle" b
"shuffle" b
end:
jnz 1s main
print Hans
done!
Это было очень весело, спасибо, Лиам! :)
Спасибо Sp3000 за небольшой, но необходимый толчок в правильном направлении.
Как?
Два слова: карманный куб .
Оказывается, что стеки соответствуют граням кубика Рубика 2x2x2 следующим образом:
____ ____
| | |
| 19 | 17 |
|____U____|
| | |
| 20 | 18 |
_________|____|____|____ ____ ____ ____
| | | | | | | | |
| 13 | 14 | 1 | 2 | 9 | 10 | 6 | 5 |
|____L____|____F____|____R____|____B____|
| | | | | | | | |
| 15 | 16 | 3 | 4 | 11 | 12 | 8 | 7 |
|____|____|____|____|____|____|____|____|
| | |
| 22 | 24 |
|____D____|
| | |
| 21 | 23 |
|____|____|
Где ULFRBD
указывает, какое лицо соответствует вверх, влево, вперед, вправо, назад, вниз, когда куб сложен правильно.
Перестановки соответствуют повороту любой из сторон на 90 градусов (где имена, к счастью, совпадают). Оказывается f
, r
и , и d
являются вращениями по часовой стрелке (при просмотре лица) и r
, l
и , и u
являются вращениями против часовой стрелки (при просмотре лица).
Теперь cinpush
команда действует таким образом, что он применяется один из поворотов u
, d
или r
( в зависимости от заданного значения) , а затем толкает входное значение в стек в положении 1
. (И затем он повторяет эту операцию для каждого элемента на входе.) Это означает, что мы можем повернуть этот процесс вспять (чтобы мы получили правильный порядок стеков без необходимости решать произвольный кубик Рубика), неоднократно просматривая стек в положение 1
, отменяя соответствующую перестановку и выталкивая значение этого стека (так, чтобы в следующий раз, когда мы увидим стек, мы получили значение под ним).
Как мы отменяем вращения? К счастью, мы оба f
и b
в нашем распоряжении. Если мы применим оба из них, мы поворачиваем весь куб на 90 градусов. Это означает , что мы можем двигаться пораженной стороны ( U
, R
или D
) , чтобы L
, отменить вращение с помощью одного или трех l
с ( в зависимости от относительного направления l
и вращение выполняется во время ввода), а затем повернуть куб назад к его предыдущей ориентации с использованием f
и b
опять таки.
В частности, каждое из вращений, выполненных во время ввода, может быть отменено следующим образом:
u --> fffbbblllfb
r --> ffbblffbb
d --> fblfffbbb
Я посмотрю, смогу ли я придумать анимацию, чтобы показать, что это работает.
Теперь это дает нам возможность перебрать весь ввод один раз. Но с 5 регистрами это все, что нам нужно:
Alberto
максимальное значение, встречающееся до сих пор.
Gertrude
является вторым по величине значением, встречающимся до сих пор.
Hans
является третьим по величине значением, встречающимся до сих пор.
Когда мы сталкиваемся с новым значением, мы добавляем его по мере необходимости, где мы можем использовать его ShabbySam
как временный регистр для свопов. Это все еще оставляет, Leopold
что мы можем использовать для условного сравнения при проведении необходимых сравнений.
В конце процесса мы просто печатаем содержимое Hans
, которое уже будет содержать 3-е по величине значение.
TKDYNS Сэм Кэпплман-Линс
Это, вероятно, не оптимально, но я думаю, что это добивается цели ...
Это может быть неожиданностью, но я не писал это вручную ... код был сгенерирован следующей программой Mathematica:
Я на самом деле написал все эти
safetyCheck
строки вручную. Но первая строка этого кода Mathematica на самом деле имеет длину около 28 000 символов и сама была сгенерирована следующим кодом CJam:(Который принимает в качестве входных данных 10 макетов, жестко запрограммированных в интерпретаторе. Вы можете запустить код онлайн. )
Код поколения-ception!
объяснение
Для начала взгляните на этот скрипт CJam, чтобы увидеть, как выглядят лабиринты.
Мое решение основано на одном важном наблюдении: пока мы подбираем элементы вдоль одного столбца, мы не будем переключаться между макетами, независимо от того, заполнены ли ячейки или нет. В частности, пока мы движемся вдоль самого левого столбца, мы останемся в макете
0
. Пока мы движемся вдоль следующего столбца, мы будем оставаться в макете1
.Сложность в том, как убедиться, что мы изменились между макетами, потому что мы не знаем, в каких ячейках столбца
1
есть элементы (если они есть!).Итак, вот алгоритм (начиная с ячейки
0
в макете0
):Теперь для каждой ячейки справа от текущего столбца (пробуя их в главном порядке столбцов), попробуйте переместиться туда в текущем макете, выбрать там элемент, а затем перейти в верхнюю строку в этом новом столбце, используя новый макет.
Если попытка ячейки содержала элемент, макет будет изменен, и мы успешно достигнем нового столбца и макета. Поскольку новая (безопасная) позиция находится в верхнем ряду, но все попытки найти следующий столбец включают 10 чистых движений вверх, все остальные попытки потерпят неудачу, поэтому мы можем их игнорировать.
Если в сотворенной ячейке не было предмета, в большинстве случаев миньон умрет при попытке добраться до верхнего ряда, используя неправильный макет, следовательно, откажется от этой попытки. Тем не менее, это не всегда так. Например, попытавшаяся ячейка уже может быть в верхней строке, поэтому в новом макете не было никаких перемещений. Аналогично, в некоторых случаях путь от ячейки до верхней строки достаточно короткий, чтобы быть допустимым в обоих макетах. Я собрал все случаи, когда это проблема вручную, и определил набор ходов, который действителен только на новом макете (но который перемещает миньона обратно в целевую ячейку, так что это фактически неоперация на новый макет). После каждой попытки, когда это может быть проблемой, я выполняю этот набор ходов, чтобы убить всех миньонов, которые не
Теперь мы успешно переместились в верхнюю часть следующего столбца, который содержит хотя бы один элемент. Вернитесь к шагу 1.
Вы можете заметить, что структура решения следующая:
Что касается кода Mathematica,
safetyCheck
строки - это те отобранные движения, которые гарантируют, что мы достигли нового макета. Первый параметр поиска - это макет, с которого мы начинаем, а второй - это ячейка, которую мы пытались выполнить. Любые комбинации, которые не упомянуты явно, просто дают пустую проверку безопасности (потому что ни одна из них не нужна).В дополнение к этому, я просто устанавливаю 10 лабиринтов как
Graph
объекты, где есть два направленных ребра между любыми соседними (и соединенными) ячейками, где каждое ребро помечено движением, необходимым для пересечения ребра. Имея это в виду, я могу просто найти пути, используя,FindShortestPath
а затем извлечь соответствующие метки реберPropertyValue[..., EdgeLabels]
.Остальная часть кода просто использует это для реализации вышеупомянутого алгоритма довольно напрямую.
Фактические данные графика хранятся в
layouts
и были сгенерированы с помощью скрипта CJam, который декодирует числа, как описано в посте полицейского, и превращает их в список Mathematica, который можно легко преобразовать в график.источник
HPR, Zgarb
Код:
Прежде всего ... код был сгенерирован, а не написан от руки (или напечатан).
Факты о языке:
Программа использует следующий psuedocode:
Среда почти всегда содержит только 1 список и 1 целое число.
Чтобы решить эту проблему, я создал небольшой макро-движок для этого языка. Это также позволяет комментарии. Вот макрос движок:
После того, как я создал макро-движок, я постепенно создал полезные функции для этого языка. Вот код, который обработал движок для создания программы:
источник
Брайан и Чак от Мартина Бюттнера
Следующая программа на Python 2.7 выводит мою программу Brian & Chuck, переводя программу brainfuck на Brian & Chuck (за исключением того, что
.
всегда печатает1
, поскольку это единственный символ, который нам нужно вывести).Поток управления работает по
волшебству,когда Брайан записывает команды Чака на магнитную ленту, чтобы отправить Брайана в нужное место в коде.Обратите внимание, что пробелы и символы,
[]
добавленные в программу B & C, являются только декоративными.источник
Firetype, автор kirbyfan64sos
Рабочий, закомментированный код:
Это зависит от переводчика, который в настоящее время представлен в ответе полицейского, что немного противоречит документации, касающейся
%
и!
.Основной проблемой здесь был анализ входных данных, поскольку
\
поиск третьего по величине значения довольно прост.источник
Acc !, DLosc
Этот язык имеет ужасную поддержку сравнения.
В
count [varname] while 0
заявлении в начале должны объявить переменный , содержащие наибольшее число, второе по величине числа, третьи по величине числа, и так далее. Сравнения осуществляются путем вычитания двух чисел с последующей проверкой, является ли результат отрицательным, путем проверки, является ли оно числом меньше этого10^6
.источник
Цинк, автор kirbyfan64sos
Это было не так сложно, когда я понял, как работает язык. Трудно было получить ошибки синтаксического анализатора, но добавление лишних скобок, похоже, исправило это. Вот решение:
объяснение
В первой и второй строк, я определить
+
, являетсяcut
операция. Остальное - это понимание. Давайте возьмем входные данные101011101100
в качестве примера и начнем с самого внутреннего:Он берет те элементы
a
из входного набора,S = {1,0,1,0,1,1,1,0,1,1,0,0}
чей индекс не равенlen(S)-1
, поэтому все, кроме последнего. Я заметил, что это также переворачивает набор, так что результат естьA = {0,1,1,0,1,1,1,0,1,0,1}
. Далее пониманиепринимает все элементы,
A
кроме первого, и переворачивает его снова, что приводит кB = {1,0,1,0,1,1,1,0,1,1}
. Затем мы разбиваемB
на0
s (это приводит к{1,1,{1,1,1},{1,1}}
его обращению или его обращению, я не проверял какой) и сортируем результат по длине. Одиночные множества сглажены, но все они1
s, поэтому их длина равна 1. Вот код:Результат этого есть
C = {{1,1,1},{1,1},1,1}
. Наконец, мы отфильтровываем все, кроме элемента с индексом 2,Это приводит к набору
D = {1}
в нашем случае. В общем, он может иметь форму{{1,1,..,1}}
, но это не имеет значения, поскольку1
печатаются только буквы s.источник
Компас Суп, от BMac
Это было весело
Редактировать: эта программа должна начинаться с новой строки, чтобы работать с интерпретатором BMac. Я не могу заставить новую строку появляться в блоке кода.
Программа разделена на 4 исполнительных раздела.
Первый, в строке 1, добавляет a
#
в конец ввода, найдя00
и заменив 20
на#
. Это также меняет все1
s наA
s, так как я хотел, чтобы1
в исходном коде было как можно меньше s.Второй раздел, в строке 5, выбирает второе число на входе и помещает его ниже первого числа в виде строки
+
s. Например, если ввод11011101100
, то это приведет к следующему:Третий раздел, в строке 12, объединяет строку
+
s с первым числом: каждый0
над a+
становитсяA
,A
становитсяB
,B
становитсяC
иC
остается неизменным. После этого мы возвращаемся во 2-й раздел, чтобы получить следующий номер.После того, как все числа были объединены таким образом, мы достигаем последнего раздела в строке 18. Число
C
s является нашим желаемым выводом, поэтому мы меняем их на1
s, пропуская первое,C
потому что1
в исходном коде есть единичное, которое печатается вдоль с выходом.источник