Бурлеск, 40 байт
ri#Q2 SH ~- "ri#Q" \/ .+ j "<-" ps if sh
Объяснение:
Burlesque имеет расширенные встроенные функции для работы со стеком и кодами. Фактически, вы не можете получить доступ к исходному коду программы, но вы можете получить доступ к оставшемуся коду, который должен быть выполнен в будущем. Это означает, #Q
что вернет весь код, который следует за ним, поэтому мы должны добавить все #Q
к этому коду, что мы и делаем ri#Q
.
blsq ) #Q1 2++
12 -- this is the result of 1 2++
{1 2 ++} -- this is the result of #Q
++1 2
технически недопустимый код, так как он основан на стеке. Но мы можем манипулировать кодом, чтобы он выполнялся как 1 2++
:
blsq ) #Q<-#q++1 2
12
Работать с этими встроенными модулями невероятно сложно, и никто до сих пор не использовал их для чего-то продуктивного, кроме вещей, связанных с Quine. Если вы перевернете, ++1 2
вы получите то, 2 1++
что будет производить, 21
а не 12
. Причина, по которой приведенный выше код 12
состоит в том, что он #Q
также включает в себя то, <-
что в итоге мы выполняем намного больше, чем просто 2 1++
: p. Мы заканчиваем тем, что выполняем, 2 1++#q<-
который производит 12
.
Мы можем фактически заменить вещи в нашем коде, например, этот код заменяет все вхождения ?+
в себе?*
blsq ) #Q(?+)(?*)r~5.-#q5 5?+
25
Использование:
$ echo "1" | blsq --stdin 'ri#Q2 SH ~- "ri#Q" \/ .+ j "<-" ps if sh'
hs fi sp "-<" j +. /\ "Q#ir" -~ HS 2Q#ir
$ echo "0" | blsq --stdin 'ri#Q2 SH ~- "ri#Q" \/ .+ j "<-" ps if sh'
ri#Q2 SH ~- "ri#Q" \/ .+ j "<-" ps if sh