Einführung
Ich weiß nicht besonders wissen , wo die Fizz Buzz Trend herkam. Es ist vielleicht nur ein Mem oder so, aber es ist etwas populär.
Herausforderung
Ihre Aufgabe heute ist es, Fizz Buzz in eine Binärdatei (0, 1) umzuwandeln und diese Binärdatei in Text umzuwandeln. Ziemlich normales Zeug.
Wie funktioniert das?
FizzBuzzBuzzFizzBuzzFizzFizzFizz FizzBuzzBuzzFizzBuzzFizzFizzBuzz würde in 01101000 01101001 übersetzen, dann würde das in "hi" übersetzen
Einschränkungen
- Die Eingabe ist in binärer Hinsicht Fizz Buzz (siehe Beispiele unten).
- Die Ausgabe muss Text sein.
- Sie können davon ausgehen, dass der FizzBuzz-Eingang richtig ist.
- Das ist Code-Golf , der Gewinn mit den kürzesten Bytes.
Eingang
FizzBuzzBuzzFizzBuzzFizzFizzFizzBuzzBuzzFizzBuzzFizzFizzBuzz FizzFizzBuzzFizzFizzFizzFizzBuzz
Ausgabe
"Hallo!"
Antworten:
C 59 Bytes
Magische Zahlen, magische Zahlen überall!
(Auch C kürzer als Python, JS, PHP und Ruby? Unbekannt!)
Dies ist eine Funktion, die eine Zeichenfolge als Eingabe und Ausgabe für STDOUT verwendet.
Komplettlösung
Die Grundstruktur ist:
Hier ist "stuff inside" eine Reihe von Code, gefolgt von einem
,*s++
Kommaoperator, der nur den Wert seines zweiten Arguments zurückgibt. Daher durchläuft dies die Zeichenfolge und setzt sie*s
auf jedes Zeichen, einschließlich des nachfolgenden NUL-Bytes (da postfix++
den vorherigen Wert zurückgibt), bevor es beendet wird.Werfen wir einen Blick auf den Rest:
Das Abschälen des Ternär- und Kurzschlusses
||
kann erweitert werdenWoher kommen diese magischen Zahlen? Hier sind die binären Darstellungen aller beteiligten Zeichen:
Zuerst müssen wir Leerzeichen und NUL vom Rest der Zeichen trennen. So wie dieser Algorithmus funktioniert, speichert er einen Akkumulator der "aktuellen" Zahl und gibt ihn immer dann aus, wenn er ein Leerzeichen oder das Ende der Zeichenfolge erreicht (dh
'\0'
). Wenn wir das bemerken' '
und'\0'
die einzigen Zeichen sind, bei denen keines der beiden niedrigstwertigen Bits gesetzt ist, können wir das Zeichen bitweise UND mit0b11
Null verknüpfen, wenn das Zeichen ein Leerzeichen oder NUL ist und ansonsten ungleich Null.Wenn wir tiefer graben, haben wir im ersten "Wenn" -Zweig jetzt einen Charakter, von dem einer ist
FBizu
. Ich entschied mich nur, den Akku aufF
s undB
s zu aktualisieren , also brauchte ich eine Möglichkeit, dieizu
s herauszufiltern . PraktischerweiseF
undB
beide haben nur das zweite, dritte oder siebtniedrigste gesetzte Bit, und alle anderen Zahlen haben mindestens ein anderes gesetztes Bit. Tatsächlich haben sie alle entweder das erste oder das viertniedrigstwertige Bit. Daher können wir bitweise UND mit0b00001001
, was 9 ist, was andernfalls 0 fürF
undB
und ungleich Null ergibt .Nachdem wir festgestellt haben , dass wir ein
F
oderB
können wir sie kartieren0
und die1
jeweils durch ihre Modul 5 zu nehmen, weilF
ist70
undB
ist66
. Dann das Snippetist nur eine golferische Art zu sagen
was auch ausgedrückt werden kann als
Dadurch wird das neue Bit an der niedrigstwertigen Position eingefügt und alles andere um 1 verschoben.
"Aber warte!" du könntest protestieren. "
i
Wann wird der Wert nach dem Drucken wieder auf 0 zurückgesetzt?" Nun,putchar
wirft sein Argument auf einunsigned char
, das gerade mal 8 Bit groß ist. Das bedeutet, dass alles, was nach dem 8. Bit mit der geringsten Signifikanz liegt (dh der Müll aus früheren Iterationen), weggeworfen wird, und wir müssen uns keine Sorgen machen.Dank @ETHproductions für das Vorschlagen ersetzen
57
mit9
, Speichern eines Byte!quelle
Gelee , 9 Bytes
Probieren Sie es online!
quelle
Bash + Coreutils,
6150 Bytes(-11 Bytes dank Doorknob !)
Probieren Sie es online!
quelle
sed
mittr FB 01|tr -d izu
zu speichern 11 Bytes.Python 3 ,
16910193918581 BytesProbieren Sie es online!
Erläuterung:
quelle
lambda
JavaScript (ES6),
80 bis79 Bytequelle
.replace(/..zz/g,
,'0b'+
etc.n
erlaubt es, 79 zu erreichen. Leider erfordert dies einen zusätzlichen Platz, der dem Eingang hinzugefügt wird. Daher der eher teure`${s} `
.Japt ,
26241917 BytesProbieren Sie es online!
2 Bytes dank @Shaggy & 2 Bytes dank @ETHproductions eingespart
Erläuterung
quelle
})
durch ersetzenÃ
. Es gibt definitiv mehr zu retten, aber ich kann es auf meinem Handy nicht ganz zum Laufen bringen.ò4...q n2
mitë4...n2
(ë4
nicht das gleiche wieò4
, außer der Rückkehr nur das erste Element, seltsam, es scheint nicht dokumentiert zu werden)Ruby,
656360 BytesDies ist eine anonyme Prozedur, die Eingaben entgegennimmt und Ausgaben als Zeichenfolge ausgibt.
quelle
JavaScript (ES6),
95888581 ByteVersuch es
quelle
+
ist kürzer alsparseInt
+(m[0]<"F")
könnte aufm<"F"|0
Perl 5, 33 Bytes
Ersetzt 'F' und 'B' in der Eingabe durch 0 bzw. 1 und löscht die anderen Zeichen. Anschließend wird
pack
diese Bitfolge mithilfe der Perl- Funktion in ASCII-Zeichen umgewandelt.quelle
-p0
Befehlszeilenoption erheblich verkürzen (die Sie<>=~r
für die Eingabe sparen und es Ihnen ermöglichen würde, sie zu verwenden,$_=
anstatt sie zu verwendenprint()
). Je nachdem, wie Sie mit Zeilenumbrüchen umgehen möchten, benötigen Sie möglicherweise nicht einmal die0
. (Auch wenn Sie Strafen für Befehlszeilenoptionen vermeiden möchten,say
ist dies kürzer alsprint
.)$_=pack'B*',y/FB -z/01/dr
senken Sie Ihren Score für Ihr Programm auf 26 Byte.Python 2 ,
90838281 Bytes-1 Byte dank totalhuman
-1 Byte dank Martmists
-1 Byte dank Jonathan Frech
Probieren Sie es online!
quelle
*1 for
*1for
*1
zum Konvertieren von Booleschen Werten in Ganzzahlen verwenden, können Sie ein Byte speichern, indem Sie a+
:(l<'D')*1for
can be verwenden+(l<'D')for
.Leerzeichen, 123 Bytes
Sichtbare Darstellung:
Unverdecktes Programm:
Die Implementierung ist nicht sonderlich merkwürdig. Das einzig wahre Golfspiel besteht in einer merkwürdigen Wiederverwendung von Provisorien, und es ist nicht wichtig, dass das unbegrenzte Stapelwachstum dazu beiträgt, weitere Bytes zu überfliegen.
quelle
Oktave ,
595753 BytesDies funktioniert bei TIO nicht, da die Kommunikations-Toolbox nicht implementiert ist. Es funktioniert einwandfrei, wenn Sie es in Octave-online kopieren und einfügen . Es ist noch nicht einmal nah dran, in MATLAB mit Code zu arbeiten.
Es gelang, zwei Bytes zu sparen, indem die Matrix nach dem Umdrehen transponiert wurde, anstatt umgekehrt.
Erläuterung:
Beginnen wir in der Mitte von
<code>
:Nennen wir den resultierenden booleschen (binären) Vektor für
t
.quelle
Perl 5, 28 Bytes + 4 Bytes für Flags = 32 Bytes
Laufen Sie mit den Fahnen
-040pE
-040
Setzt das Datensatztrennzeichen auf ein Leerzeichen, sodass Perl jede Gruppe von FizzBuzzes als separate Zeile ansieht, diese Zeilen dann in einer Schleife durchläuft, F in 0, B in 1 ändert, alles andere löscht und dann in binär und von dort in ASCII konvertiert.quelle
Gelee , 9 Bytes
Probieren Sie es online!
-3 Bytes dank Erik dem Outgolfer
quelle
PHP, 67 Bytes
Limitiert auf 8 Buchstaben
Probieren Sie es online!
PHP, 77 Bytes
Probieren Sie es online!
quelle
Brain-Flak , 107 Bytes
Probieren Sie es online!
+3 Bytes für das
-c
Flag.Erläuterung
quelle
q / kdb +,
41403733 BytesLösung:
Beispiel:
Erläuterung:
Teilen Sie die Eingabezeichenfolge auf
" "
, umFizzBuzz...
beim ersten Zeichen (dh0 4 8 ... 28
) eindeutige Listen von , index in jede dieser Listen zu geben . Gibt eine boolesche Liste zurück, die davon bestimmt wird, ob jedes Zeichen"B"
(ASCII66
) ist. Konvertieren Sie diese Listen zur Basis 10 und wandeln Sie das Ergebnis in eine Zeichenfolge um.quelle
Haskell, 72 Bytes
Probieren Sie es online!
Wie es funktioniert
quelle
JavaScript ES6 - 98 Bytes
zu viele Bytes, aber zumindest lesbar
Als Funktion definiert sind es 98 Bytes
Prüfung:
Erläuterung:
Entspricht den Buchstaben F und B sowie allen anderen Buchstaben als Gruppen
ist eine Funktion, die die Gruppen erfasst, 0 für F und 1 für B zurückgibt oder ''
c ist das Zeichen, das mit
F und B übereinstimmt. Jetzt sind es Parameter!
der 3 .. Gruppe wird als Parameter ausgelassen
F und B sind,
undefined
wenn die 3. Gruppe übereinstimmt.B ist,
undefined
wenn die Gruppe F übereinstimmtDie resultierende 0100 .. etc Zeichenfolge
wird in Scheiben von 8 Bytes geschnitten
und verarbeitet als 0b binäre Zeichenfolge
quelle
s=>s.replace( ...
. Bitte geben Sie auch die Anzahl der Bytes in die Kopfzeile Ihrer Antwort ein.let
, anonymen Funktionen nicht zu akzeptieren.shortC , 35 bytes
Conversions in diesem Programm:
A
-int main(int argc, char **argv){
W
-while(
@
-argv
P
-putchar(
);}
Schwer basiert auf der Antwort von Doorknob.
quelle
APL (Dyalog Classic) , 17 Byte
Erläuterung
Probieren Sie es online!
quelle
05AB1E , 15 Bytes
Probieren Sie es online!
quelle
Google Sheets, 94 Bytes
Ich bin nicht mit FizzBuzz-Binärdateien vertraut, aber es scheint, dass sie durch Leerzeichen abgegrenzt sind, sodass sich diese Formel darauf stützt. Die Logik ist ziemlich einfach:
Fizz
mit0
undBuzz
mit1
quelle
Java 8,
117115 BytesIch bezweifle , können Sie wie die meisten anderen Antworten in Java viele der Phantasie regex Ersatz zu tun, vor allem , weil man nichts mit den erfassten Capture-Gruppen in Java-Regexes tun können .. (Ie
"$1".charAt(...)
oder"$1".replace(...)
nicht möglich sind zum Beispiel.)Erläuterung:
Probieren Sie es hier aus.
quelle
J , 20 Bytes
Probieren Sie es online!
quelle