Напишите непустую программу или функцию, которая при вызове выдает одно значение, 1 или 0, а при вызове несколько раз выходные числа дают двоичное представление исходного кода вашей программы (в той же кодовой странице, из которой компилируется ваш код). / интерпретированы).
Например, если ваш исходный код был abc
(в ASCII), выходные данные будут:
1st call: 0 // ASCII letter 'a'
2nd call: 1
3rd call: 1
4th call: 0
5th call: 0
6th call: 0
7th call: 0
8th call: 1
9th call: 0 // ASCII letter 'b'
10th call: 1
11th call: 1
12th call: 0
13th call: 0
14th call: 0
15th call: 1
16th call: 0
17th call: 0 // ASCII letter 'c'
18th call: 1
19th call: 1
20th call: 0
21st call: 0
22nd call: 0
23rd call: 1
24th call: 1
After the 24th call, the behaviour is undefined.
Двоичное представление источника должно содержать как минимум один бит 0 и один бит 1.
Вместо 1 и 0 вы можете вывести любые два различных согласованных значения (например, true
и false
).
Допускаются самоизменяющиеся программы, которые выводят двоичное представление исходного источника, при условии, что они не читают исходный код, чтобы узнать, что печатать дальше.
Это код-гольф , поэтому выигрывает самый короткий ответ в байтах.
удар , 105 байт
НОТА . Убедитесь, что
f
в каталоге, который вы тестируете, нет важного файла, который вызывается.Если вы хотите проверить это, вы можете использовать следующую команду:
Который должен дать тот же результат
xxd -c1 -b path/to/script.sh|cut -d\ -f2|tr -d \\n
.объяснение
Это использует
trap
хитрость - вызовtrap
внутриtrap
действия просто печатает эту строку. Затем этот вывод передается по конвейеру,xxd
который преобразует его в двоичный файл (к сожалениюxxd -bp
, не работает - таким образом, обходится обход сcut
&tr
):Из этого нас интересует только один бит (скажем
N
), который мы можем выбратьcut -cN
.Чтобы выяснить, что
N
мы используем (помните, что это та часть, которую нужно увеличивать после каждого вызова), просто попробуйте установитьx
содержимое файлаf
и, если он не существует, установите его равным 1:Последнее, что нужно сделать, это обновить файл
f
- записьx+1
в него:источник
TI-Basic (серия TI-83),
592357309 байтЭта таблица является возможной ссылкой на двоичное представление калькулятора исходного кода, хотя в конечном итоге я просто использовал отладчик Virtual TI.
Для сравнения и / или исторического интереса: первые цитаты, написанные на TI-Basic .
Как это устроено
Str1
хранит исходный код (теперь в великолепном шестнадцатеричном, экономя много места по сравнению с предыдущей двоичной версией), исключая биты, в которыхStr1
будет представлено содержимое самого себя.Мы предполагаем , что программа начинается на калькуляторе, память которого только что был очищен, так
X
это0
. Каждый раз через программу мы увеличиваемX
.Обычно мы просто вычисляем половину байта, из которого мы пытаемся извлечь немного, читаем его
Str1
, преобразуем из шестнадцатеричного в двоичный и печатаем его. Если мы на части исходного кода , который хранящейStr1
(что составляет две трети от общей длины программы), то первый шаг к соответствующей части строки хранения31
,32
и так далее.источник
Java 8,
249241237234148 байтЗаранее извините за длинные объяснения. :)
Попробуй это здесь.
Объяснение:
Дополнительное объяснение:
Куайн -часть:
String s
содержит неформатированный исходный код%s
используется, чтобы поместить эту строку в себя сs.format(...)
%c
,%1$c
И34
используются для форматирования двойных кавычек ("
)s.format(s,34,s)
складывает все вместеПопробуйте это здесь с некоторыми частями, удаленными / измененными, чтобы проверить вывод quine его собственного исходного кода.
двоичная -часть:
-i/8
будет автоматически усекаться при целочисленном делении, поэтому, когда значениеi
равно от -7 до 0, оно становится0
; если отi
-15 до -8, то станет1
; и т.п.s.charAt(-i/8)
принимает текущий символ исходного кода, восемь раз друг за другом. Попробуйте здесь с модифицированной версией.--i&7
будет7,6,5,4,3,2,1,0,7,6,5,4,3,2,1,0,...
, где первый7
, когдаi=0
(который становится-1
первым из-за--i
, и будет продолжать уменьшаться).s.charAt(-i/8)>>(--i&7)
будет производить последовательности в зависимости от символов. Некоторые примеры ('A'
(65) через'E'
(69)):0,1,2,3,4,8,16,32,65,0,1,2,4,8,16,32,65,...
:;0,1,2,4,8,16,33,66,0,1,2,4,8,16,33,66,...
:;0,1,2,4,8,16,33,67,0,1,2,4,8,16,33,67,...
:;0,1,2,4,8,17,34,68,0,1,2,4,8,17,34,68,...
:;0,1,2,4,8,17,34,69,0,1,2,4,8,17,34,69,...
:;...&1
затем выводит a,0
если это четное число, и1
если это нечетное число, которое в сочетании с приведенными выше последовательностями выводит правильный результат.Старый 233 байта ответа:
Попробуй это здесь.
Объяснение:
Дополнительное объяснение:
Куайн -часть:
То же объяснение, что и выше, с добавлением:
%%
является экранированной формой по модулю (%
)Попробуйте это здесь с некоторыми частями, удаленными / измененными, чтобы проверить вывод quine его собственного исходного кода.
двоичная -часть:
i/8
автоматически усекается при целочисленном делении, поэтому, когдаi
0-7, оно станет0
; еслиi
будет 8-15, то станет1
; и т.п.s.charAt(i/8)
принимает текущий символ исходного кода, восемь раз друг за другом. Попробуйте здесь с модифицированной версией.255
is0xFF
или11111111
(максимальное значение для байта без знака)256
это0x100
или100000000
.&
Сбросы в ASCII-символ в целое число. На этом этапе, это где -то между0
и255
(00000000
в11111111
).Long.toString(...,2)
преобразует его в 9-битное двоичное строковое представление+256
и.substring(1)
обеспечит наличие начальных нулей, и преобразует 9-разрядный в 8-разрядный.Попробуйте здесь с некоторыми частями удалены / изменены, чтобы проверить все байты.
источник
int i;v->{String s="int i;v->{String s=%c%s%1$c;return 1&s.format(s,34,s).charAt(-i/8)>>(--i&7);}";return 1&s.format(s,34,s).charAt(-i/8)>>(--i&7);}
Javascript ES6,
735852 байтаобъяснение
Разбивка кода:
o=_=>
: определить функцию.`o=${o}`
: построить строку;o
преобразуется в строку, которая в данном случае является исходным кодом функции..charCodeAt(
: получить символ в строке как его код символа ASCII.(o.n=1+o.n|0)/8
: выберите персонажа. Это также, где счетчик увеличивается.)>>(7-o.n%8)
: сдвиньте полученный символьный код так, чтобы нужный бит находился в правильном положении.&1
: установите все остальные биты в 0.источник
o=_=>(o+'').charCodeAt(('n'in top?++n:n=0)/8|0)>>(7-n%8)&1
o=_=>('o='+o).charCodeAt(('n'in top?++n:n=0)/8|0)>>(7-n%8)&1
'n'in top?++n:n=0
вы можете использовать++n||(n=0)
или++n?n:n=0
илиn=++n||0
илиn=1+n||0
все, которые используют ложь,NaN
которая производится путем увеличенияundefined
o=_=>('o='+o).charCodeAt((o.n=1+o.n|0)/8)>>(~o.n&7)&1
q / kdb + , 45 байт
Решение:
Пример:
Объяснение:
Я думаю, что понял краткое.
Сначала настройте глобальную переменную
a
с начальным значением-1
. Функцияf
создает двоичное представление строкового представления функции (все, включая{}
), с добавлениемa:-1;f:
мусора, и индексирует в этот двоичный список по индексу a (который увеличивается с каждым вызовом).источник
Python 2 , 164 байта
Попробуйте онлайн!
объяснение
Давайте начнем со стандартного Quine Python 2.
Хорошо, хорошо, это выводит это просто так. Нам нужен двоичный файл!
Правильно, это просто конвертирует все в двоичный код. Но название гласит «по одному за раз». Нам нужно что-то, чтобы сохранить через несколько прогонов. Я знаю, давайте сделаем это функцией!
Подождите, это не поможет ... Хм, как мы можем отслеживать индекс бита, который должен быть выведен? Ох, ох, давайте иметь целое число, чтобы отслеживать.
Гм ... это всегда выводит первый бит. О, нам нужно увеличить трекер! О дерьмо, Python не допускает изменения целых чисел в качестве аргументов по умолчанию. И назначения не являются выражениями в Python, поэтому вы не можете сделать это в лямбда-выражении. Хорошо, это невозможно в Python, дело закрыто.
... ну не совсем. Python делает позволяют списки в качестве аргументов по умолчанию должны быть изменены. (И это постоянно кусает программистов на Python.) Давайте использовать его длину!
Это все еще не изменяет трекер ... Мы можем добавить к нему что-нибудь, чтобы увеличить его длину ... Но как? Ну, у нас есть
list.append
.lst.append(1)
эквивалентноlst += [1]
. Большой!Ой, это пропускает первый бит, потому что длина трекера равна 1, прежде чем бит будет выведен. Нам нужно уменьшить длину, где он используется.
Вот оно, ребята! Гольф это, и у вас есть мое решение!
источник
Perl 5 , 59 байт
Попробуйте онлайн!
источник