Mon collègue m'a récemment envoyé le code JavaScript suivant comme une blague:
let butScript = (nrOfButs) => {
for(var i = 0; i < nrOfButs; i++){
if(i % 3 == 0){
console.log("Yeah")
}
if(i % 2 == 0){
console.log("But")
}
if(i % 3 == 1){
console.log("No")
}
}
}
Comme le code était écrit pendant les heures de travail, il s’agissait manifestement d’un énorme gaspillage de ressources de la part de l’entreprise. Pour éviter que de tels incidents ne se reproduisent à l’avenir, nous devons minimiser le gaspillage des heures travaillées. Et comme il est de notoriété publique qu'un programme plus court est plus rapide à écrire, nous devons jouer ce code pour qu'il soit le plus court possible!
Contribution
Un seul entier non négatif. Vous ne devez pas gérer une entrée défectueuse.
Sortie
Votre programme doit produire une sortie identique à celle du script ci-dessus. Vous devez générer un mot par ligne et le nombre de mots doit être cohérent avec le script d'origine.
Il est permis d'inclure des caractères d'espacement non newline à la fin de chaque ligne (mais pas au début) car ils sont invisibles. Un caractère de nouvelle ligne supplémentaire est autorisé à la toute fin de la sortie.
Exemples
Input: 0
Output:
Input: 1
Output:
Yeah
But
Input: 2
Output:
Yeah
But
No
Input: 10
Output:
Yeah
But
No
But
Yeah
But
No
Yeah
But
No
But
Yeah
nrOfButs
variable est plutôt mal nommée et trompeuse. Beau défi simple quand même.if
s du creux et continue dans la boucle de courant si leur condition est remplie.Réponses:
Excel, 78 octets
Suppose une entrée dans la cellule A1 et que la mise en forme Wordwrap est activée pour cellule. Utilisez Alt + Entrée pour ajouter des sauts de ligne dans la chaîne et notez les espaces. Ne gère que les entrées jusqu’à 3570 en raison de la limite de la fonction REPT (bonne chance toutefois pour une cellule aussi haute).
Réimpression, avec des points pour les espaces
Comment ça marche: Le motif se répète tous les 6 chiffres:
Chacun de ceux-ci pouvant être exprimé avec 9 caractères, une chaîne est composée de 54 caractères (9 * 6), puis répétée aussi grande que le permet Excel. Ensuite, les 9 * (nombre d’entrées) de gauche sont générés en sortie.
Un saut de ligne pour le "mais aucun" est placé après le blanc afin que le Yeah pour les # 6, 12, (etc) soit formaté à gauche plutôt qu'à droite, et qu'il n'y ait pas de saut de ligne vierge ajouté toutes les 6 lignes pour cet article.
la source
JavaScript (ES6),
5957 octetsEssayez-le en ligne!
Comment?
Nous utilisons une fonction récursive qui va de à plutôt que de à .1 0 n - 1n 1 0 n - 1
En conséquence, les tests sont décalés de par rapport au code de référence:1
Cela nous permet de stocker la cas simple comme première entrée de notre tableau de recherche, où nous pouvons définir : une variable contenant soit une chaîne, soit une chaîne vide.sn ≡ 0( mod3 ) s
"But\n"
Les deux autres entrées sont définies comme
"Yeah\n" + s
ets + "No\n"
respectivement.Remarque: en itérant de à , nous pourrions également définir dans la première entrée, mais cela coûterait deux parenthèses supplémentaires .0 sn - 1 0 s
Commenté
la source
LOLCODE , 257 octets
Essayez-le en ligne!
la source
VISIBLE "But"
référence au manque de pantalons du programme?Espace blanc ,
315304300277276 octetsMerci à @JoKing pour -11 octets (réduction du nombre d'étiquettes utilisées de 8 à 7) et -24 octets supplémentaires (modification du flux général du programme et réduction du nombre d'étiquettes utilisées de 7 à 5 dans le processus).
Lettres
S
(espace),T
(tabulation) etN
(nouvelle ligne) ajoutées uniquement en surbrillance.[..._some_action]
ajouté comme explication seulement.Essayez-le en ligne (avec des espaces bruts, des onglets et des nouvelles lignes uniquement).
Est certainement pas Whitespace la bonne langue pour ce défi .. Dans les deux boucles et Whitespace si-déclarations sont faites avec des étiquettes et des sauts aux étiquettes, et puisqu'ils ne sont pas si-elseif-else cas , mais si plusieurs-cas,
cela signifie que je devra revenir en arrière après chaque si, ce quiveut dire que je devrai modifier légèrement les contrôles pour éviter certaines impressions (merci à @JoKing ).Explication en pseudo-code:
Explication supplémentaire:
En général, il passe de l’entrée à 0, poussant une nouvelle ligne et le mot inversé (donc dans l’ordre "\ noN", "\ ntuB", "\ nhaeY" au lieu de "Yeah \ n", "Mais \ n ", "Non"). Et une fois que l'entrée a été bouclée jusqu'à 0 et que tous les caractères sont sur la pile, les caractères sont inversés (ainsi le bon ordre de sortie).
Plus en profondeur cependant: bien que nous ayons besoin d’imprimer des mots dans la plage
(input, 0]
, il sera mis en boucle dans la plage[input, 0)
. Pour cette raison, nous pouvons utiliser la vérificationif(i%3 == 2)
de "\ noN" (ou en fait,if(i%3 != 2)
ignorer la poussée de "\ noN"), et la vérificationif(i%2 != 1)
de "\ ntuB" (ou en fait,if(i%2 == 0)
ignorer la poussée de "\ ntuB" ) Seulement après ces deux vérifications, nous réduisons l'itérationi
de 1. Ensuite, cochez laif(i%3 == 0)
case "\ nhaeY", comme dans l'exemple de code JS de la description du défi. Sauter avec des vérifications if-not au lieu de passer à une étiquette et revenir de l’étiquette avec if-checks sauvegardé 23 octets.En outre, dans l’espace blanc, les valeurs des caractères sont stockées dans la pile sous forme de valeurs unicode (par exemple,
10
pour les nouvelles lignes,65
pour 'A',97
pour 'a', etc.). Comme j'ai déjà besoin de boucler la pile pour imprimer les caractères, je peux également utiliser mon astuce Whitespace pour réduire le nombre d'octets en ajoutant une constante aux valeurs numériques avant de les imprimer en tant que caractères.Cette constante est
104
dans ce cas, générée avec ce programme Java que j'ai également utilisé pour jouer au golf une autre de mes réponses à Whitespace auparavant . C'est aussi la raison pour laquelle cette partie du code:a les valeurs
-94
pour la nouvelle ligne,7
pour le «o» et-26
pour le «N». Du fait d' ajouter la constante de104
volonté correctement donner nos valeurs unicode10
,111
et78
pour ces caractères respectivement.la source
if i modulo-3 != 1 jump to next if else push NO
i
avant leif(i is 0) call PRINT
est vrai, mais votre autre vérifie lei
avant de le soustraire et de sauter les impressions. Assez intelligent en fait. Continuera à le mettre en œuvre.Python 3 ,
85 à82 octetsEssayez-le en ligne!
Python 3 ,
7976 octetsPort de Keeta de réponse Excel .
Essayez-le en ligne!
la source
Perl 6 ,
6350 octetsEssayez-le en ligne!
Bloc de code anonyme qui prend un nombre et renvoie une liste de lignes
Explication:
la source
C (gcc) , 75 octets
Essayez-le en ligne!
C (gcc) , 60 + 11 = 71 octets (utilisation
-D$=||puts(
)Essayez-le en ligne!
la source
05AB1E (ancien) ,
272524 octetsSauvé 1 octet grâce à Kevin Cruijssen .
Essayez-le en ligne!
Explication
la source
×
, je n'y avais pas pensé!Θ
maintenant que vous n'utilisez plus×
, car vousÏ
ne ferez que regarder1
s, donc il ignore le2
(et0
bien sûr).Python 2 , 73 octets
Essayez-le en ligne!
la source
Python 2 ,
979592908381 octetsEssayez-le en ligne!
-2 octets, grâce aux ovs
Python 3 ,
92908583 octetsEssayez-le en ligne!
-4 octets, grâce aux ovs
-4 octets, merci à Jo King
la source
len(w)<3
->'N'in w
, 81 octets :len(w)%2
->(w<'N')
Toile , 27 octets
Essayez-le ici!
la source
Groovy (fonction), 79 octets
Depuis le début de ma réponse, j’ai parcouru quelques discussions historiques sur ce qui constitue une réponse appropriée. Comme il semble communément accepté de ne fournir qu’une méthode en Java (y compris les déclarations de type et de paramètre de retour), voici une méthode plus courte, Groovy, dont la valeur de retour est la réponse. L'utilisation de
def
signifie que le type de retour est inféré.Contrairement à la réponse originale ci-dessous, qui passe de 0 à n-1, celle-ci s’appelle de n à 1, mais décrémente l’entrée pour le reste de la ligne dans l’appel récursif.
Essayez-le en ligne!
Groovy (programme), 87 octets
Les scripts Groovy ne nécessitent pas certaines importations communes, il peut donc s'agir d'un programme imprimant la réponse à STDOUT de Java sans avoir à déclarer
System.out.
avantprint
. Il fournit également des méthodes d’utilité communes, telles que celle-toLong()
ci, qui nous permet d’analyser raisonnablement l’argument d’entrée.En gros, Java 10 répond, mais en utilisant la syntaxe de boucle plus courte et la capacité de Groovy à évaluer les déclarations véridiques.
Essayez-le en ligne!
la source
Retina 0.8.2 , 45 octets
Essayez-le en ligne! Explication:
Convertir l'entrée en unaire.
Pour chaque entier
0...n-1
, générez trois lignes de texte, une pour chaque mot, chacune précédée dei
1
s, à l'exception deNo
, qui a deux1
s supplémentaires pour calculer l'(i+2)%3==0
équivalent dei%3==1
.Supprimer les paires de
1
s avant queB
s.Supprimez
1
s en groupes de trois partout ailleurs.Supprimer toutes les lignes qui ont encore un
1
.la source
11No¶
calculer(i+2)%3==0
(donc les trois sont des vérifications si==0
), cela semble tellement évident, mais je n'y aurais pas pensé moi-même, alors c'est en fait assez ingénieux. +1 de moi, bonne réponse!Java 10,
100 à99 octets-1 octet grâce à @ OlivierGrégoire .
Essayez-le en ligne.
Explication:
la source
++i%3>1
va probablement vous faire économiser un octetPowershell,
7574726766 octets-1 octet merci TessellatingHeckler
Script de test et explication:
Sortie:
Script simple, 72 octets:
la source
======
. Il ne génèreYeah,But,No
que des chaînes. Le script de test affiche un séparateur pour faciliter la lecture des résultats uniquement.(" Yeah\nBut No But Yeah But\nNo "*($j="$args")|% s*t 32)[1..$j]-ne''
Haskell , 71 octets
Essayez-le en ligne!
Explication
Assez simple, sauvegardé deux octets en utilisant à la
[1..n]
place de[0..n-1]
et ajusté les restes: L'opérateur(?)
test prend quatre arguments, renvoyant une liste vide ou la chaîne fournie sous forme de singleton si le résultat est correct.En currying le quatrième argument de
(?)
nous pouvons utiliser(<>)
pour concaténer les résultats de chaque fonction, à savoir:la source
C # (compilateur interactif Visual C #) ,
10599949689bytesEssayez-le en ligne!
la source
x++%3==1?
peut être++x%3>1?
. Quelqu'un d'autre l'a juste indiqué pour ma réponse Java, mais il en va de même pour votre réponse C #. :)Pip ,
373533 octets(Notez l'espace après
But
.) Prend l'entrée en tant qu'argument de ligne de commande. Essayez-le en ligne!Explication
Cette explication concerne la version précédente - voir ci-dessous le journal des modifications.
Inspiré par Jo King's Perl 6 answer . Nous construisons cette liste:
et en sortir les premiers
a
éléments en utilisant une indexation cyclique.Mise à jour: Je me suis rendu compte que je n'avais pas besoin de remplacer pour changer 0/1/2 en chaînes - je pouvais utiliser ces nombres pour indexer directement dans une liste. Pour ce faire, nous devons nous assurer que les nombres à plusieurs chiffres sont divisés en listes de chiffres (sinon, nous choisirons l'index 10 au lieu des index 1 et 0). Heureusement, l'utilisation d'une liste imbriquée de manière arbitraire en tant qu'index dans Pip fonctionne comme prévu, donnant une liste (imbriquée) de résultats. Pour une entrée de 3, nous obtenons cette progression de données (où
_
représente une nouvelle ligne):Comme auparavant, le résultat final est concaténé et imprimé automatiquement.
la source
Attaché , 48 octets
Essayez-le en ligne!
Explication
la source
C (gcc) ,
7771747269 octetsIl y a déjà une meilleure réponse C ici, mais celle-ci est récursive et il m'a fallu un certain temps pour comprendre, alors je la poste.
Jusqu'à 69 octets grâce à @ceilingcat et @JonathanFrech
(Je ne pense jamais utiliser n- ~ -i à la place de n-i + 1)
Essayez-le en ligne!
la source
j
deux octets enregistrés.n-~-i
est équivalent àn-i+1
- pasi<n+1
- et donc ne sauve en fait aucun octet ...Ruby, 69 ans
7274OctetsRéponse très simple, en recherchant une méthode plus courte et récursive pour le moment.
Sauvegardé deux octets grâce à @BWO :)
Sauvegardé trois autres octets en utilisant des symboles au lieu de chaînes
la source
Python 3, 93 octets
Ce n'est pas exactement la meilleure solution, mais c'est mon point de vue.
Essayez-le en ligne!
la source
R, 65 octets
Étant donné que nous reproduisons un programme légèrement défectueux (il manque chaque quart "mais" - il aurait dû utiliser
%4 == 1
et%4 == 3
non pas des%3
conditions), nous devons utiliser un appel maladroitc
et travailler en base sept. C'est quand même plus court que LOLCODE ...(J'espérais que (3,1,2,3,2,1,2) ou une permutation similaire pourrait apparaître
lh
quelque part dans le jeu de données mais cela ne ressemble pas à ça)la source
sed -E ,
179150 octetsLe plus difficile était de ne pas construire la liste mais bien d’analyser le nombre décimal.
2 octets peuvent être enregistrés si la nouvelle ligne à la fin n'est pas requise:
c\
→d
.Nécessite encore une optimisation.
Essayez-le en ligne .
Explication
la source
Propre , 116 octets
Essayez-le en ligne!
la source
F #,
108106 octetsEssayez-le en ligne!
-2 octets passant de
i=0 to p-1
ài=1 to p
et ajustant les modulos. En dehors de cela, assez simple.la source
v
fonction imprime tout.i=1 to p
(et en ajustant les modules, naturellement). Les plages inverses sont vides. :)PHP,
6568 octetsExécuter en pipe
-nR
ou essayer en ligne .la source
VBA (Excel),
105, 101,99 octetsEdit: -4 octets de Keeta! Merci!
Éditez 2: -2 octets de Chronocidal! Woot! (Réalisé que les cas de test ne fonctionnaient que pour 10. Corrigé maintenant)
Oui, Excel a battu VBA cette fois. Peu importe. (Nous venons pour vous)
^ Ceci est collé dans la fenêtre Immediate et sort dans la fenêtre de débogage
Ungolfed
la source
&
entre deuxIIf(..)
pour 2 octets supplémentairesGelée , 22 octets
Un lien monadique donnant une liste de lignes (qui semble avoir été autorisé dans les commentaires)
Essayez-le en ligne! (le pied de page appelle le lien en utilisant
Ç
et rejoint les nouvelles lignes en utilisantY
depuis l'impression implicite dans Jelly écrase tout si possible)Comment?
Notez maintenant que les six premières valeurs sont:
La liste de lignes résultante doit donc contenir ces valeurs répétées (ou tronquées) à la longueur
n
concaténée.Notez maintenant que le pouvoir de
"Yeah", "But", "No"
est:Donc, chaque période correspond aux valeurs 1-indexées de la puissance de
"Yeah", "But", "No"
:Le code crée cette liste, la moule en longueur
n
, indexe dans le jeu de puissance, puis supprime les listes internes (ce qui supprime également les chaînes vides, car les chaînes sont des listes dans Jelly) ...la source
Python 2 ,
939283 octetsEssayez-le en ligne!
Un énorme 9 octets sauvé grâce à @Jonathan Frech
la source
('','Yeah\n')[x%3<1]
est équivalent à"Yeah\n"*(x%3<1)
.