да, это 91 строка


50

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» (но все равно включая разрыв строки).

13
msgstr " вам не разрешено использовать" y "или" \ n " " - я должен прочитать это как "Вы не можете использовать yили \nвнутри строкового литерала"?
Апсиллеры

12
С другой стороны, GNU true.cимеет длину 80 строк.
Деннис Уильямсон

6
@DennisWilliamson В похожей заметке false.c имеет длину 2 строки ....; _;
LordAro

6
coreutils yesпринимает необязательный аргумент в командной строке, а не stdin.
Брайан Минтон

7
@MrLore: подключаться к другим программам, которые могут постоянно запрашивать подтверждение различных действий, которые они делают, так что вам не придется сидеть там, набирая ys самостоятельно.
Маркус Эррониус 20.12.14

Ответы:


37

CJam, 13 байтов - 10 = 3

l_'x)?{_oNo}h

Для этого вам потребуется использовать интерпретатор Java , потому что онлайн-интерпретатор возвращается только после завершения программы.

Вы можете прервать программу с помощью SIGINT (нажав Ctrl-C). Он будет читать строку из STDIN и печатать эту строку, или yесли ввод был пустым.

объяснение

l             "Read line from STDIN.";
 _            "Duplicate.";
  'x          "Push character x.";
    )         "Increment to get y.";
     ?        "Ternary operator. Replaces line with y if it was empty.";
      {    }h "Repeat while true. Leaves condition on the stack, which is the output string.";
       _o     "Duplicate line and print.";
         No   "Push string with newline and print.";

После прояснения ОП, кажется, что следующее больше для спецификации:

l{_o9c)o1}g

Я подожду с обновлением представления, пока ОП ответит на мой комментарий.


16
Мне нравится, что ваша программа совпадает /no/i, учитывая, что это вызов.
Кевин - Восстановить Монику

20

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

++++++++++[>,]<<[[<]>>[[.>]<[<]>]]>[>++++++++++++>+<<-]>+[.>.<]

@ Фрай Я не мог получить это ниже 39 таким образом. В любом случае мне нужно 10, так что я либо добавляю 1 к 120, либо вычитаю 1 из 11, а в первом случае короче.
подземный

Да, я заметил после этого вы повторно использовали 10, извините: P
FryAmTheEggman

Вместо 10 * 12 + 1, почему не 11 * 11? Я думаю, что это может спасти вас чарса.
ProgramFOX

@pro Я не мог получить это ниже 39 таким образом. В любом случае мне нужно 10, так что я либо добавляю 1 к 120, либо вычитаю 1 из 11, а в первом случае короче.
подземный

@undergroundmonorail Ах, понятно.
ProgramFOX

18

Python 3, 27 байт

Работает как минимум с CPython и Jython.

while 1:print(str(help)[1])

SIGINT останавливает это.


18
Сделайте это python2, и вы можете сократить его до while 1:print`help`[1].
подземный

4
Ха-ха забавно. Я полностью забыл, что в python «раньше» был оператор
обратного хода

Вы также можете использовать, chr(11**2)чтобы сохранить несколько символов
user1354557

2
@RamchandraApte Вы не можете использовать 121.
Джонатон Рейнхарт

17

Marbelous 14 байтов

0978
]]/\++
!!

Это довольно просто: устройство '/ \' помещает две копии слева и справа, правая увеличивается на единицу, ++а затем падает с доски и печатается. ]]Устройство толкает любой мрамор вправо , если STDIN пуст , но позволяет первые байты на STDIN падать вниз , если это не так . Это тогда вызовет !!устройство, которое выходит из платы. Так что это будет печатать y \ n, пока вы не введете что-либо на stdin.

Это работает только в интерпретаторе Python.


17

Pyth, 10 9 6 байтов - 10 = 0 -1 -4

#|zePG

Я пытался целую вечность получить тот, которым я удовлетворен. В основном конвертируется в:

#      = while True
(implied print)
|      = or
z      = (automatically initialized from stdin)
ePG    = second-to-last lowercase letter = 'y'

Переменная «z» инициализируется из stdin, затем значение просто используется после этого. Нашел короткий способ получить значение ascii, не записывая его явно.
swstephe

