Schreiben Sie ein Programm oder eine Funktion, die den linken und rechten Wert der Würfel als ganze Zahlen (1-6) nimmt und den Wert oben zurückgibt.
Würfellayout:
+---+
| 1 |
+---+---+---+---+
| 2 | 3 | 5 | 4 |
+---+---+---+---+
| 6 |
+---+
,^.
<´ 5 `> <-- Top value
|`._,´|
.6 | 4, <-- Side values
`.|,´
Die Eingabe 6 4
kehrt also zurück 5
.
Ordnung ist wichtig:
2 3 -> 1
3 2 -> 6
Das Programm muss nicht mit ungültigen Eingabewerten arbeiten.
Um einen offensichtlichen Ansatz zu vermeiden (Verwendung einer Tabelle mit allen Kombinationen), ist die Verwendung von integrierten Textcodierungs- oder Dekomprimierungsroutinen oder einer Basiscodierung oder Ähnlichem zur Reduzierung der Größe nicht zulässig. Beachten Sie, dass die Verwendung von table weiterhin zulässig ist und auch das Rolling Ihrer eigenen Dekomprimierung zulässig ist, solange keine fertige Bibliotheksfunktion verwendet wird.
Zu Referenzzwecken finden Sie hier eine Tabelle aller Kombinationen (dh aller möglichen Ein- und Ausgänge):
23, 35, 42, 54 -> 1
14, 31, 46, 63 -> 2
12, 26, 51, 65 -> 3
15, 21, 56, 62 -> 4
13, 36, 41, 64 -> 5
24, 32, 45, 53 -> 6
Kürzester Code gewinnt, und es gelten Standardlücken.
Antworten:
Python, 30
Keine Suchanfragen, nur ein bisschen hämmern.
Die gegenüberliegenden Flächen werden paarweise als Drei-Bit-Komplemente dargestellt, was bedeutet, dass sie mit 7 XOR verknüpft sind.
Bei zwei Gesichtern aus einem Satz möchten wir ein Gesicht aus dem anderen Satz erhalten. Für
(1,2,3)
können wir dies mit XOR (^
) tun . So^
gibt die richtige Antwort bis zu drei-Bit - Komplement, was bedeutetx^7
. Wir können bedingt ergänzen durchx^7*_
.Um zu entscheiden, ob das Komplement genommen werden soll oder nicht (XOR mit 7), prüfen wir, ob das Triplett gegen die Rechtsregel verstößt. Das heißt, das
a,b
geht in der umgekehrten zyklischen Reihenfolge vonBehandlung jeder Zeile als eine der drei Kategorien. Da die Elemente in jeder Zeile Negative Mod 7 sind, können wir sie "hashen", indem wir dies tun
x*x%7
.Jede Zeile wird von den zyklisch vorherigen erhalten von 7 um 4 Modulo multipliziert, so können wir prüfen , ob diese Beziehung für hält ,
(b,a)
um zu entscheiden , ob ergänzen:a*a%7==b*b*4%7
.Dies entspricht der Überprüfung, ob modulo 7
a**2 * b**(-2)
gleich ist4
. Dab**6
gleich1
Modulo 6 ist, ist dies äquivalent zua**2 * b**4
. Da der andere mögliche Wert 2 ist (durch Überprüfen von Fällen), können wir durch Vergleichen mit 3 prüfen, ob es 4 ist.quelle
ri:Ari:B^7A7A-e<B7B-e<)=*^
min(a,7-a)
indema^7*(a>3)
ich tue , aber ich denke, dass es einen noch kürzeren Weg geben sollte. Irgendwelche Ideen?a/4*7^a
...Für die dritte Seite gibt es einen schönen Polynomausdruck modulo 7 mit zwei Seiten a und b .
oder faktorisiert
Das Modulo 7 bildet einen Rest in {0,1,2,3,4,5,6} ab.
Ich erkläre, warum es in dieser Math SE-Antwort funktioniert , obwohl ich denke, dass es wahrscheinlich ein saubereres Argument gibt, das mir fehlt. Das einzige andere Zwei-Term-Polynom, das funktioniert, ist
Das habe ich ursprünglich gefunden, indem ich mein Bit-Bashing in arithmetische Operationen umgewandelt habe. Dann habe ich eine Brute-Force-Suche über Polynome dieser Form durchgeführt, um das schönere zu finden.
Bitte fügen Sie diese Ports in Ihre bevorzugte Sprache ein. Dies ist ein CW-Beitrag.
J, 9 von Synthetica
Siehe meinen Beitrag
Dyalog APL, 9 von ngn (Tippfehler behoben von Adám)
Offen gestohlen von oben J Antwort.
TI-Basic, 14 von Timtech
Pyth, 16 von FryAmTheEggman
Definiert eine Funktion
g
aus zwei Werten.Golfscript, 18 von Peter Taylor (altes Polynom)
CJam, 18 von Martin Büttner (portiert aus Peters GolfScript) (altes Polynom)
Mathematica, 20 von Martin Büttner
Ja, das ist ein unäres Plus, und nein, es gibt keinen kürzeren Weg, der kein unäres Plus verwendet.
dc, 21 von Toby Speight
Ich muss 7 addieren,
a
um sicherzustellen, dass die Differenz immer positiv ist (dc hat einen vorzeichenbehafteten%
Operator).Julia,
2423 von Martin BüttnerCoffeeScript,
2826 von rink.attendant.6JavaScript (ES6),
2826 von rink.attendant.6Im Wesentlichen dasselbe wie CoffeeScript.
Python 28 von xnor
Bash, 31
Nichts Besonderes:
oder alternativ:
Ein weiterer (längerer, aber vielleicht interessanter) Ansatz .
Nim, 36 von Sillesta
Java 7,
4644 von rink.attendant.6Java 8,
2523 von Kevin CruijssenPHP,
4947 von rink.attendant.6Batch, 52 Unclemeat
CMD unterstützt den wahren Modul nativ nicht (kann also keine negativen Zahlen verarbeiten) - daher
%%7+7)%%7
.LESS (als parametrisches Mixin ),
6260 von rink.attendant.6Siehe meinen Beitrag unten .
05AB1E,
108 von Emigna (-2 Bytes von Kevin Cruijssen)Probieren Sie es online aus.
Haskell,
312725 nach generischem AnzeigenamenProbieren Sie es online!
Excel, 27 von von Wernisch
Excel VBA, 25 von Taylor Scott
Forth (gforth) 41 von reffu
Probieren Sie es online!
C #, 23 von Kevin Cruijssen
quelle
(ab)**5 % 7 == (ab)**-1 % 7 == a^b^7
für allea
,b
in1..6
so dassa != b
unda+b != 7
.**5
als Proxy für die Invertierung von Modulo 7 verwendete.7|3×××+×-
: 7-Rest des 3-fachen des Produkts multipliziert mit der Summe multipliziert mit der Differenz (zwischen den beiden Zahlen).CJam,
4328 BytesKeine Ahnung, ob ein vollständiger tabellenbasierter Ansatz kürzer sein wird, aber hier ist:
Eingabe wie
Ausgabe:
Dies ist eine Mischung aus meinem vorherigen Algorithmus, um das richtige Gesicht aus 2 Gesichtern und xnors Annäherung an xors zu bestimmen.
Probieren Sie es hier online aus
quelle
WENIGER, 62 Bytes
Verwendet den Algorithmus in diesem Beitrag :
Es könnte kürzer sein, wenn der ganzzahlige Wert verwendet wurde, aber um ihn anzuzeigen, musste ich die CSS-
content
Eigenschaft verwenden, die eine Variableninterpolation erforderte .Nichtsdestotrotz wird beim Code-Golf nicht oft eine CSS-Präprozessorsprache verwendet!
So verwenden Sie HTML:
quelle
Pyth, 30 Bytes
Benötigt die zwei Ziffern als Eingabe ohne Leerzeichen dazwischen (z. B.
23
nicht2 3
).Erläuterung:
Jede zweistellige Sequenz, die innerhalb liegt,
23542
repräsentiert zwei Seiten, die1
oben liegen. Ebenso31463
für 2 usw. Wenn Sie diese Zeichenfolge umkehren, erhalten Sie die Sequenzen für4
through6
.Dieser Code führt lediglich eine Suche in der Zeichenfolge durch
"23542 31463 12651 15621 36413 24532"
, teilt den Index durch 6 und erhöht ihn, um zu bestimmen, wie hoch die Oberseite sein muss.Hier online testen.
Vielen Dank an @FryAmTheEggman für die Tipps zum Golfen.
quelle
J"23542 31463 12651 "h/x+J_Jscz)6
mich an, wenn einige verwirrend sind. BevorzugtK
undJ
zur Zuweisung von Werten,h
ist unär+1
,s
auf einer Liste von Strings stehtjk
. (Auch, wenn erlaubt, nur eine Zeichenfolge wie23
als Eingabe wäre am besten)Verfolgt einen ähnlichen Ansatz wie es1024 mit einer anderen Suchzeichenfolge:
JavaScript (ES6),
737261 BytesJavaScript (ES5),
888777 BytesCoffeeScript,
7162 BytesAus Spaß ist der Code in CoffeeScript um 1 Byte kürzer als in ES6, da keine Klammern angegeben werden dürfenAufgrund der Verwendung des
-~
Tricks stellte sich heraus, dass dies die gleiche Anzahl von Zeichen wie ES6 ist.quelle
''+l+r
=>[l]+r
1+Math.floor
=>-~
. Suchen Sie auch anstelle von indexOf.search
aber es ist nur für ES6.String.prototype.search
ist es seit ECMAScript 3rd Edition Teil von JavaScript, sodass Sie Ihre Antwort ändern können. developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…J (9)
Verwendet den Algorithmus aus diesem Beitrag.
Baumdiagramm der Funktion (könnte einige Dinge aufklären):
Demonstration:
quelle
PHP, 81 Bytes
Wie meine JavaScript-Lösung:
quelle
Lua 118
Musste die letzte Version aufgrund eines Fehlers wiederherstellen, den ich nicht finden kann, und hatte auch keine Zeit, danach zu suchen.
Ich arbeite aber immer noch daran.
quelle
4
mit2 3
.JavaScript (ES6), 79 Byte
Nicht die kürzeste, aber ich habe versucht, einen anderen Ansatz als derzeit in den Antworten.
quelle
Lua, 89 Bytes
Eine unkomplizierte Portierung der Python-Lösung von xnor.
quelle
Bash, 85
Dies konkurriert nicht mit dem magischen Polynom von @ xnor. Aber ich denke, das ist eine andere interessante Methode, um die Antwort zu berechnen:
Konkret kennen wir uns mit Würfeln aus:
Durch rekursives Kombinieren der obigen Werte (unter Verwendung von {1,2,3} als Ausgangspunkt) können wir die gesamte Abbildung von {l, r} -> t für alle möglichen Werte generieren. Diese Antwort definiert eine rekursive Funktion g (), die ein vollständiges Array mit d [lr] = t auffüllt. Die rekursive Funktion wird anfänglich mit {1,2,3} aufgerufen und durchläuft den gesamten Cube, bis keine Array-Elemente mehr festgelegt wurden. Die Funktion rekursiert auf zwei Arten in sich selbst:
Anschließend wird eine einfache Array-Suche der erforderlichen Werte durchgeführt.
quelle
Dyalog APL , 9 Bytes
Offensichtliche Zeichensubstitution der J-Lösung von ɐɔıʎuʇǝɥʇs :
Edit: Ich habe später bemerkt, dass diese genaue Lösung von ngn am 17. Januar, 15 vorgeschlagen wurde.
TryAPL online!
quelle
Julia, 26 Bytes
oder
oder
quelle
Common Lisp, 45 Bytes
Probieren Sie es online!
Port der xnor-Lösung.
quelle
C # (Visual C # Interactive Compiler) , 49 Byte
Probieren Sie es online!
-1 Byte dank @GB!
Die Eingabe ist eine 2-stellige Zeichenfolge, die die sichtbaren linken und rechten Ziffern enthält.
Unten ist die Lösung, die ich selbstständig gefunden habe. Mithilfe der Suchzeichenfolge aus der JavaScript-Antwort von rink.attendant.6 konnte ich 5 Bytes sparen (aber jetzt sind unsere Antworten ziemlich ähnlich;)
C # (Visual C # Interactive Compiler) , 55 Byte
Probieren Sie es online!
quelle