sì è lungo 91 righe


50

yes, da coreutils, è lungo 91 linee . Molti di loro sono commenti, ma è ancora MODO troppo lungo.

Modifica da settembre 2019: il file sorgente è cresciuto negli ultimi cinque anni e ora è lungo 126 righe.

Scrivi un programma che imita yes:

  • in uscita a stdoutun flusso infinito di "y \ n"
  • ci deve essere un'opzione per fermarlo oltre a uccidere il processo con SIGKILL: ma SIGINTe va SIGPIPEbene
  • non ti è permesso usare "y" o "\ n" o i loro valori ASCII (121, 0x79, 0171, 10, 0xA o 012)

Vince la risposta più breve.

Bonus:

  • sottrai 10 dalla lunghezza del tuo codice, se puoi ricevere una frase stdine stamparla invece di "y" (ma includendo comunque l'interruzione di riga).

13
"non ti è permesso usare" y "o" \ n " " - dovrei leggere questo come "Non puoi usare yo \ndentro una stringa letterale"?
apsillers,

12
Su una nota correlata, GNU true.cè lungo 80 linee.
Dennis Williamson,

6
@DennisWilliamson Su una nota correlata in modo simile, false.c è lungo 2 righe ....; _;
LordAro

6
coreutils yesaccetta un argomento facoltativo sulla riga di comando, non stdin.
Brian Minton,

7
@MrLore: collegarsi ad altri programmi che potrebbero costantemente chiedere la conferma delle varie cose che stanno facendo, quindi non devi sederti lì digitando yte stesso.
marcus erronius,

Risposte:


37

CJam, 13 byte - 10 = 3

l_'x)?{_oNo}h

A tale scopo dovrai utilizzare l'interprete Java , poiché l'interprete online ritorna solo al termine del programma.

È possibile interrompere il programma con SIGINT (premendo Ctrl-C). Legge una riga da STDIN e stampa quella riga o yse l'input era vuoto.

Spiegazione

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.";

Dopo il chiarimento del PO, le seguenti sembrano più specifiche:

l{_o9c)o1}g

Aspetterò con l'aggiornamento dell'invio fino a quando l'OP non risponderà al mio commento.


16
Mi piace che il tuo programma coincida /no/i, considerando quale sia la sfida.
Kevin - Ripristina Monica il

20

Brainfuck - 38 byte

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

Non usa 10 o 121, perché +-<>.,[]sono comunque tutti i caratteri significativi nella lingua, ma li calcola in modo abbastanza ingenuo (0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 = 10, 10 * 12 + 1 = 121).

Questo probabilmente dipende dall'interprete, ma muore ^Csulla mia macchina.

Brainfuck - (63-10) = 53

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

@fry Non sono riuscito a farlo sotto i 39 in quel modo. Ho comunque bisogno di 10, quindi sto aggiungendo da 1 a 120 o sottraendo 1 da 11, ed è più breve fare il primo.
undergroundmonorail,

Sì, ho notato dopo che hai riutilizzato il 10, scusa: P
FryAmTheEggman,

Invece di 10 * 12 + 1, perché non 11 * 11? Penso che potrebbe farti risparmiare un personaggio.
Programma FOX il

@pro Non sono riuscito a farlo sotto i 39 in quel modo. Ho comunque bisogno di 10, quindi sto aggiungendo da 1 a 120 o sottraendo 1 da 11, ed è più breve fare il primo.
undergroundmonorail,

@undergroundmonorail Ah, capisco.
Programma FOX il

18

Python 3, 27 byte

Funziona con almeno CPython e Jython.

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

SIGINT lo ferma.


18
Rendilo python2 e puoi accorciarlo while 1:print`help`[1].
undergroundmonorail,

4
Ahah carino. Ho completamente dimenticato che "python" era un operatore di
backtick

Puoi usare anche chr(11**2)per salvare alcuni caratteri
user1354557

2
@RamchandraApte Non puoi utilizzare 121.
Jonathon Reinhart,

17

Marbelous 14 byte

0978
]]/\++
!!

Questo è piuttosto semplice, il dispositivo '/ \' posiziona due copie a sinistra e a destra, quella destra viene incrementata di, ++quindi cade dalla scheda e viene stampata. Il ]]dispositivo spinge qualsiasi marmo verso destra se STDIN è vuoto ma lascia cadere il primo byte su STDIN se non lo è. Ciò attiverà quindi il !!dispositivo, che esce dalla scheda. Quindi questo stamperà y \ n fino a quando non inserisci nulla su stdin.

