Die Geschenke wurden geöffnet. Die Hackfleischpasteten sind gegessen worden. Die Star Wars wurden gesehen. Die Weihnachtszeit neigt sich dem Ende zu. Inzwischen haben Sie vielleicht ein paar Weihnachtscracker gezogen . Wenn Sie Glück haben, haben Sie möglicherweise anstelle des üblichen nutzlosen Plastikspielzeugs einen Mystery Calculator gewonnen, mit dem Sie Ihre Freunde und Verwandten in Erstaunen versetzen können .
Dieser Trick besteht aus 6 Karten, auf denen jeweils ein 4 × 8-Raster mit Zahlen gedruckt ist. Jede Karte enthält eine andere Teilmenge der ganzen Zahlen [1,63]
. Der Zauberer fordert Sie auf, eine Nummer von einer Karte auszuwählen und diese Nummer geheim zu halten. Der Zauberer fragt dann, welche Karten diese Nummer haben. Mit diesem Wissen wird der Magier auf magische Weise in der Lage sein, die erratene ursprüngliche Zahl zu bestimmen und offenzulegen.
Geben Sie den vollständigen Satz von 6 Mystery Calculator-Karten wie folgt aus:
1 3 5 7 9 11 13 15
17 19 21 23 25 27 29 31
33 35 37 39 41 43 45 47
49 51 53 55 57 59 61 63
- - - - - - - - - - -
2 3 6 7 10 11 14 15
18 19 22 23 26 27 30 31
34 35 38 39 42 43 46 47
50 51 54 55 58 59 62 63
- - - - - - - - - - -
4 5 6 7 12 13 14 15
20 21 22 23 28 29 30 31
36 37 38 39 44 45 46 47
52 53 54 55 60 61 62 63
- - - - - - - - - - -
8 9 10 11 12 13 14 15
24 25 26 27 28 29 30 31
40 41 42 43 44 45 46 47
56 57 58 59 60 61 62 63
- - - - - - - - - - -
16 17 18 19 20 21 22 23
24 25 26 27 28 29 30 31
48 49 50 51 52 53 54 55
56 57 58 59 60 61 62 63
- - - - - - - - - - -
32 33 34 35 36 37 38 39
40 41 42 43 44 45 46 47
48 49 50 51 52 53 54 55
56 57 58 59 60 61 62 63
Die Ausgabe kann eine letzte nachgestellte Zeile enthalten oder nicht. Es darf kein Leerzeichen nachgestellt werden. Jede Karte ist durch 11 -
Perforationen getrennt.
- md5sum mit abschließender newline:
7aa2d9339b810ec62a2b90c5e11d6f4a
- md5sum ohne letzte newline:
e9abe4e32dca3e8fbfdaa4886fc5efd2
Für diejenigen unter Ihnen, die eher Windows-orientiert sind, werde ich auch CRLF
Zeilenenden zulassen . In diesem Fall sind die md5s:
- md5sum mit abschließender newline:
e4f16ff9752eee2cedb5f97c7b5aec6d
- md5sum ohne letzte newline:
78c560eed3b83513e3080117ab5dc5fa
quelle
Antworten:
Python 2 ,
99969391 BytesWird mit einem Fehler beendet, der standardmäßig zulässig ist .
Probieren Sie es online! oder überprüfen Sie den MD5-Hash .
Wie es funktioniert
Nach der Initialisierung k als 1 geben wir eine Endlosschleife ein, die den folgenden Code ausführt.
tuple(n for n in range(64)if k&n)
Erzeugt ein Tupel aller nicht negativen ganzen Zahlen unter 64 , für die das j- te Bit gesetzt ist, wobei j die Iterationszahl der Schleife ist, dh 2 j = k .('%2d '*7+'%2d\n')*4
erstellt zuerst die Formatzeichenfolge'%2d %2d %2d %2d %2d %2d %2d \n'
und wiederholt sie dann viermal. Dies ist eine Vorlage für jede Karte, die jede Ganzzahl im Tupel mit zwei Zeichen (vorstehende Leerzeichen) auffüllt und jede 8er- Gruppe voneinander trennt Ganzzahlen durch Leerzeichen und die Gruppen selbst durch Zeilenvorschübe .Jetzt, die
print
Aussage von Python 2 ist ein merkwürdiges Biest. Es werden mehrere durch Kommata getrennte Ausdrücke verwendet, die nacheinander gedruckt werden. Es wertet den ersten Ausdruck aus, druckt ihn aus, wertet die nächsten Ausdrücke aus, druckt ihn aus usw., bis keine Ausdrücke mehr übrig sind. Wenn dem letzten Ausdruck kein Komma folgt, wird ein Zeilenvorschub angehängt. Außerdem wird allen Ausdrücken ein Leerzeichen vorangestellt, es sei denn, sie werden am Anfang einer Zeile gedruckt.In jeder Iteration wird zuerst das Ergebnis der Anwendung der Formatzeichenfolge auf das Tupel gedruckt. Wir stehen am Anfang einer Zeile, daher wird kein Leerzeichen vorangestellt.
Dann versuchen wir, das Ergebnis von auszudrucken
11/(k<32)*' -'
. Wenn k <32 , wird dieser Ausdruck zu ausgewertet' - - - - - - - - - - -'
. Auch hier stehen wir am Anfang einer Zeile, daher wird kein Leerzeichen vorangestellt. Nach diesem Ausdruck steht kein Komma.print
Fügen Sie daher einen Zeilenvorschub hinzu. In der sechsten Iteration ist jedoch k = 2 5 = 32 , sodass der Versuch, auszuwerten,11/(k<32)*' -'
einen nicht erfassten ZeroDivisionError auslöst . Dies bricht die Schleife ab und beendet das Programm sofort.quelle
C (gcc), 105 Bytes
quelle
Python 2, 132 Bytes
Das Aufteilen von Sequenzen ist in Python ärgerlich.
Probieren Sie es online aus .
quelle
Jelly ,
2726 BytesProbieren Sie es online! oder überprüfen Sie den MD5-Hash .
Wie es funktioniert
quelle
G
eingebaute System ist für diese Herausforderung schwer überfordert. Ich brauchte ungefähr 10 Bytes, um das gleiche zu tun.Pip ,
494844 Bytes43 Byte Code, +1 für
-S
Flag.Probieren Sie es online!
Erläuterung
quelle
Ruby, 90 Bytes
Ungolfed
Ziemliech direkt. Die einzige Sache, die zusätzliche Erklärung erfordert, ist, wann eine Zahl mit einer neuen Zeile anstatt einer Leerstelle zu folgen ist. Dies passiert, wenn
j+1%16==0
in den ersten vier Kartenj+1%8
== 0 und in den letzten beiden. Daher wird der Ausdruck15>>i/64/4
oder die Entsprechung15>>i/256
mit UND verknüpft, umj
zu bestimmen, ob Leerzeichen oder Zeilenumbrüche erforderlich sind.quelle
JavaScript (ES6), 150 Byte
quelle
Perl 6 ,
194 11686 BytesVersuch es
Versuch es
Versuch es
(überprüfen Sie die Debug - Abschnitte für die MD5 - Ergebnisse)
Die letzten beiden wurden inspiriert / transkribiert von den Ruby und C - Implementierungen
quelle
05AB1E , 71 Bytes
Probieren Sie es online!
Probieren Sie diesen Ansatz nicht aus. Wird wahrscheinlich aus Schande löschen, um ehrlich zu sein. Die Matrix-Manipulation ist nicht meine Stärke, deshalb habe ich versucht, alle 6 Sequenzen mit brachialer Kraft zu erzeugen und sie dann schlampig zusammenzupumpen.
quelle
Batch, 249 Bytes
Gibt eine nachfolgende CRLF aus.
quelle
JavaScript (ES6),
103 bis102 ByteMD5: 7AA2D9339B810EC62A2B90C5E11D6F4A
Prüfung
Code-Snippet anzeigen
quelle
Bash / Unix-Dienstprogramme,
125124 BytesBearbeiten: Ein unnötiges ^ wurde am Ende aus dem regulären Ausdruck entfernt. Der reguläre Ausdruck wird ohnehin immer am Anfang der Zeile angezeigt.
quelle
PHP, 102 Bytes
druckt eine führende, aber keine nachfolgende neue Zeile und ein führendes Leerzeichen in jeder Zeile. Laufen Sie mit
-nr
oder versuchen Sie es online .Für PHP <5.6, ersetzen
2**$c
mit(1<<$c)
. PHP 5.5 könnte&~1<<$c?:
anstelle von verwenden%2**$c||
.Für PHP <5.5, ersetzen
"\n"[$n++%8]
mit($n++%8?"":"\n")
.Bindestriche sind aufgrund des führenden Leerzeichens ein Zeichen weniger. füge ein Leerzeichen an das erste an
str_pad
Parameter ein Leerzeichen hinzu (fügen Sie ein Leerzeichen vor der zweiten Codezeile ein), um dies zu beheben.Das Entfernen des führenden Leerzeichens erfordert stattdessen etwas Fummeln und drei zusätzliche Bytes:
printf("%c%2d",$n++%8?32:10,++$b%64);
und23
statt25
.Die führende Zeile in eine nachfolgende zu verwandeln, würde weitere drei Bytes kosten:
PHP, 109 Bytes
Entspricht allen Spezifikationen und funktioniert mit allen PHP-Versionen.
quelle
Python 2 , 89 Bytes
Probieren Sie es online!
Erläuterung:
quelle
05AB1E , 29 Bytes
Port aus @Emignas 05AB1E-Antwort hier. Danach habe ich zusätzlichen Code hinzugefügt, um ihn gemäß den Anforderungen in dieser Herausforderung zu drucken.
Probieren Sie es online oder überprüfen Sie md5sum .
Erläuterung:
quelle
JavaScript, 234 Bytes.
Ich werde später eine Erklärung schreiben.
Falls
console.log
erforderlich, würde die Byteanzahl 247 Bytes betragen.quelle