Переключено с «^ 11 2» на «^ hT2» для сохранения символа.
swstephe

Привет swstephe, я рад видеть другого пользователя языка! Пара гольфов: #имеет эквивалентную функциональность W1и ePGявляется гораздо более коротким способом получить характер, yчем C^hT2.
Исаак

Спасибо, я приму эти изменения. Все еще новичок в этом гольфе. Мне нравится Pyth, но у Wish было больше контекстных функций и немного манипуляций.
swstephe

13

C #, 81 78 76 байтов

Не может конкурировать с другими языками, но здесь это все равно:

class A{static void Main(){for(;;)System.Console.WriteLine((char)('x'+1));}}

Может быть убит с помощью SIGINT нажатием Ctrl+ C.

Бонуса нет, потому что для его получения потребуется более 10 байт.


Вы не можете использовать while(1)? Спасает двух персонажей.
Зубная щетка

@toothbrush Я пробовал это, но это не работает в C #.
ProgramFOX

1
for(;;) должно работать.
core1024

2
По какой-то причине этот код все еще есть yв нем. Пожалуйста, изучите System.
TheNumberOne

4
@TheBestOne Это Systemне может быть удалено. это верхнее пространство имен в .NET Framework, все классы / другие пространства имен находятся в нем, поэтому рефлексия здесь не поможет. Но не уверен, что это неверно. Смотрите комментарий Рамона: «ничего, что оценивает y или \ n». Это не оценивает y. Я оставляю комментарий к вопросу, чтобы спросить Рамона, действительно ли это так.
ProgramFOX

10

Ява, 178

class C{public static void main(String[]a)throws Exception{for(char c='x'+1;;)((java.io.PrintStream)Class.forName("java.lang.S"+c+"stem").getField("out").get(null)).println(c);}}

Печать обязательна System, но yсимвол запрещен. Следовательно, я должен был использовать отражение.


FileDescriptor.out - это то, что я имел в виду.
TheNumberOne

Вы можете сохранить a ;, поместив char c='x'+1;в forобъявление цикла, так for(char c='x'+1;;)как у вас все равно есть пустая точка с запятой
corsiKa

@corsiKa Хороший вопрос.
Ypnypn

10

Perl: 18 байт - 10 = 8

Строка из STDIN.

$_=<>;{print;redo}

3
Печатает ли он y\nповторно, если не получает ввод от STDIN? Если нет, то это не правильно имитировать yes.
vurp0

@ vurp0 в конце концов yesне принимает входные данные STDIN:)
core1024

1
Это не так, но в вопросе о коде указывается, что если он не получает ввод, он должен многократно печататься y\n.
vurp0

2
@ vurp0 Где? Любая программа, которая читает из потока, будет зависать без ввода.
core1024

@ vurp0 Смотрите комментарий ОП по этому вопросу.
nyuszika7h

9

Рубин, 30 23 18 байт

loop{puts ?x.succ}

Может быть убит с помощью SIGINT нажатием Ctrl+ C.

Спасибо Manatwork для обмена улучшениями!


1
loop{puts [*?x..?z][1]}- 23 символа, loop{puts ?x.succ}- 18 символов
manatwork

@manatwork Спасибо! Обновлено.
ProgramFOX

8

Perl, 26 байт

{print chr$=*2+1,$/;redo}

Пользовательский ввод из аргумента (как на yesсамом деле работает), 22 байта-10 = 12

{print @ARGV,$/;redo}

Пользовательский ввод из стандартного ввода, 22 байта-10 = 12

while(<>){print;redo}

Программа @mar Nitz имеет длину всего 14 байт, и в вашей ссылке есть очень высоко оцененный комментарий, в котором говорится, что имена файлов имеют значение, если вы включите их в bytecount. Это кажется мне законным.
подземный

Ой, подождите, я не видел "вопрос, вы не можете использовать \" у \ "" часть вопроса. неважно, это плохо
подземный

Вы правы. Исправлено
Nitz

6

C 64 55 53 45 40 - 10 = 30

main(int c,int**a){for(;;)puts(a[c>1]);}

Я не очень доволен этим, так как для этого требуется, чтобы программа называлась "y" и вызывалась только с `y`, поэтому она должна быть в $ PATH, но, эй, сначала codegolf :)

