99 bugs dans le code

47

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

Sam Dean
la source
1
Connexe: 1 2 (différence: dans ce défi, la sortie peut être arbitrairement longue).
user202729
16
Un scénario plus réaliste consisterait à inverser le signe du nombre aléatoire!
Stewie Griffin
9
Je suis déçu que les exigences n'incluent pas que le programme doit avoir un bogue une fois qu'un nombre négatif est rencontré, comme un crash, un débordement à max int ou similaire;).
Allo
3
"Les nombres entiers aléatoires ne doivent pas nécessairement être répartis de manière uniforme, ils doivent tous être possibles." m'a rappelé xkcd.com/221
Ivo Beckers
2
Dommage que 99 n'ait pas généré de nombres aléatoires.
Jonathan Allan

Réponses:

18

R , 182 140 138 135 octets

n=99;while(n)cat(n,b<-" bugs in the code
",n,b,"take one down and patch it around
",n<-max(0,n-sample(21,1)+5),b,"
",c(n,b)[!n],sep="")

Essayez-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!

Giuseppe
la source
1
Où JayCe a-t-il trouvé tous ces octets? Était-ce juste un hasard ou JayCe les recherchait-il activement?
Stewie Griffin
Cela ne +5vous coûte- t-il pas 2 autres octets? pourquoi pas seulement sample(26,6))?
theforestecologist
2
@theforestecologist Bienvenue à PPCG! Je vous suggère de regarder de plus près la question ... il y a un signe moins devantsample
JayCe
11

Java 8, 161 160 octets

v->{String s="",t=" bugs in the code\n";for(int i=99;i>0;s+=i+t+i+t+"Take one down and patch it around\n"+((i-=Math.random()*21+4)<0?0:i)+t+"\n");return s+0+t;}

-1 octet grâce à @JonathanAllan .

Essayez-le en ligne.

Explication:

v->{                   // Method with empty unused parameter and String return-type
  String s="",         //  Result-String, starting empty
         t=" bugs in the code\n";
                       //  Temp-String we use multiple times
  for(int i=99;i>0;    //  Start `i` at 99, and loop as long as it's larger than 0
    s+=                //   Append to the result-String:
       i+t             //    The first line of the verse
       +i+t            //    The second (duplicated) line of the verse
       +"Take one down and patch it around\n"
                       //    The third line of the verse
       +((i-=Math.random()*21-4)
                       //    Decrease `i` by a random integer in the range [-16, 4]
         <0?0:i)       //    If `i` is now negative, set it to 0
        +t+"\n");      //    And append the fourth line of the verse
  return s             //  Return the result,
         +0+t;}        //  appended with an additional line for 0 at the very end
Kevin Cruijssen
la source
Vous semblez ne pas utiliser rpour quelque chose?
OOBalance
1
Enlever ,rsemble toujours fonctionner: essayez-le en ligne!
Kamil Drakari
@OOBalance Oups .. Vous ne savez pas trop pourquoi je l'ai eu là-bas ...>.> Merci de l'avoir remarqué.
Kevin Cruijssen
1
i - = ... + 5 sauve une personne (bien que je pense que la plage devrait être [-16 4] et non [-15,5])
Jonathan Allan
1
@OOBalance oui r n'est pas utilisé, car il utilise java ;-)
Anand Rockzz
10

PowerShell , 137 135 133 131 octets

$b=' bugs in the code';for($a=99;$a){,"$a$b"*2;"Take one down and patch it around";$a+=-16..4|Random;if($a-lt0){$a=0}"$a$b`n"}"0$b"

Essayez-le en ligne!

