oui, c'est 91 lignes


50

yes, de coreutils, a 91 lignes . Beaucoup d’entre eux sont des commentaires, mais c’est encore BEAUCOUP trop long.

Edition de septembre 2019: le fichier source a augmenté au cours des cinq dernières années et compte maintenant 126 lignes.

Ecrivez un programme qui imite yes:

  • sortie vers stdoutun flux infini de "y \ n"
  • il doit y avoir une option pour l'arrêter autre que de tuer le processus avec SIGKILL: mais SIGINTet ça SIGPIPEva
  • vous n'êtes pas autorisé à utiliser "y" ou "\ n" ou leurs valeurs ASCII (121, 0x79, 0171, 10, 0xA ou 012)

La réponse la plus courte gagne.

Prime:

  • soustrayez 10 de votre longueur de code, si vous pouvez recevoir une phrase stdinet l’imprimer au lieu de "y" (tout en incluant le saut de ligne).

13
" vous n'êtes pas autorisé à utiliser" y "ou" \ n " " - devrais-je lire ceci comme "Vous ne pouvez pas utiliser you à l' \nintérieur d'un littéral de chaîne"?
apsillers

12
Sur une note connexe, GNU comporte true.c80 lignes.
Dennis Williamson

6
@DennisWilliamson Sur une note similaire, false.c a une longueur de 2 lignes ....; _;
LordAro

6
coreutils yesprend un argument optionnel sur la ligne de commande, pas stdin.
Brian Minton

7
@MrLore: pour intégrer d'autres programmes pouvant demander constamment la confirmation de leurs tâches, pour que vous n'ayez pas à rester là à taper le ys vous-même.
Marcus erronius

Réponses:


37

CJam, 13 octets - 10 = 3

l_'x)?{_oNo}h

Pour ce faire, vous devrez utiliser l'interpréteur Java , car l'interpréteur en ligne ne sera renvoyé qu'une fois le programme terminé.

Vous pouvez abandonner le programme avec SIGINT (en appuyant sur Ctrl-C). Il lira une ligne de STDIN et imprimera cette ligne ou ysi l'entrée était vide.

Explication

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

Après clarification du PO, ce qui suit semble plus spécifique:

l{_o9c)o1}g

J'attendrai la mise à jour de la soumission jusqu'à ce que le PO réponde à mon commentaire.


16
J'aime que votre programme corresponde /no/i, compte tenu du défi que cela représente.
Kevin - Réintégrer Monica

20

Brainfuck - 38 octets

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

Il n’utilise pas 10 ou 121, car +-<>.,[]tous les caractères de la langue ont du sens, mais il les calcule assez naïvement (0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 = 10, 10 * 12 + 1 = 121).

Cela dépend probablement de l'interprète, mais il meurt ^Csur ma machine.

Brainfuck - (63-10) = 53

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

@fry je ne pouvais pas l'obtenir en dessous de 39 de cette façon. J'ai besoin de 10 de toute façon, donc j'ajoute 1 à 120 ou soustrais 1 de 11, et c'est plus court que l'ancien.
undergroundmonorail

Ouais, j'ai remarqué qu'après que tu
aies

Au lieu de 10 * 12 + 1, pourquoi pas 11 * 11? Je pense que cela pourrait vous sauver un caractère.
ProgramFOX

@pro je ne pouvais pas l'obtenir en dessous de 39 de cette façon. J'ai besoin de 10 de toute façon, donc j'ajoute 1 à 120 ou soustrais 1 de 11, et c'est plus court que l'ancien.
undergroundmonorail

@ undergroundmonorail Ah, je vois.
ProgramFOX

18

Python 3, 27 octets

Fonctionne avec au moins CPython et Jython.

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

SIGINT l'arrête.


18
Faites-le python2 et vous pouvez le raccourcir à while 1:print`help`[1].
undergroundmonorail

4
Haha, gentil. J'ai complètement oublié qu'il y avait "l'habitude de" être un opérateur de backtick en python :)
pgy

Vous pouvez également utiliser cette chr(11**2)
option

2
@RamchandraApte Vous n'êtes pas autorisé à utiliser 121.
Jonathon Reinhart

17

Marbelous 14 octets

0978
]]/\++
!!

