Analysieren Sie übergebene Shuffles

13

Rod moderiert ein Kartenspiel zwischen zwei Spielern: George und Tim. Derzeit mischt Tim die Karten. Rod vermutet, dass Tim versucht zu schummeln, also braucht er deine Hilfe, um zu überprüfen, ob das Shuffle fair ist.

Tim mischt die übergebenen Karten: Er schneidet einen Stapel Karten vom unteren Ende des Stapels ab, schneidet dann verschiedene Teile vom oberen Ende des Stapels auf den oberen Rand des Stapels und wiederholt den Vorgang einige Male.

Rod hat Adleraugen und kann genau sehen, wie viele Karten Tim jedes Mal schneidet. Er kann die Karten jedoch nicht so schnell berechnen und verfolgen, wie Tim sie mischt. Hier kommen Sie ins Spiel: Rod möchte, dass Sie ein Programm oder eine Funktion schreiben, die die detaillierten Informationen zum Mischen abruft und feststellt, ob das Mischen fair, schwach oder trickreich ist.

  • Wenn nach dem Mischen weniger als 25 Paare benachbarter Karten nebeneinander liegen (in derselben Reihenfolge), ist das Mischen fair und das Spiel kann fortgesetzt werden.
  • Wenn mindestens 25 (aber nicht alle) Paare benachbarter Karten nebeneinander liegen, ist die Mischung schwach und Rod schlägt Tim über den Kopf und bittet ihn, weitere Karten zu mischen.
  • Wenn alle Karten am Ende in der gleichen Position bleiben, betrügt Tim offensichtlich und Rod schlägt ihn mit einer großen Forelle.

Dies ist Codegolf, also gewinnt der kürzeste Code.

Eingang:

Sie erhalten eine Reihe von Zahlen zwischen 0 und 52 (beide exklusive), die durch ein Leerzeichen voneinander getrennt sind. Dabei steht jede Zeile für eine Mischrunde, die mit allen gestapelten Karten beginnt und endet.

In jeder Zeile ist die erste Zahl die Anzahl der Karten, die Tim vom unteren Ende des Decks abschneidet, und jede nachfolgende Zahl ist die Anzahl der Karten, die er von seiner Hand auf die Oberseite des Decks fallen lässt. Wenn nach der letzten Zahl in einer Zeile noch Karten übrig sind, sollten Sie davon ausgehen, dass Tim sie oben auf den Stapel legt.

Die Eingabe ist garantiert gültig. Es gibt mindestens eine Zahlenzeile und jede Zeile enthält mindestens 2 Zahlen. Die erste Zahl in jeder Zeile ist nicht kleiner als die Summe aller anderen Zahlen in derselben Zeile. Ein abschließender Zeilenumbruch ist optional. Sie können davon ausgehen, dass der Eingang einen hat oder dass er keinen hat.

Ausgabe:

Ihr Programm sollte "fair" drucken / zurückgeben, wenn das Mischen fair ist, "schwach", wenn das Mischen schwach ist, und "trick", wenn Tim alle Karten in derselben Reihenfolge hält. Ein abschließender Zeilenumbruch ist optional.

Beispiel:

Es wird davon ausgegangen, dass das Kartenspiel 52 Karten enthält. Zu Demonstrationszwecken verwende ich jedoch ein kleineres Kartenspiel mit 10 Karten.

Eingang:

5 3 1
4 2 2

Anfangsstapel von oben gesehen 0 1 2 3 4 5 6 7 8 9
5:: 0 1 2 3 4( 5 6 7 8 9in der Hand)
35 6 7 0 1 2 3 4( 8 9in der Hand)
18 5 6 7 0 1 2 3 4( 9in der Hand)
Linienende ➜ 9 8 5 6 7 0 1 2 3 4
49 8 5 6 7 0( 1 2 3 4in der Hand)
21 2 9 8 5 6 7 0( 3 4in der Hand)
23 4 1 2 9 8 5 6 7 0
4 Paare bleiben benachbart:(3 4) (1 2) (5 6) (6 7)

Testfälle:

