задача
- Возьмите один символ Unicode в качестве ввода.
- Выведите программу на том же языке, который также соответствует этой спецификации, но не содержит вводимый символ.
- Если ваша программа запускается с помощью ввода a , а затем выходная программа запускается с помощью ввода b , то программе, которую она выводит, разрешено содержать символ a . Однако b все еще не разрешено появляться в этой программе. Другими словами, только вход в самое последнее воплощение программы запрещено появляться.
- Независимо от того, что заголовок может сказать, применяются стандартные правила Квина.
Кратчайшая программа выигрывает. Программа должна быть длиной не менее одного байта.
пример
Если программа ABCD. (# это комментарий)
> slangi "ABCD"
A
EBCD # "FBCD" "JGGJ" "UGDKJGDJK" are all OK
> slangi "EBCD"
C
ABGD # "EBGD" "UIHDAIUTD" are all OK
> slangi "ABGD"
B
AFCD
> slangi "AFCD"
Z
ABCD
Где slangi
переводчик для вымышленного языка.
code-golf
restricted-source
quine
Akangka
источник
источник
e
.e
, но это делает Гэдсби.Ответы:
CJam,
45413835 байтЕсли вводимый символ не является ни одним из символов
"$&)+,/:?HOX\_`el{}
, эта программа печатает следующую, слегка измененную версию себя. Попробуйте онлайн!В противном случае программа печатает следующую обфусцированную версию модификации. Попробуйте онлайн!
Обратите внимание, что некоторые символы непечатаемы. Попробуйте онлайн!
Как это работает
В первой возможной программе вывода мы избегаем использовать
~
ее для использования в другой программе. Поэтому вместо_~
модифицированной программы заканчиваетсяOX$_?
, что работает следующим образом.Наконец, в оставшейся выходной программе
оборачивает все эти символы в массив, поэтому выдвигает следующую строку.
If-
вычитает 18 из каждого кода символа, нажимая строкукоторый
~
оценивает.источник
JavaScript (ES6),
356340327308303263Теперь используем
Function`...```
для второй программы:Функция упаковывает себя в одну из трех возможных программ:
Первая программа вызывает
eval
строковый литерал, содержащий код функции, причем каждый символ экранируется как восьмеричное значение.Вторая программа перенаправляет браузер на
javascript:
URL-адрес, содержащий код функции с кодированным URL-адресом каждого символа. Это единственный способ оценить код без использования скобок. Это также ускользает от букв в 'Eval'.Последняя программа мучительно длинная. Он строит код функции, добавляя по одному (
+9-8
) за раз, чтобы получить код каждого символа. Это делается для того, чтобы не использовать восьмеричные цифры.Правильная программа индексируется путем поиска тщательно сконструированной строки для входного символа:
Вот неопробованная, не проверенная версия. Это может не сработать из-за новых строк в источнике.
источник
function f(){ ... };f()
может быть(f=_=>{ ... })()
. Вот пример: es6fiddle.net/iiz2nq0lf=(_=prompt())=>...;f()
. Ввод сохраняется как_
.Function`[code]`.call``;
работу вместо перенаправления? Вот рабочий пример: es6fiddle.net/ij023v49 (видите? Нетevil()
! Эмм, я имею в видуeval()
...)this
объект будет той пустой строкой шаблона. Он опирается наFunction
конструктор, который позволяет создавать функции, а не запускатьeval()
. Функция будет иметь код, содержащийся в первом параметре. Я использую это много, чтобы получить реальноеwindow
, используяFunction('return this')()
. Так как вы не можете использовать()
, я немного злоупотребил добротой ES6, пытаясь выплюнуть полезную функцию, без которой вы можете работать()
. Для этого вам нужен.call()
метод, который вызывает функцию с новымthis
объектом.