C’est assez simple, le périphérique '/ \' place deux copies à gauche et à droite, celle de droite est incrémentée ++puis tombe du tableau et est imprimée. L' ]]appareil pousse n'importe quelle bille vers la droite si STDIN est vide mais laisse tomber le premier octet sur STDIN s'il ne l'est pas. Cela déclenchera ensuite le !!périphérique qui sort du tableau. Donc, cela imprimera y \ n jusqu'à ce que vous saisissiez quoi que ce soit sur stdin.

Cela ne fonctionne que dans l'interpréteur Python.


17

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

#|zePG

Je cherche depuis longtemps à en obtenir un qui me satisfait. Convertit essentiellement en:

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

La variable "z" est initialisée à partir de stdin, la valeur est ensuite simplement utilisée par la suite. J'ai trouvé un moyen simple d'obtenir la valeur ASCII sans l'écrire explicitement.
swstephe

Passez de "^ 11 2" à "^ hT2" pour enregistrer un caractère.
swstephe

Bonjour swstephe, je suis excité de voir un autre utilisateur de la langue! Un couple de Golfs: #a une fonctionnalité équivalente à W1, et ePGest beaucoup plus court chemin pour obtenir le caractère yque C^hT2.
isaacg

Merci, je vais appliquer ces changements. Encore nouveau à cette affaire de golf. J'aime Pyth, mais souhaite aurait quelques fonctions plus contextuelles et manipulation de bits.
swstephe

13

C #, 81 78 76 octets

Vous ne pouvez pas rivaliser avec les autres langues, mais la voici quand même:

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

Peut être tué avec SIGINT en appuyant sur Ctrl+ C.

Pas de bonus, car il faudrait plus de 10 octets pour l'obtenir.


Tu ne peux pas utiliser while(1)? Enregistre deux caractères.
Brosse à dents

@toothbrush J'ai essayé ça, mais ça ne marche pas en C #.
ProgramFOX

1
for(;;) devrait fonctionner.
core1024

2
Pour une raison quelconque, ce code contient toujours un y. S'il vous plaît examiner System.
TheNumberOne

4
@TheBestOne Cela Systemne peut pas être supprimé. Il s'agit de l'espace de noms supérieur du .NET Framework. Tous les classes / autres espaces de noms s'y trouvent. La réflexion ne vous aidera pas. Mais pas sûr si c'est invalide. Voir le commentaire de Ramon: "rien qui évalue à y ou \ n". Cela n'évalue pas à y. Je laisse un commentaire sur la question pour demander à Ramon si cela est valable.
ProgramFOX

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

L'impression nécessite System, mais le ycaractère est interdit. Par conséquent, je devais utiliser la réflexion.


FileDescriptor.out est ce que je voulais dire.
TheNumberOne

Vous pouvez sauvegarder un ;en mettant char c='x'+1;dans la fordéclaration de boucle, donc for(char c='x'+1;;)puisque vous avez quand même un point-virgule vide
corsiKa

@corsiKa Bon point.
Ypnypn

10

Perl: 18 octets - 10 = 8

La chaîne est de STDIN.

$_=<>;{print;redo}

3
Est-ce qu'il imprime à y\nplusieurs reprises s'il ne reçoit pas d'entrée de STDIN? Si non, alors il n'imite pas correctement yes.
vurp0

@ vurp0 yesne prend pas l'entrée STDINaprès tout :)
core1024

1
Ce n’est pas le cas, mais la question du code de golf ici précise que, s’il ne reçoit pas d’entrée, il doit être imprimé à plusieurs reprises y\n.
vurp0

2
@ vurp0 Où? Tout programme qui lit depuis un flux sera bloqué sans entrée.
core1024

@ vurp0 Voir le commentaire du PO sur la question.
nyuszika7h

9

Ruby, 30 23 18 octets

loop{puts ?x.succ}

Peut être tué avec SIGINT en appuyant sur Ctrl+ C.

Merci à manatwork pour le partage des améliorations!


1
loop{puts [*?x..?z][1]}- 23 caractères, loop{puts ?x.succ}- 18 caractères
manatwork

@manatwork Merci! Mis à jour.
ProgramFOX

8

Perl, 26 octets

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

Entrée personnalisée à partir d'un argument (comme si cela yesfonctionnait réellement), 22 octets-10 = 12

{print @ARGV,$/;redo}

Entrée personnalisée à partir de stdin, 22 octets-10 = 12

while(<>){print;redo}

Le programme de @mar Nitz ne fait que 14 octets de long et il y a un commentaire très élevé sur votre lien qui dit que c'est froid pour les noms de fichiers qui importent si vous les incluez dans le décompte. Cela me semble légitime.
undergroundmonorail

