yes
из coreutils длиной 91 строка . Многие из них являются комментарии, но это по - прежнему WAY слишком долго.
Редактировать с сентября 2019 года: исходный файл вырос за последние пять лет и теперь составляет 126 строк.
Напишите программу, которая имитирует yes
:
- вывод в
stdout
бесконечный поток "y \ n" - должна быть возможность остановить его, кроме как убить процесс с помощью
SIGKILL
: ноSIGINT
иSIGPIPE
все в порядке - Вам не разрешено использовать "y" или "\ n" или их значения ASCII (121, 0x79, 0171, 10, 0xA или 012)
Кратчайший ответ выигрывает.
Бонус:
- вычтите 10 из длины вашего кода, если вы можете получить фразу
stdin
и распечатать ее вместо «y» (но все равно включая разрыв строки).
code-golf
restricted-source
Рамон Снир
источник
источник
y
или\n
внутри строкового литерала"?true.c
имеет длину 80 строк.yes
принимает необязательный аргумент в командной строке, а неstdin
.y
s самостоятельно.Ответы:
CJam, 13 байтов - 10 = 3
Для этого вам потребуется использовать интерпретатор Java , потому что онлайн-интерпретатор возвращается только после завершения программы.
Вы можете прервать программу с помощью SIGINT (нажав Ctrl-C). Он будет читать строку из STDIN и печатать эту строку, или
y
если ввод был пустым.объяснение
После прояснения ОП, кажется, что следующее больше для спецификации:
Я подожду с обновлением представления, пока ОП ответит на мой комментарий.
источник
/no/i
, учитывая, что это вызов.Brainfuck - 38 байт
Он не использует 10 или 121, потому что
+-<>.,[]
все равно все значимые символы в языке, но вычисляет их довольно наивно (0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 = 10, 10 * 12 + 1 = 121).Вероятно, это зависит от переводчика, но он умирает
^C
на моей машине.Brainfuck - (63-10) = 53
источник
Python 3, 27 байт
Работает как минимум с CPython и Jython.
SIGINT останавливает это.
источник
while 1:print`help`[1]
.chr(11**2)
чтобы сохранить несколько символов121
.Marbelous 14 байтов
Это довольно просто: устройство '/ \' помещает две копии слева и справа, правая увеличивается на единицу,
++
а затем падает с доски и печатается.]]
Устройство толкает любой мрамор вправо , если STDIN пуст , но позволяет первые байты на STDIN падать вниз , если это не так . Это тогда вызовет!!
устройство, которое выходит из платы. Так что это будет печатать y \ n, пока вы не введете что-либо на stdin.Это работает только в интерпретаторе Python.
источник
Pyth,
1096 байтов - 10 =0-1-4Я пытался целую вечность получить тот, которым я удовлетворен. В основном конвертируется в:
источник
#
имеет эквивалентную функциональностьW1
иePG
является гораздо более коротким способом получить характер,y
чемC^hT2
.C #,
817876 байтовНе может конкурировать с другими языками, но здесь это все равно:
Может быть убит с помощью SIGINT нажатием Ctrl+ C.
Бонуса нет, потому что для его получения потребуется более 10 байт.
источник
while(1)
? Спасает двух персонажей.for(;;)
должно работать.y
в нем. Пожалуйста, изучитеSystem
.System
не может быть удалено. это верхнее пространство имен в .NET Framework, все классы / другие пространства имен находятся в нем, поэтому рефлексия здесь не поможет. Но не уверен, что это неверно. Смотрите комментарий Рамона: «ничего, что оценивает y или \ n». Это не оцениваетy
. Я оставляю комментарий к вопросу, чтобы спросить Рамона, действительно ли это так.Ява, 178
Печать обязательна
System
, ноy
символ запрещен. Следовательно, я должен был использовать отражение.источник
;
, поместивchar c='x'+1;
вfor
объявление цикла, такfor(char c='x'+1;;)
как у вас все равно есть пустая точка с запятойPerl: 18 байт - 10 = 8
Строка из STDIN.
источник
y\n
повторно, если не получает ввод от STDIN? Если нет, то это не правильно имитироватьyes
.yes
не принимает входные данныеSTDIN
:)y\n
.Рубин,
302318 байтМожет быть убит с помощью SIGINT нажатием Ctrl+ C.
Спасибо Manatwork для обмена улучшениями!
источник
loop{puts [*?x..?z][1]}
- 23 символа,loop{puts ?x.succ}
- 18 символовPerl, 26 байт
Пользовательский ввод из аргумента (как на
yes
самом деле работает), 22 байта-10 = 12Пользовательский ввод из стандартного ввода, 22 байта-10 = 12
источник
C
6455534540 - 10 = 30main(int c,int**a){for(;;)puts(a[c>1]);}
Я не очень доволен этим, так как для этого требуется, чтобы программа называлась "y" и вызывалась только с `y`, поэтому она должна быть в $ PATH, но, эй, сначала codegolf :)
Альтернатива:
C, 30 (+ 1 имя файла)
main(){for(;;)puts(__FILE__);}
Используя ту же технику, что и мой уважаемый коллега @Matt Windsor
источник
Linux Bash, 33-10 = 23
Может быть убит с помощью SIGINT нажатием Ctrl+ C.
источник
yes
толькоcat
программа.read a;for((;;));{ echo $a;}
Ржавчина, 52 знака
y
Кажется, что в Rust нет хороших способов вычислений , если они не дерзкие - они слишком хорошо поработали над безопасными символами. Я:println!
, поэтому там не допускаются уловки;'x'
, потому что в Rust символы не являются числами;И бонус код не стоит, потому что чтение из него
stdin
потребует обработки ошибок = 3Большая часть сокращений кода, которые я мог найти, заключалась в том, чтобы все чаще нарушать правила в среде компилятора:
Rust, 44 символа (+ как минимум 1 символ для имени файла)
Устаревший ниже. Этот, вероятно, не считается, так как имя исходного файла должно начинаться с
y
.Редактировать: Rust, 36 символов (35 источников, 1 имя файла)
Как и выше, но файл должен быть вызван
y
(неy.rs
,y
). Забавно, что Rust перезапишет исходный код двоичным файлом! По крайней мере, на моей машине бинарный код работает после этого.Ржавчина, 37 символов (+ эквивалент
env K='y'
на вашей платформе)Это один еще хуже: вам нужно установить переменную окружения ,
K
чтобыy
на время компиляции .Edit : если вы установите
K
наy\n
, вы могли бы отказаться отln
инprintln!
, для большой общей сложности35 символов инескольких facepalms:источник
x
в моде, но это все еще не коротко:(b'x' + 1) as char
Linux Bash - 19 байт
Это, вероятно, обман и может привести к ошибке, если у вас нет / usr / bin / yes или у вас есть / usr / bin / xes или / usr / bin / zes:
Я думаю, что он соответствует требованиям, хотя, возможно, он нарушает правило «ничего, что оценивает y». И, возможно, имитация
yes
на самом деле работаетyes
против правил.Это можно было бы немного оптимизировать (хотя и с меньшей вероятностью), чтобы уменьшить его до 11 байт:
Я не мог понять, как получить бонус в 10 очков, читая строку из стандартного ввода, не добавляя более 10 байтов в код
источник
/*/*/?es `line`
или/*/*/?es `head -n1`
если у вас нет/usr/bin/line
.sed q
дляline
.12
Только выходы
y\n
. Не читает со стандартного ввода, так что бонусов нет.30986 - это 0x790A (т. Е. "Y \ n"). Команда
P
просто преобразует число в основную 256 и печатает соответствующий символ для каждой базовой цифры 256.источник
y\n
?P
но не знал, что это может сделать больше чем один персонаж за один раз.Common Lisp: (30-10) = 20
(read)
из входного потока(format t ... )
format
аргументы (только один здесь):~@{ ... ~}
внутри цикла, для каждого аргумента:
~A
последующим переводом строки~%
~:*
(бесконечный цикл)Вы можете разорвать цикл с помощью Ctrl+C, который сигнализирует об ошибке с опциями перезапуска (продолжить / прервать).
источник
Haskell, 29 байт
Я полагаю, что это остановлено обоими
SIGINT
иSIGPIPE
.источник
'\89'
вместоsucc 'x'
Рубин, 27 байт - 10 = 17
Это просто решение @ ProgramFOX с бонусом (на решение вопроса о бонусе у меня ушло 9 байтов).
источник
постоянный ток, 21 байт - 10 = 11
Обратите внимание, что входные данные должны быть обернуты
[]
, например[no]
, потому что?
это единственный способ получить ввод, который выполняет его какdc
код.источник
C2
вместо122
. На самом деле я бы поспорил, что122 1-
его можно заменить тем,C1
чтоC1
явно не запрещено в вопросеCommodore 64 Basic:
1413 байтКак обычно, я сделал замену для символов в PETSCII, которых нет в Unicode.
|
используется для представленияSHIFT+H
, а╭
представляетSHIFT+U
. Обратите внимание, что при этом выводится ASCII «y» (значение байта 121), а не символ, который по умолчанию для набора символов Commodore отображается как «y».BASIC, предположительно, является простым в освоении английским языком программирования. Добавьте ярлыки ввода, присутствующие на многих ранних диалектах, и вы получите что-то более короткое и менее читаемое, чем Perl.
РЕДАКТИРОВАТЬ : В «сдвинутом режиме» это становится на два байта короче, благодаря строчной букве «y», кодируемой с десятичным значением 89. Использование набора символов не-ASCII, чтобы обойти правило «не разрешено использовать их значения ASCII» может быть обманывает, хотя.
источник
SHIFT+H
, но символ трубы легче набрать. Там нет ничего, соответствующего "линиям на верхнем и левом краях", произведенных `SHIFT + O"AWK, 38 байт
Вариант, который будет читать строку на стандартный ввод: 14 байт-10 = 4
Но так как он не может сделать и то и другое (вернуться к «y», если не указан stdin), я не уверен, что это считается ...: o)
Оба могут быть закрыты с помощью Ctrl + C.
источник
Деление , 5 байт
Это довольно конкурентоспособно для деления. :)
Поток управления начинается с
(1,0)
правого атома вR
.x
устанавливает массу120
и+
увеличивает ее, чтобы дать(121,0)
. Затем!
печатает соответствующий символ (y
) иN
печатает новую строку. Исходный код оборачивается по краям, поэтому атомR
снова проходит (что сейчас ничего не делает), сноваx
устанавливает массу120
,+
увеличивает ее и так далее, и так далее ...источник
C, 32 байта
Требуется машина с прямым порядком байтов и компиляция с -O2 (чтобы избежать переполнения стека).
источник
PowerShell, 27 - 10 = 17
Может не работать в Паше. Более надежная альтернатива должна быть
источник
Lua, 42 байта - 10 = 32
Lua, 49 байтов - 10 = 39
Оба были протестированы с Lua 5.1.4 и могут быть убиты с SIGINT ( Ctrl+ C).
источник
Perl, 31
Вот версия Perl, которая на самом деле ведет себя как GNU
yes
, насколько я могу судить:Это работает, если допустимо использование переключателей командной строки perl (
-l
для новой строки), иначе это станет на 3 символа длиннее:источник
-l
(не-e
) переключатель для новой строки.CAPL 1.5+; 6 без ввода; 10 - 10 = 0 с вводом
Sidenote
Я где-то читал [ссылка?], Что пользовательские языки не допускаются в вопросах игры в гольф, поскольку они могут делать встроенные функции, которые точно выполняют заданный вопрос, однако я сделал CAPL, чтобы упростить игру в гольф в целом . Если вы думаете, что это здесь запрещено, дайте мне знать!
Я получил некоторые идеи от > <> и Befunge (вы можете перемещаться между строками и использовать шестнадцатеричные символы для ввода чисел), некоторые из Ruby, а некоторые из моих, чтобы упростить игру в гольф.
CAPL читает слева направо и идет на одну строку вниз в конце строки. Если это последняя строка, программа закроется.
Поскольку никто еще не знает этот язык, я постараюсь объяснить как можно больше.
Вывод y. 6 байт
bb*.n<
bb*
b
является шестнадцатеричным для11
, поэтомуbb*
is11*11
=121
, который является эквивалентом UTF-8y
. Это значение помещается в стек..
Извлекает верхнее значение из стека и выводит как UTF-8. Как121
и на вершине стека, индекс здесь игнорируется.n
Выводит новую<
строку. Отправляет указатель назад к началу строки, повторяя эту строку. Поскольку мы не ожидаем ввода, мы можем сделать это безопасно, без повторного запроса ввода.Вывод из ввода. 10 байт, 0 после бонуса
i~a&{X:.)}
i
Принимает ввод от пользователя, выдвигает как UTF-8 на вершину стека, и увеличивает длину после этого. Т.е.[72,101,108,108,111,5]
~
извлекает число из стека, а затем переворачивает это количество байтов. Т.е.[111,108,108,101,72]
a
шестнадцатеричный для10
, символ новой строки&{...}
делает бесконечный цикл. У нас есть вход, поэтому мы не можем отправить указатель обратно на строку. Я мог бы поместить функцию в строку ниже, что бы обезопасить меня от байта, но новые строки не разрешены в этом вызове.X
Удаляет верхнее значение из стека (индекс из цикла).:.
Дублирует верхнее значение, а затем выводит как UTF-8.)
Поворачивает стек вправо. ([1,2,3,4,5]
->[5,1,2,3,4]
)Однако это означает, что мы начинаем с новой строки, затем начинаем выводить ввод, затем новую строку, затем ввод и т. Д. Если нам не разрешено начинать с новой строки, используйте следующий код с 12 байтами или 2 после вычитания бонус.
iXa#~&{X:.)}
Единственная новая команда здесь
#
, которая помещает количество элементов в стеке в стек.Я удалил длину из
i
, потому что добавление 1, затем замена новой строкой длиннее, чем удаление и получение длины снова.Просто для удовольствия, вот программа "Hello World"
?!
Операция такая же , как> <> 'sисточник
APL (Dyalog APL) , 5 - 10 = -5 байт
Предупреждение: полагается на недокументированную и неподдерживаемую функцию / ошибку.
Пустой STDIN печатает пустые строки (не «y»), что разрешено и было предложено .
Попробуйте онлайн!
⎕
STDOUT с завершающими символами новой строки,←
получает⍣
неоднократно, пока≢
это отличается от⍞
STDINто есть никогда, но непрерывно, прерывая поток.
источник
⍣
при назначении←
, даже если←
он не является реальной функцией и, следовательно, не может быть операндом. Все еще работает через ...> <>, 6 байт
Не добавляя
;
в конце, > <> будет продолжать плавать до тех пор, пока SIGINT не выпустит его.объяснение
> <>, 17 - 10 = 7 байт
Предыдущее решение довольно скучное, поэтому вот то, которое принимает ввод от stdin. Это злоупотребляет факт , что путь по умолчанию подачи входных данных для <>> программ
echo 'input' | fish.py yes.fish
, гдеecho
обеспечивает\n
характер.объяснение
0r
В конце позволяют СФОР цикла произойдет, обернув вокруг, где мы по- прежнему предполагаем , стек будет отменено с-1
сверху.источник
Видимо это не совсем переносимо. Мое
sys.version
это2.7.9 (default, Dec 11 2014, 04:42:00) \n[GCC 4.9.2]
, так что если ваш отличается это может не работать , я думаю.Python 2 - (76-10) = 66
Довольно долго, но я хотел пойти на бонус (хотя он и стоил больше 10 байт). Проверка, является ли stdin пустым или нет, без запроса ввода, по-видимому, долгая.
Сначала я неправильно воспринял бонус как аргумент вместо стандартного ввода. Я горжусь своим решением для этого, поэтому я все равно выкладываю его;)
Python 2 - (52-10 + ∞) = ∞ (неверно!)
sys.argv
это список, где нулевой элемент является именем файла, а каждый элемент afterwords является аргументом, данным программе. Я добавляю значение Falsey в конец списка; если аргументов нет, первый элемент - это значение false, иначе это первый аргумент.a or b
в Python возвращает первое значение, которое подтверждает, каким будет результат: еслиa
это правда, мы уже знаем, что все это будет правдой, поэтому оно просто возвращается. Если это false,b
возвращается (так какFalse or b
==b
).источник
y\n
немедленно начал выплевывать, если stdin был пуст.r=raw_input();p=r if r else`help`[1]\nwhile 1:print p
52 персонажаy
и вторая.