Альтернатива:

C, 30 (+ 1 имя файла)

main(){for(;;)puts(__FILE__);}

Используя ту же технику, что и мой уважаемый коллега @Matt Windsor

  • РЕДАКТИРОВАТЬ: получается, что обход символа no \ n сделал его короче
  • EDIT2: "int" короче, чем "char"
  • EDIT3: эта переменная вообще не нужна
  • EDIT4: немного неопределенное поведение никогда никому не повредит
  • EDIT5: добавить альтернативную версию

5

Linux Bash, 33-10 = 23

read a; while :; do echo $a; done

Может быть убит с помощью SIGINT нажатием Ctrl+ C.


Вы должны прочитать только одну строку и печатать одну и ту же строку несколько раз. Ваши программы не yesтолько catпрограмма.
jimmy23013

Мой плохой, я не должен был пробовать это после дня работы.
Orace

Как насчетread a;for((;;));{ echo $a;}
core1024

5

Ржавчина, 52 знака

fn main(){loop{println!("{}",'Y'.to_lowercase())}}

yКажется, что в Rust нет хороших способов вычислений , если они не дерзкие - они слишком хорошо поработали над безопасными символами. Я:

  • Не может предоставить не-литеральную строку println!, поэтому там не допускаются уловки;
  • Невозможно добавить 1 к 'x', потому что в Rust символы не являются числами;
  • Не может ROT13 (почему Rust не имеет ROT13 в своей стандартной библиотеке !?);
  • Не может легко сделать что-то небезопасное, например, сбросить строки C, преобразовать числа в символы и т. Д., Не будучи невероятно многословным и не пройдя 52c.

И бонус код не стоит, потому что чтение из него stdinпотребует обработки ошибок = 3

Большая часть сокращений кода, которые я мог найти, заключалась в том, чтобы все чаще нарушать правила в среде компилятора:

Rust, 44 символа (+ как минимум 1 символ для имени файла)

fn main(){loop{println!("{:.1}", file!())}}

Устаревший ниже. Этот, вероятно, не считается, так как имя исходного файла должно начинаться с y.

Редактировать: Rust, 36 символов (35 источников, 1 имя файла)

fn main(){loop{println!(file!())}}

Как и выше, но файл должен быть вызван y(не y.rs, y). Забавно, что Rust перезапишет исходный код двоичным файлом! По крайней мере, на моей машине бинарный код работает после этого.

Ржавчина, 37 символов (+ эквивалент env K='y'на вашей платформе)

fn main(){loop{println!(env!("K"))}}

Это один еще хуже: вам нужно установить переменную окружения , Kчтобы yна время компиляции .

Edit : если вы установите Kна y\n, вы могли бы отказаться от lnин println!, для большой общей сложности 35 символов и нескольких facepalms:

fn main(){loop{print!(env!("K"))}}

Наша обычная политика для требования определенных имен файлов или флагов компилятора состоит в том, чтобы просто включать те в число байтов.
Мартин Эндер

@ MartinBüttner Справедливо. Как ни странно, кажется, что ржавчина не лучший язык для игры в гольф кода: P
Мэтт Виндзор

Вы можете добавить один xв моде, но это все еще не коротко:(b'x' + 1) as char
Shepmaster

5

Linux Bash - 19 байт

Это, вероятно, обман и может привести к ошибке, если у вас нет / usr / bin / yes или у вас есть / usr / bin / xes или / usr / bin / zes:

/usr/bin/[x-z]es $*

Я думаю, что он соответствует требованиям, хотя, возможно, он нарушает правило «ничего, что оценивает y». И, возможно, имитация yesна самом деле работает yesпротив правил.

Это можно было бы немного оптимизировать (хотя и с меньшей вероятностью), чтобы уменьшить его до 11 байт:

/*/*/?es $*

Я не мог понять, как получить бонус в 10 очков, читая строку из стандартного ввода, не добавляя более 10 байтов в код


2
/*/*/?es `line` или /*/*/?es `head -n1` если у вас нет /usr/bin/line.
jimmy23013

2
Или sed qдля line.
jimmy23013

5