Funziona solo nell'interprete Python.


17

Pyth, 10 9 6 byte - 10 = 0 -1 -4

#|zePG

Ho cercato per anni di ottenerne uno di cui sono soddisfatto. Fondamentalmente converte in:

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

La variabile "z" viene inizializzata da stdin, quindi il valore viene semplicemente utilizzato successivamente. Ho trovato un modo breve per ottenere il valore ASCII senza scriverlo esplicitamente.
Swstephe

Passato da "^ 11 2" a "^ hT2" per salvare un personaggio.
Swstephe

Ciao swstephe, sono entusiasta di vedere un altro utente della lingua! Un paio di campi da golf: #ha funzionalità equivalenti a W1, ed ePGè un modo molto più breve per ottenere il personaggio ydi C^hT2.
Isaacg,

Grazie, applicherò queste modifiche. Ancora nuovo in questa cosa del golf. Mi piace Pyth, ma Wish aveva alcune funzioni contestuali e manipolazione dei bit in più.
swstephe,

13

C #, 81 78 76 byte

Non è possibile competere con le altre lingue, ma eccolo qui:

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

Può essere ucciso con SIGINT premendo Ctrl+ C.

Nessun bonus, perché sarebbero necessari più di 10 byte per ottenerlo.


Non puoi usare while(1)? Salva due personaggi.
Spazzolino da denti il

@toothbrush L'ho provato, ma non funziona in C #.
Programma FOX

1
for(;;) dovrebbe funzionare.
core1024,

2
Per qualche motivo, questo codice ha ancora un yin esso. Si prega di esaminare System.
TheNumberOne il

4
@TheBestOne Non Systempuò essere rimosso. è lo spazio dei nomi principale in .NET Framework, tutte le classi / altri spazi dei nomi sono presenti, quindi la riflessione non sarà di aiuto qui. Ma non sono sicuro se non è valido. Vedi il commento di Ramon: "niente che valuti y o \ n". Questo non lo valuta y. Lascio un commento sulla domanda per chiedere a Ramon se questo è valido.
Programma FOX il

10

Java, 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);}}

La stampa richiede System, ma il ypersonaggio è proibito. Quindi, ho dovuto usare la riflessione.


FileDescriptor.out è ciò che intendevo.
TheNumberOne

Puoi salvare un ;inserendo char c='x'+1;la fordichiarazione del ciclo, quindi for(char c='x'+1;;)dato che hai comunque un punto e virgola vuoto
corsiKa

@corsiKa Ottimo punto.
Ypnypn,

10

Perl: 18 byte - 10 = 8

La stringa proviene da STDIN.

$_=<>;{print;redo}

3
Stampa y\nripetutamente se non riceve input da STDIN? In caso contrario, non imita correttamente yes.
vurp0

@ vurp0 dopo tutto yesnon accetta input STDIN:)
core1024

1
Non lo fa, ma la domanda di golf del codice qui specifica che se non riceve input, dovrebbe stampare più volte y\n.
vurp0

2
@ vurp0 Dove? Qualsiasi programma che legge da uno stream si bloccherà senza input.
core1024

@ vurp0 Vedere il commento del PO sulla domanda.
nyuszika7h,

9

Rubino, 30 23 18 byte

loop{puts ?x.succ}

Può essere ucciso con SIGINT premendo Ctrl+ C.

Grazie a manatwork per condividere miglioramenti!


1
loop{puts [*?x..?z][1]}- 23 caratteri, loop{puts ?x.succ}- 18 caratteri
arte

@manatwork Grazie! Aggiornato.
Programma FOX il

8

Perl, 26 byte

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

Input personalizzato dall'argomento (come yeseffettivamente funziona), 22 byte-10 = 12

{print @ARGV,$/;redo}

Input personalizzato da stdin, 22 byte-10 = 12

while(<>){print;redo}

Il programma di @mar Nitz è lungo solo 14 byte e c'è un commento molto votato sul tuo link che dice che è freddo per i nomi dei file importare se li includi nel bytecount. Questo mi sembra legittimo.
undergroundmonorail,

oh aspetta, non ho visto la parte "non puoi usare \" y \ "" della domanda. non importa che sia un male
undergroundmonorail

