"Fit Numbers"
Sam hat eine "geniale" Idee für die Komprimierung! Kannst du helfen?
Hier ist ein Überblick über Sams Komprimierungsschema. Nehmen Sie zunächst eine Basis 10-Darstellung einer natürlichen Zahl, die streng kleiner als 2 ^ 16 ist, und schreiben Sie sie als Binärzeichenfolge ohne führende Nullen.
1 -> 1 9 -> 1001 15 -> 1111 13 -> 1101 16 -> 10000 17 -> 10001 65535 -> 111111111111111
Ersetzen Sie nun eine Gruppe von einer oder mehreren Nullen durch eine einzelne Null. Dies liegt daran, dass die Zahl magerer geworden ist. Ihre Binärzeichenfolge sieht jetzt so aus.
1 -> 1 -> 1 9 -> 1001 -> 101 15 -> 1111 -> 1111 13 -> 1101 -> 1101 16 -> 10000 -> 10 17 -> 10001 -> 101 65535 -> 111111111111111 -> 111111111111111
Jetzt konvertieren Sie die Binärzeichenfolge zurück in eine Basis 10-Darstellung und geben sie in einem beliebigen akzeptablen Format aus. Hier sind Ihre Testfälle. Die erste Ganzzahl repräsentiert eine Eingabe und die letzte Ganzzahl repräsentiert eine Ausgabe. Beachten Sie, dass sich einige Zahlen nicht ändern und daher als "fit" bezeichnet werden können.
1 -> 1 -> 1 -> 1 9 -> 1001 -> 101 -> 5 15 -> 1111 -> 1111 -> 15 13 -> 1101 -> 1101 -> 13 16 -> 10000 -> 10 -> 2 17 -> 10001 -> 101 -> 5 65535 -> 1111111111111111 -> 11111111111111 -> 65535 65000 -> 1111110111101000 -> 11111101111010 -> 16250
Sie können jede Sprache verwenden, aber bitte beachten Sie, dass Sam Standardlücken hasst. Dies ist Codegolf, damit der Code so kurz wie möglich ist, um Platz für die "komprimierten" Zahlen zu schaffen.
Hinweis: Dies ist KEIN akzeptables Komprimierungsschema. Wenn Sie dies verwenden, werden Sie sofort gefeuert.
Citation-Needed: Ich kann dieses Konzept nicht würdigen. Das kommt von @Conor O‘Brien Blog hier sehen diese OEIS Passnummern. https://oeis.org/A090078
10000
?Antworten:
05AB1E ,
86 BytesErläuterung
Probieren Sie es online aus
2 Bytes gespart dank Adnan
quelle
„00'0
durch00¬
:) ersetzen .Bash + GNU-Dienstprogramme, 27
Eingang von STDIN gelesen.
quelle
dc
:)JavaScript (ES6), 41 Byte
quelle
Qualle , 20 Bytes
Probieren Sie es online!
Erläuterung
i
eingegeben wird.b
konvertiert es in binär (Liste der Ziffern)\d
mit Argumenten2
und die Ziffernliste giltd
(Binärziffern zu Zahl) für jede Teilzeichenfolge der Länge 2 der Ziffernliste.*
Nimmt ein Zeichen für die Ergebnisse: 00 geht auf 0, alles andere auf 1.,1
setzt eine 1 ans Ende, damit die letzte Ziffer nicht verloren geht.# S
wählt ausbi
den Ziffern, die eine 1 in der oben berechneten Liste haben: diejenigen, die nicht die linke Hälfte von 00 sind.d
konvertiert zurück in Zahl undp
druckt das Ergebnis.quelle
Python 2, 36 Bytes
Eine direkte rekursive Implementierung ohne integrierte Basiskonvertierungs- oder Zeichenfolgenoperationen. Weniger golfen:
Wenn
n
es sich um ein Vielfaches von 4 handelt, endet es in zwei binären Nullen , sodass wir eine durch Teilen durch 2 abschneiden. Andernfalls teilen wir unsn
auf(n%2) + 2*(n/2)
, lassen die letzte binäre Ziffer inn%2
Ruhe und greifen auf die anderen Ziffern zurückn/2
.quelle
n%2
überflüssig?|n
führt zu falschen Ergebnissen.(n%4>0)|n%2
mit(n%4>0)
.(f(n/2)<<(n%4>0)) | n%2
.Bash (sed + bc),
605543 Bytesbearbeiten:
sed -E 's/0+
insed 's/00*
und geändert in Echo und Pipe, mit denen der Wert an bc übergeben wird<<<
.Beispiel:
quelle
echo "obase=2;$1"|bc|sed 's/00*/0/g;s/^/ibase=2;/'|bc
ist 2 Bytes kürzerecho $[2#`bc<<<obase=2\;$1|sed s/00\*/0/g`]
. Aberdc
undtr
mach es viel kürzer .bc<<<"obase=2;$1"|sed 's/00*/0/g;s/^/ibase=2;/'|bc
tr -s 0
anstelle von sed verwenden, können Sie bis zu 36 Bytes erreichenPerl 6 ,
3127 BytesErläuterung:
Beispiel:
quelle
MATL,
1198 BytesDiese Version funktioniert nur in MATLAB, da
strrep
in MATLAB logische Eingaben verarbeitet werden können. Hier ist eine Version, die in Octave (9 Bytes) (und damit im Online-Interpreter) funktioniert und die logischen Eingaben explizit in type umsetztdouble
.Probieren Sie es online aus
Erläuterung
quelle
Python 3,
55, 50 Bytes.4 Bytes gespart dank Sp3000.
Ziemlich einfache Lösung.
quelle
0b
und einfacheval
stattdessen behalten ?lambda x:eval(re.sub('0+','0',bin(x))) <insert newline here> import re
Javascript (ES6), 40 Byte
quelle
console.log(+('0b'+parseInt(process.argv[1]).toString(2).replace(/0+/g,0)))
.N=>
einer gültigen Funktion.Eigentlich 14 Bytes (nicht konkurrierend)
Probieren Sie es online!
Diese Einsendung ist nicht konkurrierend, da ein Bugfix für gemacht
Æ
wurde, nachdem diese Herausforderung veröffentlicht wurde.Erläuterung:
quelle
Ruby,
3531 Bytes-2 Bytes dank @Doorknob
Siehe es auf repl.it: https://repl.it/CnnQ/2
quelle
Jelly ,
137 Bytes6 Bytes danke an Zgarb für seinen Algorithmus .
Probieren Sie es online!
quelle
PHP,
5351 BytesÜbernimmt ein Argument von der Konsole.
Dank an:
@manatwork "0" durch 0 ersetzen
quelle
"0"
und0
werden genauso gehandhabt.Perl, 38 + 1 (
-p
) = 39 BytesNeeds
-p
flag to run (Ich habe-l
flag hinzugefügt , um es lesbarer zu machen, aber es wird sonst nicht benötigt):Zu dem Code gibt es viel zu sagen: Er konvertiert die Zahl in binary (
sprintf"%b"
), ersetzt dann Blöcke mit Nullen durch nur eine Null und konvertiert das Ergebnis in decimal (oct"0b".
).quelle
C #,
11291 Bytes-8 Bytes dank TuukkaX
quelle
int f(int x){var a=Regex.Replace(Convert.ToString(x,2),"0+","0");return Convert.ToInt32(a,2);}
- 94 Bytes unter Verwendung von Regex. Ich habe gesehen, dass viele C # -Lösungen nicht enthaltenSystem.Text.RegularExpressions
sind. Vielleicht ist dies auch hier zulässig ...?int f(int x){return Convert.ToInt32(Regex.Replace(Convert.ToString(x,2),"0+","0"),2);}
86 Bytes.Java, 75
Testprogramm:
quelle
PARI / GP ,
5443 Bytesquelle
PowerShell v2 +, 69 Byte
( Featureanforderung Eine kürzere Möglichkeit zum Konvertieren in / aus Binärdateien in PowerShell )
Übernimmt Eingaben
$args[0]
, verwendet das eingebaute .NET[convert]::ToString(int,base)
konvertiert die Eingabe-Ganzzahl in eine binäre Basiszeichenfolge. Das wird durch die gefiltert-replace
, um alle Läufe von einer oder mehreren Nullen zu entfernen0
. Diese resultierende Zeichenfolge wird über zurück in die andere Richtung gesendet[convert]::ToInt32(string,base)
, um die Binärdatei wieder in eine Ganzzahl umzuwandeln. Diese Ganzzahl bleibt in der Pipeline und die Ausgabe ist implizit.Testfälle
quelle
Referenzimplementierung in SILOS "nur" 417 Byte
Golf gespielt
Hier ist die Referenzimplementierung völlig ungolfed. Als Bonusfunktion werden die Schritte ausgegeben, die für eine Antwort erforderlich sind.
Auf Wunsch wurde die Transpilation gelöscht. Sie können auch den Bearbeitungsverlauf anzeigen, um ihn wiederherzustellen. Andernfalls wechseln Sie zu diesem Repo einen Dolmetscher.
Beispielausgabe für 65000
quelle
Pyth, 12
Online.
quelle
Netzhaut , 30 Bytes
Probieren Sie es online!
Und hier dachte ich, Retina wäre eine der ersten Antworten ...
quelle
Java,
152143138 Bytesquelle
Integer i;
Teil ist einfach und fantastisch!Dyalog APL , 19 Bytes
TryAPL online!
Diese Funktion ist wirklich eine "Spitze" von zwei Funktionen, die erste Funktion ist:
2∘⊥⍣¯1
das inverse von binary- zu -decimal Umwandlung, dh binary- aus -decimal Umwandlungzwei
2
gebunden ist∘
an -bis-dezimalen⊥
Wiederholen der Operation
⍣
negativ Zeit¯1
(dh einmal, aber invertiert)In der zweiten Funktion wird das obige binäre Ergebnis dargestellt durch
⍵
:{2⊥⍵/⍨~0 0⍷⍵}
0 0⍷⍵
Boolesch für den~
Punkt, an dem {0, 0} in in Boolescher Negation beginnt. Jetzt haben wir ᴛʀᴜᴇ überall, aber bei Nullen in⍵/⍨
Nullläufen wird dies zum Filtern von ⍵ verwendet. Dadurch werden unsere unerwünschten Nullen entfernt2⊥
, die die Binärzahl in die Dezimalzahl umwandelnquelle
TSQL, 143 Bytes
Keine Verwendung von Build-Ins zum Konvertieren von und nach Binär.
Golf gespielt:
Ungolfed:
Geige
quelle
CJam, 16
Probieren Sie es online aus
Es ist ziemlich lang, weil es an Regex mangelt.
Erläuterung:
quelle
Java, 64 Bytes
Testprogramm
quelle
CJam , 23 Bytes
Probieren Sie es online!
Erläuterung
quelle
Ruby,
37-35BytesZwei Bytes dank Handarbeit gespart.
Der naive Ansatz. (:
quelle
"0"
sehen, den zweiten Punkt in sepp2k ‚s Spitze . Wenn.to_i(2)
nicht eindeutig ist, wo ein Parameter hingehört, sind die Klammern optional.C 37 Bytes
quelle