99 bugs dans le code
L'adaptation de "99 bouteilles de bière sur le mur" pour l'informatique, où les bugs augmentent au lieu de diminuer les bouteilles, est souvent réaffichée sur Internet. Exemple de T-shirt ici .
Je pense qu'il sera intéressant de voir la récurrence potentielle et la génération de nombres aléatoires dans une grande variété de langues et de trouver les moyens les plus efficaces de le faire.
Il y a pas mal d'autres défis à relever avec 99 bouteilles de bière, mais aucun ne semble avoir un nombre croissant et décroissant!
Défi
Votre programme ou fonction ne doit prendre aucune entrée et ensuite imprimer
99 bugs dans le code
99 bugs dans le code
Prenez-en un et corrigez-le
X bugs dans le code
(ligne blanche)
Où X est l’entier précédent moins 1 plus un entier aléatoire compris dans l’intervalle [-15,5].
Vous pouvez fusionner le moins 1 dans l'entier aléatoire, permettant ainsi la plage [-16,4].
Les plages peuvent être exclusives, donc moins un plus (-16,6) ou (-17,5).
Les nombres entiers aléatoires ne doivent pas nécessairement être répartis de manière égale, ils doivent tous être possibles.
Le programme commence toujours par 99 bogues.
Vous pouvez ignorer l'erreur grammaticale de "1 bugs".
Le programme doit s’arrêter lorsque le nombre de bogues est égal à 0 ou négatif et imprimer
0 bugs dans le code
Il ne devrait jamais y avoir un nombre négatif de bugs. La fin devrait ressembler à
Y bugs dans le code
Y bugs dans le code
Prenez-en un et corrigez-le
0 bugs dans le code
(ligne blanche)
0 bugs dans le code
Une nouvelle ligne est acceptable.
- Votre code peut être un programme complet ou une fonction.
- Il n'y a pas d'entrée.
- La sortie doit être sur stdout ou renvoyée.
- Les avertissements / erreurs dans les journaux / STDERR sont acceptables tant que STDOUT a le texte requis. Voir ici pour plus d'informations.
C'est le code-golf donc le code le plus court en octets gagne.
Exemple de sortie
Exemple de sortie de bac collé truqué pour -11 bugs à chaque fois
Réponses:
R ,
182140138135 octetsEssayez-le en ligne!
tout en étant raisonnablement bon en génération de nombres aléatoires, R est terrible en chaînes et en impression.JayCe a trouvé environ un milliard d'octets et continue de trouver de nouvelles façons de jouer au golf!la source
+5
vous coûte- t-il pas 2 autres octets? pourquoi pas seulementsample(26,6))
?sample
Java 8,
161160 octets-1 octet grâce à @JonathanAllan .
Essayez-le en ligne.
Explication:
la source
r
pour quelque chose?,r
semble toujours fonctionner: essayez-le en ligne!PowerShell ,
137135133131 octetsEssayez-le en ligne!
La section "bugs dans le code" est enregistrée
$b
pour une utilisation ultérieure. Définit$a
sur99
, entre dans unefor
boucle$a
. Nous créons d’abord un tableau de deux chaînes," "*2
, la chaîne étant le"X bugs in the code"
.Suivant est juste la chaîne
"Take one down and patch it around"
. Ensuite, nous incrémentons$a
en sélectionnant unRandom
entier dans la plage[-16,4]
. Après cela, nous fixons$a
pour être au minimum zéro en utilisant un ifif($a-lt0){$a=0}
. Puis la ficelle"Y bugs in the code"
.Enfin, une fois la boucle terminée, nous plaçons la chaîne
"0 bugs in the code"
sur le pipeline. Toutes ces chaînes sont collectées à partir du pipeline et une impliciteWrite-Output
nous donne des nouvelles lignes entre elles gratuitement.Enregistré deux octets en utilisant une
for
boucle au lieu d'unewhile
boucle.Enregistré deux octets en déplaçant
$b
sur sa propre section.Enregistré deux octets grâce à Adrian Blackburn.
la source
JavaScript (Node.js) , 127 octets
Essayez-le en ligne!
Explication:
Merci à @tsh pour l'idée de récursivité et d'implémentation (quelques octets sauvegardés)
Toute suggestion pour jouer au golf plus loin est la bienvenue.
la source
0+
enlevé? Il semble être la sortie requise.05AB1E , 59 octets
Essayez-le en ligne!
la source
Python 2 , 151 octets
Belle astuce
j=i+max(-i,randint(-16,4))
de Jo King, exploitant une distribution inégale autoriséeQuelques octets sauvegardés grâce à Mnemonic
Essayez-le en ligne!
la source
j=max(0,i+randint(-16,4))
.Charbon de bois , 81 octets
Essayez-le en ligne! Le lien est vers la version verbeuse du code. Explication:
Commencez avec 99 bugs dans le code.
Enregistrez la chaîne compressée "% d bugs dans le code \ n".
Répétez l'opération tant qu'il reste un nombre positif de bugs.
Imprimer le nombre de bugs dans le code deux fois.
Imprimer "Prenez-en un et corrigez-le".
Ajoutez un nombre aléatoire de bugs entre -17 (exclusif) et 4 (inclus).
Affiche le nombre de bogues restants ou 0 s'il est négatif.
Laissez une ligne blanche entre les versets.
Après le dernier verset, imprimez à nouveau 0 bugs dans le code.
la source
JavaScript,
189176168162 octetsEssayez-le en ligne!
Merci à Muhammad Salman pour le
console.log
remplacement manquant et à Oliver pour l'amélioration du test xMerci pour l4m2 pour le golf de 8 octets
la source
x<=0?console.log("\n"+0+a):f(x)
à la fin.f
déclaration. Voté jusqu'à mis à jour pour résoudre ce problème. (Mon lien a également besoin d'une mise à jour)f
, ce que vous ne pouvez pas supposer.Python 3 ,
156138 octetsMerci à Jonathan Python 2 de répondre à l'
id
astuceEssayez-le en ligne!
Explication:
la source
Octave ,
149148 octetsEnregistré un octet en changeant
randi(21)
et%i
en21*rand
et%.f
.%.f
assure que la sortie est un nombre à virgule flottante avec zéro décimale (ie et entier).Inséré un tas de sauts de ligne au lieu de virgules et points-virgules pour faciliter la lisibilité. On se sent mal, mais ce n'est pas plus long que le one-liner.
Essayez-le en ligne!
Explication:
Utiliser
p((x+=21*rand-17)*(x>0)
au lieu demax
enregistre un octet, mais la dernière ligne est générée-0 bugs ...
au lieu de0 bugs
. Cela fonctionne avecrandi(21)-17
, mais alors c'est la même longueur que celle ci-dessus. Essayez-le en ligne!la source
COBOL (GnuCOBOL),
317294279270 octetsEssayez-le en ligne!
Ungolfed
Note: la dernière phrase est toujours imprimé, parce que COBOL exécute l'ensemble du programme, et après la
perform until
boucle , il « tombe-travers » l'étiquette d' un , l' exécution de ses déclarations. Ce comportement est similaire à unswitch case
sansbreak
.PS: Les chiffres ne sont pas affichés exactement comme requis, mais COBOL n’est pas très bon pour la conversion automatique des nombres en une jolie représentation textuelle.
la source
-=
ini-=Math.random()*21-4
), ce qui implique une parenthèse autour de l'ensemble de l'opérande de droite. J'ai oublié de les rendre explicites, mais c'est maintenant corrigé, je pense.VBA:
212163 octetsCette solution est basée sur celle de Chronocidal publiée hier. C'est mon premier post et je n'ai pas assez de réputation pour commenter son post.
Cette révision contient deux améliorations.
While/Wend
au lieu deFor/Next
enregistre quelques caractères.GoSub
et les lignesExit Sub
etReturn
nécessaires pour le prendre en charge.Edit:
3. Suppression des espaces blancs et des caractères que l'éditeur VBA rajoutera automatiquement. Voir Conseils pour jouer au golf dans VBA
4. Ajout des suggestions de @EricF, puis avoir vu que son algorithme de collage était encore plus petit. J'ai donc remplacé mon algorithme par le sien et supprimé les espaces blancs Un changement de clé a été ajouté
vbLF
à la chaîne de sortie, ilDebug.Print
n'a donc pas été nécessaire d'appeler aussi souvent. Félicitations à EricF .C'était un défi amusant. Si vous connaissez un interprète en ligne tel que TIO pour VB6 / VBScript / VBA, laissez un commentaire.
Si vous souhaitez tester ce code et que Microsoft Excel, Word, Access ou Outlook est installé (Windows uniquement), appuyez sur Alt + F11 pour ouvrir l'EDI VBA. Insérez un nouveau module de code (Alt + I, M) et effacez
Option Explicit
. Ensuite, collez le code et appuyez sur F5 pour l'exécuter. Les résultats doivent apparaître dans la fenêtre Immédiat (appuyez sur Ctrl + G si vous ne le voyez pas).la source
c
plutôtc>0
que votre condition While et utilisezc=Iif(c<0,0,c)
plutôtIf c<0 [...]
: pastebin.com/nFGtGqdELaTeX ,
368304293287245240 octetsBien que n'étant pas vraiment compétitif par rapport aux autres programmes en termes d'octets, je voulais juste voir comment faire cela dans LaTeX.
Plus lisible:
Améliorations (par édition):
\if
clause en\repeat
tant que\else
\value{b}=x
fonctionne pour l'initialisation mais pas dans la boucle (au lieu de\setcounter{b}{x}
)\relax
devrait être utilisé pour le point 3, mais cela peut également être réalisé en insérant un espace. Suppression des\else
commandes TeX utilisées au lieu de LaTeX car elles sont plus courtes et remplacées\'
par~
.la source
\ifnum\value{b}<1
autrement<0
?C,
169165 octetsMerci à @ceilingcat pour avoir économisé quatre octets!
Essayez-le en ligne!
la source
SAS, 210 octets
Ungolfed:
Peut économiser quelques octets si les avertissements dans le journal sont autorisés (insérez la
&a
dans la&b
variable macro, mais cela génère un avertissement initial).la source
PHP, 126 octets
Exécuter sur la ligne de commande, en utilisant
php -r 'code here'
:la source
ABAP , 295 octets
... car pourquoi diable pas!
Ce n’est certainement pas compétitif par rapport aux autres langues, mais j’ai même réussi à le réduire de 330 octets que j’écrivais au début, c’est pourquoi je le considère comme une victoire personnelle.
Comme ABAP n'autorise pas les lignes de plus de 255 caractères, j'ai dû remplacer un espace par un saut de ligne. Sous Windows, la taille du fichier passait initialement à 296 octets en raison de CRLF, mais elle fonctionne correctement avec uniquement le LF. ABAP nécessite certes beaucoup d'espaces, alors ce n'est pas grave.
WRITE écrit simplement le texte de l'interface graphique, alors je suppose que c'est un peu comme stdout? Je pourrais probablement économiser quelques octets ici en utilisant une structure ou un tableau, mais en raison de la façon dont SAP gère les structures mixtes (contenant des caractères et des nombres), je pensais que l'approche ne fonctionnerait que sur des systèmes non Unicode ... Ce que je considère personnellement comme un non aller, malgré avoir accès aux deux.
Le module de fonction pour les nombres aléatoires est le seul que je puisse trouver dans notre système, je suppose qu'il pourrait y en avoir un avec un nom ou des paramètres plus courts. Aucune idée!
Code plus ou moins lisible, commentaires inclus:
Merci pour le défi!
À mon patron: S'il vous plaît, ne me virez pas, je ne fais que m'éduquer!
la source
Propre ,
245234 octetsEssayez-le en ligne!
la source
C #,
184181 octetsMa première réponse à Code Golf!
(Basé sur la réponse Java de @Kevin Cruijssen)
Essayez-le en ligne!
la source
C (gcc) ,
141137 octetsJ'ai utilisé des macros de préprocesseur pour une plus grande justice (avertissement: TV Tropes)
Essayez-le en ligne!
la source
T-SQL, 188 octets
SQL autorise les retours à l'intérieur des littéraux de chaîne, ce qui aide.
CONCAT()
effectue une conversion implicite en texte afin que je n’aie pas à me soucier deCAST
ouCONVERT
.la source
JavaScript, 138 octets
Afficher l'extrait de code
la source
QB64 , 134 octets
De mon frère.
la source
Pyth ,
9492 octetsEssayez-le en ligne
Version précédente: 94 octets
la source
Gelée , 61 octets
Un lien niladique qui fonctionne également comme un programme complet.
Essayez-le en ligne! (la sortie est vidée une fois l'exécution terminée, mais elle est imprimée paragraphe par paragraphe)
Comment?
la source
Perl, 132 octets
la source
VBA:
225233 octets{EDIT} Ajouté le manquant
rnd()*
Remarques:
Permet
GoSub
d’imprimer la ligne triplée, car elle est légèrement plus courte que l’affectation de la ligne à une variable et sonDebug.Print
insertion.Debug.Print
sans aucun argument affiche une ligne vide (pas besoin d'un Null ou d'une chaîne vide) UneWorksheetFunction.Max
ligne serait trop longue, j'ai donc utilisé un "si inférieur à" pour éviter les négatifs.Avec indentation et commentaires
la source
rnd() *
dedans - je pense que j'étais occupé à faire le décompte s'il y avait moins de caractères àDim c%
(c'est- à -dire "c est un entier") et à laisser tomberInt()
Python 2 ,
138 134 133 131127 octets-1 Merci à Jo King (réorganisez de manière à utiliser la logique
bugs-=min(bugs,randomNumber)
plutôt quebugs=max(0,bugs-randomNumber)
). Cela permettait à la force de quitter en utilisant une erreur de division par zéro, économisant 6 octets supplémentaires !Essayez-le en ligne!
la source
Ruby: 149 octets
Devrait fonctionner dans à peu près n'importe quelle version de Ruby> = 1.8
Je pense qu’il serait peut-être possible d’optimiser un peu plus les chaînes, mais en général, j’en suis assez satisfait, en particulier l’affectation combo / comparaison / instruction de rupture et l’abus des crochets optionnels.
Remarque: techniquement, la sortie comporte deux nouvelles lignes; si cela doit être pris en compte, il augmente de 4 caractères.
la source
\n
(non\r
).Zsh , 133 octets
Essayez-le en ligne!
Cela tire parti de quelques fonctionnalités zsh.
while list; do list; done
peut être écrite commewhile list {list}
printf
est numérique, l'argument correspondant est évalué en tant qu'expression arithmétique. Alors:n
gratuitement sans utiliser un$
n -= RANDOM % 21 - 4, n = n > 0 ? n : 0
est à nouveau évalué sans avoir à utiliser$((...))
,$[...]
ou similaire. Le>
et?
devait être échappé.printf $b
la fin, un argument vide est évalué à 0%d
.$b
.$b$b"Take..."
au lieu de"$b${b}Take..."
.\n
, etfor((n=99;n;))
au lieu den=99;while ((n))
.la source