La section "bugs dans le code" est enregistrée $bpour une utilisation ultérieure. Définit $asur 99, entre dans une forboucle $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 $aen sélectionnant un Randomentier dans la plage [-16,4]. Après cela, nous fixons $apour être au minimum zéro en utilisant un if if($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 implicite Write-Outputnous donne des nouvelles lignes entre elles gratuitement.

Enregistré deux octets en utilisant une forboucle au lieu d'une whileboucle.
Enregistré deux octets en déplaçant $bsur sa propre section.
Enregistré deux octets grâce à Adrian Blackburn.

AdmBorkBork
la source
Vous pouvez remplacer $ a = (0, $ a) [$ a-gt0]; avec If ($ a-lt0) {$ a = 0} pour quelques octets
Adrian
@AdrianBlackburn Merci!
AdmBorkBork
9

JavaScript (Node.js) , 127 octets

f=(i=99,t=` bugs in the code
`)=>i>0?i+t+`Take one down and patch it around
`+((i+=0|Math.random()*21-15)<0?0:i)+t+`
`+f(i):0+t

Essayez-le en ligne!


Explication:

f = (                                          // start of our recursive function
    i=99,t=` bugs in the code                 // parameters, 1. num bugs , 2. text
`)                                           // using string literal end text with \n
=>                                          // start function
    i > 0 ?                                // if i is greater than 0
        i + t +                           // return value of i, value of t and  
    `Take one down and patch it around   // and this text 
    `                                   // + new line
    + (( i +=                          // and add 
        0|Math.random()*21-15) < 0 ?  // remove decimal from value obtained by multiplying
                                     // random number (between 0 and 1) multiplied by 21 
                                    // and then subtracting 15 from it
                                   // if that value is less than 0
        0 :                       // add 0 to i
        i                        // otherwise add value of i  
        )                       // end the parenthesis 
    + t                        // add value of t to that
    + `\n`                    // along with a new line 
    + f(i)                   // and repeat the process (this is recursive)
    :                       // if i > 0 condition not met then
        0 + t              // return 0 + t. Zero is there so the last line can be 
                          // repeated

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.

Muhammad Salman
la source
1
Pourquoi a été 0+enlevé? Il semble être la sortie requise.
Tsh
@tsh: c'est ça? Je n'ai pas lu cette partie.
Muhammad Salman
7

05AB1E , 59 octets

99[Ð16(4ŸΩ+¾‚{θ©3F“ÿ±À€†€€ƒË“Š}“ƒ¶€µ„‹€ƒš¡€•…¡“ªsõ®>#®]sDŠ»

Essayez-le en ligne!

Emigna
la source
6

Python 2 , 151 octets

Belle astuce j=i+max(-i,randint(-16,4))de Jo King, exploitant une distribution inégale autorisée

Quelques octets sauvegardés grâce à Mnemonic

from random import*
i,s=99,'bugs in the code\n'
while i:j=max(0,i+randint(-16,4));print i,s,i,s,'Take one down and patch it around\n',j,s;i=j
print i,s

Essayez-le en ligne!

Mort possum
la source
1
Vous pouvez enregistrer un octet en utilisant j=max(0,i+randint(-16,4)).
Mnémonique
En outre, il s'agit de "bugs dans le code".
Mnémonique
Utiliser 0 pour comparer ne rendra pas tous les nombres possibles. Merci pour rien 'the': D
Dead Possum
Même astuce que ma réponse, 151 octets
Jo King
Ils ne sont pas possibles de toute façon. Vous n'êtes pas autorisé à descendre en dessous de 0.
Mnémonique
6

Charbon de bois , 81 octets

≔⁹⁹θ≔”⧴"pWº⁴tSn/{yBⅈ⁺”ζW›θ⁰«×²﹪ζθ”↶0⪫\`3+¤⸿Zν(z¬hLÀTj'ZXεPraF”≧⁺⁻⁴‽²¹θ﹪ζ×θ›θ⁰¶»﹪ζ⁰

Essayez-le en ligne! Le lien est vers la version verbeuse du code. Explication:

≔⁹⁹θ

Commencez avec 99 bugs dans le code.

≔”⧴"pWº⁴tSn/{yBⅈ⁺”ζ

Enregistrez la chaîne compressée "% d bugs dans le code \ n".

W›θ⁰«

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.

”↶0⪫\`3+¤⸿Zν(z¬hLÀTj'ZXεPraF”

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.

Neil
la source
Besoin de cette dernière répétée "0 bugs dans le code"!
Sam Dean
1
@SamDean Désolé, j'avais oublié cela, corrigé.
Neil
6

JavaScript, 189 176 168 162 octets

f=(x=99)=>{c=console.log;m=Math;a=` bugs in the code
`;c(x+a+x+a+"Take one down and patch it around"+(x=m.max(x+m.ceil(m.random()*21-15),0))+a)
x?f(x):c(`
`+x+a)}

Essayez-le en ligne!

Merci à Muhammad Salman pour le console.logremplacement manquant et à Oliver pour l'amélioration du test x

Merci pour l4m2 pour le golf de 8 octets

Le gars au hasard
la source
Je ne suis pas un expert en nœuds, mais je pense que "le programme doit s'arrêter lorsque le nombre de bogues est égal à 0 ou négatif" signifie que vous en avez besoin x<=0?console.log("\n"+0+a):f(x)à la fin.
NoOneIsHere
1
D'accord désolé. Encore une chose: si vous avez besoin de recurse dans une fonction anonyme, vous devez explicitement la nommer (+2 octets)
NoOneIsHere
1
Ce dernier fichier "console.log" ne peut-il pas être remplacé par "c"?
Sam Dean
1
Aussi @NoOneIsHere a raison. Vous avez besoin de cette fdéclaration. Voté jusqu'à mis à jour pour résoudre ce problème. (Mon lien a également besoin d'une mise à jour)
Muhammad Salman
2
Ce que j'essaie de dire ici, c'est que votre code ne fonctionne pas si la fonction n'est pas appelée f, ce que vous ne pouvez pas supposer.
NoOneIsHere
6

Python 3 , 156 138 octets

Merci à Jonathan Python 2 de répondre à l' idastuce

r=n=99
z='%d bugs in the code\n'
while n:x=n;r+=id(r);n-=min(n,r%21-4);print((z%x)*2+'Take one down and patch it around\n'+z%n)
print(z%n)

Essayez-le en ligne!

Explication:

r=n=99       #Initialise r and n to 99
z='%d bugs in the code\n'  #Save n
while n:     #Loop while n is not 0
    x=n      #Save value of n
    r+=id(r) #Modify value of r, which changes the hash value
    n-=min(n,r%21-4)  #Change n's value by a random number between 4 and -16
    print((z%x)*2+'Take one down and patch it around\n'+z%n)   #Print the message
print(z%n)  #And print the final line
Jo King
la source
5

Octave , 149 148 octets

Enregistré un octet en changeant randi(21)et %ien 21*randet %.f. %.fassure 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.

x=99;do(p=@(i)printf('%.f bugs in the code\n',i))(x)
p(x)
disp('Take one down and patch it around')
p(max([0,x+=21*rand-17]))
disp('')until x<1
p(0)

Essayez-le en ligne!

Explication:

x=99;               % Initialize the number of bugs to 99
do ...  until x<1   % Loop until the number of bugs is less than 1
 (p=@(i)printf('%.f bugs in the code\n',i))(x)  % Create a function handle p that takes
                                                % the number of bugs as input and outputs
                                                % the string x bugs ... \n
 p(x)                % Call that function with the same number of bugs to get two lines
 ,disp('Take on down and patch it around')       % Outputs that line, including a newline
 ,p(max([0,x+=21*rand-17]))                    % Call p again, while updating the number
                                                 % of bugs. The number of bugs will be 
                                                 % the old one plus the random number, or 0
                                                 % if it would have turned negative
 ,disp('')        % A newline
p(0)              % Finally, the last single line.

Utiliser p((x+=21*rand-17)*(x>0)au lieu de maxenregistre un octet, mais la dernière ligne est générée -0 bugs ...au lieu de 0 bugs. Cela fonctionne avec randi(21)-17, mais alors c'est la même longueur que celle ci-dessus. Essayez-le en ligne!

Stewie Griffin
la source
5

COBOL (GnuCOBOL), 317 294 279 270 octets

data division.working-storage section. 1 i pic S99 value 99.procedure division.perform until i=0 perform a 2 times display"Take one down and patch it around"compute i=i-(random*21- 4)if i<0 compute i=0 end-if perform a display""end-perform.a.display i" bugs in the code"

Essayez-le en ligne!

Ungolfed

data division.                     <-- Define the variables we want to use
working-storage section.           <-- Define global variables used in this
                                       program

1 i pic S99 value 99.              <-- Define variable i with datatype signed
                                       numeric and with two digits

procedure division.                <-- Define our program

perform until i = 0                <-- Perform the following code until i = 0
    perform a 2 times              <-- Execute the procedure called 'a' twice,
                                       see below

    display "Take one down and patch it around"   <-- Display this sentence
    compute i = i -                <-- Subtract from i some random value
        (random * 21 - 4)

    if i < 0                       <-- if i < 0
        compute i=0                <-- then assign 0 to i
    end-if
    perform a                      <-- Execute the procedure 'a'
    display ""                     <-- Display an empty string; needed because
                                       of the blank line
end-perform.

a.                                 <-- Define procedure called 'a'.
    display i " bugs in the code"  <-- Display the value of i and then the
                                       given string literal

Note: la dernière phrase est toujours imprimé, parce que COBOL exécute l'ensemble du programme, et après la perform untilboucle , il « tombe-travers » l'étiquette d' un , l' exécution de ses déclarations. Ce comportement est similaire à un switch casesans break.

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.

MC empereur
la source
1
Salut. Bienvenue chez PPCG.
Muhammad Salman
Je pense que moins 4 devrait être plus 4. Je suppose que vous avez opté pour (i- (rand-4) == (i-rand + 4). Mais il n'y a pas de crochets, le signe doit donc être changé. des chiffres soit supprimés ou est-ce une caractéristique de la langue? Mais bon travail avec une langue non favorable à l'or!
Sam Dean
1
@SamDean Merci! J'ai corrigé cette erreur. Je dois admettre que le calcul aléatoire aléatoire réel est inspiré de la réponse de Kevin Cruijssen . Mais il utilise un opérateur d'assignation composé ( -=in i-=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.
MC empereur
@MCEmperor me va bien maintenant!
Sam Dean
Ne pouvez-vous pas utiliser +4 et sauvegarder les crochets?
Raznagul
4

VBA: 212 163 octets

Cette 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.

  1. Utiliser While/Wendau lieu de For/Nextenregistre quelques caractères.
  2. L'appel d'un sous-nom nommé avec un seul caractère est plus court que GoSubet les lignes Exit Subet Returnné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, il Debug.Printn'a donc pas été nécessaire d'appeler aussi souvent. Félicitations à EricF .


Sub b()
s=" bugs in the code"&vbLf
c=99
While c
Debug.? c &s &c &s &"Take one down and patch it around
c=c+5-Int(Rnd()*20)
c=IIf(c<0,0,c)
Debug.? c &s
Wend
End Sub

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).

Ben
la source
4
Bienvenue sur le site!
Wheat Wizard
1
Vous pouvez le réduire à 197 caractères si vous combinez des chaînes, utilisez cplutôt c>0que votre condition While et utilisez c=Iif(c<0,0,c)plutôt If c<0 [...]: pastebin.com/nFGtGqdE
ErikF
4

LaTeX , 368 304 293 287 245 240 octets

Bien 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.

\documentclass{proc}\newcount\b\b99\usepackage[first=-16,last=5]{lcg}\def~{\the\b\ bugs in the code\\}\def\|{\loop~~Take one down and patch it around\\\rand\advance\b\value{rand}\ifnum\b>0 ~\\\repeat\b0 ~\\~}\begin{document}\|\end{document}

Plus lisible:

\documentclass{proc}               %shortest document class
\newcount\b                        %short variable name
\b 99                              %set the value to 99
\usepackage[first=-16,last=5]{lcg} %random number generator
%\the prints the value of the variable behind it
%\def is shorter than \newcommand and can redefine commands
\def~{\the\b\ bugs in the code\\}
\def\|{                            %the function
    \loop
        ~
        ~
        Take one down and patch it around\\
        %\rand creates a counter named rand and                                        
        %stores the random value in it
        \rand \advance\b\value{rand} 
        %if the counter is smaller than 0, it becomes 0
        \ifnum\b>0 
            ~ \\                  %extra newline as required
    \repeat
    %if b is equal or smaller than 0, set it to 0
    \b 0 
    ~ \\                          %then print like normal
    %extra print at the end
    ~
}
\begin{document}
    \|                             %calling the function
\end{document}

Améliorations (par édition):

  1. "x bugs dans le code" est maintenant une fonction au lieu de 4 lignes
  2. Réécriture de la \ifclause en \repeattant que\else
  3. Apparemment \value{b}=xfonctionne pour l'initialisation mais pas dans la boucle (au lieu de \setcounter{b}{x})
  4. Apparemment, \relaxdevrait être utilisé pour le point 3, mais cela peut également être réalisé en insérant un espace. Suppression des \elsecommandes TeX utilisées au lieu de LaTeX car elles sont plus courtes et remplacées \'par ~.
  5. Certains codes n'ont pas besoin d'être assouplis pour une raison quelconque.
Simon Klaver
la source
1
Bienvenue chez PPCG.
Muhammad Salman le
Bienvenue chez PPCG! Je n'ai pas exécuté votre code mais ne devrait-il pas en être \ifnum\value{b}<1autrement <0?
JayCe
@JayCe: Cela n'a pas vraiment d'importance, une fois que b est 0, il échappe quand même à la boucle. Il peut être moins intuitif que lorsque b vaut 0, le cas d’autre est imprimé, mais dans les faits, il n’ya pas de différence.
Simon Klaver
@JayCe a raccourci le code, maintenant cela n'a plus d'importance;)
Simon Klaver
4

C,  169  165 octets

Merci à @ceilingcat pour avoir économisé quatre octets!

*s=" bugs in the code";f(i,j){for(i=99;i>0;i=j)printf("%d%s\n%d%s\nTake one down and patch it around\n%d%s\n\n",i,s,i,s,(j=i+rand()%19-15)<0?0:j,s);printf("0%s",s);}

Essayez-le en ligne!

Steadybox
la source
3

SAS, 210 octets

%macro t;%let b=bugs in the code;%let a=99;%do%until(&a<=0);%put&a &b;%put&a &b;%put Take one down, pass it around;%let a=%eval(&a-%sysfunc(ranbin(0,20,.3))+4);%if &a<0%then%let a=0;%put&a &b;%put;%end;%mend;%t

Ungolfed:

%macro t;
%let b=bugs in the code;
%let a=99;
%do%until(&a<=0);
  %put &a &b;
  %put &a &b;
  %put Take one down, pass it around;    
  %let a=%eval(&a-%sysfunc(ranbin(0,20,.3))+4);
  %if &a<0%then%let a=0;
  %put &a &b; 
  %put;
%end;
%mend;
%t

Peut économiser quelques octets si les avertissements dans le journal sont autorisés (insérez la &adans la &bvariable macro, mais cela génère un avertissement initial).

Joe
la source
Quelques autres ont des avertissements alors je vais aller avec ils sont autorisés.
Sam Dean
3

PHP, 126 octets

Exécuter sur la ligne de commande, en utilisant php -r 'code here':

$b=" bugs in the code
";for($x=99;print$x.$b,$x;)echo"$x{$b}Take one down and patch it around
",$x-=min($x,rand(-4,16)),"$b
";
Veuillez vous lever
la source
3

ABAP , 295 octets

... car pourquoi diable pas!

REPORT z.DATA:a(16),c TYPE qfranint.a = 'bugs in the code'.data(b) = 99.WRITE:/ b,a.WHILE b > 0.WRITE:/ b,a,/'Take one down and patch it around'.CALL FUNCTION
'QF05_RANDOM_INTEGER' EXPORTING ran_int_max = 21 IMPORTING ran_int = c.b = b + c - 17.IF b < 1.b = 0.ENDIF.WRITE:/ b,a,/,/ b,a.ENDWHILE.

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:

REPORT z.
  "Define a (text) and c (random)
  DATA: a(16),
        c TYPE qfranint. "A stupid data type for a random INT

  "This is shorter than using VALUE (saves 3 bytes)
  a = 'bugs in the code'.
  "This is slightly shorter than doing ',b TYPE i' and 'b = 99'. (saves 2 bytes)
  data(b) = 99.

  "first line has to be outside of loop due to our exit condition (saved me ~5 bytes)
  WRITE: / b,a. "\n xx bugs in the code

  WHILE b > 0.
    WRITE: / b,a, "\n xx bugs in the code
    /'Take one down and patch it around'.

    "This ridiculous function for random numbers...
    "To save some bytes, I leave ran_int_min at it's default
    "of 1, and set the max to 21 instead, from which I remove
    "17 later on, resulting in a range of [-16,4]
    "Compare:
    "   ' - 17'              =  5 bytes
    "   ' ran_int_min = -16' = 18 bytes
    "(saves 13 bytes)

    CALL FUNCTION 'QF05_RANDOM_INTEGER'
        EXPORTING ran_int_max = 21
        IMPORTING ran_int = c.

    "Maximum number of bugs added:     4 = 21 - 17
    "Maximum number of bugs removed: -16 =  1 - 17
    b = b + c - 17.

    IF b <= 0.
        b = 0.
    ENDIF.

    WRITE: / b,a,/,/ b,a. "\nxx bugs in the code\n\nxx bugs in the code
  ENDWHILE.

Merci pour le défi!
À mon patron: S'il vous plaît, ne me virez pas, je ne fais que m'éduquer!

Maz
la source
3

Propre , 245 234 octets

import StdEnv,Math.Random,System.Time,System._Unsafe,Text
f[n,v:l]b|n>0=n<+b<+n<+b+"Take one down and patch it around\n"<+max 0v<+b+"\n"+f[v:l]b=0<+b

f(scan(+)99[n rem 20-16\\n<-genRandInt(toInt(accUnsafe time))])" bugs in the code\n"

Essayez-le en ligne!

Οurous
la source
Avez-vous une chance de supprimer les guillemets au début et à la fin?
Sam Dean
1
@ SamDean Oh, c'est juste une option de compilateur que j'ai oubliée. Je vais mettre ça
dedans
3

C #, 184 181 octets

Ma première réponse à Code Golf!

(Basé sur la réponse Java de @Kevin Cruijssen)

Func<String>c=()=>{String s="",t=" bugs in the code\n";for(int i=99;i>0;s+=i+t+i+t+"Take one down and patch it around\n"+((i-=new Random().Next(21)-4)<0?0:i)+t+"\n");return s+0+t;};

Essayez-le en ligne!

Ben Noble
la source
1
Bienvenue sur PPCG :)
Shaggy
2

T-SQL, 188 octets

DECLARE @ INT=99,@b CHAR(18)=' bugs in the code
'a:PRINT CONCAT(@,@b,@,@b,'Take one down and patch it around
')SET @+=5-22*RAND()IF @<0SET @=0PRINT CONCAT(@,@b,'
')IF @>0GOTO a;PRINT '0'+@b

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 de CASTou CONVERT.

BradC
la source
2

JavaScript, 138 octets

_=>(I=i=>`Take one down and patch it around
${l=(i>0?i:0)+` bugs in the code
`}
`+l+l+(i>0&&I(i+Math.random()*21-15|0)))(99).slice(55,-25)

Darrylyeo
la source
2

QB64 , 134 octets

De mon frère.

S$="bugs in the code":I=99:WHILE I>0:?I;S$:?I;S$:?"Take one down and patch it around":I=I+INT(RND*21)-15:I=-(I>0)*I:?I;S$:?:WEND:?I;S$
ErikF
la source
2

Pyth , 94 92 octets

J99WJ%jb[K"%d bugs in the code"K"Take one down and patch it around"Kk)[JJ=JeS,Z+J-O21 16;%KZ

Essayez-le en ligne


Version précédente: 94 octets

J99WJp%jb[K"%d bugs in the code"K"Take one down and patch it around"K)[JJ=JeS,Z+J-O21 16)b;%KZ
Sok
la source
2

Gelée , 61 octets

;“,Ȥm46Ṛṛ⁽eɼḞF»
ÇȮ“"ḃḲɠ⁼ċTṪʠ/Ạ⁺ṗḍ^ẸƘⱮṖ8»20X+_«¥©17Ç⁷®ßÇ®?
99Ç

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?

;“,Ȥm46Ṛṛ⁽eɼḞF» - Link 1, helper to construct count-text: number
 “,Ȥm46Ṛṛ⁽eɼḞF» - compressed string (list of characters) = " bugs in the code\n"
;               - concatenate the number with that list of characters

ÇȮ“"ḃḲɠ⁼ċTṪʠ/Ạ⁺ṗḍ^ẸƘⱮṖ8»20X+_«¥©17Ç⁷®ßÇ®? - Link 2, print stuff: number
Ç                                         - call the last Link (1) as a monad
 Ȯ                                        - print and yield that
                                          - ...at this point that is then printed again
                                          -    implicitly due to the start of a new leading
                                          -    constant chain below
  “"ḃḲɠ⁼ċTṪʠ/Ạ⁺ṗḍ^ẸƘⱮṖ8»                  - compressed string (list of characters)
                                          -     = "Take one down and patch it around\n"
                                          - ...once again an implicit print, same reason
                        20                - twenty
                          X               - random int from [1,20] 
                           +              - add the left argument, the number
                                17        - seventeen
                              ¥           - last two links as a dyad:
                             «            -   minimum (of rand[1,20]+n and 17) 
                            _             -   subtract
                               ©          - copy this newNumber to the register
                                  Ç       - call last Link (1) as a monad = f(newNumber)
                                          - here we get another implicit print, same reason
                                   ⁷      - a new line character
                                          - yet another implicit print, same reason
                                    ®     - recall newNumber from the register
                                        ? - if... 
                                       ®  - ...condition: recall from register again
                                          -               (i.e. if non-zero)
                                     ß    - ...then: call this Link (2) as a monad
                                          -          = Link 2(newNumber)
                                      Ç   - ...else: call the last Link (1) as a monad
                                          -          = Link 1(0) (since newNumber=0)

99Ç - Main Link: no arguments
99  - yep, you guessed it, ninety nine
  Ç - call the last Link (2) as a monad
Jonathan Allan
la source
2

Perl, 132 octets

$c=" bugs in the code
";for($i=99;$i>0;$i+=~~rand(21)-16){print$t.$/,($t=$i.$c)x2,"Take one down and patch it around
"}print"0$c
"x2
Trenton Trama
la source
2

VBA: 225 233 octets

Sub b()
For c = 99 To 0 Step -1
GoSub d
GoSub d
Debug.Print "Take one down and patch it around"
c = c + 5 - Int(rnd() * 20)
If c < 0 Then c = 0
GoSub d
Debug.Print
Next c
Exit Sub
d:
Debug.Print c & " bugs in the code"
Return
End Sub

{EDIT} Ajouté le manquantrnd()*

Remarques:
Permet GoSubd’imprimer la ligne triplée, car elle est légèrement plus courte que l’affectation de la ligne à une variable et son Debug.Printinsertion.
Debug.Printsans aucun argument affiche une ligne vide (pas besoin d'un Null ou d'une chaîne vide) Une WorksheetFunction.Maxligne serait trop longue, j'ai donc utilisé un "si inférieur à" pour éviter les négatifs.

 

Avec indentation et commentaires

Sub b()
    For c = 99 To 0 Step -1
        GoSub d '"# bugs in the code"
        GoSub d '"# bugs in the code"
        Debug.Print "Take one down and patch it around"
        c = c + 5 - Int(rnd() * 20)
        If c < 0 Then c = 0 'Non-negative
        GoSub d '"# bugs in the code"
        Debug.Print
    Next c
    Exit Sub
d: 'This is our GoSub bit
    Debug.Print c & " bugs in the code"
    Return
End Sub
Chronocide
la source
1
C'est un moyen très efficace de faire des nombres aléatoires!
Sam Dean
@ SamDean Pas sûr de savoir comment j'ai oublié d'inclure le 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()
Chronocide
haha pas de soucis! Heureux de voir une réponse VBA car je ne l'ai pas utilisée depuis des années!
Sam Dean
2

Python 2 ,  138 134 133 131  127 octets

-1 Merci à Jo King (réorganisez de manière à utiliser la logique bugs-=min(bugs,randomNumber)plutôt que bugs=max(0,bugs-randomNumber)). Cela permettait à la force de quitter en utilisant une erreur de division par zéro, économisant 6 octets supplémentaires !

r=n=99
t="bugs in the code\n"
while 1:r+=id(r);b=n;n-=min(n,r%21-4);print b,t,1/b|b,t,"Take one down and patch it around\n",n,t

Essayez-le en ligne!

Jonathan Allan
la source
Il s'avère que je n'ai pas du tout besoin de créer de n-uplets.
Jonathan Allan
133 octets
Jo King le
@JoKing Merci! (J'aurais vraiment dû remarquer cela, car cela ressemble plus à ce que je fais dans ma réponse à la gelée.)
Jonathan Allan
2
@JoKing ... ce qui signifie que nous pouvons forcer la démission avec une division par zéro pour sauver - deux - six autres :)
Jonathan Allan
2

Ruby: 149 octets

n=99;f=" bugs in the code\n";loop{puts"#{n}#{f}"*2+"Take one down and patch it around\n";(n+=rand -16..4)>0?puts("#{n}#{f}\n"):break};puts"0#{f}\n"*2

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.

DaveMongoose
la source
Bonjour et bienvenue chez PPCG! Nous comptons les retours à la ligne, mais si cela fonctionne sous Linux, vous ne pouvez compter que le \n(non \r).
NoOneIsHere
@NoOneIsHere Merci :) J'ai mis à jour ma réponse pour préciser - je faisais référence aux nouvelles lignes de la sortie, car la question précise qu'il est acceptable d'en avoir une, mais je n'étais pas sûre de deux.
DaveMongoose
Je vois. Je pense que c'est bon
NoOneIsHere
2

Zsh , 133 octets

b="%d bugs in the code
";for ((n=99;n;)){printf $b$b"Take one down and patch it around
$b
" n n n-=RANDOM%21-4,n=n\>0\?n:0};printf $b

Essayez-le en ligne!


Cela tire parti de quelques fonctionnalités zsh.

  • la forme de boucle alternative : while list; do list; donepeut être écrite commewhile list {list}
  • Si un spécificateur de format printfest numérique, l'argument correspondant est évalué en tant qu'expression arithmétique. Alors:
    • nous obtenons la valeur de ngratuitement sans utiliser un$
    • n -= RANDOM % 21 - 4, n = n > 0 ? n : 0est à nouveau évalué sans avoir à utiliser $((...)), $[...]ou similaire. Le >et ?devait être échappé.
    • À printf $bla fin, un argument vide est évalué à 0 %d.
  • Le fractionnement de mots lors de l’expansion des paramètres est désactivé par défaut, je n’ai donc pas à citer de devis $b.
    • Cela me permet d’écrire $b$b"Take..."au lieu de "$b${b}Take...".

  • Enregistré quelques octets en utilisant des nouvelles lignes au lieu de \n, et for((n=99;n;))au lieu de n=99;while ((n)).
muru
la source
Je pense que ça devrait être -4. "- =" ressemble à son composé, donc il fait d'abord le +4 puis le soustrait tout.
Sam Dean
@SamDean oups, corrigé.
Muru