Hai ragione. Risolto il problema
Nitz,

6

C, 64 55 53 45 40 - 10 = 30

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

Non sono molto contento di questo, poiché richiede che il programma sia chiamato "y" e sia chiamato solo con "y", quindi deve essere in $ PATH, ma ehi, primo codegolf :)

Alternativa:

C, 30 (+ 1 nome file)

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

Usando la stessa tecnica del mio stimato collega @Matt Windsor

  • EDIT: risulta aggirare il carattere no \ n rendendolo più breve
  • EDIT2: "int" è più corto di "char"
  • EDIT3: non aveva bisogno di quella variabile
  • EDIT4: un po 'di comportamento leggermente indefinito non fa mai male a nessuno
  • EDIT5: aggiungi versione alternativa

5

Linux Bash, 33-10 = 23

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

Può essere ucciso con SIGINT premendo Ctrl+ C.


Dovresti leggere solo una riga e stampare ripetutamente la stessa riga. I tuoi programmi non sono yesche catprogrammi.
jimmy23013,

Mio male, non avrei dovuto provarlo dopo una giornata di lavoro.
Orace,

Che ne diciread a;for((;;));{ echo $a;}
core1024

5

Ruggine, 52 caratteri

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

yApparentemente non c'è un bel modo di lavorare senza essere sfacciati in Rust: hanno fatto un lavoro troppo bello nel fare i caratteri in modo sicuro. IO:

  • Non è possibile fornire una stringa non letterale a println!, quindi non sono ammessi trucchi lì;
  • Impossibile aggiungere 1 a 'x', perché in Rust i caratteri non sono numeri;
  • Impossibile ROT13 (perché Rust non ha ROT13 nella sua libreria standard !?);
  • Non si può facilmente fare qualcosa di pericoloso come passare alle stringhe C, convertire da numeri in caratteri, ecc. Senza essere incredibilmente prolisso e andare oltre 52c.

Né vale la pena per il bonus del codice, perché la lettura da stdinrichiederebbe la gestione degli errori = 3

Gran parte delle riduzioni del codice che ho potuto trovare coinvolte nel fare cose sempre più in contrasto con l'ambiente del compilatore:

Rust, 44 caratteri (+ almeno 1 carattere per il nome file)

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

Obsoleted dal basso. Questo probabilmente non conta, poiché il nome del file sorgente deve iniziare y.

Modifica: Rust, 36 caratteri (35 sorgente, 1 nome file)

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

Come sopra, ma il file deve essere chiamato y(no y.rs, y). Umoristicamente, Rust sovrascriverà la fonte con il binario! Almeno sulla mia macchina, il binario funziona dopo quello però.

Rust, 37 caratteri (+ equivalente di env K='y'sulla tua piattaforma)

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

Questo è anche peggio: è necessario impostare la variabile di ambiente Ksu yal momento della compilazione .

Edit : se si imposta Ka y\n, si potrebbe cadere la lna println!, per un totale di 35 caratteri e diverse facepalms:

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

La nostra politica abituale per richiedere determinati nomi di file o flag del compilatore è semplicemente includere quelli nel conteggio dei byte.
Martin Ender,

@ MartinBüttner Abbastanza giusto. Stranamente, sembrerebbe che la ruggine non sia la lingua migliore per il codice golf>: P
Matt Windsor,

Puoi aggiungerne uno a xmodo, ma non è ancora breve:(b'x' + 1) as char
Shepmaster

5

Linux Bash - 19 byte

Questo è probabilmente un imbroglio e soggetto a fallimento se non hai / usr / bin / yes o hai / usr / bin / xes o / usr / bin / zes:

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

Penso che soddisfi i requisiti, anche se forse sta violando la regola "niente che valuta y". E forse imitare yeseseguendo effettivamente yesè contro le regole.

Questo potrebbe essere ottimizzato un po '(anche se meno probabile che funzioni) per portarlo fino a 11 byte:

/*/*/?es $*

Non sono riuscito a capire come ottenere il bonus di 10 punti leggendo una stringa da stdin senza aggiungere più di 10 byte al codice


2
/*/*/?es `line` o /*/*/?es `head -n1` se non lo hai /usr/bin/line.
jimmy23013,

2
O sed qper line.
jimmy23013,

5

dc, 12

[30986Pdx]dx

