introduction
Je ne sais pas particulièrement d' où vient la tendance du fizz buzz. Ce pourrait être juste un mème ou quelque chose, mais il est quelque peu populaire.
Défi
Votre travail consiste aujourd'hui à convertir Fizz Buzz en binaire (0, 1) respectivement, et à convertir ce binaire en texte. Des trucs assez standard.
Comment ça marche?
FizzBuzzBuzzFizzBuzzFizzFizzFizz FizzBuzzBuzzFizzBuzzFizzFizzBuzz se traduirait par 01101000 01101001 puis cela se traduirait par "salut"
Contraintes
- L'entrée est Fizz Buzz d'un point de vue binaire (voir les exemples ci-dessous.)
- La sortie doit être du texte.
- Vous pouvez supposer que l'entrée FizzBuzz est correcte.
- C'est le code-golf , la plus courte victoire en octets.
Contribution
FizzBuzzBuzzFizzBuzzFizzFizzFizz FizzBuzzBuzzFizzBuzzFizzFizzBuzz FizzFizzBuzzFizzFizzFizzFizzBuzz
Sortie
"salut!"
Réponses:
C, 59 octets
Des nombres magiques, des nombres magiques partout!
(De plus, C plus court que Python, JS, PHP et Ruby? Du jamais vu!)
Il s'agit d'une fonction qui prend une chaîne en entrée et sort vers STDOUT.
Procédure pas à pas
La structure de base est:
Ici, le "stuff inside" est un tas de code suivi de
,*s++
, où l'opérateur virgule ne renvoie que la valeur de son deuxième argument. Par conséquent, cela parcourra la chaîne et sera défini*s
sur chaque caractère, y compris l'octet NUL de fin (puisque postfix++
renvoie la valeur précédente), avant de quitter.Jetons un coup d'œil au reste:
Décoller le ternaire et les courts-circuits
||
, cela peut être étendu àD'où viennent ces nombres magiques? Voici les représentations binaires de tous les personnages impliqués:
Tout d'abord, nous devons séparer l'espace et NUL du reste des caractères. La façon dont cet algorithme fonctionne, il conserve un accumulateur du nombre "courant", et l'imprime chaque fois qu'il atteint un espace ou la fin de la chaîne (ie
'\0'
). En remarquant cela' '
et'\0'
étant les seuls caractères à n'avoir aucun des deux bits les moins significatifs définis, nous pouvons bit par bit ET le caractère avec0b11
pour obtenir zéro si le caractère est un espace ou NUL et non nul sinon.En creusant plus profondément, dans la première branche "if", nous avons maintenant un personnage qui en fait partie
FBizu
. J'ai choisi uniquement de mettre à jour l'accumulateur surF
s etB
s, donc j'avais besoin d'un moyen de filtrer lesizu
s. Idéalement,F
et lesB
deux n'ont que le deuxième, le troisième ou le septième ensemble de bits de poids faible, et tous les autres nombres ont au moins un autre ensemble de bits. En fait, ils ont tous le premier ou le quatrième bit le moins significatif. Par conséquent, nous pouvons binaire ET avec0b00001001
, qui est 9, ce qui donnera 0 pourF
etB
et non nul sinon.Une fois que nous avons déterminé que nous avons un
F
ouB
, nous pouvons les mapper à0
et1
respectivement en prenant leur module 5, parce queF
est70
etB
est66
. Puis l'extraitest juste une façon golfique de dire
qui peut également être exprimé comme
qui insère le nouveau bit à la position la moins significative et décale tout le reste sur 1.
"Mais attendez!" vous pourriez protester. "Après avoir imprimé
i
, quand est-il jamais remis à zéro?" Eh bien,putchar
convertit son argument en ununsigned char
, qui se trouve être 8 bits. Cela signifie que tout ce qui dépasse le 8e bit le moins significatif (c'est-à-dire la jonque des itérations précédentes) est jeté, et nous n'avons pas à nous en soucier.Merci à @ETHproductions d' avoir proposé de remplacer
57
par9
, d'économiser un octet!la source
Gelée , 9 octets
Essayez-le en ligne!
la source
Bash + coreutils,
6150 octets(-11 octets grâce à Doorknob !)
Essayez-le en ligne!
la source
sed
partr FB 01|tr -d izu
pour économiser 11 octets.Python 3 ,
16910193918581 octetsEssayez-le en ligne!
Explication:
la source
lambda
fonctionJavaScript (ES6),
8079 octetsla source
.replace(/..zz/g,
,'0b'+
etc.n
permet d'atteindre 79. Malheureusement, cela nécessite un espace supplémentaire pour être ajouté à l'entrée. D'où le plutôt coûteux`${s} `
.Japt ,
26241917 octetsEssayez-le en ligne!
2 octets enregistrés grâce à @Shaggy et 2 octets grâce à @ETHproductions
Explication
la source
})
parÃ
. Il y a certainement plus à économiser que cela, mais je n'arrive pas à le faire fonctionner sur mon téléphone.ò4...q n2
parë4...n2
(ë4
fait la même chose queò4
, sauf en renvoyant uniquement le premier élément; étrangement, il ne semble pas être documenté)Rubis,
656360 octetsIl s'agit d'un proc anonyme qui prend l'entrée et donne la sortie sous forme de chaîne.
la source
JavaScript (ES6),
95888581 octetsEssayez-le
la source
+
c'est plus court queparseInt
+(m[0]<"F")
pourrait être raccourci àm<"F"|0
Perl 5, 33 octets
Remplace «F» et «B» dans l'entrée par 0 et 1 respectivement et supprime les autres caractères. Il utilise ensuite la
pack
fonction de perl pour transformer cette chaîne de bits en caractères ASCII.la source
-p0
option de ligne de commande (ce qui vous permettrait d'économiser<>=~r
des données et vous permettrait d'utiliser$_=
plutôt queprint()
). Selon la façon dont vous souhaitez gérer les sauts de ligne, vous n'aurez peut-être même pas besoin de0
. (Même si vous voulez éviter les pénalités d'option de ligne de commande,say
est plus court queprint
.)$_=pack'B*',y/FB -z/01/dr
pour votre programme, votre score baisse à 26 octets.Python 2 ,
90838281 octets-1 octet grâce à totalement humain
-1 octet grâce aux Martmistes
-1 octet grâce à Jonathan Frech
Essayez-le en ligne!
la source
*1 for
dans*1for
*1
pour convertir du booléen en entier, vous pouvez enregistrer un octet en utilisant un+
:(l<'D')*1for
peut être+(l<'D')for
.Espace, 123 octets
Représentation visible:
Programme non obscurci:
L'implémentation n'a rien de particulièrement étrange, le seul vrai golf est dans une étrange réutilisation des temporaires ainsi que de ne pas se soucier de la croissance illimitée de la pile pour parcourir encore plus d'octets.
la source
Octave ,
595753 octetsCela ne fonctionne pas sur TIO, car la boîte à outils de communication n'est pas implémentée. Cela fonctionne très bien si vous le copiez-collez sur Octave-online . Ce n'est même pas près de fonctionner du code dans MATLAB.
Géré pour enregistrer deux octets en transposant la matrice après l'avoir retournée, au lieu de l'inverse.
Explication:
Commençons au milieu de
<code>
:Appelons le vecteur booléen (binaire) résultant pour
t
.la source
Perl 5, 28 octets + 4 octets pour les indicateurs = 32 octets
Courez avec les drapeaux
-040pE
-040
définit le séparateur d'enregistrement sur un espace de sorte que perl voit chaque groupe de FizzBuzz comme une ligne distincte, puis passe en boucle sur ces lignes, change F à 0, B à 1, supprime tout le reste, puis convertit en binaire et de là en ascii.la source
Gelée , 9 octets
Essayez-le en ligne!
-3 octets grâce à Erik l'Outgolfer
la source
PHP, 67 octets
Limité à 8 lettres
Essayez-le en ligne!
PHP, 77 octets
Essayez-le en ligne!
la source
Brain-Flak , 107 octets
Essayez-le en ligne!
+3 octets pour le
-c
indicateur.Explication
la source
q / kdb +,
41403733 octetsSolution:
Exemple:
Explication:
Divisez la chaîne d'entrée sur
" "
pour donner des listes distinctes deFizzBuzz...
, indexez dans chacune de ces listes au premier caractère (c'est-à-dire0 4 8 ... 28
). Renvoie une liste booléenne déterminée par si chaque caractère est"B"
(ASCII66
). Convertissez ces listes en base 10, puis convertissez le résultat en chaîne.la source
Haskell, 72 octets
Essayez-le en ligne!
Comment ça marche
la source
JavaScript ES6 - 98 octets
trop d'octets, mais au moins lisible
Défini comme fonction, il est de 98 octets
tester:
Explication:
Correspond aux lettres F et B et à tout le reste en tant que groupes
est une fonction qui capture les groupes, renvoie un 0 pour F et 1 pour B, ou ''
c est le caractère correspondant à
F et B sont maintenant des paramètres!
le 3 . le groupe est omis comme paramètre
F et B sont
undefined
lorsque le 3e groupe est appariéB est
undefined
lorsque le groupe F est appariéLa chaîne 0100 .. etc résultante
est coupé en tranches de 8 octets
et traité comme une chaîne binaire 0b
la source
s=>s.replace( ...
. Veuillez également inclure un nombre d'octets dans l'en-tête de votre réponse.let
des fonctions anonymes, sont acceptables.shortC , 35 octets
Conversions dans ce programme:
A
-int main(int argc, char **argv){
W
-while(
@
-argv
P
-putchar(
);}
Fortement basé sur la réponse de Doorknob.
la source
APL (Dyalog Classic) , 17 octets
Explication
Essayez-le en ligne!
la source
05AB1E , 15 octets
Essayez-le en ligne!
la source
Google Sheets, 94 octets
Je ne suis pas familier avec le binaire FizzBuzz mais il semble qu'ils soient délimités par des espaces, donc cette formule s'appuie sur cela. La logique est assez simple:
Fizz
par0
etBuzz
par1
la source
Java 8,
117115 octetsJe doute que vous puissiez faire beaucoup de remplacements de regex fantaisie en Java comme la plupart des autres réponses, principalement parce que vous ne pouvez rien faire avec les groupes de capture capturés dans Java-regexes .. (C'est-à-dire
"$1".charAt(...)
ou"$1".replace(...)
n'est pas possible par exemple.)Explication:
Essayez-le ici.
la source
J , 20 octets
Essayez-le en ligne!
la source