12

[30986Pdx]dx

Только выходы y\n. Не читает со стандартного ввода, так что бонусов нет.

30986 - это 0x790A (т. Е. "Y \ n"). Команда Pпросто преобразует число в основную 256 и печатает соответствующий символ для каждой базовой цифры 256.


Это довольно умно, как оценивает 30986 y\n?
nyuszika7h

Я знал о, Pно не знал, что это может сделать больше чем один персонаж за один раз.
nyuszika7h

5

Common Lisp: (30-10) = 20

(format t"~@{~a~%~:*~}"(read))
  • (read) из входного потока
  • печать в выходной поток: (format t ... )
  • перебрать все formatаргументы (только один здесь):~@{ ... ~}
  • внутри цикла, для каждого аргумента:

    • аргумент print с ~Aпоследующим переводом строки~%
    • перемотать текущий элемент к предыдущему ~:*(бесконечный цикл)

Вы можете разорвать цикл с помощью Ctrl+C, который сигнализирует об ошибке с опциями перезапуска (продолжить / прервать).


3

Haskell, 29 байт

main=putStrLn[succ 'x']>>main

Я полагаю, что это остановлено обоими SIGINTи SIGPIPE.


предложение: используйте '\89'вместоsucc 'x'
гордый haskeller

3

Рубин, 27 байт - 10 = 17

Это просто решение @ ProgramFOX с бонусом (на решение вопроса о бонусе у меня ушло 9 байтов).

loop{puts ARGV[0]||?x.succ}

3

постоянный ток, 21 байт - 10 = 11

C1st?st[ltP[]ps0dx]dx

Обратите внимание, что входные данные должны быть обернуты [], например [no], потому что ?это единственный способ получить ввод, который выполняет его как dcкод.


Вы можете использовать C2вместо 122. На самом деле я бы поспорил, что 122 1-его можно заменить тем, C1что C1явно не запрещено в вопросе
Digital Trauma

3

Commodore 64 Basic: 14 13 байт

1?C|(11↑2):R╭

Как обычно, я сделал замену для символов в PETSCII, которых нет в Unicode. |используется для представления SHIFT+H, а представляет SHIFT+U. Обратите внимание, что при этом выводится ASCII «y» (значение байта 121), а не символ, который по умолчанию для набора символов Commodore отображается как «y».

BASIC, предположительно, является простым в освоении английским языком программирования. Добавьте ярлыки ввода, присутствующие на многих ранних диалектах, и вы получите что-то более короткое и менее читаемое, чем Perl.

РЕДАКТИРОВАТЬ : В «сдвинутом режиме» это становится на два байта короче, благодаря строчной букве «y», кодируемой с десятичным значением 89. Использование набора символов не-ASCII, чтобы обойти правило «не разрешено использовать их значения ASCII» может быть обманывает, хотя.

1?cH(89):rU

При всех 💩, которые существуют в юникоде, кажется удивительным, что полный набор символов, используемый C64, не будет где-то там.
Касперд

