FizzBuzz ist so einfach, dass Sie es wahrscheinlich rückwärts machen können. In dieser Herausforderung erhalten Sie die Länge der FizzBuzz-Zeichenfolge und müssen die positive Ganzzahl angeben, die diese Zeichenfolge erzeugt hat.
Beschreibung
Um dies aufzuschlüsseln, ein FizzBuzz-String für n
wird vom folgenden Algorithmus generiert.
Beginnen Sie mit einem leeren String und für jeden i=1..n
(inklusive):
- Wenn dies
i
durch3
und durch teilbar ist5
, hängen Sie esFizzBuzz
an die Zeichenfolge an. - If
i
ist nur durch3
Append teilbarFizz
. - If
i
ist nur durch5
Append teilbarBuzz
. - Wenn
i
durch keine teilbar ist, hängen Sie die Dezimalrepräsentation von ani
.
Zum Beispiel FizzBuzz(15)
ist das folgende:
12Fizz4BuzzFizz78FizzBuzz11Fizz1314FizzBuzz
Sie werden gegeben Length(FizzBuzz(n))
und müssen bestimmen n
. Sie können davon ausgehen, dass die Eingabe positiv ist und immer der Länge einer FizzBuzz-Zeichenfolge entspricht.
Regeln
Ihre Lösung kann ein vollständiges Programm oder eine Funktionsdefinition in einer beliebigen Standardsprache sein. Ihr Programm / Ihre Funktion kann Argumente aufnehmen und Antworten auf jede übliche Weise zurückgeben . Standardlücken sind verboten.
Sie können davon ausgehen, dass die Eingabe positiv und gültig ist (beschreibt die Länge einiger FizzBuzz-Zeichenfolgen) und kleiner als die größte in Ihrer Sprache nativ darstellbare Ganzzahl ist.
Dies ist Codegolf, also gewinnt die kürzeste Anzahl an Bytes.
Beispiele
Hier sind einige Beispielfälle
Length(FizzBuzz(n)) -> n
1 -> 1
6 -> 3
15 -> 6
313 -> 100
3677 -> 1001
Bearbeiten
Letzter Testfall behoben. Vielen Dank @SteadyBox.
Antworten:
Jelly ,
16 bis14 Bytes2 Byte, die mit neueren Sprachfunktionen
)
fürµ€
undÄ
für gespeichert wurden+\
Probieren Sie es online! oder sehen Sie die Testfälle .
Wie?
Erstellt eine Liste der Längen aller Elemente von
1
bis zur Eingabe, verringert sich durch Addition und findet dann den einbasierten Index der Eingabe in der Liste. (Dies bedeutet auch, dass eine ungültige Eingabe zu0
"Nicht in Liste" führt.)quelle
C
8178 Bytes68 Bytes, wenn Sie nichts dagegen haben, nach
double
und zurück zu konvertieren :quelle
return i;
wird benötigt, da dies eine allgemein akzeptierte Methode für die Ausgabe in Code Golf ist, während nur das Ändern einer globalen Variablen dies nicht ist. Ich habe überlegt, es zu verwendenlog10(i)+1
, aber ich dachte, es könnte einige Probleme verursachen, weil es in double und back konvertiert wird (z. B.pow(i)
ist nicht zuverlässig mit ganzen Zahlen). Es scheint jetzt aber, dass es gut für alle positiven Werte funktioniert, die eineint
Dose darstellen kann, also könnte ich es wahrscheinlich verwenden. (Bei Werten, die größer sind als ein einfacher Wertint
, schlägt dies manchmal fehl, aber das spielt hier keine Rolle.)n
als Zeiger nehmen und dann nur den Wert ändern, auf den es am Ende zeigt, aber das würde mehr Code auf der Aufrufseite erfordern, um den Wert drucken zu können, so wie es sich anfühlt Ein bisschen wie Betrug für mich.MATL ,
312827 BytesProbieren Sie es online!
Erläuterung
quelle
Mathematica, 67 Bytes
Dies ist sowohl schneller als auch kürzer als meine ursprüngliche Lösung:
oder mein verzweifelter Versuch, es zu verkürzen:
Erläuterung
Die Standardschleife
For
, dien
bis zum Inkrementieren verwendets := Length(FizzBuzz(n))
wird, entspricht mindestens der Eingabe#
. Das einzig interessante ist, wie ich die Länge des(n+1)
-ten Terms der FizzBuzz-Sequenz berechnequelle
MATL,
31 3028 BytesVerwendet die gleiche Idee wie Jonathan Allens Jelly-Lösung.
Probieren Sie es auf matl.suever.net !
quelle
Java 8,
10097 BytesGolf gespielt:
Ungolfed:
Ausgabe:
quelle
JavaScript (ES6),
62.57ByteTestfälle
Code-Snippet anzeigen
quelle
(!(++k%3)+!(k%5)<<2||`${k}`.length)
.Javascript (ES6), 56 Byte
quelle
Python 3, 78 Bytes
Rekursive Funktion. Muss das Rekursionslimit für alle Ergebnisse über 1000 erhöht werden.
Erläuterung:
quelle
Python, 93 Bytes
quelle
k, 33 Bytes
Kurze (python-ish) Erklärung:
Beispiel mit kmac 2016.06.28:
quelle
Gleichstrom ,
76-70BytesProbieren Sie es online!
quelle
Ruby,
6966 BytesUrsprünglich habe ich die verschachtelte Monstrosität von ternären Operatoren vermieden und bin auf 69 Bytes heruntergekommen:
quelle
Java 8,
9593 BytesDies ist die optimierte Version der Antwort von @ Snowman
quelle
Groovy, 76 Bytes
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;}
Meistens die gleiche Antwort wie bei @ Snowman , verwendet jedoch einige groovige Magie / Unterschiede, um die Anzahl der Bytes zu verringern.
quelle
Perl 6 ,
5552 BytesProbieren Sie es online!
Wie es funktioniert
quelle
Japt , 20 Bytes
Versuch es
quelle
Perl 5
-p
, 48 BytesProbieren Sie es online!
quelle
C (gcc) , 68 Bytes,
stdout
-spammingProbieren Sie es online!
C (gcc) , 74 Bytes
Probieren Sie es online!
quelle
05AB1E , 17 Bytes
Probieren Sie es online aus oder überprüfen Sie alle Testfälle .
Erläuterung:
quelle