Solo uscite y\n. Non legge dallo stdin, quindi nessun bonus.

30986 è 0x790A (ovvero "y \ n"). Il Pcomando converte semplicemente il numero in base 256 e stampa il carattere corrispondente per ogni 256 base base.


È abbastanza intelligente, come valuta 30986 y\n?
nyuszika7h,

Ne sapevo Pma non sapevo che potesse fare più di un personaggio alla volta.
nyuszika7h,

5

Lisp comune: (30-10) = 20

(format t"~@{~a~%~:*~}"(read))
  • (read) dal flusso di input
  • stampa nel flusso di output: (format t ... )
  • iterare su tutti gli formatargomenti (solo uno qui):~@{ ... ~}
  • all'interno del ciclo, per ogni argomento:

    • argomento di stampa ~Aseguito da una nuova riga~%
    • riavvolgi l'elemento corrente a quello precedente ~:*(loop infinito)

È possibile interrompere il ciclo con Ctrl+C, che segnala un errore con le opzioni di riavvio (continua / interrompi).


3

Haskell, 29 byte

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

Credo che questo sia fermato da entrambi SIGINTe SIGPIPE.


suggerimento: usa '\89'invece disucc 'x'
orgoglioso haskeller il

3

Rubino, 27 byte - 10 = 17

È solo la soluzione di @ ProgramFOX con il bonus (ci sono voluti i miei 9 byte per risolvere la domanda di bonus).

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

3

dc, 21 byte - 10 = 11

C1st?st[ltP[]ps0dx]dx

Si noti che è necessario includere l'input [], ad es [no]. Perché ?è l'unico modo per accettare l'input, che lo esegue come dccodice.


Puoi usare C2invece di 122. In effetti direi che 122 1-potrebbe essere sostituito con un C1dato che C1non è esplicitamente vietato nella domanda
Digital Trauma

3

Commodore 64 Basic: 14 13 byte

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

Come al solito, ho effettuato sostituzioni per personaggi in PETSCII che non sono presenti in Unicode. |è usato per rappresentare SHIFT+H, mentre rappresenta SHIFT+U. Si noti che ciò genera ASCII 'y' (valore byte 121) anziché un carattere che il set di caratteri Commodore predefinito visualizza come 'y'.

BASIC è presumibilmente un linguaggio di programmazione simile all'inglese facile da imparare. Inserisci le scorciatoie da tastiera presenti in molti primi dialetti e otterrai qualcosa che è più breve e meno leggibile di Perl.

EDIT : in "modalità spostata", questo si accorcia di due byte, grazie alla minuscola "y" codificata al valore decimale 89. L'utilizzo di un set di caratteri non ASCII per aggirare la regola "non consentito utilizzare i loro valori ASCII" potrebbe essere barare, però.

1?cH(89):rU

Con tutto il 💩 che esiste in Unicode, sembra sorprendente che l'intero set di caratteri usato dal C64 non sia lì da qualche parte.
Kasperd,

