Ваша задача состоит в том, чтобы написать непустую программу / функцию подсчета байт L , который, когда повторные М раз, проверяет , является ли данная целым положительным числом N равен L × M .
Теоретически вы должны поддерживать произвольное количество повторений (произвольное положительное целое число M ), но это нормально, если из-за языковых ограничений он не может работать через определенный порог. Чтение исходного кода вашей программы или доступ к информации о нем строго запрещены .
Для обеспечения вывода вы должны выбрать непротиворечивое значение для одного из состояний (истинное или ложное) и использовать любой другой (не обязательно непротиворечивый) возможный вывод для другого состояния ( Обсуждение ).
Ваши ответы будут оцениваться по длине вашей начальной программы L (в байтах), при этом меньше байтов будет лучше.
пример
Допустим, ваша (начальная) программа ABCDE
. Потом:
ABCDE
(1 повторение) должен проверить, равен ли вход 5 .ABCDEABCDE
(2 повторения) должны проверить, равен ли вход 10 .ABCDEABCDEABCDE
(3 повторения) должны проверить, равен ли вход 15 . И т.д...
Оценка этого примера кода будет 5 , поскольку исходный источник имеет длину 5 байтов.
источник
L
после себя,M
должен возвращать,N
равен ли его входL*M
?Ответы:
Желе , 1 байт
Выходной сигнал равен 0 для совпадения, ненулевой для несоответствия.
Попробуйте онлайн!
Как это устроено
Это дает преимущество чрезмерно либерального формата вывода. Повторение
’
M раз просто уменьшает ввод M раз, поэтому результат будет нулевым, если и только если вводом является LM , где L = 1 .источник
Haskell, 8 байт
Попробуйте онлайн!
Как и многие другие ответы, он возвращает 0 для истинности и не 0 для ложных, многократно вычитая длину кода из входного числа.
источник
Сетчатка ,
2120 байтПопробуйте онлайн! Просто повторите часть в окне кода, чтобы увидеть, как он обрабатывает мультипликаторы.
Дает
0
правильные кратные и положительные целые числа для всего остального.объяснение
Давайте сначала посмотрим на одну программу:
Это преобразует десятичное число в унарное (используя
_
в качестве унарной цифры).Если строка пуста (что не может произойти в этот момент, потому что входные данные гарантированно будут положительными), мы заменим ее одинарной
_
.Теперь мы избавляемся от первых 20 подчеркиваний. Если вход был
20
, это приводит к пустой строке.И, наконец, мы подсчитываем количество подчеркиваний в результате, которое равно нулю, если ввод был
20
.Теперь, что происходит, когда мы повторяем исходный код. Так как мы не вставляем перевод строки при присоединении к программам, первая строка будет идти в конце последней строки, мы получаем это, когда программа удваивается:
Теперь вместо подсчета подчеркивания мы получаем следующую стадию:
Этот этап ничего не делает, потому что в рабочей строке больше нет цифр, поэтому регулярное выражение не может совпадать.
Теперь этот этап становится актуальным. Если ввод был кратен 20, строка была очищена предыдущей копией исходного кода. В этом случае мы превращаем его в единственное подчеркивание, которое, как мы знаем, больше никогда не может быть превращено нашей программой в пустую строку. Таким образом , мы гарантируем , что только в М - е множественный принимаются (и не все кратные вплоть до М - го).
Мы удалим первые 20 подчеркиваний еще раз. Таким образом, M повторений исходного кода удалит 20M подчеркивания из строки, если это возможно.
И когда мы дойдем до конца программы, мы по-прежнему будем считать подчеркивание, чтобы действительные входные данные давали ноль.
источник
32-битный фрагмент машинного кода x86, 1 байт
Вход в EAX, вывод в EAX: 0 для истины, ненулевое значение для ложных. (Также оставляет флаг ZF установленным для true, не установленным для false, чтобы вы могли
je was_equal
). В качестве «бонуса» вам не нужно беспокоиться об упаковке; 32-битный x86 может адресовать только 4 ГБ памяти, поэтому вы не можете сделать M достаточно большим, чтобы полностью обернуться и найти1 == 2**32 + 1
что-нибудь.Чтобы создать вызываемую функцию, добавьте
0xC3
ret
инструкцию после повторения0x48
M раз. (Не учитывается при общем подсчете, потому что многим языкам нужно повторять только тело функции или выражение, чтобы иметь возможность конкурировать).Вызывается из GNU C с помощью атрибута функции x86 прототипа
__attribute__((regparm(1))) int checkeqM(int eax);
GNU Cregparm
, например-mregparm
, использует EAX для передачи первого целочисленного аргумента.Например, эта полная программа принимает 2 аргумента, и JIT помещает M копий инструкции + a
ret
в буфер, а затем вызывает ее как функцию. (Требуется исполняемая куча; скомпилировать сgcc -O3 -m32 -z execstack
)не-PIE исполняемые файлы загружаются ниже в виртуальной памяти; может сделать больший смежный malloc.
Обратите внимание , что GNU C не поддерживает объект размером более
ptrdiff_t
(32-разрядное), ноmalloc
иmemset
сделать еще работы, так что эта программа успешно.Фрагмент машинного кода ARM Thumb, 2 байта
Первый аргумент in
r0
и возвращаемое значение inr0
- это стандартное соглашение о вызовах ARM. Это также устанавливает флаги (s
суффикс). Забавный факт; не -flag устанавливающих версияsub
является 32-битной инструкции.Команда возврата вам необходимо добавить это
bx lr
.Фрагмент машинного кода AArch64, 4 байта
Работает для 64-битных целых чисел. Ввод / вывод в
x0
соответствии со стандартным соглашением о вызовах.int64_t foo(uint64_t);
У AArch64 нет режима Thumb (пока), поэтому 1 инструкция - лучшее, что мы можем сделать.
источник
__builtin___clear_cache
необходим только потому, что вы выполняете память, из которой вы получилиmalloc
. Еслиmmap
вместо этого вы получили память , оптимизация не происходит.V , 16 (или 1) байт
Скучный ответ:
один байт
Менее скучный ответ:
Попробуйте онлайн!
HexDump:
Я на самом деле написал это примерно через 5 минут после выхода вызова. Мне потребовалось 30 минут, чтобы залатать эту ужасную кучу спагетти-кода, который я называю языком .
источник
Perl 5
-p
, 6 байтовПопробуйте онлайн!
использует
0
для равныхисточник
-p
решение Perl 6 .Брахилог , 2 байта
Попробуйте онлайн!
источник
Python 3 , 27 байт
Попробуйте онлайн!
Код повторяется дважды:
Попробуйте онлайн!
источник
Brain-Flak , 24 байта
Попробуйте онлайн!
Возвращает
0
для равных и что-то еще для не равных.Как это устроено:
n
Время выполнения этого кода будет вычитатьсяn * 24
из ввода, давая 0 только когда input =n*24
.источник
Stax , 1 байт
Попробуйте онлайн!
источник
TI-Basic (серия 83), 4 байта
Принимает ввод в
Ans
: например, вы можете набрать,17:prgmCODEGOLF
чтобы запустить это с вводом17
. Печатает (и возвращаетAns
) значение,0
если входное значение равно L × M , и ненулевое значение в противном случае.Обратите внимание, что
:
это часть кода, поэтому, если вы вводите это в редактор программы, вы должны увидетьесли вы введете его один раз и
если вы введете его три раза.
источник
Haskell , 12 байт
Попробуйте онлайн!
Выходы
0
для правдивого и ненулевого целого числа для ложного.Альтернативный раствор, 12 байт
Попробуйте онлайн!
источник
Befunge-98 , 15 байт
Попробуйте онлайн!
Попробуй вдвое!
Использует 0 для равных и все остальное для неравных.
Объяснение:
Этот код, повторенный много раз, будет выглядеть примерно так:
]
направо. Отправляет IP вниз.>
двигаться на восток Посылает IP правильно.f
нажмите 16.v
двигаться на юг Отправляет IP вниз. Если это последний раз, перейдите к шагу 8.]
направо. Посылает IP влево.+
добавлять. Добавляет 16 к вершине стека.v
двигаться на юг Отправляет IP вниз. Перейти к шагу 2.<
двигаться на запад Отправьте IP слева.#
пропускать. перепрыгнуть]
и обернуть до конца.+
добавлять. Добавляет 16 к вершине стека.&
вход. Нажмите номер от пользователя.-
вычитать. получите разницу в сумме, над которой мы работали, и входные данные..
Распечатать. Распечатайте результат.@
конец.источник
Чистый Баш , 15
Ввод дан как параметр командной строки. Выводить как код выхода оболочки -
1
для TRUE и0
для FALSE.источник
Древесный уголь , 13 байт
Попробуйте онлайн! Исходя из моего ответа, я удваиваю источник, вы удваиваете вывод! Объяснение:
1
Умудряется выводить за правдивость и0
за ложь. Последующие повторы сравнивают вход против13
,26
,39
, и52
т.д. , но каждый раз , когда ответ надпечатки так только окончательный ответ видно.источник
JavaScript ES6, 32 байта
если true будет 0 и false как другие, 31 байт
источник
MIPS, 4 байта
Используется в
$a0
качестве аргумента и возвращаемого значения.MIPS, 8 байтов (с использованием соглашения о вызовах MIPS)
x86, 5 байт
Это мой первый ответ на x86, поэтому отзывы приветствуются. Использует соглашение _fastcall с ecx в качестве первого аргумента.
Питер Кордес есть 1-байтовое решение в комментариях.
Комментарий Brainfuck : сложная часть состоит в том, чтобы заставить brainfuck вернуть единственное значение. Иначе что-то вроде этого было бы легко.
источник
sub $4, %al
/mov %al, %dl
. Или все же вернитесь в AL / EAX, и тогда вы получите решение Денниса сdec %eax
(1 байт в 32-битном режиме). И да, пользовательские соглашения о вызовах хороши для asm. Это asm, а не просто "asm, который легко вызвать из C"; реальный код, написанный на asm, использует пользовательские соглашения о вызовах, где это помогает, так что это полностью оправдано.r0
котором также указан ответ, поэтому Thumbsub r0, #2
имеет размер 2 байта.ret
конец блока повтора, прежде чем вы сможете их вызвать. Обычно я включаюret
подсчет байтов для моих ответов на x86 asm. Но я думаю, что изменение правил здесь, чтобы только тело функции имело смысл, иначе многие языки не могут конкурировать вообще.xchg %eax, %ecx
/sub $4, %al
/xchg %eax, %ecx
составляет 4 байта и следует соглашению _fastcall. Использование AL, короткие кодировки imm8 и xchg-with-eax часто полезны для гольф-кода.objdump -drwC -Mintel
чтобы получить hexdump байтов машинного кода.add r32, imm8
также 3 байта: код операции + ModR / M + imm8. Все инструкции, которые могут использовать imm32, имеют альтернативный код операции, который принимает расширенный знак imm8. См. Felixcloutier.com/x86/ADD.html, например; все «классические» инструкции ALU (но не MOV), относящиеся к 8086 году, имеют все эти кодировки, включая специальные AL / AX / EAX без modr / m, просто op + imm8 / 16/32. В этом ответе есть примерыОктава: 23 байта
Если N = L * M, выражение возвращает
0+i
(т.е. чисто мнимое число), в противном случае выражение приводит к комплексному числу с вещественным компонентом.Для более приятного результата за счет дополнительного байта:
Если N = L * M, выражение возвращает
-1
, в противном случае положительное число.Демо-версия:
PS, вы можете получить тот же результат,
+24;if N==ans;-1;end;ans
но bytecount такой жеисточник
Луа,
5646 байтВыводит 0 (без завершающего символа новой строки), если оно равно, и либо ничего, либо последовательность отрицательных чисел (с предшествующим нулем в некоторых случаях), если они не равны.
В одиночку: попробуйте онлайн!
Повторил кучу раз: попробуйте онлайн!
объяснение
На первой итерации (когда она
a
еще не определена и, следовательно, естьnil
) задаетсяa
число, взятое из ввода, в противном случае - для себя. В обоих случаях 46 затем вычитается изa
.Это просто печатает
a
если оно меньше чем (чтобы позаботиться о случаях, когда ввод был больше, чем общая длина) или равно нулю, и пустая строка в противном случае.-10 байт для запоминания того, что Lua автоматически выполняет преобразование между числами и строками. Упс.
источник
JavaScript (ES6), 47 байт
Это , используя ту же технику, Benoit Esnard в этом ответе (от меня двойной источник, вы удвоить выход! ).
Печать 0, если n = 47 * M , или ненулевое значение в противном случае.
Демо для М = 1
Демо для М = 2
источник
Brain-Flak , 24 байта
Попробуйте онлайн!
Просто вычитает 24 из входных данных. Выходы
0
для истины и что-нибудь еще для ложных.Brain-Flak , 68 байт
Попробуйте онлайн!
Этот более сложный, он выводит
1
как true, так и0
false.источник