oh, attends, je n’ai pas vu la partie de la question "tu ne peux pas utiliser \" y ". tant pis, c'est mauvais
undergroundmonorail

Tu as raison. Corrigé
Nitz

6

C, 64 55 53 45 40 - 10 = 30

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

Je ne suis pas très heureux avec cela, car le programme doit être nommé "y" et appelé avec "y" uniquement, il doit donc être dans $ PATH, mais bon, premier codegolf :)

Alternative:

C, 30 (+ 1 nom de fichier)

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

En utilisant la même technique que mon estimé collègue @ Matt Windsor

  • EDIT: finit par contourner le caractère no \ n raccourci
  • EDIT2: "int" est plus court que "char"
  • EDIT3: n'a pas du tout besoin de cette variable
  • EDIT4: un comportement légèrement indéfini ne fait de mal à personne
  • EDIT5: ajouter une version alternative

5

Linux Bash, 33-10 = 23

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

Peut être tué avec SIGINT en appuyant sur Ctrl+ C.


Vous devez lire une seule ligne et imprimer la même ligne à plusieurs reprises. Vos programmes ne sont pas yesque des catprogrammes.
jimmy23013

Ma mauvaise, je n'aurais pas dû essayer après une journée de travail.
Orace

Que diriez-vousread a;for((;;));{ echo $a;}
core1024

5

Rouille, 52 caractères

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

Il n’ya apparemment pas de bonne façon d’informatique ysans être insolent à Rust - ils ont trop bien réussi à faire les personnages en toute sécurité. JE:

  • Impossible de fournir une chaîne non littérale à println!, donc aucune astuce autorisée ici;
  • Impossible d'ajouter 1 à 'x', car dans Rust, les caractères ne sont pas des nombres;
  • Can't ROT13 (pourquoi Rust n’a-t-il pas ROT13 dans sa bibliothèque standard!?);
  • Vous ne pouvez pas facilement faire quelque chose de dangereux, comme passer à des chaînes de caractères C, convertir des nombres en caractères, etc. sans être incroyablement prolixe et passer au-dessus de 52c.

Le bonus au code ne vaut pas non plus la peine, car la lecture de celle- stdinci exigerait une gestion des erreurs = 3

Une grande partie des réductions de code que je pouvais trouver impliquaient de faire de plus en plus bafouer les règles avec l'environnement de compilation:

Rust, 44 caractères (+ au moins 1 caractère pour le nom de fichier)

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

Obsolète par ci-dessous. Celui-ci ne compte probablement pas, car le nom du fichier source doit commencer y.

Edit: Rust, 36 caractères (35 sources, 1 nom de fichier)

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

Comme ci-dessus, mais le fichier doit être appelé y(pas y.rs, y). Humour, Rust remplacera la source par le binaire! Au moins sur ma machine, le binaire fonctionne après.

Rust, 37 caractères (+ équivalent de env K='y'sur votre plate-forme)

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

Celui-ci est encore pire: vous devez définir la variable d'environnement Ksur ylors de la compilation .

Edit : si vous définissez Ksur y\n, vous pouvez déposer l’ lnin println!, pour un total de 35 caractères et plusieurs facepalms:

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

Notre politique habituelle pour exiger certains noms de fichiers ou certains indicateurs de compilation est simplement d'inclure ceux-ci dans le nombre d'octets.
Martin Ender

@ MartinBüttner assez juste. Curieusement, il semblerait que la rouille ne soit pas la meilleure langue pour le code de golf>: P
Matt Windsor

Vous pouvez en ajouter un à xla mode, mais ce n’est pas encore bref:(b'x' + 1) as char
Shepmaster

5

Linux Bash - 19 octets

C'est probablement de la triche et un échec si vous n'avez pas / usr / bin / yes ou si vous avez un / usr / bin / xes ou / usr / bin / zes:

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

Je pense que cela répond aux exigences, même s’il enfreint peut-être la règle du "rien qui s’évalue en y". Et peut-être qu'imiter yesen courant yesest contraire aux règles.

Cela pourrait être un peu optimisé (bien que moins susceptible de fonctionner) pour le réduire à 11 octets:

/*/*/?es $*

Je ne comprenais pas comment obtenir le bonus de 10 points en lisant une chaîne de caractères stdin sans ajouter plus de 10 octets au code.


2
/*/*/?es `line` ou /*/*/?es `head -n1` si vous n'en avez pas /usr/bin/line.
Jimmy23013

