Das Banach-Tarski-Paradoxon besagt, dass Sie bei einer Kugel im dreidimensionalen Raum die Kugel in eine endliche Anzahl von Punkt-Teilmengen zerlegen können. Diese nicht zusammenhängenden Punktmengen können dann wieder zusammengesetzt werden, um zwei Kopien der ursprünglichen Kugel zu erzeugen. Sie hätten dann theoretisch zwei identische Bälle.
Der Vorgang des Zusammenbaus besteht darin, nur die oben genannten Punkt-Teilmengen zu verschieben und sie zu drehen, ohne ihre räumliche Form zu ändern. Dies kann mit nur fünf disjunkten Teilmengen erfolgen.
Disjunkte Mengen haben definitionsgemäß keine gemeinsamen Elemente. Wo A
und B
sind zwei beliebige Punkt-Teilmengen der ursprünglichen Kugel, die gemeinsamen Elemente zwischen A
und B
ist eine leere Menge. Dies wird in der folgenden Gleichung gezeigt.
Für die disjunkten Mengen unten bilden die gemeinsamen Mitglieder eine leere Menge.
Die Herausforderung
Schreiben Sie ein Programm, das eine Eingabe-ASCII- "Kugel" und eine doppelte "Kugel" ausgeben kann.
Eingang
Hier ist ein Beispiel für eine Eingabekugel:
##########
###@%$*.&.%%!###
##!$,%&?,?*?.*@!##
##&**!,$%$@@?@*@&&##
#@&$?@!%$*%,.?@?.@&@,#
#,..,.$&*?!$$@%%,**&&#
##.!?@*.%?!*&$!%&?##
##!&?$?&.!,?!&!%##
###,@$*&@*,%*###
##########
Jede Kugel wird durch Rauten umrissenen ( #
) und mit einem der These Zeichen gefüllt: .,?*&$@!%
. Jede Eingabe besteht aus 22x10 Zeichen (Breite nach Höhe).
Ein Duplikat erstellen
Zunächst erhält jeder Punkt innerhalb des Balls einen nummerierten Punkt basierend auf seinem Index in .,?*&$@!%
. Hier ist das obige Beispiel, einmal nummeriert:
##########
###7964151998###
##86295323431478##
##5448269677374755##
#75637896492137317572#
#21121654386679924455#
##1837419384568953##
##85363518238589##
###2764574294###
##########
Dann wird jeder Punkt um eins nach oben verschoben (neun geht zu eins):
##########
###8175262119###
##97316434542589##
##6559371788485866##
#86748917513248428683#
#32232765497781135566#
##2948521495679164##
##96474629349691##
###3875685315###
##########
Schließlich wird jeder neue Punktwert wieder in das entsprechende Zeichen umgewandelt:
##########
###!.@&,$,..%###
##%@?.$*?*&*,&!%##
##$&&%?@.@!!*!&!$$##
#!$@*!%.@&.?,*!*,!$!?#
#?,,?,@$&*%@@!..?&&$$#
##,%*!&,.*%&$@%.$*##
##%$*@*$,%?*%$%.##
###?!@&$!&?.&###
##########
Ausgabe
Diese beiden Bälle werden dann in dieser Form nebeneinander ausgegeben (durch vier Leerzeichen an den Äquatoren getrennt):
########## ##########
###@%$*.&.%%!### ###!.@&,$,..%###
##!$,%&?,?*?.*@!## ##%@?.$*?*&*,&!%##
##&**!,$%$@@?@*@&&## ##$&&%?@.@!!*!&!$$##
#@&$?@!%$*%,.?@?.@&@,# #!$@*!%.@&.?,*!*,!$!?#
#,..,.$&*?!$$@%%,**&&# #?,,?,@$&*%@@!..?&&$$#
##.!?@*.%?!*&$!%&?## ##,%*!&,.*%&$@%.$*##
##!&?$?&.!,?!&!%## ##%$*@*$,%?*%$%.##
###,@$*&@*,%*### ###?!@&$!&?.&###
########## ##########
Hinweis: Das Verschieben der Punktwerte und späterer Zeichen ist ein Symbol für die Rotationen, die ausgeführt werden, um die Punktteilmengen (Zeichengruppierungen) wieder zusammenzusetzen.
Antworten:
Pyth, 21 Bytes
Probieren Sie es online aus: Demonstration
Endlich ein Anwendungsfall für
.r
.Erläuterung
Die Endlosschleife wird unterbrochen, wenn kein Eingang mehr verfügbar ist.
quelle
Rubin, 65
Funktioniert hervorragend, wenn die Eingabe von einer Datei statt von stdin stammt:
Wenn Sie dagegen Bälle manuell eingeben möchten und die Ausgabe am Ende wünschen, probieren Sie diese 67-Byte-Version aus:
quelle
Matlab, 120
Matlab ist nicht die beste Sprache für den Umgang mit Strings.
\n
wird immer als zwei Zeichen betrachtet, was ziemlich ärgerlich ist, und Sie können nicht einfach eine Matrix aus einer Zeichenfolge mit Zeilenumbruch erstellen, sondern müssen dies manuell tun. Zumindest musste ich mich nicht um die Größe / Polsterung kümmern, da jede Linie genau die gleiche Länge hat.Beispiel Eingabe:
Beispielausgabe:
PS: Wenn ich die Eingabe so annehmen kann:
Ich brauche nur 88 Zeichen:
quelle
Rubin, 102
Im Grunde ist es nur
tr
auf den Eingang aufrufenquelle
sed (39 bytes)
quelle
CJam, 28 Bytes
Probieren Sie es online aus
Erläuterung:
quelle
Python 3.5,
968988 BytesPython 3.3,
1039695 BytesErläuterung
Python 3.3 und 3.5 werden separat aufgeführt, da sich die Art und Weise, wie
input()
Zeilenumbrüche in IDLE behandelt werden, geändert hat. Das hat 8 Bytes gespart, was cool ist.Hinweis zur Ausführung: IDLE verwenden. Wenn Sie ein Terminal verwenden, ist die Lösung für 3.3 dieselbe wie für 3.5, aber beide verschachteln die Eingabe mit der Ausgabe.
Ich habe die Symbolzeichenfolge umgekehrt
s
, um die negative Indizierung von Python zu nutzen. Dann gebe ich für jede Zeile in der Eingabe zwei Leerzeichen aus, und die Zeile mit jedem Symbol wird durch das vorangegangene Symbol ersetzt. Der Grund, warum ich nur zwei Leerzeichen eingegeben habe, ist, dass ich,
stattdessen verwendet habe+
, wodurch der gedruckten Ausgabe ein Leerzeichen hinzugefügt wird. Dies (,' ',
) hat mir ein Byte gespart+' '*4+
.Vielen Dank an xsot für das Speichern von
7 bis8 Bytes. Ich habe geänderts.find
,s.rfind
um mir zu erlauben, die Leerzeichen und Hashes in zu setzens
, wodurch die Notwendigkeit beseitigt wurde, nach zu sucheny in s
. Außerdem wurde ein Platz gespart. BEARBEITEN: Zurückgesetzt auf,s.find
weil##
ich mich aufgrund des Vorhandenseins von jetzt nicht mehr+1
um einen Indexfehler sorgen muss.quelle
input()
verändert hat? Ich kann keine Unterschiede zwischen den Dokumentationen 3.4 und 3.5 feststellen .Retina ,
4539 BytesVerwenden Sie das
-s
Flag, um den Code aus einer einzelnen Datei auszuführen .Die erste Stufe dupliziert jede durch getrennte Zeile, um
" ; "
zu erhaltenDann betrifft die zweite Stufe nur Zeichen, die in Übereinstimmungen von gefunden werden
;.*
, dh nur die zweite Hälfte jeder Zeile. Diese Zeichen werden dann über die folgende Korrespondenz transliteriertWobei die ersten 9 Paare die Zeichen in der Kugel "erhöhen" und das letzte Paar das Semikolon in ein anderes Leerzeichen verwandelt.
quelle
Python 2, 77 Bytes
quelle
Perl, 59 Bytes
56 Byte Code plus 3 Byte,
-p
da dieser in einer Datei gespeichert werden muss.Anwendungsbeispiel:
quelle
05AB1E (Legacy) , 21 Byte
Verwendet die Vorgängerversion von 05AB1E, da der Filter
ʒ
mit implizity
als foreach zum Drucken verwendet werden konnte, während mit der neuen Version die tatsächliche for-each-Schleifev
mit explizity
verwendet werden sollte, die 1 Byte länger ist.Probieren Sie es online aus.
Erläuterung:
Hier eine Version, die auch in der neuen Version von 05AB1E funktioniert ( Dank an @Grimy ):
05AB1E , 21 Bytes
Probieren Sie es online aus.
Erläuterung:
quelle
TFD?4ú".,?*&$@!%"DÀ‡,
(Eingabe garantiert genau 10 Zeilen).₂j
ist eine schöne (obwohl gleiche Byte) Alternative für4ú
, da die Breite 26 Zeichen garantiert ist. :)