43 5 5 5 5 5 5 5 5
43 5 5 5 5 5 5 5 5
43 5 5 5 5 5 5 5 5

Ausgabe: fair


43 5 5 5 5 5 5 5 5
43 5 5 5 5 5 5 5 5
43 5 5 5 5 5 5 5

Ausgabe: weak


29 24
19 18
38 2 1 8 13 6 4
47 15 16 5 2 1 7
34 22 9 3
44 9 10 11 3 1 7
33 18 4 2 3 3

Ausgabe: fair


24 6 12 4
25 3 19
36 4 25 2
19 11 1 3
15 9 3
37 5 27

Ausgabe: weak


26 13
26 13
26 13
26 13

Ausgabe: trick


50 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2

Ausgabe: weak


50 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
50 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2

Ausgabe: trick


50 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
49 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2

Ausgabe: fair

Bedarf:

  • Wenn Sie eine Funktion schreiben, kann diese entweder von der Standardeingabe lesen oder die Eingabe als einzelner Zeichenfolgenparameter empfangen. Außerdem kann die Funktion die Ausgabe entweder ausdrucken oder zurückgeben.
  • Das Programm muss unter Linux mit frei verfügbarer Software lauffähig sein.
  • Der Quellcode darf nur ASCII-Zeichen enthalten.
  • Keine Standardlücken.
aditsu
quelle
2
Warum die Einschränkung auf ASCII? Viele Sprachen (APL, Maschinencode, TI-BASIC) verwenden überhaupt kein ASCII, daher lassen Sie diese implizit nicht zu.
Lirtosiast
@ThomasKwa Weil mir die Probleme beim Anzeigen und Zählen von Nicht-ASCII-Zeichen nicht gefallen. Einige dieser Sprachen haben ASCII-Darstellungen oder Alternativen. Ich denke, es ist keine sehr harte Einschränkung, und es gleicht die Wettbewerbsbedingungen ein wenig aus.
Aditsu
Ich denke, dass ein Bewertungssystem wie "Einträge, die nur druckbare ASCII-Zeichen verwenden, deren Byteanzahl mit log (95) / log (256) multipliziert wird" eine bessere Option wäre, wenn Sie druckbare ASCII-Übermittlungen mit einem angemessenen Anreiz versehen möchten. Die Begründung ist, dass der Informationsgehalt von Einträgen mit der gleichen Punktzahl gleich wäre. Persönlich würde ich aber immer noch eine einfache Bewertung nach Bytes bevorzugen.
Lirtosiast
@ThomasKwa Ok, wie wäre es damit? Nur druckbare Unicode-Zeichen, die in UTF-8-Codierung Bytes zählen
aditsu

Antworten:

3

Pyth, 62 Bytes

@c"weak trick fair"d-!JlfhT-M.:us_cG.u+NYtKrH7-52hK.zU52 2>J26

Demonstration.

isaacg
quelle
4

CJam, 76 75 Bytes

52,qN/{[~](52\-@/(\e_@{/(@+\e_}/\+}/2ew::m2f/0-,_!\26>-"weak trick fair"S/=

Probieren Sie es online im CJam-Interpreter aus .

Dennis
quelle
5
LOL, "Forelle" :)
aditsu
2

JavaScript, 292 289 Bytes

Dies könnte wahrscheinlich mehr Bytes herausholen, aber es ist vorerst ein schneller erster Durchgang:

d=[];for(i=0;i<52;i+=1)d[i]=i
s=prompt().split('\n')
s.forEach(function(e,i){s[i]=e.split(' ')
h=d.splice(-s[i][0],99)
for(j=1;j<s[i].length;j+=1)d.unshift.apply(d,h.splice(0,s[i][j]))
d.unshift.apply(d,h)})
for(c=0;i>1;i-=1)if(d[i-2]==d[i-1]-1)c+=1
alert(c<25?"fair":c<51?"weak":"trick")

BEARBEITEN: Speichert 3 Bytes, indem der Wert iaus der Deck-Building-Schleife beim Zählen der Anzahl benachbarter Karten wiederverwendet wird .

Sean Latham
quelle