Eingabe : Entweder eine oder zwei Zeichenfolgen von '0' und '1'. Wenn es 2 gibt, werden sie durch ein Leerzeichen getrennt. Alle Saiten haben eine Länge von mindestens 1.
Ausgabe : Wenn eine Zeichenfolge eingegeben wurde, werden 2 ausgegeben. Wenn 2 eingegeben wurden, wird 1 ausgegeben. Die Ausgabezeichenfolgen können beliebig sein, aber wenn Sie Ihr Programm mit Eingabe A ausführen, erhalten Sie B, dann muss die Ausführung mit B A ergeben (wenn die Eingabe 111 11
ergibt 00000
, 00000
muss die Eingabe ergeben 111 11
).
Das heißt, wenn Sie Ihr Programm an sich selbst weiterleiten, sollten Sie alles zurückerhalten, was Sie eingegeben haben. Wenn Ihr Programm foo heißt, können Sie das folgendermaßen testen:
>echo 101 101|foo|foo
101 101
Um die Verwendung von Brute-Force-Techniken zu verhindern, sollte Ihr Code in weniger als 10 Sekunden mit 1000-stelligen Zeichenfolgen ausgeführt werden können. Meine Python-Lösung hierfür benötigt weniger als 1 Sekunde für 10.000-stellige Zeichenfolgen, daher sollte dies kein Problem sein.
Der kürzeste Code gewinnt.
quelle
if x not in d:
mitif(x in d)-1:
und speichern ein Byte.Python, 326
Beispiel für Ein- / Ausgänge:
quelle
Perl 5, 197 Zeichen
Mit einigen Zeilenumbrüchen:
Dieses Programm besteht aus zwei Bijektionen:
Ein Paar natürlicher Zahlen kann einer Binärzeichenfolge zugeordnet werden, indem eine in eine Basis-2-Zahl und die andere in fremde führende Nullen umgewandelt wird.
n
Diese Funktion ist undN
ist sein Inverses (außer , dassN
Verwendungen$_
als Parameter).Ein Paar natürlicher Zahlen kann unter Verwendung der Cantor-Paarungsfunktion einer einzelnen natürlichen Zahl zugeordnet werden . Der erste
map
Block ist diese Funktion und der zweite ist seine Umkehrung.Somit werden zwei Binärzeichenfolgen in vier Zahlen aufgeteilt, in zwei Zahlen kombiniert und dann zu einer Binärzeichenfolge kombiniert - oder umgekehrt.
Getestet an 100 zufälligen Eingaben jedes Typs mit Zeichenfolgen mit bis zu 8 Symbolen. Ich habe viele Möglichkeiten gefunden, dies etwas kürzer zu machen, aber ich werde aufhören und es veröffentlichen. Wenn es Raum für weitere Optimierungen gibt, liegt dies wahrscheinlich an den arithmetischen Ausdrücken.
quelle
1111111111111111111111111111111111111111111111111111111111111111
(641
s) scheint abzustürzen, und die Eingabe des Paares0
und von 501
s ergibt das gleiche Ergebnis wie0
und 511
s, die beide 641
s ausgeben . Ich denke, es gibt eine Art Überlauf mit der Anzahl der führenden0
s, daher könnte eine Lösung darin bestehen, den AusgabewertN
aus einer Cantor-Paarung von EingabewertenN
und denn
Wert aus einer Paarung vonn
Werten zu erhalten (oder umgekehrt für die Umkehrung). Ich bin allerdings ein Perl Noob, also hätte ich vielleicht etwas falsch gemacht.Perl, 56 Zeichen
+1 Zeichen für
-p
Befehlszeilenschalter hinzugefügtquelle
Python, 394
Ich bin sicher, dass dies weiter gespielt werden kann, aber dieser Monolith verwendet die Cantor-Pairing-Funktion und ihre Umkehrung.
Erläuterung
Es gibt eine natürliche Assoziation zwischen einer Binärzeichenfolge und einem Paar natürlicher Zahlen: Die erste Zahl des Bildes ist die Anzahl der führenden Nullen und die zweite ist der ganzzahlige Wert der Binärzahl. Zu wissen, dass wir haben:
S ~ N^2
und mit der Cantor-Bijektion
N ~ N^2
deshalb:
S ~ N^2 ~ N^4 ~ S^2
S ~ S^2
Wobei S aus allen Binärzeichenfolgen besteht. Diese Lösung implementiert die Bijektion zwischen S und S ^ 2.
quelle