2
Ou sed qpour line.
jimmy23013

5

dc, 12

[30986Pdx]dx

Seules les sorties y\n. Ne lit pas de stdin, donc pas de bonus.

30986 est 0x790A (c'est-à-dire "y \ n"). La Pcommande convertit simplement le nombre en base 256 et imprime le caractère correspondant pour chaque chiffre de base 256.


C'est assez intelligent, comment se comporte 30986 y\n?
nyuszika7h

J'étais au courant Pmais je ne savais pas qu'il pouvait faire plus d'un personnage à la fois.
nyuszika7h

5

Lisp commun: (30-10) = 20

(format t"~@{~a~%~:*~}"(read))
  • (read) du flux d'entrée
  • imprimer dans le flux de sortie: (format t ... )
  • itérer sur tous les formatarguments (un seul ici):~@{ ... ~}
  • à l'intérieur de la boucle, pour chaque argument:

    • argument argument ~Asuivi d'une nouvelle ligne~%
    • rembobiner l'élément courant au précédent ~:*(boucle infinie)

Vous pouvez rompre la boucle avec Ctrl+C, ce qui signale une erreur avec les options de redémarrage (continuer / abandonner).


3

Haskell, 29 octets

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

Je crois que cela est arrêté par les deux SIGINTet SIGPIPE.


suggestion: utiliser '\89'au lieu desucc 'x'
fier haskeller

3

Ruby, 27 octets - 10 = 17

C'est juste la solution de @ ProgramFOX avec le bonus (il a fallu 9 octets pour résoudre la question du bonus).

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

3

dc, 21 octets - 10 = 11

C1st?st[ltP[]ps0dx]dx

Notez que l'entrée doit être encapsulée [], par exemple [no], car ?c'est le seul moyen de prendre une entrée, qui l'exécute en tant que dccode.


Vous pouvez utiliser C2au lieu de 122. En fait, je dirais que cela 122 1-pourrait être remplacé par ce C1qui C1n’est pas explicitement interdit dans la question
Digital Trauma,

3

Commodore 64 Basic: 14 à 13 octets

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

Comme d'habitude, j'ai substitué des caractères dans PETSCII qui ne sont pas présents dans Unicode. |est utilisé pour représenter SHIFT+H, tandis que représente SHIFT+U. Notez que ceci génère ASCII 'y' (valeur d'octet 121) plutôt qu'un caractère que le jeu de caractères Commodore par défaut affiche comme 'y'.

BASIC est censé être un langage de programmation de type anglais, facile à apprendre. Ajoutez les raccourcis de frappe présents dans de nombreux dialectes anciens et vous obtiendrez un résultat plus court et moins lisible que Perl.

EDIT : en "mode décalé", la taille est raccourcie de deux octets, car "y" minuscule est codé à la valeur décimale 89. L'utilisation d'un jeu de caractères non-ASCII pour contourner la règle "non autorisé à utiliser leurs valeurs ASCII" peut être tricher, cependant.

1?cH(89):rU

Avec tous les 💩 existant dans l'unicode, il semble surprenant que le jeu de caractères complet utilisé par le C64 ne soit pas présent quelque part.
Kasperd

@kasperd, les caractères de dessin de boîte d'Unicode proviennent principalement du jeu "DOS" d'IBM et passent au centre de la cellule de caractère. PETSCII a un ensemble beaucoup plus large, dont une grande partie utilise les bords de la cellule de caractère. U + 2502 est probablement une approximation décente de la barre verticale produite par SHIFT+H, mais le caractère de la conduite est plus facile à saisir. Il n'y a rien qui corresponde aux "lignes sur les bords supérieur et gauche" produites par `SHIFT + O".
Mark

Très bien, mais vous pourriez économiser un octet en remplaçant "Goto 1" par "Run": "1? CH (89): rU"
LeFauve

@ LeFauve, Merci. Je l'ai également appliqué à la version émettrice ASCII.
Marc

3

AWK, 38 octets

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

Variante qui lira la chaîne sur stdin: 14 octets-10 = 4

{for(;;)print}

Mais comme il ne peut pas faire les deux (revenez à "y" si aucun stdin n'est fourni), je ne suis pas sûr que cela compte ...: o)

Les deux peuvent être quittés avec Ctrl + C.


3

Fission , 5 octets

Rx+!N

C'est assez compétitif pour la fission. :)

Le flux de contrôle commence par un (1,0)atome allant de droite à R. xdéfinit la masse sur 120et l’ +augmente pour donner (121,0). Puis !imprime le caractère correspondant ( y) et Nimprime une nouvelle ligne. Le code source enveloppe les bords, de sorte que l'atome repasse R(ce qui ne fait plus rien maintenant), xredéfinit la masse sur 120, l' +incrémente, etc., etc.


3

C, 32 octets

Nécessite une petite machine endian et une compilation avec -O2 (pour éviter le débordement de pile).

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

2

PowerShell, 27 - 10 = 17

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

Pourrait ne pas fonctionner en Pash. Une alternative plus robuste devrait être

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

2

Lua, 42 octets - 10 = 32

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

Lua, 49 octets - 10 = 39

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

Les deux ont été testés avec Lua 5.1.4 et peuvent être tués avec SIGINT ( Ctrl+ C).


Impressionnant! Ma mère écrit à Lua, je ne l'avais jamais vue dans la nature auparavant. ( Hé maman! Devine ce que j'ai vu! )
Signal15

2

Perl, 31 ans

Voici une version de Perl qui se comporte réellement comme GNU yes, pour autant que je sache:

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

Cela fonctionne s'il est correct d'utiliser les commutateurs de ligne de commande de perl ( -lpour la nouvelle ligne), sinon cela aurait 3 caractères de plus:

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

typo: est -l(pas -e) le commutateur pour la nouvelle ligne.
chris-l

En outre, le bonus est uniquement si votre script peut lire à partir du stdin . Oui, je sais que le vrai oui ne lit pas le stdin, mais un argument, mais c’est la règle du OP; il faut que ce soit de stdin pour avoir le bonus.
chris-l

@ chris-l fixe le type, merci. J'ai également supprimé l'allégation concernant le bonus, mais je laisserai ma réponse en l'état :-P
xebtl

héhé bien sûr, ma propre réponse est comme la tienne; il utilise un argument au lieu de stdin. À mon humble avis, l'op devrait donner le bonus à ceux qui en fait faire ce que le vrai oui fait.
chris-l

2

CAPL 1.5+; 6 sans entrée; 10 - 10 = 0 avec entrée

Sidenote,
j'ai lu quelque part [lien?] Que les langues personnalisées ne sont pas autorisées dans les questions de golf, car elles pourraient créer des fonctions intégrées qui font exactement ce que la question demande, bien que j'ai aidé CAPL à rendre le golf plus facile en général . Si vous pensez que ce n'est pas permis ici, faites le moi savoir!

J'ai eu quelques idées de > <> et de Befunge (vous pouvez passer d'une ligne à une autre et utiliser des caractères hexadécimaux pour composer des chiffres), certaines de Ruby et d'autres des miennes pour faciliter la pratique du golf.
CAPL se lit de gauche à droite et passe d'une ligne à la fin de la ligne. Si c'est à la dernière ligne, le programme sera arrêté.

Comme personne ne connait encore cette langue, je vais essayer d’expliquer le plus possible.

Sortie y. 6 octets

bb*.n<

bb* best hexadécimal pour 11, donc bb*is 11*11= 121, qui est l’équivalent UTF-8 de y. Cette valeur est poussée dans la pile.
.Extrait la valeur la plus élevée de la pile et renvoie le format UTF-8. Comme 121en haut de la pile, l'index est ignoré ici.
nGénère une nouvelle ligne
<Envoie le pointeur au début de la ligne, répétant ainsi cette ligne. Comme nous ne nous attendons pas à une contribution, nous pouvons le faire en toute sécurité sans demander à nouveau cette entrée.

Sortie de l'entrée. 10 octets, 0 après bonus

i~a&{X:.)}