@kasperd, символы Unicode для рисования ящиков происходят в основном из набора IBM "DOS" и проходят через центр ячейки символов. PETSCII имеет гораздо больший набор, большая часть которого использует края ячейки персонажа. U + 2502, вероятно, является достойной аппроксимацией вертикальной черты, создаваемой SHIFT+H, но символ трубы легче набрать. Там нет ничего, соответствующего "линиям на верхнем и левом краях", произведенных `SHIFT + O"
Марк

Очень хорошо, но вы можете сохранить один байт, заменив «Goto 1» на «Run»: «1? CH (89): rU»
LeFauve

@ LeFauve, спасибо. Я также применил это к версии, излучающей ASCII.
Отметить

3

AWK, 38 байт

BEGIN{for(;;)printf("%c%c",60+61,5+5)}

Вариант, который будет читать строку на стандартный ввод: 14 байт-10 = 4

{for(;;)print}

Но так как он не может сделать и то и другое (вернуться к «y», если не указан stdin), я не уверен, что это считается ...: o)

Оба могут быть закрыты с помощью Ctrl + C.


3

Деление , 5 байт

Rx+!N

Это довольно конкурентоспособно для деления. :)

Поток управления начинается с (1,0)правого атома в R. xустанавливает массу 120и +увеличивает ее, чтобы дать (121,0). Затем !печатает соответствующий символ ( y) и Nпечатает новую строку. Исходный код оборачивается по краям, поэтому атом Rснова проходит (что сейчас ничего не делает), снова xустанавливает массу 120, +увеличивает ее и так далее, и так далее ...


3

C, 32 байта

Требуется машина с прямым порядком байтов и компиляция с -O2 (чтобы избежать переполнения стека).

a=11*11;main(){main(puts(&a));}

2

PowerShell, 27 - 10 = 17

param($s=$Host[1])for(){$s}

Может не работать в Паше. Более надежная альтернатива должна быть

param($s="$(gal gh*)"[2])for(){$s}

2

Lua, 42 байта - 10 = 32

while 1 do print(...or('').char(90+31))end

Lua, 49 байтов - 10 = 39

y=...or(string.char(60+61))while 1 do print(y)end

Оба были протестированы с Lua 5.1.4 и могут быть убиты с SIGINT ( Ctrl+ C).


Потрясающие! Моя мама пишет в Lua, я никогда не видел это в дикой природе раньше. ( Привет, мама! Угадай, что я видел! )
Signal15

2

Perl, 31

Вот версия Perl, которая на самом деле ведет себя как GNU yes, насколько я могу судить:

{print "@ARGV"||chr 11**2;redo}

Это работает, если допустимо использование переключателей командной строки perl ( -lдля новой строки), иначе это станет на 3 символа длиннее:

{print "@ARGV"||chr 11**2,$/;redo}

опечатка: это -l(не -e) переключатель для новой строки.
Крис-1

Кроме того, бонус только в том случае, если ваш скрипт может читать со стандартного ввода . Да, я знаю, что настоящее « да» читается не из стандартного ввода, а из аргумента, но это правило, поставленное ОП; это должно быть от stdin, чтобы получить бонус.
Крис-1

@ Крис-л исправил тип, спасибо. Я также снял претензию относительно бонуса, но я оставлю свой ответ таким, какой он есть :-P
xebtl

хе-хе, конечно, мой собственный ответ похож на ваш; он использует аргумент вместо стандартного ввода. ИМХО, ОП должен дать бонус тем, кто действительно делает то, что делает настоящее да .
Крис-л

2

CAPL 1.5+; 6 без ввода; 10 - 10 = 0 с вводом

Sidenote
Я где-то читал [ссылка?], Что пользовательские языки не допускаются в вопросах игры в гольф, поскольку они могут делать встроенные функции, которые точно выполняют заданный вопрос, однако я сделал CAPL, чтобы упростить игру в гольф в целом . Если вы думаете, что это здесь запрещено, дайте мне знать!

Я получил некоторые идеи от > <> и Befunge (вы можете перемещаться между строками и использовать шестнадцатеричные символы для ввода чисел), некоторые из Ruby, а некоторые из моих, чтобы упростить игру в гольф.
CAPL читает слева направо и идет на одну строку вниз в конце строки. Если это последняя строка, программа закроется.

Поскольку никто еще не знает этот язык, я постараюсь объяснить как можно больше.

Вывод y. 6 байт

bb*.n<

bb* bявляется шестнадцатеричным для 11, поэтому bb*is 11*11= 121, который является эквивалентом UTF-8 y. Это значение помещается в стек.
.Извлекает верхнее значение из стека и выводит как 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"

"Hello World"#~
#?!;.<

?!Операция такая же , как> <> 's


На самом деле ограничение распространяется на пользовательские языки / библиотеки / функции, опубликованные после публикации вопроса.
manatwork

@manatwork Это будет означать, что мой ответ неверен. Спасибо за разъяснения. Я сделал этот язык и хотел сделать несколько испытаний в гольфе, чтобы проверить, что я могу улучшить в будущих версиях, если это что-то улучшит.
Чарли

На мой взгляд, это не является недействительным, просто не имеет права на победу. Целью ограничения было предотвращение мошенничества, но, поскольку вы включили утверждение о свежести языка, это вряд ли можно считать попыткой мошенничества.
manatwork

2

APL (Dyalog APL) , 5 - 10 = -5 байт

Предупреждение: полагается на недокументированную и неподдерживаемую функцию / ошибку.

⎕←⍣≢⍞

Пустой STDIN печатает пустые строки (не «y»), что разрешено и было предложено .

Попробуйте онлайн!

 STDOUT с завершающими символами новой строки,

 получает

 неоднократно, пока

 это отличается от

 STDIN

то есть никогда, но непрерывно, прерывая поток.


Хм. злоупотребление ошибками .. интересно.
Мэтью Ро

@MatthewRoh Использование, а не злоупотребление. «Функция» использует оператор при назначении , даже если он не является реальной функцией и, следовательно, не может быть операндом. Все еще работает через ...
Адам

2

> <>, 6 байт

b:*oao

Не добавляя ;в конце, > <> будет продолжать плавать до тех пор, пока SIGINT не выпустит его.

объяснение

b:*oao
b         Push 11
 :        Duplicate
  *       Multiply top elements to get 121
   o      Print as character
    a     Push 10
     o    Print as character (yielding '\n')
          No program terminator, so our ><> will 
          keep on swimming this path forever.
^----' 


> <>, 17 - 10 = 7 байт

Предыдущее решение довольно скучное, поэтому вот то, которое принимает ввод от stdin. Это злоупотребляет факт , что путь по умолчанию подачи входных данных для <>> программ echo 'input' | fish.py yes.fish, где echoобеспечивает \nхарактер.

 i:0)?!v
0r}o:r~<

объяснение

 i:0)?!v     Load STDIN into the stack (reversed)

             NOP           <----------,
 i           Push a byte from STDIN   |
  :          Duplicate top element    |
   0         Push 0                   |
    )?       If (i > 0):              |
      !        Wrap around  ----------'
             Else:
       v       Move to the second part

0r}o:r~<     Print STDIN until halted

       <     Go right         <---------------,
      ~      Remove top element (duplicated   |
                -1 from EOF)                  |
     r       Reverse stack                    |
    :        Duplicate top element            |
   o         Output as character              |
  }          Rotate stack to right (go to     |
                next character)               |
 r           Reverse the stack                |
0            Push 0                           |
             Wrap around       ---------------'

0rВ конце позволяют СФОР цикла произойдет, обернув вокруг, где мы по- прежнему предполагаем , стек будет отменено с -1сверху.


1

Видимо это не совсем переносимо. Мое sys.version это 2.7.9 (default, Dec 11 2014, 04:42:00) \n[GCC 4.9.2], так что если ваш отличается это может не работать , я думаю.

Python 2 - (76-10) = 66

import sys
s=sys.stdin;a=`help`[1]if s.isatty()else s.read()
while 1:print a

Довольно долго, но я хотел пойти на бонус (хотя он и стоил больше 10 байт). Проверка, является ли stdin пустым или нет, без запроса ввода, по-видимому, долгая.

Сначала я неправильно воспринял бонус как аргумент вместо стандартного ввода. Я горжусь своим решением для этого, поэтому я все равно выкладываю его;)

Python 2 - (52-10 + ∞) = ∞ (неверно!)

import sys
while 1:print(sys.argv+[0])[1]or`help`[1]

sys.argvэто список, где нулевой элемент является именем файла, а каждый элемент afterwords является аргументом, данным программе. Я добавляю значение Falsey в конец списка; если аргументов нет, первый элемент - это значение false, иначе это первый аргумент. a or bв Python возвращает первое значение, которое подтверждает, каким будет результат: если aэто правда, мы уже знаем, что все это будет правдой, поэтому оно просто возвращается. Если это false, bвозвращается (так как False or b== b).


@ Фрай, я мог, но это подсказало бы пользователю. Я хотел, чтобы он y\nнемедленно начал выплевывать, если stdin был пуст.
подземный

@ Фрай Это странно, у меня это работает. Это может зависеть от cPython? У меня нет других идей.
подземный

хорошая идея, на нем
подземный

r=raw_input();p=r if r else`help`[1]\nwhile 1:print p 52 персонажа
сумасшедший

1
Хм, уже в первой строке, кажется, есть yи вторая.
Пажло Эберманн
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.