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
stdout
un flux infini de "y \ n" - il doit y avoir une option pour l'arrêter autre que de tuer le processus avec
SIGKILL
: maisSIGINT
et çaSIGPIPE
va - 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
stdin
et l’imprimer au lieu de "y" (tout en incluant le saut de ligne).
code-golf
restricted-source
Ramon Snir
la source
la source
y
ou à l'\n
intérieur d'un littéral de chaîne"?true.c
80 lignes.yes
prend un argument optionnel sur la ligne de commande, passtdin
.y
s vous-même.Réponses:
CJam, 13 octets - 10 = 3
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
y
si l'entrée était vide.Explication
Après clarification du PO, ce qui suit semble plus spécifique:
J'attendrai la mise à jour de la soumission jusqu'à ce que le PO réponde à mon commentaire.
la source
/no/i
, compte tenu du défi que cela représente.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
^C
sur ma machine.Brainfuck - (63-10) = 53
la source
Python 3, 27 octets
Fonctionne avec au moins CPython et Jython.
SIGINT l'arrête.
la source
while 1:print`help`[1]
.chr(11**2)
121
.Marbelous 14 octets
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.
la source
Pyth,
1096 octets - 10 =0-1-4Je cherche depuis longtemps à en obtenir un qui me satisfait. Convertit essentiellement en:
la source
#
a une fonctionnalité équivalente àW1
, etePG
est beaucoup plus court chemin pour obtenir le caractèrey
queC^hT2
.C #,
817876 octetsVous ne pouvez pas rivaliser avec les autres langues, mais la voici quand même:
Peut être tué avec SIGINT en appuyant sur Ctrl+ C.
Pas de bonus, car il faudrait plus de 10 octets pour l'obtenir.
la source
while(1)
? Enregistre deux caractères.for(;;)
devrait fonctionner.y
. S'il vous plaît examinerSystem
.System
ne 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.Java, 178
L'impression nécessite
System
, mais ley
caractère est interdit. Par conséquent, je devais utiliser la réflexion.la source
;
en mettantchar c='x'+1;
dans lafor
déclaration de boucle, doncfor(char c='x'+1;;)
puisque vous avez quand même un point-virgule videPerl: 18 octets - 10 = 8
La chaîne est de STDIN.
la source
y\n
plusieurs reprises s'il ne reçoit pas d'entrée de STDIN? Si non, alors il n'imite pas correctementyes
.yes
ne prend pas l'entréeSTDIN
après tout :)y\n
.Ruby,
302318 octetsPeut être tué avec SIGINT en appuyant sur Ctrl+ C.
Merci à manatwork pour le partage des améliorations!
la source
loop{puts [*?x..?z][1]}
- 23 caractères,loop{puts ?x.succ}
- 18 caractèresPerl, 26 octets
Entrée personnalisée à partir d'un argument (comme si cela
yes
fonctionnait réellement), 22 octets-10 = 12Entrée personnalisée à partir de stdin, 22 octets-10 = 12
la source
C,
6455534540 - 10 = 30main(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
la source
Linux Bash, 33-10 = 23
Peut être tué avec SIGINT en appuyant sur Ctrl+ C.
la source
yes
que descat
programmes.read a;for((;;));{ echo $a;}
Rouille, 52 caractères
Il n’ya apparemment pas de bonne façon d’informatique
y
sans être insolent à Rust - ils ont trop bien réussi à faire les personnages en toute sécurité. JE:println!
, donc aucune astuce autorisée ici;'x'
, car dans Rust, les caractères ne sont pas des nombres;Le bonus au code ne vaut pas non plus la peine, car la lecture de celle-
stdin
ci exigerait une gestion des erreurs = 3Une 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)
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)
Comme ci-dessus, mais le fichier doit être appelé
y
(pasy.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)Celui-ci est encore pire: vous devez définir la variable d'environnement
K
sury
lors de la compilation .Edit : si vous définissez
K
sury\n
, vous pouvez déposer l’ln
inprintln!
, pour un total de35 caractères etplusieurs facepalms:la source
x
la mode, mais ce n’est pas encore bref:(b'x' + 1) as char
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:
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
yes
en courantyes
est contraire aux règles.Cela pourrait être un peu optimisé (bien que moins susceptible de fonctionner) pour le réduire à 11 octets:
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.
la source
/*/*/?es `line`
ou/*/*/?es `head -n1`
si vous n'en avez pas/usr/bin/line
.sed q
pourline
.dc, 12
Seules les sorties
y\n
. Ne lit pas de stdin, donc pas de bonus.30986 est 0x790A (c'est-à-dire "y \ n"). La
P
commande convertit simplement le nombre en base 256 et imprime le caractère correspondant pour chaque chiffre de base 256.la source
y\n
?P
mais je ne savais pas qu'il pouvait faire plus d'un personnage à la fois.Lisp commun: (30-10) = 20
(read)
du flux d'entrée(format t ... )
format
arguments (un seul ici):~@{ ... ~}
à l'intérieur de la boucle, pour chaque argument:
~A
suivi d'une nouvelle ligne~%
~:*
(boucle infinie)Vous pouvez rompre la boucle avec Ctrl+C, ce qui signale une erreur avec les options de redémarrage (continuer / abandonner).
la source
Haskell, 29 octets
Je crois que cela est arrêté par les deux
SIGINT
etSIGPIPE
.la source
'\89'
au lieu desucc 'x'
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).
la source
dc, 21 octets - 10 = 11
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 quedc
code.la source
C2
au lieu de122
. En fait, je dirais que cela122 1-
pourrait être remplacé par ceC1
quiC1
n’est pas explicitement interdit dans la questionCommodore 64 Basic:
14 à13 octetsComme d'habitude, j'ai substitué des caractères dans PETSCII qui ne sont pas présents dans Unicode.
|
est utilisé pour représenterSHIFT+H
, tandis que╭
représenteSHIFT+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.
la source
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".AWK, 38 octets
Variante qui lira la chaîne sur stdin: 14 octets-10 = 4
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.
la source
Fission , 5 octets
C'est assez compétitif pour la fission. :)
Le flux de contrôle commence par un
(1,0)
atome allant de droite àR
.x
définit la masse sur120
et l’+
augmente pour donner(121,0)
. Puis!
imprime le caractère correspondant (y
) etN
imprime une nouvelle ligne. Le code source enveloppe les bords, de sorte que l'atome repasseR
(ce qui ne fait plus rien maintenant),x
redéfinit la masse sur120
, l'+
incrémente, etc., etc.la source
C, 32 octets
Nécessite une petite machine endian et une compilation avec -O2 (pour éviter le débordement de pile).
la source
PowerShell, 27 - 10 = 17
Pourrait ne pas fonctionner en Pash. Une alternative plus robuste devrait être
la source
Lua, 42 octets - 10 = 32
Lua, 49 octets - 10 = 39
Les deux ont été testés avec Lua 5.1.4 et peuvent être tués avec SIGINT ( Ctrl+ C).
la source
Perl, 31 ans
Voici une version de Perl qui se comporte réellement comme GNU
yes
, pour autant que je sache:Cela fonctionne s'il est correct d'utiliser les commutateurs de ligne de commande de perl (
-l
pour la nouvelle ligne), sinon cela aurait 3 caractères de plus:la source
-l
(pas-e
) le commutateur pour la nouvelle ligne.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*
b
est hexadécimal pour11
, doncbb*
is11*11
=121
, qui est l’équivalent UTF-8 dey
. Cette valeur est poussée dans la pile..
Extrait la valeur la plus élevée de la pile et renvoie le format UTF-8. Comme121
en haut de la pile, l'index est ignoré ici.n
Gé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:.)}
i
Prend 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]
a
hexadécimal10
, 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.X
Supprime 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"
L'
?!
opération est la même que celle de> <>la source
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⍞
STDINc'est-à-dire jamais, mais sans interruption en mettant en pause le fil.
la source
⍣
en affectation←
, même si ce←
n'est pas une fonction réelle, et donc pas vraiment éligible pour être un opérande.> <>, 6 octets
En ne incluant pas
;
à la fin, le > <> continuera à nager jusqu'à ce qu'il soit libéré par un SIGINT.Explication
> <>, 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.fish
oùecho
fournit le\n
caractère.Explication
À
0r
la fin, la boucle se passe en boucle, où nous supposons toujours que la pile est inversée avec un-1
sommet.la source
Apparemment, ce n'est pas totalement portable. Mon
sys.version
est2.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
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!)
sys.argv
est 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 b
in Python renvoie la première valeur qui confirme le résultat: Sia
vérité, nous savons déjà que tout sera vrai, elle sera donc renvoyée. Si c'est faux,b
est retourné (depuisFalse or b
==b
).la source
y\n
immédiatement si stdin était vide.r=raw_input();p=r if r else`help`[1]\nwhile 1:print p
52 personnagesy
dedans, la seconde aussi.