iPrend les entrées de l'utilisateur, place UTF-8 en haut de la pile, puis la longueur par la suite. Ie [72,101,108,108,111,5]
~Enlève un nombre de la pile, puis inverse cette quantité d'octets. En [111,108,108,101,72]
ahexadécimal 10, le caractère de nouvelle ligne
&{...}crée une boucle infinie. Nous avons des entrées, nous ne pouvons donc pas renvoyer le pointeur à la ligne. Je pourrais placer la fonction sur la ligne ci-dessous, ce qui me protégerait d'un octet, mais les nouvelles lignes ne sont pas autorisées dans ce défi.
XSupprime la valeur supérieure de la pile (L'index de la boucle)
:.Duplique la valeur supérieure, puis s'affiche en tant que UTF-8
)Tourne la pile à droite. ( [1,2,3,4,5]-> [5,1,2,3,4])

Cependant, cela signifie que nous commençons avec une nouvelle ligne, puis commençons à générer l'entrée, puis une nouvelle ligne, puis l'entrée, etc. Si nous ne sommes pas autorisés à commencer par une nouvelle ligne, utilisez le code suivant avec 12 octets, ou 2 après la soustraction le bonus.

iXa#~&{X:.)}

La seule nouvelle commande proposée est celle #qui pousse le nombre d'éléments de la pile dans la pile.
J'ai supprimé la longueur de i, car ajouter 1, puis permuter avec la nouvelle ligne est plus long que supprimer et récupérer la longueur.

