FizzBuzz est si simple, je parie que vous pouvez le faire à l'envers. Dans ce défi, vous recevrez la longueur de la chaîne FizzBuzz et devez donner l'entier positif qui a produit cette chaîne.
La description
Pour décomposer cela, une chaîne FizzBuzz pour n
est générée par l'algorithme suivant.
Commencez avec une chaîne vide et, pour chaque i=1..n
(inclus):
- Si
i
est divisible par3
et par5
, ajoutezFizzBuzz
à la chaîne. - Si
i
est juste divisible par3
ajouterFizz
. - Si
i
est juste divisible par5
ajouterBuzz
. - Si
i
n'est divisible par aucun, ajoutez la représentation décimale dei
.
Par exemple, FizzBuzz(15)
voici ce qui suit:
12Fizz4BuzzFizz78FizzBuzz11Fizz1314FizzBuzz
On vous donnera Length(FizzBuzz(n))
et vous devrez déterminer n
. Vous pouvez supposer que l'entrée est positive et sera toujours la longueur d'une chaîne FizzBuzz.
Règles
Votre solution peut être un programme complet ou une définition de fonction dans n'importe quelle langue standard acceptable. Votre programme / fonction peut accepter des arguments et renvoyer des réponses de toute manière standard acceptée . Les failles standard sont interdites.
Vous pouvez supposer que l'entrée est positive et valide (décrit la longueur d'une chaîne FizzBuzz) et est plus petite que le plus grand entier représentable nativement dans votre langue.
C'est le golf par code, donc le nombre d'octets le plus court l'emporte.
Exemples
Voici quelques exemples de cas
Length(FizzBuzz(n)) -> n
1 -> 1
6 -> 3
15 -> 6
313 -> 100
3677 -> 1001
modifier
Correction du dernier cas de test. Merci @SteadyBox.
Réponses:
Gelée ,
1614 octets2 octets enregistrés à l'aide de fonctionnalités linguistiques plus récentes
)
pourµ€
etÄ
pour+\
Essayez-le en ligne!ou consultez les cas de test .
Comment?
Construit une liste des longueurs de chaque élément de
1
à l'entrée, réduit par addition, puis trouve l'index à base unique de l'entrée dans la liste. (Cela signifie également qu'une entrée non valide entraîne0
«pas dans la liste»).la source
C,
8178 octets68 octets si cela ne vous dérange pas de convertir en aller
double
-retour:la source
return i;
est nécessaire, car il s'agit d'un moyen généralement accepté de sortir dans le code golf alors que seule la modification d'une variable globale ne l'est pas. J'ai envisagé d'utiliserlog10(i)+1
, mais j'ai pensé que cela pourrait causer des problèmes en raison de la conversion en double et en arrière (par exemple, cepow(i)
n'est pas fiable avec des entiers). Il semble maintenant que cela fonctionne bien pour toutes les valeurs positives qu'un anint
peut représenter, donc je pourrais probablement l'utiliser. (Avec des valeurs plus grandes qu'un simpleint
peut contenir, il échoue parfois, mais cela n'a pas d'importance ici.)n
pointeur et ensuite juste modifier la valeur vers laquelle il pointe à la fin, mais cela nécessiterait plus de code sur le site d'appel afin de pouvoir imprimer la valeur, donc on se sent un peu comme me tromper.MATL ,
312827 octetsEssayez-le en ligne!
Explication
la source
Mathematica, 67 octets
C'est à la fois plus rapide et plus court que ma solution initiale:
ou ma tentative désespérée de le raccourcir:
Explication
For
Boucle standard qui s'incrémenten
jusqu'à ce qu'elles := Length(FizzBuzz(n))
soit au moins égale à l'entrée#
. Le seul(n+1)
élément intéressant est la façon dont je calcule la longueur du -ème terme de la séquence FizzBuzzla source
MATL,
31 3028 octetsUtilise la même idée que la solution Jelly de Jonathan Allen.
Essayez-le sur matl.suever.net !
la source
Java 8,
10097 octetsGolfé:
Non golfé:
Sortie:
la source
JavaScript (ES6),
6257 octetsCas de test
Afficher l'extrait de code
la source
(!(++k%3)+!(k%5)<<2||`${k}`.length)
.Javascript (ES6), 56 octets
la source
Python 3, 78 octets
Fonction récursive. Il faudra augmenter la limite de récursivité pour tout résultat supérieur à 1000.
Explication:
la source
Python, 93 octets
la source
k, 33 octets
Brève explication (python-ish):
Exemple utilisant kmac 2016.06.28:
la source
dc ,
7670 octetsEssayez-le en ligne!
la source
Rubis,
6966 octetsÀ l'origine, j'évitais la monstruosité de l' opérateur ternaire imbriqué et je suis descendu à 69 octets:
la source
Java 8,
9593 octetsCeci est la version optimisée de la réponse de @ Snowman
la source
Groovy, 76 octets
def f(n){i=0;for(s='';s.size()<n;)s+=++i%15<1?"1"*8:i%5<1||i%3<1?"1"*4:i;i;}
Généralement identique à la réponse de @ Snowman , mais utilise une certaine magie / différences Groovy pour réduire le nombre d'octets.
la source
Perl 6 ,
5552 octetsEssayez-le en ligne!
Comment ça marche
la source
Japt , 20 octets
Essayez-le
la source
Perl 5
-p
, 48 octetsEssayez-le en ligne!
la source
C (gcc) , 68 octets,
stdout
spammingEssayez-le en ligne!
C (gcc) , 74 octets
Essayez-le en ligne!
la source
05AB1E , 17 octets
Essayez-le en ligne ou vérifiez tous les cas de test .
Explication:
la source