Ваша задача проста: написать программу, которая получает целое число в качестве входных данных и выводит его, если оно было нечетным, и ничего не делает иначе (не допускается остановка). Проблема в том, что вы можете использовать только нечетные байты.
При желании вы можете добавить завершающий символ новой строки к выводу.
Это код-гольф, самый короткий ответ в (нечетных) байтах выигрывает.
Стандартные лазейки запрещены. Кроме того, вы не можете использовать версии языков, которые являются более новыми, чем публикация этой задачи.
Пример ввода> вывод:
13
> 13
42
>
code-golf
restricted-source
M.Herzkamp
источник
источник
does nothing otherwise
значит? В Haskell функция с типомInt -> Int
либо возвращает целое число, либо не останавливается, либо выдает некоторую ошибку. Если вход даже четный, его, очевидно, не следует возвращать, поэтому не будет ли приемлемым останов или ошибка в этом случае?alphabet=new Set(Array(256).fill(0).map((v,i)=>i).filter(v=>v%2).map(String.fromCharCode));
. Проверьте источник действует:[..."SOURCE CODE"].every(v=>alphabet.has(v))
. См недопустимых символов в источнике:[...new Set("SOURCE CODE")].filter(v=>!alphabet.has(v))
. Не забудьте избежать цитаты,"
=>\"
;)Ответы:
Japt
-f
, 1 байтu
имеет значение кодового символа117
.Попытайся
источник
Lenguage ,
64552990892693725368469578896563590933240436003407993941579915009404922707271907630494487351174269748937617561533841898064735499551229338293752006975899311592859961592895993115928599615928Это примерно равно 2 duodecillion байтов.
Файл переводится в следующую программу brainfuck:
Принимает ввод в виде кода ASCII с максимальным значением 256. Использует перенос.
источник
,[<<+>+>-]<[>>+<<-]+>>[-[->]<]<[<[<]>.<]
?,[[>]++[-<]<+>>]>[<<<.<]
только 3452857532394791089951 байт?,-[-->++<]>+.
работает такжеМашинный код x86-64, 8 байт
Вдохновленный решением Брюса Форте , но немного под пар. :-)
В
EDI
регистр берется единственный целочисленный параметр в соответствии с соглашением о вызовах System V AMD64.Изначально создается копия этого значения и помещается в
EAX
нее, чтобы при необходимости ее можно было вернуть. (LEA
используется вместо обычного,MOV
потому что нам нужна инструкция с нечетными байтами.)Затем значение in
EDI
сдвигается вправо на 1, что помещает сдвинутый бит в флаг переноса (CF). Этот бит будет 0, если число было четным, или 1, если оно было нечетным.Затем мы проверяем CF, используя
JNC
инструкцию, которая будет разветвляться, только если CF равен 0 (т. Е. Число было четным). Это означает, что мы войдем в бесконечный цикл для четных значений. Для нечетных значений мы проваливаемся иEAX
возвращаем исходное значение (in ).Однако с
JNC
инструкцией есть небольшая хитрость - у нее естьREP
префикс! ОбычноREP
префиксы используются только со строковыми инструкциями, но поскольку оба руководства Intel и AMD согласны с тем, что нерелевантные / лишние / избыточныеREP
префиксы игнорируются, мы добавляем один из них в инструкцию перехода, чтобы сделать ее длиной 3 байта. Таким образом, относительное смещение, которое кодируется в инструкции перехода, также является нечетным. (И, конечно,REP
сам по себе префикс нечетного байта.)Слава Богу
RET
, кодируется нечетным байтом!Попробуйте онлайн!
В случае, если вы не думаете, возвращать ли значение, если оно нечетное, или входить в бесконечный цикл, если оно четное (чтобы вы никогда не возвращали), удовлетворяет требованиям «вывода» задачи, или вы просто хотите что-то более интересное, вот функция который выводит значение на последовательный порт (но, конечно, только если он нечетный).
Машинный код x86-64 (вывод на последовательный порт), 17 байт
Что делает это немного более интересным, так это то, что код делает больше , а это значит, что было сложнее сделать все это, используя инструкции, которые кодируются с использованием нечетных байтов. Конечно, это также означает, что в коде гольф это терпит неудачу, так что это своего рода компромисс: хотите интересного и сложного или короткого?
В любом случае, для записи в порт ввода-вывода 0x3F8, который является стандартным последовательным портом COM1 на ПК , используется
OUT
инструкция x86 . Самое интересное, конечно, в том, что все стандартные порты ввода / вывода (последовательные и параллельные) имеют четные адреса, поэтому их нельзя просто закодировать как непосредственные для инструкции или перенести непосредственно в регистр. Вы должны инициализировать на единицу меньше действительного значения, а затем увеличить значение в регистре. Вы также ограничены использованием определенных регистров для манипуляции, потому что вам нужны регистры, которые кодируются с использованием нечетных байтов в инструкции, когда используются в качестве операндов.OUT
Кроме того, мне пришлось инициализировать
DX
регистр (черезCX
регистр) в верхней части цикла, хотя это необходимо только в том случае, если значение нечетное, чтобыJNC
команда имела нечетное смещение. Тем не менее, поскольку мы пропускаемOUT
инструкцию, все, что делает этот код - это пустые циклы и пустые регистры; на самом деле ничего не выводится , поэтому не нарушает правила.Наконец, эта функция вернет (после того, как вы сделали или не сделали вывод на последовательный порт) с оставленным входным значением
EAX
. Но это на самом деле не нарушает никаких правил; все функции на ассемблере будут возвращаться со значением вEAX
- вопрос только в том, является ли это значительным значением или значением мусора . Это определяется документацией функции (по сути, возвращает ли она значение или возвращаетvoid
), и в этом случае я документирую ее как не возвращающую значение. :-)Нет ссылки TIO для этого, поскольку он не реализует вывод на последовательные порты. Вам понадобится настоящее железо или воображение.
источник
MOV
инструкция, ее операнды также должны быть закодированы в байтах. В этом случае это будут регистры источника и назначения (хотя операнды также могут быть непосредственными значениями, которые похожи на константы). Различные регистры отображаются на разные байты, и некоторые из этих байтов являются четными. Так, например, то, что я хотел бы использовать, было быmov eax, edi
, но это89 F8
в байтах. Смотрите путь больше , чем вы когда - либо хотели знать о кодировках здесь, в разделе «код» . @ M.HerzkampЖеле , 2 байта
Эти символы соответствуют байтам 0xF7 и 0xBF в кодовой странице Jelly .
Попробуйте онлайн!
источник
05AB1E , 3 байта
Код соответствует байтовым значениям
C9,69,3D
или201,105,61
которые являются нечетными.Попробуйте онлайн!
объяснение
источник
= # print without newline
это на самом деле печатать с новой строки без всплывающихÉ×
похоже, не работает):D
передней, но это даже не короче. Причина, по которой это не работает, состоит в том, что повторный неявный ввод принимается как второй аргумент.MATL , 3 байта
MATL использует ASCII - символов, так что
o?G
соответствует байт (в десятичной системе )111
,63
,71
.Попробуйте онлайн!
объяснение
источник
Haskell ,
3633 байтаПопробуйте онлайн!
Использование:
o 7
yiedls7
,o 8
входит в бесконечный цикл.Фактический алгоритм
Первая проблема, с которой я столкнулся, была нехватка места и
(
, потому что функция,o
которая принимает аргументm
, обычно определяется какo m=...
илиo(m)=...
. Однако я обнаружил, что встроенный комментарий также{- some comment -}
работает как разделитель токенов, поэтому определениеo{--}m=...
возможно по заданным правилам. Редактировать: Орджан Йохансен отметил, что вместо пробела можно использовать символ табуляции, сохраняя три байта:o m=...
Второй проблемой был рекурсивный вызов
o(m-2)
.-2
это просто-1-1
, но здесь трюк с комментариями не работает, потому что скобки обязательны. Я исправил это, позволив функции работать с одноэлементным списком, содержащим число:o[m-2]
однако, поскольку это не стандартный способ ввода данных, я передал вычисление вспомогательной функции,c
которая работает со списками, и вызовc
изo
которой имеет правильный формат. ,источник
\t
вместо{--}
.Python REPL, 38 байт
Принимает ввод как значение предыдущего выражения, используя
_
. Выходными данными будет строка (строковое представление целого числа для нечетного или пустая строка для четного).Попробуйте онлайн
Чтобы запустить его в реальной оболочке, вы можете попробовать это здесь . Введите ввод, нажмите ввод. Вставьте код, нажмите Enter.
Объяснение:
Это заняло некоторое время, чтобы выяснить. Там нет ни умножения, ни разветвления, ни среза, ни запятых, ни точек, ни импорта, ни скобок, ни
exec
нетeval
, ни нетprint
, ни функций. Я получил одно решение, работающее с этим выводом, используя stderr, но потом я понял, что нам нужно вывести фактическое целое число, а не просто значение truey / falsey.Я использую скобки вместо скобок с
[expression][-1]
. Упрощение превращает приведенный выше код в'%s'%(['']+[_])[_%(1+1)]
.Поскольку не может быть запятых, я использовал добавление списка для создания
['',_]
. Используя форматирование строки, вы получите желаемый результат.источник
None
это будет даже лучше, чем''
. Во всяком случае, это все еще в 10000 раз лучше, чем я мог придумать.False
. ИДК, как вы могли бы получитьNone
, хотя.CJam, 6 байтов
113
95
105
89
37
37
Эта программа принимает мод 2 ввода (назовем его r ) и печатает каждый r- й символ во входной строке. Если введенный номер нечетный, он печатает всю строку, но если его попросят напечатать каждый 0-й символ, программа выдает ошибку.
Попробуй здесь
источник
qi_Y%]W%{}/M?
а затем я увидел это.Cubix ,
231917 байтПопытайся!
@
, которая завершает программу Cubix, является ascii 64, так что, к сожалению, это фактически просто входит в бесконечный цикл после проверки на странность. Нет ссылки TIO, поскольку время ожидания истекло.=
(ASCII 61) не является опцией в Cubix.Это небольшая модификация предыдущего алгоритма (то же самое количество байтов), который фактически работает для отрицательных целых чисел.
Куб версия:
Алгоритм:
I
(73)
: читать на входе как число1
(49)
: нажать 1)
(41)
: приращение%
(37)
: возьми мод/
(47)
: повернуть налево!
(33)
: пропустить следующую инструкцию, если нечетный1;;/;
;
is(59)
: готовит стек к выводуO
(79)
: Вывод в виде числа.I
читает0
для конца ввода, поэтому мы гарантированно войдем в четную ветвьu
(117)
: разворот с правой стороны;;;!I
: loop, эффективно ничего не делая.источник
?
Древесный уголь , 9 байт
Попробуйте онлайн!
По сути, он печатает ввод справа, если он не кратен 10/5 (
²
символ даже на кодовой странице древесного угля ). Используемые символы:¿
: КодBF
.﹪
: КодA5
.I
: КодC9
.θ
: КодF1
.÷
: КодAF
.χ
: КодE3
.⁵
: КодB5
.→
: Код13
.На самом деле
→
ближний конец избыточен, но потом я увидел, что ответ должен был иметь нечетную длину ...Объяснение:
источник
→θ
.машинный код x86_64 (Linux),
1211 байтК сожалению
0x80
, даже, но это все-таки сработало (предполагая, что «ничего не делает» означает не возвращаться):-1 байт, спасибо @CodyGray!
Попробуйте онлайн!
источник
lea (%edi),%eax
требуется префикс переопределения размера адреса (0x67
), когда источником является 32-битный регистр. Вы можете устранить это, делаяlea (%rdi),%eax
. Это экономит байт и фактически делает код немного более эффективным (префиксы замедляют декодирование и заполняют i-cache). Есть некоторые другие вещи, которые вы можете сделать, чтобы сократить это еще больше, но это, по сути, представляет собой полное переписывание, поэтому я опубликую свой собственный ответ. :-) Я тоже за это проголосовал, конечно! (О, только что понял, что вы, возможно, использовали префикс, чтобы сделать смещение при прыжке странным. Ну, вам понадобится больше магии.)F6
) дляJNE
инструкции, потому что он имеет четное смещение. Это то, что я имел в виду под последней скобкой, которую я отредактировал в своем первом комментарии. Вам действительно нужен этот префикс для создания нечетного выравнивания. Или вы должны переписать код другим способом. Я играл с кучей разных вариаций. Я на самом деле смотрел на это прошлой ночью и пытался найти хороший способ использоватьOUT
для вывода нечетных значений, но никаких хороших решений мне не пришло. Понимание здесь для меня состоит в том, чтобы войти в бесконечный цикл для четных значений.BT
семейство инструкций, которое никто никогда не использует (к сожалению, все регистровые кодировки являются даже байтами). Я подумал, что было бы более интересно писать код, который выводит на последовательный порт, а не просто возвращать значение или что-то еще, но это увеличивает количество байтов (особенно если адреса последовательных портов в шестнадцатеричном формате четны!), Поэтому я отказался от этого.Mathematica, 20 байтов
Похоже, что это первое решение на неигровом языке.
В
MacintoshChineseTraditional
кодировке символов.\[Divides]
есть{161, 253}
(2 байта)Альтернативная версия (23 байта)
или (показано в Юникоде)
в
Symbol
кодировке символов. (используйте только 1-байтовые символы)Решение определяет функцию
g
(илиΓ
), которая оценивает ввод, когда ввод нечетный, и буквально «ничего не делает» (не оценивает), когда ввод четный.источник
;
в конце), если число байтов должно быть четным; а\[Divides]
также иметь нечетный код Unicode.I[1+1]
, вы можете просто использовать{1+1}
. Кроме того, вы проверили, действительны ли байты скобок пола? Если это так, вы можете получить2
от\[LeftFloor]E\[RightFloor]
.Symbol
сделать пол действительным, но у него нет ни того,E
ни другого\[ExponentialE]
.D
;v
; ниd
, поскольку у них есть четное значение байта .. :(\[Divides]
- это один единственный символ в Mathematica, который представлен 2 байтами{161, 253}
.Perl, 54 байта
Требуется
-E
.Мне действительно очень понравился этот вызов, я думаю, что хотел бы попытаться улучшить этот ответ, но я думаю, что это может быть самый короткий, который я могу сделать на данный момент. Я уже несколько дней играю с этими ответами, но чувствую, что доволен 54-байтовым решением!
Попробуйте онлайн!
объяснение
По умолчанию большинство строковых функций Perl работают
$_
, что пусто для запуска.Сначала
s//A_=Y[;A_=A_%O?A_W''/
заменяет пустую строку на$_
withA_=Y[;A_=A_%O?A_W''
, затемy/#A-_/#-A/
заменяет символы на основе следующего списка (char выше становится char ниже):какие обновления
$_
содержать$_=<>;$_=$_%2?$_:''
. Далееs/[#-}]+/uc/ee
заменяет все символы[#-}]+
сuc
. Без этого/ee
это будет просто строкаuc
, но она/ee
оценивает содержимое строки дважды. Первая оценка возвращает результатuc
, который является заглавной версией,$_
но так как не$_
содержит буквенных символов, он просто возвращает всю строку, а затем вторая/e
снова оценивает строку, которая устанавливает$_
либо$_
(входное число), либо в''
зависимости от того, или не число нечетное или четное.Наконец, так как
$_
теперь содержит то, что мы хотим, мы называемsay
(что требуется,-E
а не-e
), который печатает$_
после новой строки.Альтернативный Perl, 93 байта
Код 92 байта + 1 для
-p
, который, я чувствую, сделал бы его неконкурентным.Содержит вкладку и вертикальную вкладку в
y///
, обозначенную как\x09
и\x0b
.Попробуйте онлайн!
источник
LOGO ,
390465250 байтЭто список шаблонов, который возвращает входные данные, если входные данные нечетные, и вызывает ошибку, если входные данные четные.
Использование:
выход
так как 5 странно, и
вызовет ошибку, потому что 6 четное.
источник
TI-BASIC, 14 байтов
Это приводит к ошибке домена (ничего не печатая на домашний экран) на четном числе.
источник
Pyth ,
1411109 байтТестовый пакет .
источник
I%Qy1Q
работать?y1
... Однако%
, к сожалению , это не разрешено.%
имеет значение ASCII 37 и является нечетным.Japt , 4 байта
Japt использует ISO / IEC 8859-1 , так что это соответствует (в десятичном формате )
117 41 231 85
.Проверьте это онлайн!
объяснение
Сначала я попробовал использовать решения
p
, в основномç
с обратными аргументами. Однако,p
выполняет возведение в степень, если его левый аргумент является числом, поэтому нам нужно явно преобразовать его в строку. Это решение оказывается на самом деле короче байта, в дополнение к отсутствию каких-либо нечетных байтов.источник
постоянный ток , 21 байт
Десятичный:
91 99 93 115 97 63 107 75 75 67 73 45 49 59 49 107 37 49 33 61 97
Согласно этому стандартному вводу-выводу, эта программа оставляет ввод в главном стеке, если он нечетный, и в противном случае очищает стек. Это можно подтвердить, добавив команду
f
отладки в конец программы, как на странице TIO.Попробуйте онлайн!
объяснение
источник
TI-Basic, 18 байтов
Сохранено 2 байта благодаря lirtosiast
в байтах (+2 новых строки = 3F)
Смотрите http://tibasicdev.wikidot.com/one-byte-tokens
источник
Input Q[newline]sinֿ¹(gcd(Q²,int(e[newline]Q
(14 байт). Могу ли я опубликовать отдельный ответ?MathGolf , 3 байта
Попробуйте онлайн!
Используемые байты есть
157, 123, 107
.объяснение
источник
Баш , 31 байт
Попробуйте онлайн!
Объяснение:
источник
rd $20|h
и