Juste pour le plaisir, voici un programme "Hello World"

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

L' ?!opération est la même que celle de> <>


En réalité, la restriction s’applique aux langues / bibliothèques / fonctions personnalisées publiées après la publication de la question.
manatwork

@manatwork Cela voudrait dire que ma réponse est invalide. Merci pour la clarification. J'ai créé ce langage et je voulais relever quelques défis au golf afin de tester ce que je pourrais améliorer pour les versions futures, si cela améliore quelque chose.
Charlie

À mon avis, cela n’est pas invalide, mais n’est pas éligible pour gagner. L'objectif de la restriction était d'empêcher la tricherie, mais comme vous avez inclus l'énoncé sur la fraîcheur de la langue, cela pourrait difficilement être considéré comme une tentative de triche.
manatwork

2

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

Avertissement: repose sur une fonctionnalité / bogue non documentée et non prise en charge.

⎕←⍣≢⍞

STDIN vide imprime des lignes vides (pas "y"), ce qui est autorisé et a été suggéré .

Essayez-le en ligne!

 STDOUT avec des retours à la ligne,

 obtient

 à plusieurs reprises jusqu'à

 il diffère de

 STDIN

c'est-à-dire jamais, mais sans interruption en mettant en pause le fil.


Hmm. abuser de bugs .. intéressant.
Matthew Roh

@ MatthewRoh Utiliser, ne pas abuser. La "fonctionnalité" utilise l'opérateur en affectation , même si ce n'est pas une fonction réelle, et donc pas vraiment éligible pour être un opérande.
Travaille

2

> <>, 6 octets

b:*oao

En ne incluant pas ;à la fin, le > <> continuera à nager jusqu'à ce qu'il soit libéré par un SIGINT.

Explication

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 octets

La précédente est une solution assez ennuyeuse, alors voici une solution qui prend en compte stdin. Cela abuse du fait que le moyen par défaut de fournir des entrées à un programme > <> est echo 'input' | fish.py yes.fishechofournit le \ncaractère.

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

Explication

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

À 0rla fin, la boucle se passe en boucle, où nous supposons toujours que la pile est inversée avec un -1sommet.


1

Apparemment, ce n'est pas totalement portable. Mon sys.version est 2.7.9 (default, Dec 11 2014, 04:42:00) \n[GCC 4.9.2] , alors si le vôtre est différent, cela pourrait ne pas fonctionner, je suppose.

Python 2 - (76-10) = 66

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

Assez long, mais je voulais aller pour le bonus (même si cela coûte plus de 10 octets). Vérifier si stdin est vide ou non sans invite à la saisie est apparemment long.

Au début, j'ai mal interprété le bonus comme prenant un argument au lieu de stdin. Je suis fier de ma solution, alors je la poste quand même;)

Python 2 - (52-10 + ∞) = ∞ (invalide!)

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

sys.argvest une liste où l'élément zeroth est le nom du fichier et chaque élément après-mots est un argument donné au programme. J'ajoute une valeur falsey à la fin de la liste; s'il n'y a pas d'argument, le premier élément est cette valeur de falsey, sinon c'est le premier argument. a or bin Python renvoie la première valeur qui confirme le résultat: Si avérité, nous savons déjà que tout sera vrai, elle sera donc renvoyée. Si c'est faux, best retourné (depuis False or b== b).


@fry je pourrais, mais cela inciterait l'utilisateur. Je voulais que ça commence à cracher y\nimmédiatement si stdin était vide.
undergroundmonorail

@fry C'est bizarre, ça marche pour moi. Cela pourrait dépendre de cPython? Je n'ai pas d'autres idées.
undergroundmonorail

bonne idée, là-dessus
undergroundmonorail

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

1
Hmm, déjà la première ligne semble avoir un ydedans, la seconde aussi.
Paŭlo Ebermann
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.