@kasperd, i personaggi di Unicode del disegno a scatola provengono principalmente dal set "DOS" di IBM e passano attraverso il centro della cella del carattere. PETSCII ha un set molto più grande, molti dei quali utilizza i bordi della cella del carattere. U + 2502 è probabilmente un'approssimazione decente della barra verticale prodotta da SHIFT+H, ma il carattere del tubo è più facile da digitare. Non c'è nulla che corrisponda alle "linee sui bordi superiore e sinistro" prodotte da `MAIUSC + O".
Marco

Molto bene, ma è possibile salvare un byte sostituendo "Goto 1" con "Run": "1? CH (89): rU"
LeFauve,

@LeFauve, grazie. L'ho anche applicato alla versione che emette ASCII.
Segna il

3

AWK, 38 byte

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

Variante che leggerà la stringa su stdin: 14 byte-10 = 4

{for(;;)print}

Ma dal momento che non può fare entrambe le cose (ripristina "y" se non viene fornito alcuno stdin), non sono sicuro che conti ...: o)

Entrambi possono essere usciti con Ctrl + C.


3

Fissione , 5 byte

Rx+!N

Questo è abbastanza competitivo per Fission. :)

Il flusso di controllo inizia con un (1,0)atomo a destra in corrispondenza di R. ximposta la massa su 120e la +incrementa per dare (121,0). Quindi !stampa il carattere corrispondente ( y) e Nstampa una nuova riga. Il codice sorgente si avvolge ai bordi, quindi l'atomo passa di Rnuovo (che non fa nulla ora), ximposta di 120nuovo la massa , la +incrementa e così via e così via ...


3

C, 32 byte

Richiede la macchina little endian e la compilazione con -O2 (per evitare lo overflow dello stack).

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

2

PowerShell, 27-10 = 17

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

Potrebbe non funzionare in Pash. Un'alternativa più solida dovrebbe essere

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

2

Lua, 42 byte - 10 = 32

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

Lua, 49 byte - 10 = 39

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

Entrambi sono stati testati con Lua 5.1.4 e possono essere uccisi con SIGINT ( Ctrl+ C).


Eccezionale! Mia mamma scrive a Lua, non l'ho mai visto in natura prima d'ora. ( Ehi mamma! Indovina cosa ho visto! )
Signal15

2

Perl, 31

Ecco una versione Perl che in realtà si comporta come GNU yes, per quanto ne so:

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

Funziona se va bene usare le opzioni -ldella riga di comando di perl ( per la nuova riga), altrimenti diventerebbe più lungo di 3 caratteri:

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

errore di battitura: è -l(non -e) l'interruttore per la nuova linea.
chris-l,

Inoltre, il bonus è solo se il tuo script può leggere dallo stdin . Sì, so che il vero non legge dallo stdin, ma da un argomento, ma questa è la regola dell'OP; deve essere dallo stdin per avere il bonus.
chris-l

@ chris-l ha corretto il tipo, grazie. Ho anche rimosso il reclamo relativo al bonus, ma lascerò la mia risposta così com'è :-P
xebtl

hehe certo, la mia risposta è come la tua; usa un argomento invece di stdin. IMHO, l'operazione dovrebbe dare il bonus a quelli che fanno effettivamente ciò che fa il vero .
chris-l,

2

CAPL 1.5+; 6 senza input; 10 - 10 = 0 con input

Sidenote
Ho letto da qualche parte [link?] Che le lingue personalizzate non sono consentite nelle domande sul golf, in quanto potrebbero creare funzioni integrate che fanno esattamente ciò che la domanda pone, tuttavia ho reso CAPL più semplice per giocare a golf in generale . Se pensi che questo non sia consentito qui, fammi sapere!

Ho avuto alcune idee da > <> e Befunge (puoi muoverti tra le righe e usare caratteri esadecimali per spingere i numeri), alcuni da Ruby e alcuni dai miei per rendere più facile il golf.
CAPL legge da sinistra a destra e scende di una riga alla fine della riga. Se è come ultima riga, il programma verrà chiuso.

Dato che nessuno conosce ancora questa lingua, cercherò di spiegare il più possibile.

In uscita y. 6 byte

bb*.n<

bb* bè esadecimale per 11, quindi bb*è 11*11= 121, che è l'equivalente UTF-8 di y. Questo valore viene inserito nello stack.
.Estrae il valore più alto dallo stack e genera come UTF-8. Come 121è in cima allo stack, l'indice viene ignorato qui.
nEmette una nuova riga Riporta
<il puntatore all'inizio della riga, ripetendo così quella riga. Poiché non prevediamo input, possiamo farlo in modo sicuro senza richiedere nuovamente l'input.

Uscita da input. 10 byte, 0 dopo il bonus

i~a&{X:.)}

iRiceve input dall'utente, inserisce UTF-8 nella parte superiore dello stack e successivamente ne inserisce la lunghezza. Cioè [72,101,108,108,111,5]
~estrae un numero dallo stack, quindi inverte quella quantità di byte. [111,108,108,101,72]
aVale a dire esadecimale per 10, il personaggio newline
&{...}crea un ciclo infinito. Abbiamo input, quindi non possiamo inviare il puntatore alla riga. Potrei posizionare la funzione sulla riga in basso, il che mi metterebbe in salvo un byte, ma i newline non sono ammessi in questa sfida.
XRimuove il valore superiore dallo stack (l'indice dal loop)
:.Duplica il valore superiore, quindi viene emesso come UTF-8
)Ruota lo stack a destra. ( [1,2,3,4,5]-> [5,1,2,3,4])

Tuttavia, questo significa che iniziamo con una nuova riga, quindi iniziamo a presentare l'input, quindi una nuova riga, quindi l'input, ecc. Se non ci è permesso iniziare con una nuova riga, utilizzare il seguente codice con 12 byte o 2 dopo la sottrazione il bonus.

iXa#~&{X:.)}

L'unico nuovo comando qui è #, che spinge la quantità di oggetti nella pila nella pila.
Ho rimosso la lunghezza da i, perché l'aggiunta di 1, quindi lo scambio con la nuova riga è più lungo della rimozione e del recupero della lunghezza.

Solo per divertimento, ecco un programma "Hello World"

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

L' ?!operazione è uguale a> <>


In realtà la restrizione si applica alle lingue / librerie / funzionalità personalizzate pubblicate dopo la pubblicazione della domanda.
Manatwork

@manatwork Ciò significherebbe che la mia risposta non è valida. Grazie per il chiarimento. Ho creato questo linguaggio e volevo affrontare alcune sfide del golf per testare ciò che potevo migliorare per le versioni future, se ciò migliorasse.
Charlie,

A mio avviso, ciò non è invalido, ma non è idoneo a vincere. L'obiettivo della restrizione era quello di prevenire gli imbrogli, ma poiché hai incluso l'affermazione sulla freschezza del linguaggio, questo non poteva essere considerato un tentativo di imbrogli.
arte

2

APL (Dyalog APL) , 5-10 = -5 byte

Avvertenza: si basa su una funzione / bug non documentato e non supportato.

⎕←⍣≢⍞

STDIN vuoto stampa righe vuote (non "y"), che è consentito ed è stato suggerito .

Provalo online!

 STDOUT con newline finali,

 prende

 ripetutamente fino al

 differisce da

 STDIN

cioè mai, ma senza interruzioni mettendo in pausa il thread.


Hmm. abusare di bug .. interessante.
Matthew Roh

@MatthewRoh Usando, non abusando. La "caratteristica" sta usando l'operatore durante l'assegnazione , anche se non è una vera funzione propria, e quindi non è realmente ammissibile per essere un operando. Funziona ancora ...
Adám

2

> <>, 6 byte

b:*oao

Non includendo un ;alla fine, il <<> continuerà a nuotare fino a quando non verrà rilasciato da un SIGINT.

Spiegazione

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 byte

La precedente è una soluzione piuttosto noiosa, quindi eccone una che prende input dallo stdin. Questo abusa del fatto che il modo predefinito di fornire input a un programma > <> è echo 'input' | fish.py yes.fish, dove echofornisce il \ncarattere.

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

Spiegazione

 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       ---------------'

Alla 0rfine permettono di realizzare il loop avvolgendosi, dove ipotizziamo che lo stack sia invertito con un -1in cima.


1

Apparentemente questo non è totalmente portatile. Il mio sys.version è 2.7.9 (default, Dec 11 2014, 04:42:00) \n[GCC 4.9.2], quindi se il tuo è diverso questo potrebbe non funzionare immagino.

Python 2 - (76-10) = 66

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

Abbastanza lungo, ma volevo andare per il bonus (anche se costava più di 10 byte). Controllare se lo stdin è vuoto o meno senza richiedere input è lungo, a quanto pare.

All'inizio, ho letto male il bonus come prendere una discussione invece di stdin. Sono orgoglioso della mia soluzione per questo, quindi lo pubblicherò comunque;)

Python 2 - (52-10 + ∞) = ∞ (non valido!)

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

sys.argvè un elenco in cui l'elemento zeroth è il nome file e ogni elemento secondario è un argomento fornito al programma. Aggiungo un valore falso alla fine dell'elenco; se non ci sono argomenti, il primo elemento è quel valore false, altrimenti è il primo argomento. a or bin Python restituisce il primo valore che conferma quale sarà il risultato: se aè vero, sappiamo già che tutto sarà vero, quindi viene restituito. Se è falso, bviene restituito (poiché False or b== b).


@fry Potrei, ma richiederebbe l'utente. Volevo che iniziasse a sputare y\nimmediatamente se lo stdin era vuoto.
undergroundmonorail,

@fry È strano, funziona per me. Potrebbe dipendere da cPython? Non ho altre idee.
undergroundmonorail,

buona idea, su di esso
undergroundmonorail

r=raw_input();p=r if r else`help`[1]\nwhile 1:print p 52 personaggi
globby

1
Hmm, già la prima riga sembra averne una y, anche la seconda.
Paŭlo Ebermann,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.