Nichttransitive Würfel sind hübsche Spielzeuge, die sich unserer Wahrscheinlichkeitstheorie widersetzen . Für diese Herausforderung benötigen wir einige Definitionen:
Betrachten Sie zwei Würfel A und B, die gleichzeitig geworfen werden. Wir sagen , dass A schlägt B , wenn die Wahrscheinlichkeit von A eine größere Zahl als zu zeigen , B streng größer als die Wahrscheinlichkeit ist B eine größere Zahl als zu zeigen , A .
Jetzt einen Satz von drei Würfeln betrachten, mit Etikett A , B , C . Ein solcher Würfelsatz heißt nichttransitiv, wenn
- entweder A schlägt B , B schlägt C und C schlägt A
- oder C schlägt B , B schlägt A und A schlägt C .
Betrachten Sie als eines meiner Lieblingsbeispiele die Grime-Würfel mit den folgenden Seiten:
A: 3 3 3 3 3 6
B: 2 2 2 5 5 5
C: 1 4 4 4 4 4
Interessanterweise beträgt der Mittelwert jedes Würfels 3,5, genau wie bei einem normalen Würfel.
Das kann man zeigen:
- A schlägt B mit einer Wahrscheinlichkeit von 7/12.
- B schlägt C mit einer Wahrscheinlichkeit von 7/12.
- C schlägt A mit einer Wahrscheinlichkeit von 25/36.
Jetzt sind diese besonderen Würfel noch seltsamer. Wenn wir jeden Würfel zweimal würfeln und die Ergebnisse addieren, wird die Reihenfolge der Schläge umgekehrt:
- B schlägt A mit einer Wahrscheinlichkeit von 85/144.
- C schlägt B mit einer Wahrscheinlichkeit von 85/144.
- A schlägt C mit einer Wahrscheinlichkeit von 671/1296.
Nennen wir eine Reihe von Würfeln mit dieser Eigenschaft Grime-nicht-transitiv .
Andererseits, wenn die Würfel ihren ursprünglichen Zyklus behalten, wenn sie zwei Würfe verwenden, nennen wir sie stark nicht-transitiv . (Wenn es für zwei Würfe überhaupt keinen Zyklus gibt, nennen wir sie einfach nichttransitiv .)
Die Herausforderung
Gegeben drei sechsseitige Würfel, festzustellen , welche der oben genannten Eigenschaften dieser Satz hat und die Ausgabe einer der folgenden Strings: none
, nontransitive
, Grime-nontransitive
, strongly nontransitive
.
Sie können ein Programm oder eine Funktion schreiben, Eingaben über STDIN, Befehlszeilenargument, Eingabeaufforderung oder Funktionsargument vornehmen und das Ergebnis in STDOUT schreiben oder als Zeichenfolge zurückgeben.
Sie können davon ausgehen, dass alle Seiten nicht negative ganze Zahlen sind. Sie können nicht davon ausgehen, dass die Seiten oder die Würfel in einer bestimmten Reihenfolge sind. Sie können Eingaben in einem beliebigen Listen- oder Zeichenfolgeformat vornehmen.
Dies ist Codegolf, daher gewinnt die kürzeste Antwort (in Bytes).
Testfälle
none
1 2 3 4 5 6, 6 5 4 3 2 1, 1 3 5 2 4 6
1 1 1 6 6 6, 4 4 4 5 5 5, 5 5 5 5 5 5
1 1 2 5 6 6, 2 2 3 4 4 6, 2 3 3 4 4 5
0 1 2 3 4 5, 1 1 2 3 3 5, 1 2 2 2 3 5
3 13 5 7 13 7, 5 7 11 5 7 13, 5 9 13 5 7 9
nontransitive
1 2 2 4 6 6, 1 2 3 5 5 5, 2 3 4 4 4 4
1 4 4 4 4 4, 2 2 2 4 5 6, 2 3 3 3 5 5
1 2 1 6 5 6, 3 1 3 6 2 6, 2 4 2 4 4 5
3 4 6 6 7 7, 4 4 4 7 7 7, 5 5 5 5 6 7
2 5 11 11 14 14, 5 5 5 14 14 14, 8 8 8 8 8 17
Grime-nontransitive
3 3 3 3 3 6, 2 2 2 5 5 5, 1 4 4 4 4 4
1 1 4 5 5 5, 2 2 2 3 6 6, 3 3 3 4 4 4
2 1 4 6 4 4, 2 4 5 2 3 5, 3 3 6 3 3 3
11 11 13 15 15 16, 12 12 12 13 16 16, 13 13 13 14 14 14
4 4 7 16 19 19, 4 7 13 13 13 19, 4 10 10 10 16 19
strongly nontransitive
2 2 2 5 5 5, 2 3 3 3 5 5, 1 1 4 5 5 5
2 2 2 3 6 6, 2 2 2 5 5 5, 2 2 4 4 4 5
1 5 1 3 6 5, 6 6 4 2 2 1, 5 3 4 3 4 2
0 0 2 4 4 5, 0 1 1 3 5 5, 1 1 2 3 4 4
1 1 9 17 17 21, 1 5 5 13 21 21, 5 5 13 13 13 17
Wenn Sie Ihren Code noch ausführlicher testen möchten, hat Peter Taylor freundlicherweise eine Referenzimplementierung geschrieben, die alle ~ 5000 Würfelsätze mit den Seiten 1 bis 6 und einem Mittelwert von 3,5 klassifiziert. Pastebin-Link
quelle
1 2 2 4 6 6, 1 2 3 5 5 5, 2 3 4 4 4 4
Ich erhalte A <B 17/36, B> C 19/36, C <A 16/36.Antworten:
Dyalog APL,
107100 Bytes{({+/×+/¨,¨×⍵∘.-¨1⌽⍵}{3≠|a←⍺⍺⍵:1⋄a=b←⍺⍺∘.+⍨¨⍵:2⋄3+a=-b}⍵)⊃(⊂'none'),'strongly '⍬'Grime-',¨⊂'nontransitive'}
{T←{+/×+/¨∊¨×⍵∘.-¨1⌽⍵}⋄3≠|S←T⍵:'none'⋄N←'nontransitive'⋄S=D←T∘.+⍨¨⍵:'strongly ',N⋄S=-D:'Grime-',N⋄N}
(Danke @Tobia für diese einfachere, kürzere, bessere Lösung)
Grundlagen:
←
Zuordnung⋄
Anweisungstrennzeichen{}
Lambda-Form⍺⍵
linkes und rechtes ArgumentA:B
Wache ("wennA
dann zurückB
")T
ist eine Funktion, die 3 zurückgibt, wenn A B schlägt, B C schlägt und C A schlägt; -3 wenn das genaue Gegenteil der Fall ist; und etwas dazwischen sonst. Im Detail:1⌽⍵
ist die eine Umdrehung von⍵
. Wenn⍵
ABC ist, ist die Rotation BCA.∘.-
berechnet eine Subtraktionstabelle zwischen zwei Vektoren (1 2...10 ∘.× 1 2...10
wäre die Multiplikationstabelle, die wir aus der Schule kennen). Wir wenden dies zwischen jedem (¨
) Element von⍵
und dem entsprechenden Element in an1⌽⍵
.×
Signum aller Zahlen in den Subtraktionstabellen∊¨
Flache jeden Tisch+/¨
und summiere es. Wir haben jetzt drei Zahlen, die das Gleichgewicht darstellen: Anzahl der Siege minus der Niederlagen für A gegen B, B gegen C, C gegen A.×
Zeichen von denen+/
SummeBehandeln Sie dann die Fälle der Reihe nach:
3≠|S←T⍵:'none'
WennT⍵
der absolute Wert nicht 3 ist, wird 'none' zurückgegeben.N←'nontransitive'
Wir werden dieses Wort sehr brauchenS=D←T∘.+⍨¨⍵:'strongly ',N
Berechnen SieT
für Würfelpaare (∘.+⍨¨⍵
← →⍵((∘.+)¨)⍵
) und geben Sie "stark ..." zurück, wenn die gleichen Beziehungen zwischen ABC immer noch bestehenS=-D:'Grime-',N
⍝ "Schmutz", wenn die Beziehungen in die entgegengesetzte Richtung verlaufenN
Wenn alles andere fehlschlägt, einfach "nicht-transitiv"quelle
{T←{+/×+/¨∊¨×⍵∘.-¨1⌽⍵}⋄3≠|S←T⍵:'none'⋄N←'nontransitive'⋄S=D←T∘.+⍨¨⍵:'strongly ',N⋄S=-D:'Grime-',N⋄N}
Python 2, 269
Hier ist ein netter kleiner Ausdruck, der zu einer Funktion ausgewertet wird. Es akzeptiert drei Listen mit ganzen Zahlen. Besteht alle Testfälle.
quelle
J -
311257 BytesUpdate (13. Januar 2015):
Erklärung: Vereinfachen Sie mit Gerunds die
if.
s zu@.
s.Ältere Version:
Versuchen Sie zuerst, sowohl in J zu codieren als auch Golf zu spielen.
Führen Sie es mit einer Syntax aus, die der folgenden ähnelt (zusätzliche Leerzeichen zur Verdeutlichung):
Erläuterung:
g
ist definiert als eine Diade zwei Arrays nehmen , die sagen , wenn die erste Würfel zweiten Würfel schlägth
als eine Diade , wobei zwei Arrays definiert , die zweimal erzählt und Summieren , wenn werfen, tut erster Würfel zweiten schlagenf
ist eine Monade , die eine Tabelle und gibt eine Zeichenkette mit dem Takes richtige AntwortBearbeiten: Behebung eines Fehlers in einem schmutzigen, nichttransitiven Zustand (Ersetzen
,
durch*
)quelle
Pyth 129
133Versuchen Sie es hier , oder zumindest könnten Sie es, aber das Online-
eval
System scheint Listen mit Listen nicht zu mögen :( Wenn Sie es dort versuchen möchten, speichern Sie manuell eine Liste mit 3 Würfeln in einer Variablen, die nicht vom Programm verwendet wird, und ersetzen Sie sie dann Alle Instanzen vonQ
mit dieser Variablen. Eine Beispielinitialisierung:Damit sind alle Testfälle von Martin bestanden. Ich habe nicht das Herz, alle Fälle von Peter durchzugehen: P
Erklärung (das wird ein Trottel sein)
Ziemlich einfach: Erstellt eine Funktion
y
, die die Summe aller kartesischen Wertepaare in einem Iterationsschritt zurückgibt. Entspricht:def y(b):return map(lambda d:sum(d),product(b,repeats=2))
. Dies wird verwendet, um mehrseitige Würfel zu erstellen, die das zweimalige Werfen der regulären Würfel simulieren.Definiert eine Funktion
g
aus 2 Argumenten, die zurückgibt, wie oft ein Würfel einen anderen schlägt. Entsprichtdef g(G,H):return sum(map(lambda k:sum(map(lambda b:b>k,G)),H)
.Definiert eine Funktion
P
, die eine Liste von zwei Würfeln als Argument verwendet. Dies ergibt -1, wenn der erste Würfel 'verliert', 0 für einen Gleichstand und 1, wenn der erste Würfel 'gewinnt'. Gleichwertig:Das
AGH
Assigns verhält sich wie eine Python 2-Tupel-Zuweisung. Im WesentlichenG,H=(result)
Ich gehe zurück, um es in den Karten zu erklären.
m,@Qb@QhbUQ
iteriert über b = 0..2 und erzeugt 2 Tupel Würfel mit Index b und Index b + 1. Dies gibt uns Würfel (A, B), (B, C), (C, A) (Pyth modifiziert die Indizes automatisch nach der Länge der Liste).Nächster,
m,PkP,yhkyek
das Ergebnis der vorherigen Karte durchlaufen, wobei jedes Würfelpaar bei jedem Durchlauf in k gespeichert wird. Gibttuple(P(k),P(tuple(y(k[0]),y(k[-1]))))
für jeden Wert zurück. Das läuft auf `((A schlägt B ?, 2 * A schlägt 2 * B), (B schlägt C ?, 2 * B schlägt ..)) hinaus.Schließlich
msdC
fasst die Werte der vorherigen Karte , nachdem es gezippt wurde. Der Reißverschluss bewirkt, dass alle Einzelwürfel im ersten Tupel und die Doppelwürfel im zweiten Tupel "Schläge" ergeben.Eine grobe Sache, die die Ergebnisse druckt. Wenn G 0 ist oder nicht durch 3 teilbar, diese bieten Fänge +/- 3, (
|!G%G3
), drucktnone
, druckt sonst die Summe der follwing Liste:[not(G+H)*"Grime",(G==H)*"strongly ","nontransitive"]
. Ich denke, die Booleschen sind in Bezug auf die Definitionen in der Frage ziemlich selbsterklärend. Beachten Sie, dass G hier nicht Null sein kann, da dies durch die vorherige Prüfung erfasst wird.quelle
J (204)
Viel zu lange könnte man wahrscheinlich viel Golf spielen, wenn man ein effizienteres System zur Auswahl der richtigen Saite hätte.
quelle
Matlab (427)
Es ist nicht so kurz und ich bin sicher, dass es viel mehr Golf spielen kann. Ich habe nur versucht, diese Herausforderung zu lösen, weil ich dachte, dass es eine sehr lustige Aufgabe war. Vielen Dank an @ MartinBüttner für die Erstellung dieser Herausforderung!
Hier der Code in voller Länge mit einigen Kommentaren, wenn Sie versuchen möchten, zu verstehen, was los ist. Ich habe einige Testfälle eingeschlossen und die Eingabebefehle ausgeschlossen:
quelle
input()
und dann die drei Elemente zuweisena,b,c
? Verwenden Sie außerdem bitte die genauen Strings in der Spezifikation (none
,nontransitive
und aktiviertGrime
) ... sollte wohl auch sparen Sie Bytes.disp
Befehle in der langen Version entfernt habe. Sie waren nur zum Testen des Programms gedacht, aber die endgültige Nachricht ist in gespeichertm
. Und ich habe das korrigiertG
.JavaScript - 276 Bytes
Die Wahrscheinlichkeit ist nicht sehr gut. Um sicher zu gehen, ziehe ich es vor, die Würfel hunderttausend Mal zu werfen.
Der Ausdruck ergibt eine Funktion, die nur mit einem Argument aufgerufen werden sollte: einem Array von drei Arrays von ganzen Zahlen. Überprüfen Sie die Geige , um den Code selbst ausführen zu können.
Hier ist die ungolfed Version:
quelle