Правда машина (кредиты идут к этому парню , что пришли с ним) очень простой программой , предназначенной для демонстрации ввода / вывода и управления потоком языка. Вот что делает машина правды:
Получает число (0 или 1) из STDIN.
Если это число равно 0, распечатайте 0 и завершите.
Если это число равно 1, выведите 1 навсегда.
Вызов
Напишите машину правды, как описано выше, на выбранном вами языке. Машина истины должна быть полной программой, которая следует этим правилам:
- принять вход от STDIN или приемлемой альтернативы
- Если ваш язык не может получить ввод из STDIN, он может получить ввод из жестко закодированной переменной или подходящего эквивалента в программе
- должен выводить на STDOUT или приемлемую альтернативу
- Если ваш язык не способен выводить символы
0
или 1
, байтовый или унарный ввод / вывод приемлем.
- при вводе
1
он должен постоянно печатать 1
s и останавливаться, только если программа убита или не хватает памяти
вывод должен быть либо с 0
последующим либо одним, либо без новой строки или пробела, либо с бесконечным 1
s, 1
за которым следует либо один, либо без новой строки или пробела. Никакие другие выходные данные не могут быть сгенерированы, кроме постоянного вывода интерпретатора вашего языка, который не может быть подавлен (например, приветствие, цветовые коды ANSI или отступ). Ваше использование новых строк или пробелов должно быть согласованным: например, если вы решите выводить 1
с новой строкой после всех 1
, после них должна быть новая строка .
тогда и только тогда, когда ваш язык не может завершиться на входе 0
, допустимо, чтобы код входил в бесконечный цикл, в котором ничего не выводится.
Поскольку это каталог, языки, созданные после этого конкурса, могут конкурировать. Обратите внимание, что должен быть переводчик, чтобы представление можно было проверить. Разрешается (и даже поощряется) самостоятельно писать этот переводчик для ранее не реализованного языка. Кроме этого, все стандартные правила код-гольфа должны соблюдаться. Материалы на большинстве языков будут оцениваться в байтах в соответствующей существующей кодировке (обычно UTF-8).
Каталог
Фрагмент стека в нижней части этого поста создает каталог из ответов а) в виде списка кратчайшего решения для каждого языка и б) в качестве общей таблицы лидеров.
Чтобы убедиться, что ваш ответ обнаружен, начните его с заголовка, используя следующий шаблон уценки:
## Language Name, N bytes
где N
размер вашего представления. Если вы улучшите свой счет, вы можете сохранить старые результаты в заголовке, вычеркнув их. Например:
## Ruby, <s>104</s> <s>101</s> 96 bytes
Если вы хотите включить в заголовок несколько чисел (например, потому что ваш результат равен сумме двух файлов или вы хотите перечислить штрафы за флаг интерпретатора отдельно), убедитесь, что фактический результат является последним числом в заголовке:
## Perl, 43 + 2 (-p flag) = 45 bytes
Вы также можете сделать имя языка ссылкой, которая будет отображаться во фрагменте кода:
## [><>](http://esolangs.org/wiki/Fish), 121 bytes
<style>body { text-align: left !important} #answer-list { padding: 10px; width: 290px; float: left; } #language-list { padding: 10px; width: 320px; float: left; } table thead { font-weight: bold; } table td { padding: 5px; }</style><script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <link rel="stylesheet" type="text/css" href="//cdn.sstatic.net/codegolf/all.css?v=83c949450c8b"> <div id="language-list"> <h2>Shortest Solution by Language</h2> <table class="language-list"> <thead> <tr><td>Language</td><td>User</td><td>Score</td></tr> </thead> <tbody id="languages"> </tbody> </table> </div> <div id="answer-list"> <h2>Leaderboard</h2> <table class="answer-list"> <thead> <tr><td></td><td>Author</td><td>Language</td><td>Size</td></tr> </thead> <tbody id="answers"> </tbody> </table> </div> <table style="display: none"> <tbody id="answer-template"> <tr><td>{{PLACE}}</td><td>{{NAME}}</td><td>{{LANGUAGE}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr> </tbody> </table> <table style="display: none"> <tbody id="language-template"> <tr><td>{{LANGUAGE}}</td><td>{{NAME}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr> </tbody> </table><script>var QUESTION_ID = 62732; var ANSWER_FILTER = "!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe"; var COMMENT_FILTER = "!)Q2B_A2kjfAiU78X(md6BoYk"; var OVERRIDE_USER = 12012; var answers = [], answers_hash, answer_ids, answer_page = 1, more_answers = true, comment_page; function answersUrl(index) { return "https://api.stackexchange.com/2.2/questions/" + QUESTION_ID + "/answers?page=" + index + "&pagesize=100&order=desc&sort=creation&site=codegolf&filter=" + ANSWER_FILTER; } function commentUrl(index, answers) { return "https://api.stackexchange.com/2.2/answers/" + answers.join(';') + "/comments?page=" + index + "&pagesize=100&order=desc&sort=creation&site=codegolf&filter=" + COMMENT_FILTER; } function getAnswers() { jQuery.ajax({ url: answersUrl(answer_page++), method: "get", dataType: "jsonp", crossDomain: true, success: function (data) { answers.push.apply(answers, data.items); answers_hash = []; answer_ids = []; data.items.forEach(function(a) { a.comments = []; var id = +a.share_link.match(/\d+/); answer_ids.push(id); answers_hash[id] = a; }); if (!data.has_more) more_answers = false; comment_page = 1; getComments(); } }); } function getComments() { jQuery.ajax({ url: commentUrl(comment_page++, answer_ids), method: "get", dataType: "jsonp", crossDomain: true, success: function (data) { data.items.forEach(function(c) { if (c.owner.user_id === OVERRIDE_USER) answers_hash[c.post_id].comments.push(c); }); if (data.has_more) getComments(); else if (more_answers) getAnswers(); else process(); } }); } getAnswers(); var SCORE_REG = /<h\d>\s*([^\n,<]*(?:<(?:[^\n>]*>[^\n<]*<\/[^\n>]*>)[^\n,<]*)*),.*?(\d+)(?=[^\n\d<>]*(?:<(?:s>[^\n<>]*<\/s>|[^\n<>]+>)[^\n\d<>]*)*<\/h\d>)/; var OVERRIDE_REG = /^Override\s*header:\s*/i; function getAuthorName(a) { return a.owner.display_name; } function process() { var valid = []; answers.forEach(function(a) { var body = a.body; a.comments.forEach(function(c) { if(OVERRIDE_REG.test(c.body)) body = '<h1>' + c.body.replace(OVERRIDE_REG, '') + '</h1>'; }); var match = body.match(SCORE_REG); if (match) valid.push({ user: getAuthorName(a), size: +match[2], language: match[1], link: a.share_link, }); else console.log(body); }); valid.sort(function (a, b) { var aB = a.size, bB = b.size; return aB - bB }); var languages = {}; var place = 1; var lastSize = null; var lastPlace = 1; valid.forEach(function (a) { if (a.size != lastSize) lastPlace = place; lastSize = a.size; ++place; var answer = jQuery("#answer-template").html(); answer = answer.replace("{{PLACE}}", lastPlace + ".") .replace("{{NAME}}", a.user) .replace("{{LANGUAGE}}", a.language) .replace("{{SIZE}}", a.size) .replace("{{LINK}}", a.link); answer = jQuery(answer); jQuery("#answers").append(answer); var lang = a.language; lang = jQuery('<a>'+lang+'</a>').text(); languages[lang] = languages[lang] || {lang: a.language, lang_raw: lang.toLowerCase(), user: a.user, size: a.size, link: a.link}; }); var langs = []; for (var lang in languages) if (languages.hasOwnProperty(lang)) langs.push(languages[lang]); langs.sort(function (a, b) { if (a.lang_raw > b.lang_raw) return 1; if (a.lang_raw < b.lang_raw) return -1; return 0; }); for (var i = 0; i < langs.length; ++i) { var language = jQuery("#language-template").html(); var lang = langs[i]; language = language.replace("{{LANGUAGE}}", lang.lang) .replace("{{NAME}}", lang.user) .replace("{{SIZE}}", lang.size) .replace("{{LINK}}", lang.link); language = jQuery(language); jQuery("#languages").append(language); } }</script>
Bf
иbf
быть на разных языках.Ответы:
Гексагония , 6 байт
Это было удивительно сложно,
и я не уверен, что это оптимально ...После дополнения и развертывания кода это представляет следующую шестнадцатеричную сетку:
При этом используется тот же поток управления, что и в моей недавней безошибочной программе для кошек , движущейся по антидиагоналам. Чтобы добиться этого, мы начинаем с отклонения указателя инструкций (IP) влево, где фиолетовый путь оборачивается в нижний левый угол.
?
читает входные данные как целое число.!
печатает его обратно..
это просто неоперация. Теперь угол сетки действует как ветвь:Если вход был
0
, IP будет продолжаться по красной дорожке, которая просто завершает программу с@
.Если вход был
1
, IP будет продолжаться по зеленому пути. Опять же,.
это просто запрет, но$
это эквивалент батута Бефунге: он пропускает следующую инструкцию. После переноса следующей инструкцией будет?
, но из-за$
выполнения фактически продолжается синий путь, начиная с!
печати другой копии1
. Этот цикл, который только содержит!..$
, теперь повторяется бесконечно.Исследование потока управления в шестиугольнике ...
Я считаю, что вышеуказанное решение является оптимальным. Я написал брутфорсер, который проверяет все 6-байтовые программы Hexagony, которые содержат по крайней мере одну из них
?!@
(которые необходимы; я также проверил:
и%
вместо того,@
чтобы завершить с ошибкой деления на ноль, но это тоже не помогло). Проверка печатает все программы, которые a) выдают0
на входе0
и завершают, и b) выдают по крайней мере два1
с (и ничего больше) и не завершаются в течение первых 60 тактов программы (200 тактов для 5-байтовых решений) , Я сомневаюсь, что любое правильное решение потребовало бы более 200 тиков, чтобы правильно напечатать первое0
или второе1
на такой маленькой сетке, поэтому я не думаю, что упустил какие-либо потенциальные решения.Поиск не дал никаких результатов для 5 байтов, но 57 результатов для 6 байтов (используя
@
; нет необходимости завершать с ошибкой, если мы можем решить это чисто в том же количестве байтов). Из этих 57 только 6 были ложными срабатываниями, которые фактически напечатали только два1
с, а затем вошли в бесконечный цикл, не печатая больше. Одно решение было указано дважды, поскольку оно содержало две!
команды. Это оставляет ровно 50 действительных решений.Существует определенная степень вырождения между решениями, в которых один или два символа несущественны, например потому, что они в любом случае фактически не работают. Решения могут быть сгруппированы в 23 набора действительно различных программ (в некоторых случаях разница между двумя наборами составляет всего один символ, но это существенно меняет поток управления, поэтому я их подсчитал отдельно). Две группы даже используют несколько указателей инструкций очень неожиданным образом. Поскольку я никогда не смог бы придумать большинство из этих способов использования ветвей и зеркал, они очень интересно изучают, какие виды управления потоками возможны в гексагонии, и я определенно изучил некоторые новые приемы для будущих гольфов.
Общий поток управления почти всегда одинаково: читать номер, распечатать его. Если это
0
найти путь к@
, если нет, продолжайте циклически проходить!
при сохранении значения ребра1
. Есть четыре заметных исключения:!
) печатает два1
s за итерацию по сетке, поэтому печатает примерно в два раза быстрее, чем большинство программ. Я отметил этоx2
ниже.o
) заменить1
с111
(символьным кодомo
), поэтому они печатают три1
с на итерацию, что делают их напечатать примерно в три раза быстрее, чем в большинстве программ. Я пометил ихx3
ниже.1
к значению ребра в каждой итерации (так1
->11
->111
-> ...). Они печатаются очень быстро, но со временем у них заканчивается память. Я пометил ихOoM
ниже.!
, печатая на каждом другом тике (вместо каждого 5-го или около того), что делает их немного быстрее (и аккуратнее). Я пометил их><
ниже.Так вот и весь зоопарк:
Ниже приведен краткий обзор нескольких наиболее представительных групп. Особенно группы 10 и 23 стоит проверить. В других группах есть много других интересных и порой запутанных путей, но я думаю, что в конце этого вам достаточно скучно. Для тех, кто действительно хочет изучать гексагонию, их, безусловно, стоит исследовать, поскольку они демонстрируют еще более возможное использование зеркал и
$
.Группа 1
Это не намного сложнее, чем мое первоначальное решение, но пути идут в разных направлениях. Это также учитывает наибольшее количество вариантов в одной ячейке, так как самый правый неоперативный объект может быть заменен 5 различными командами, которые все еще делают это действительным без изменения структуры:
Группа 2
Этот довольно интересный, потому что он движется только горизонтально. После перехода к
>
IP-адрес сразу же меняется на противоположный, принимая ветку в углу. Это не совсем хорошо видно на диаграмме, но в случае1
мы снова пересекаем первый ряд, но на этот раз в обратном направлении. Это также означает, что мы сталкиваемся?
снова, который теперь возвращает0
(EOF). Это исправлено с)
(приращением), чтобы сохранить печать1
s. Это также имеет 5 вариантов, которые)
также могут быть1
илиo
, и>
также могут быть|
:Группа 3
Это выглядит почти идентично предыдущему, но чертовски грязно. До удара,
|
а затем прохождения нижнего или верхнего ряда это то же самое. Но в случае цикла,$
теперь пропускается)
на зеркало. Таким образом, мы идем по бирюзовой дорожке направо, теперь нажимаем на приращение, пропускаем все@
до того, как|
снова обернемся, а затем возвращаемся к зеленой дорожке наверху.Группа 4
Я думал, что это было особенно изящно:
_
Зеркало в верхнем правом углу не является изначально не-оп, поэтому мы печатаем с!
и ударил<
. Теперь0
путь попадает в горизонтальное зеркало и заканчивается.1
Путь занимает очень интересную траекторию , хотя: она отклоняется вниз, заворачивает к!
, перенаправляется в сторону по горизонтали , а затем заворачивает назад к!
снова . Затем он продолжает двигаться в форме ромба, печатая дважды за итерацию (каждый третий тик).Группа 8
Это одно из двух решений с очень плотным циклом печати:
В
<
выступает в качестве филиала. После оборачивания дважды,0
удары@
.1
с другой стороны, сначала пропускает?
, затем снова>
отправляет его на$
, то есть пропускает@
. Затем IP оборачивается в бирюзовый путь, где он подпрыгивает назад и вперед между>
и<
(обтекание края между ними).Группа 10
Одна из двух групп, которые используют другие указатели инструкций, и это абсолютно красиво. Гексагония имеет 6 - каждый начинается с другого угла по краю по часовой стрелке, но одновременно активен только один из них.
Как обычно, мы читаем с
?
. Теперь~
унарное отрицание: оно превращается1
в-1
. Далее мы попали#
. Это один из способов переключения между IP-адресами: он принимает текущее граничное значение по модулю 6 и переключается на соответствующий IP-адрес (IP-адреса нумеруются0
по часовой стрелке). Так что, если вход был0
, то IP просто остается прежним, и скучно идет прямо вперед!@
. Но если вход был1
, то текущее значение,-1
которое есть5 (mod 6)
. Поэтому мы переключаемся на IP, который начинается в той же ячейке (зеленый путь). Сейчас#
не работает и?
устанавливает край памяти на0
.)
увеличивает, так что!
печатает1
. Теперь мы~
снова ударили, чтобы убедиться, что#
до сих пор не работает (в отличие от переключения на IP 1, который завершит программу). Удивительно, насколько хорошо все сочетается в этой маленькой программе.Группа 22
Просто отметим, что это группа, в которой находится мое первоначальное решение. Это также самая большая группа, потому что no-op может находиться в двух разных местах, и есть несколько вариантов для действительной (действующей no-op) команды.
Группа 23
Это другая группа, использующая несколько IP-адресов. На самом деле этот использует 3 разных IP. В верхнем правом углу немного беспорядка, но я постараюсь провести вас через это:
Итак, начало, которое вы видели раньше:
<
отклоняет северо-восток,?
читает ввод. Теперь]
есть еще один способ переключения между IP-адресами: он передает управление следующему IP-адресу по часовой стрелке. Таким образом, мы переключаем управление на бирюзовый путь, который (я знаю, что это трудно увидеть) начинается в северо-восточном углу юго-востока. Это сразу же отражается<
тем, что оно охватывает юго-восточный угол, идущий на северо-запад. Это также ударил,]
поэтому мы переключаемся на следующий IP. Это серая тропа, начинающаяся в восточном углу и идущая на юго-запад. Он печатает ввод, затем переносится в северо-восточный угол.<
отклоняет путь в горизонтальное положение, где он отражается другим<
. Теперь правая рука<
действует как ветвь: если вход был0
, IP перемещается на северо-восток и переносится на@
. Если вход был1
, IP перемещается в!
, оборачивается в левую и<
там, где он отражается ... теперь в углу, он оборачивается обратно в!
, отклоняется вправо<
, отражается слева<
и начинается путь над...Довольно беспорядок, но красивый беспорядок. :)
Диаграммы, созданные с помощью удивительного HexagonyColorer Тимви .
источник
Motorola MC14500B Машинный код, 2 байта
В шестнадцатеричном виде:
Объяснение:
Motorola MC14500B - это 1-битный микроконтроллер; он имеет один 1-битный регистр и 1-битную шину данных. Поскольку коды операций имеют 4 бита каждый, их всего шестнадцать; половина из них выполняет логическую операцию между регистром и битом на шине данных.
Инструкция перехода устанавливает флаг перехода; если адрес не указан, обычно устанавливается счетчик программы равным 0. Если входной бит был равен нулю, процессор не скачет. Если бит ввода равен 1, процессор возвращается к началу; так как мы работаем
OR
со входом, то не имеет значения, какой будет входной сигнал после этого - регистр будет равен 1 всегда.Как обычно, регистр инициализируется в 0.
Список кодов операций можно найти в техпаспорте или здесь .
источник
Арнольд С, 296 байт
Не очень конкурентоспособный, но для удовольствия. Не поддерживает STDIN, заменить
@NO PROBLEMO
с@I LIED
для нулевого значения.@No Problemo
это 1.Запустите с (при условии, что файл - truemachine.arnoldc):
источник
BECAUSE I'M GOING TO SAY PLEASE
LOLif(i){while(i) print(i);} else {print(i);}
это будет корочеprint(i);while(i) print(i);
?BULLSHIT
на большой вклад в развлекательную ценность программы, технически это не нужно. Вы можетеBULLSHIT
выделить всю ветку, перейдяTALK TO THE HAND i
послеYOU HAVE NO RESPECT FOR LOGIC
.BULLSHIT
Minecraft, 18 байт (версия MC 15w45a)
Как видите, есть рычаг, направленный в повторяющийся командный блок, в котором есть команда
say 1
. Вдобавок к этому имеется инверторный факел, который направляет питание в блок однопроходного управления с командойsay 0
в нем.Всякий раз, когда переключатель направлен в сторону истины, блок повторителя использует код
say 1
для вывода бесконечных1
s. Когда рычаг перенаправлен на false, он выдает одиночный сигнал0
.Обратите внимание, что это выводит
[@]
по умолчанию. Если вы действительно хотите получить только 1 и ноль, это становится 34 байта, где код в командных блокахtellraw @a [1]
иtellraw @a [0]
. Для этого используется счетчик байтов @ Cᴏɴᴏʀ O'Bᴏɴᴏʀ для MC, который можно найти в Meta .источник
is:answer Minecraft
. c:Утилиты Bash + GNU, 13
Баш, 35
источник
Руби, 20
Запускайте из командной строки, чтобы избежать предупреждений, так как
Объяснение:
Менее гольф, это
Когда регулярное выражение используется в условном выражении, оно оценивается как ложное, если переменная
$_
не заполнена и не соответствует шаблону. В первый раз в цикле$_
пусто, поэтому мы переходим кgets
, что устанавливает значение$_
строки, считываемой из STDIN.print
без аргументов печатает$_
. Теперь мы снова оцениваем условное. Если мы читаем в 1, мы закорачиваем и просто печатаем 1 снова, и так далее навсегда. В противном случае мы переходим кgets
, но поскольку нет второй строки ввода,gets
возвращает ноль, поэтому цикл заканчивается.источник
||gets
Часть прохладно и все, но вы не можете просто сделатьgets;print while/1/
и сохранить байт?Microscript, 3 байта
Самый короткий, который я знаю.
Объяснение:
Microscript имеет неявную печать регистра 1 после завершения, что является причиной, почему ввод
0
печатается один раз.источник
Машинный код Тьюринга, 32 байта
Используя синтаксис таблицы правил, найденный здесь.
источник
JavaScript, 28 байт
Поскольку петли часто короче, чем в то время как петли.
alert(x)
Возвращаетundefined
, что ложно, поэтому побитовое или оператор|
, приводит его к0
. Таким образом, еслиx
есть"0"
, предупредите один раз, иначе продолжайте цикл. Используетalert
для STDOUT, как этот ответ .источник
SyntaxError
без него.Python 2, 29 байт
Это заканчивается с ошибкой деления на
0
, которая разрешена по умолчанию .источник
Brainfuck,
41363130 байтУкорочено печатью сразу после ввода и с помощью Итана и пользователя 46915.
Предыдущая версия: вычтите 48 из входных данных, и, если это не ноль, добавьте 1 к 48, чтобы напечатать ASCII
1
навсегда, иначе напечатайте0
.Я запустил его здесь , но из-за буферизованного вывода вы не можете видеть никакого вывода, так как программа никогда не завершается
1
.Изменить: я забыл напечатать
0
на входе0
. Исправлено сейчас. Мне нравятся>.<
лица в конце.источник
,.[>+>+<<-]-[>-<-----]>+++[>.<]
,.[->+>+<<]>>[->[>-<[-]]>+[<+>-]<<]>[<<.>>]
,.+++[->>+<-----<]>>---<-[>.<]
Пит,
271816 кодов(Codel - причудливое название для пикселя, используемое, чтобы избежать путаницы при растягивании изображения для просмотра. Я посчитал коделы вместо байтов, потому что сценарии Piet сохраняются в виде изображений, поэтому физический размер может отличаться. этот фрагмент максимально эффективно занимал бы 11 байт. На практике мой крошечный gif-файл составляет 62 байта с оптимальными данными палитры. Скажите, должен ли я использовать это в качестве размера моей записи вместо объема кодела.)
Исходное изображение:
Увеличенный:
В piet разница между двумя цветами определяет, какая команда запускается, поэтому, если дважды увидеть один и тот же цвет, это не означает, что он выполняет одно и то же действие. Выполнение начинается в верхнем левом коде. Затем он движется горизонтально, выполняя следующее:
Если ввод был 1, курсор затем перемещается в извилистый код, который помещает 1 в стек. Затем выполнение продолжается налево. Когда курсор переходит от цвета к белому и от белого к цвету, ничего не происходит. Поскольку черный также считается стеной, курсор в конечном итоге возвращается к извилистому кодексу в верхней строке и повторяет все это с шага 2.
Однако, если ввод был равен 0, курсор никогда не будет опускаться и будет заканчиваться синим J справа (каламбур, он того стоил), если он останется в ловушке (потому что верхний, правый, левый и нижние стороны этого J-образного блока находятся рядом с черными коделами или краем изображения). Поскольку курсор захвачен, выполнение заканчивается.
Неожиданные значения:
если пользователь пишет другое число, оно все равно будет напечатано, тогда курсор будет вращаться более или менее раз в зависимости от значения.
5111111111111...
Любое нецелое значение завершит программу. Выполнение будет продолжаться в обычном режиме, но все операции будут игнорироваться, поскольку в стеке ничего нет. Таким образом, в некотором роде, программа никогда не падает, она либо останавливается нормально, либо работает постоянно.
PietDev дружественная версия
PietDev (очень простая онлайн-среда Piet IDE), похоже, испытывает проблемы с белыми коделами, поэтому я сделал новую версию, которая вручную вращается назад вместо того, чтобы полагаться на правильное автоматическое вращение белой коделлы. И мне даже не нужно было использовать новый цвет! Если вы хотите протестировать его, убедитесь, что вы рисуете черную рамку вокруг кода, потому что PietDev не поддерживает нестандартные размеры программ.
Старые версии
Первая версия не вернула 1 обратно в стек и вместо этого вернулась к более ранней инструкции дублирования. У этого также были декоративные бесполезные кодеки.
Тогда у меня была идея нажать 1 в стеке, чтобы убрать пустую строку. Забавно, как я об этом думал благодаря моим декоративным кодексам.
Затем я понял, что у меня есть посторонний дубликат, который больше не нужен, и я уменьшил количество цветов, чтобы сэкономить на данных палитры в изображении. Я также избавился от единственного декоративного кодекса, потому что я не знаю.
источник
Pyth,
432Существует нет! завершающий пробел (спасибо Айзеку :)). Раньше для компиляции цикла while требовалось пространство, но с тех пор Pyth был обновлен. Обычно это дисквалифицирует его использование, но поскольку это каталог, он должен быть действительным.
Объяснение:
источник
pass
в Pyth. Пространство теперь ненужно. pyth.herokuapp.com/?code=WpQ&input=0&debug=0Чип , 6 байт
Чип - это двумерный язык, который немного похож на интегральную схему. Он принимает входные данные по одному байту за раз и разбивает биты на отдельные входные элементы. Выходные данные объединяют значения выходных элементов обратно в байты.
Давайте разберем это:
*
является исходным сигналом, он отправит истинное значение всем соседним элементам.e
иf
соответствуют пятому и шестому битам выхода. Итак,e*f
выдает двоичный файл00110000
, который является ASCII-символом "0".Теперь
A
это первый бит ввода иa
первый бит вывода, поэтомуaA
копирует этот бит с входа на выход. Таким образом, в сочетании сe*f
, вход ASCII «0» выдает «0», а «1» выдает «1». (Нет взаимодействия междуf
иa
, так как ни один не производит никакого сигнала.)s
На конце, при активации истинного сигнала, предотвратит вход с переходом к следующему байту, а это означает , что все это будет работать снова с тем же входом.Поскольку первый байт «0» равен нулю, он не активирует этот элемент, и программа выведет «0» и тем самым исчерпает свой ввод, что позволяет ему завершиться. «1», однако, активирует этот элемент, что означает, что «1» выводится, но не расходуется на входе, что позволяет циклу повторяться бесконечно.
Если для вывода используются значения 0x0 и 0x1, а не ASCII, мы можем исключить
e*f
часть, получив в результате только 3 байта :Если ноль должен завершиться сам, а не ожидать закрытия stdin, мы получим следующее, которое инвертирует первый байт с
~
и передает результатt
, который завершает программу ( 10 байт ):(
t
также не выдает сигнал, поэтому нет взаимодействия междуt
иe
.)источник
Brainbool , 5 байтов
Brainbool - это Brainfuck, но он работает только с битами, вводом-выводом
0
и1
символами.источник
LOLCODE, 119 байт
Ungolfed:
источник
MAEK n A NUMBR
сыграть? 3. Можете ли вы использоватьDIFFRINT
вместоBOTH SAEM
и переключать условия?O RLY?
приведение к булеву?O RLY?
это как постфиксif
.C 37 байт
Другой взгляд на то, как это сделать на C.
c
значение по умолчанию -int
значение 1.gets(&c)
получает строкуstdin
, которая здесь ударяется о значениеc
, какc
это ни странноchar*
.putchar(c)
печатает значениеc
доstdout
и возвращаетc
. Так'0'
как 48 и'1'
49 в ASCII, мы можем использовать последний бит (&1
), чтобы определить, что это такое. Если это так'0'
, цикл обрывается. В противном случае, это идет навсегда.Компилирует (с предупреждением о
gets
) и работает подgcc-4.8
Linux.источник
c
умолчанию равен anint
, который является многобайтовым значением, и в архитектуре с прямым порядком байтовgets
будет установлен неправильный байт.Лабиринт , 7 байт
Лабиринт - это язык 2D-стека, в котором поток управления зависит от знака верхнего элемента стека, проверяемого после каждой инструкции. Выполнение начинает двигаться вправо от первой действительной инструкции в верхнем ряду, которая здесь является
?
.Соответствующие инструкции:
Если входное значение равно 0, IP читает входные данные с помощью
?
, добавляет две верхние части стека (0 + 0 = 0
), затем дублирует:
и выдает!
0. Здесь мы встречаемся с единственным соединением в программе и должны проверить верхнюю часть стека, чтобы определить куда идти. Поскольку вершина равна 0, мы движемся вперед и заканчиваем с@
.С другой стороны, если входное значение равно 1, мы выполняем ту же инструкцию, что и раньше (но выводим 1), прежде чем достичь соединения в точке
!
. Теперь вершина стека положительна, поэтому мы поворачиваем направо в?
. На EOF Labyrinth нажимает 0, поэтому мы делаем0 + 1 = 1
на+
, дублировать:
и выводить!
. Еще раз у нас есть 1 на вершине стека, и цикл продолжается.Для бонуса предлагаем 7-байтовое решение @ MartinBüttner, которое работает аналогично:
Обратите внимание, что, в отличие от большинства языков,
1
фактически выталкиваетсяn
из стека и выталкиваетn*10 + 1
, что облегчает создание больших чисел. Однако, поскольку верхняя часть стека в этот момент пуста, она ничем не отличается от простого нажатия 1.источник
> <> , 7 байт
При этом используется тот факт, что> <> помещает -1 в EOF, что равно 1 модулю 2. Он также использует деление на 0 для завершения (что, по-видимому, нормально, поскольку единодушным является тот факт, что вывод STDERR игнорируется).
Просто для справки, чистый выход без ошибок - это дополнительный байт:
источник
APL, 6 байтов
Объяснение:
источник
Брайан и Чак , 21 байт
Здесь
<SOH>
следует заменить соответствующий управляющий символ (0x01).объяснение
Основная идея состоит в том, чтобы вычесть код символа ввода (48 или 49) из
p
конца в конце Чака, который либо даст?
(что является допустимой командой), либо a,@
который не используется.,
читает входной символ в первую ячейку Чака (отмечен значком_
). Мы хотим уменьшить это значение до0
цикла, в то же время внося некоторые другие изменения:}<
движется кp
и-
уменьшает его. Затем{
возвращается к-
уменьшению входной ячейки, что также. Пока это еще не ноль,?
дает контроль Чаку. Теперь>
перемещает головку ленты Брайана на одну ячейку вправо (которая инициализируется1
) и+
увеличивает ее. Затем мы сбрасываем цикл с помощью{?
.К тому времени , когда первая клетка на Чаке ударяется
0
, то<SOH>
ячейка будет уже увеличена до символа мы читаем из STDIN иp
будем?
для ввода1
или@
для ввода0
.Теперь
?
больше не переключает управление. Знак0
или1
после него не используется, как и нулевой байт (представлен_
).{
возвращается к первой ячейке Чака и+
увеличивается, чтобы убедиться, что она положительна, так что?
руки контролируют Чака.Это время
>+
увеличивает ячейку после окончания начальной ленты Брайана. Эта клетка - мусор, но мы никогда не будем ее использовать. Теперь{
сканирует не весь путь до ленты Брайана, а только до_
. Следовательно,?
не работает, потому что текущая ячейка равна нулю. Затем<.
перемещается на одну влево (копия входного символа) и печатает его.Наконец, мы сталкиваемся с
?
или@
. Если вход был0
и эта ячейка -@
это неоперация, и программа завершается. Но если вход был1
и эта ячейка -?
мы передаем Брайану,{+?
который сбросит цикл на Чаке, и теперь мы печатаем1
s навсегда (пока целое число в ячейке в конце ленты Брайана не поместится в память. больше, я полагаю ...).бонус
Sp3000 и я играли в гольф на этом в течение нескольких дней. Мы начали с 40 байтов и получили два совершенно разных, но связанных решения с 26 байтами. Только когда я начал писать свое объяснение, 21-байтовое решение, приведенное выше, пришло мне в голову. Большое спасибо Sp за то, что он бросил идеи и научил друг друга некоторым трюкам игры в гольф в B & C. :)
Это его 26-байтовое решение:
И это мое
Где
®
находится байт со значением 174 (например, просто сохраните файл как ISO 8859-1).В основном шахта работает аналогично 21-байтовому решению, в котором
®
делается}
для ввода1
и~
(без операции) для ввода0
, но выполнение гораздо менее элегантно.Его решение довольно изящно в том, что исходный код предназначен только для ASCII и что для обработки ввода не требуется цикл. Вместо этого
----
превращается1
в-
и0
в,
(не для Чака). Это-
тогда изменит первый?
на ленте Брайана на>
, создавая тем самым другой поток управления для1
-case.источник
Побитовая циклическая метка , 3 бита или <1 байт
Побитовая циклическая метка является одним из самых простых языков с тьюринговым соответствием. Он работает с двумя цепочками битов, программой и данными . Биты программы считываются циклически и интерпретируются следующим образом:
0
: Удалить первый бит данных (и вывести его в реализациях, которые имеют выход).1x
: Если первый бит данных1
, добавитьx
(представляющий либо0
или1
) в конец данных. (Если первый бит данных0
, ничего не делать.)Программа работает до тех пор, пока строка данных не станет пустой.
Истина-машина
Когда строка данных установлена в
0
:11
ничего не добавляет, потому что первый бит данных не является1
.0
удаляет / выводит0
.Когда строка данных установлена в
1
:11
присоединяет1
.0
удаляет / выводит1
.1
и программа возвращается к тому месту, где она началась, поэтому мы зацикливаемся навсегда.источник
GNU sed, 10
объяснение
:
определить безымянный ярлык/1/
Если вход соответствует регулярному выражению1
, тоp
напечатайте пространство образца (то есть 1)b
и вернуться к неназванной метке (навсегда)источник
:;p;/1/b
и н флагом, в общей сложности 9 байт. Посколькуsed -f
в любом случае используется для запуска файла сценария, добавление этого дополнительного флага не требует 2 байтов.Серьезно ,
43 байтаВычеркнуто 4 все еще 4 :(
,
читает значение из STDINW
запускает цикл, который выполняется, пока значение на вершине стека истинно, с телом■
.■
печатает верхний элемент стека без выталкивания Цикл неявно замкнут в EOF.При вводе
0
цикла цикл никогда не выполняется (поскольку он0
имеет тип false), и программа заканчивается в EOF, автоматически выталкивая и печатая каждое значение в стеке. На входе1
(или любое значение, которое не0
,""
или[]
), то цикл выполняется бесконечно.На самом деле , ведение
,
не требуется (благодаря неявному вводу), в результате чего счет уменьшается до 2 байтов.источник
Чт, 34 байта
Объяснение:
1::=12
Экземпляры подстроки "1" могут стать "12"2::=~1
Экземпляры подстроки "2" можно удалить, напечатав "1"0::=~0
Экземпляры подстроки «0» можно удалить, напечатав «0»@::=:::
Экземпляры подстроки "@" могут быть заменены на строки из ввода::=
Конечный список правил замещения@
Начальная строка "@"источник
Арнольд С, 134 байта
Хотя это не так увлекательно, как в другом ответе ArnoldC , это игра в гольф. Например, отступы не нужны, как и макросы
@NO PROBLEMO
и@I LIED
.Протестировано с этой версией языка , который не может принимать входные данные.
источник
Cubix , 5
6байтCubix - это новый двухмерный язык @ETHproductions, где команды обертываются вокруг граней куба. Онлайн переводчик. Спасибо @ETHproductions за экономию.
Это в конечном итоге расширилось до куба
Это начинается с
I
команды. Введите целое число в стек.\
, перенаправляет указатель инструкции вниз по оператору no op.O
, выводит числовое значение вершины стека.!
, пропустите следующую команду (@
), если вершина стека верна. Это переместит\
перенаправление, если 1\
, перенаправит указатель команды на программу@
выхода.Это использует тот факт, что стек не выталкивается
O ? !
командами.источник
?
и просто используя!
:!I\@O
@IOw!
,@I?Ov
,@!IOw
,!IOW@
,!I\@O
Foo , 6 байт
Ввод жестко закодирован как второй символ, так как Foo не имеет ввода STDIN. Разве мы не согласны с тем, что Фу теперь великолепен? :)
объяснение
источник
Perl,
18 + 1 = 1913 + 1 = 14 байтовЗапустите так:
Спасибо ThisSuitIsBlackNot (который намного лучше в игре в Perl, чем я) за пять байтов.
источник
+0
:echo -n 0 | perl -pe'print while$_'
(13 байт + 1 для-p
).perl -M5.010 -pe'say while$_'
будет еще короче, но это приведет к несовместимым переводам строки между 0 против 1.0
ложна, но0
+ перевод строки верен. Смperldoc perlsyn
.say
короче, даже если вы считаете-E
дополнительный байт.-l
:perl -lpE 'say while$_'
(11 байт + 2 для-lp
).> <> , 6 байт
Вставляет ввод в стек, чтобы начать
источник
'0'
) и 49 ('1'
). Я ошибаюсь?-v
флага.-v
, тогда я был исправлен. Так что ты не единственный. :)