Ist es ein Shuffle?


19

Gestern habe ich diese Frage zu Riffle Shuffles gestellt. Es scheint, dass die gestrige Frage etwas zu schwierig war, daher ist diese Frage eine verwandte, aber viel einfachere Aufgabe.

Heute werden Sie gefragt, ob eine Permutation tatsächlich ein Riffle-Shuffle ist. Unsere Definition von Riffle Shuffle wurde von unserer letzten Frage übernommen:

Der erste Teil des Shuffle ist die Kluft. In der Divide-Partition wird das Kartenspiel in zwei Teile geteilt. Die beiden Unterabschnitte müssen fortlaufend sein, sich gegenseitig ausschließen und erschöpfend sein. In der realen Welt möchten Sie Ihre Partition so gleichmäßig wie möglich gestalten. Bei dieser Herausforderung spielt dies jedoch keine Rolle. Alle Partitionen, einschließlich entarteter Partitionen (eine Partition ist leer), werden gleichermaßen berücksichtigt.

Nach der Partitionierung werden die Karten so zusammengefügt, dass die relative Reihenfolge der Karten in der Partition erhalten bleibt, in der sie Mitglied sind . Wenn die Karte zum Beispiel A vor Karte B im Deck und Karten A und B sind in der gleichen Partition, Karte A muss vor der Karte sein B im Endergebnis, auch wenn die Anzahl der Karten zwischen ihnen erhöht. Wenn sich A und B in unterschiedlichen Partitionen befinden, können sie im Endergebnis unabhängig von ihrer Startreihenfolge in beliebiger Reihenfolge sein.

Jedes Riffle-Shuffle kann dann als eine Permutation des ursprünglichen Kartenstapels angesehen werden. Zum Beispiel die Permutation

1,2,3 -> 1,3,2

ist ein Riffle Shuffle. Wenn Sie das Deck so teilen

1, 2 | 3

Wir sehen, dass jede Karte in 1,3,2der Partition dieselbe relative Reihenfolge zu jeder anderen Karte in der Partition hat. 2ist immer noch hinterher 1.

Andererseits ist die folgende Permutation kein Riffle-Shuffle.

1,2,3 -> 3,2,1

Wir können dies sehen, weil für alle zwei (nicht-trivialen) Partitionen

1, 2 | 3
1 | 2, 3 

Es gibt ein Paar Karten, deren relative Reihenfolge nicht eingehalten wird. In der ersten Partition 1und 2ändern Sie ihre Reihenfolge, während in der zweiten Partition 2und 3ändern Sie ihre Reihenfolge.

Aufgabe

Bestimmen Sie bei einer Permutation mit einer vernünftigen Methode, ob es sich um ein gültiges Riffle Shuffle handelt. Sie sollten zwei unterschiedliche konstante Werte ausgeben, einen für "Ja, das ist ein Riffle-Shuffle" und einen für "Nein, das ist kein Riffle-Shuffle".

Dies ist daher werden die Antworten in Bytes bewertet, wobei weniger Bytes besser sind.

Testfälle

1,3,2 -> True
3,2,1 -> False
3,1,2,4 -> True
2,3,4,1 -> True
4,3,2,1 -> False
1,2,3,4,5 -> True
1,2,5,4,3 -> False
5,1,4,2,3 -> False
3,1,4,2,5 -> True
2,3,6,1,4,5 -> False

1
Kann die Ausgabe inkonsistent sein, aber in unserer Sprache wahr / falsch? Wie (Python, wo unter den ganzen Zahlen nur 0 falsch ist) 0für falsch, aber eine ganze Zahl [1, +∞)für wahr?
Mr. Xcoder

1
@ Mr.Xcoder Ich mag die Wahrheits- / Falschheitswerte nicht, weil sie ziemlich schwer zu definieren sind. Die Antworten sollten sich an die aktuellen Regeln halten.
Weizen-Assistent

Empfohlene Testfall: [3,1,4,2,5].
Ørjan Johansen

9
Traurig über dieses, aber: [2,3,6,1,4,5].
Ørjan Johansen

1
Können wir Permutationen von [0, ..., n-1]statt [1, ..., n]als Eingabe nehmen?
Dennis

Antworten:


8

JavaScript (ES6), 47 Byte

Nimmt die Eingabe als Array von Ganzzahlen. Gibt einen Booleschen Wert zurück.

([x,...a],y)=>a.every(z=>z+~x?y?z==++y:y=z:++x)

Testfälle

Wie?

Das Eingabearray A ist ein gültiges Riffle-Shuffle, wenn es aus höchstens zwei verschiedenen verschachtelten Folgen aufeinanderfolgender ganzer Zahlen besteht.

Die Herausforderungsregeln geben an, dass wir eine Permutation von [1 ... N] erhalten . Wir müssen also nicht zusätzlich prüfen, ob die sortierte Vereinigung dieser Sequenzen tatsächlich zu einem solchen Bereich führt.

Wir verwenden einen auf A [0] initialisierten Zähler x und einen anfangs undefinierten Zähler y .

Für jeden Eintrag z in A beginnend mit dem 2. Eintrag :

  • Wir prüfen, ob z entweder x + 1 oder y + 1 entspricht . Wenn ja, erhöhen wir den entsprechenden Zähler.
  • Ansonsten: Wenn y noch nicht definiert ist, initialisieren wir es mit z .
  • Sonst: Wir machen den Test nicht.

6

Haskell , 41 Bytes

n%h=n+0^(n-h)^2
f l=elem(foldl(%)0$l++l)l

Probieren Sie es online!

Überprüft, ob die mit sich selbst verkettete Liste die Nummern 0..n-1in der angegebenen Reihenfolge als Teilsequenz enthält .


5

Haskell , 43 Bytes

sNimmt eine Liste von Ganzzahlen wie in den OP-Beispielen und gibt a zurück Bool.

s p=or[f(<x)p++f(>=x)p<[1..]|x<-p]
f=filter

Probieren Sie es online!

Wie es funktioniert

  • Das Listenverständnis versucht jedes Element xder pReihe nach und prüft, ob es das erste Element der zweiten Partition des Shuffle sein kann. Kehrt dann orzurück, Truewenn einer der Schecks war True.
  • Das Verständnis tut dies, indem es (mit filter) pin Elemente unterteilt, die kleiner und größer als (oder gleich) sind x, verkettet und überprüft, ob die resultierende Liste [1..length p], dh die Elemente, in der richtigen Reihenfolge sind.
  • Die Prüfung, ob die resultierende Liste erstellt wurde, wird [1..length p]durchgeführt, indem festgestellt wird, ob das Ergebnis streng kleiner als die unendliche Liste ist [1..] == [1,2,3,etc.], was für jede Permutation dasselbe Ergebnis ergibt.

5

Jelly , 13 6 Bytes

ỤIṢḊRẠ

Probieren Sie es online!

Alternative Version, Challenge nach Datum, 5 Bytes

Ụ>ƝSỊ

Probieren Sie es online!

Wie es funktioniert

ỤIṢḊRẠ  Main link. Argument: A (permutation of [1, ..., n])

Ụ       Grade up; sort the indices of A by their respective values.
        For shuffles, the result is the concatenation of up to two increasing
        sequences of indices.
 I      Compute the forward differences.
        In a shuffle, only one difference may be negative.
  Ṣ     Sort the differences.
   Ḋ    Dequeue; remove the first (smallest) difference.
    R   Range; map each k to [1, ..., k].
        This yields an empty array for non-positive values of k.
     Ạ  All; check if all resulting ranges are non-empty.


4

Brachylog , 9 Bytes

o~cĊ⟨⊆⊇⟩?

Probieren Sie es online!

Das Prädikat ist erfolgreich, wenn die Eingabe ein Riffle-Shuffle darstellt, und schlägt fehl, wenn dies nicht der Fall ist. Dies bedeutet unter anderem, dass bei Ausführung des Prädikats ein vollständiger Programmerfolg ausgegeben wird true.und ein Fehler ausgegeben wird false.. Die Eingabe wird als Liste aller Arten von Elementen interpretiert und als sortierte Permutation von sich selbst interpretiert.

   Ċ         Some length-two list
 ~c          which concatenated
o            is the input sorted
    ⟨        satisfies the condition that its first element
     ⊆       is an ordered not-necessarily-contiguous sublist
        ?    of the input
      ⊇      which is an ordered superlist of
       ⟩     the list's second element.

Ich habe das Gefühl, dass es etwas gibt, dessen Geist ⊆ᵐanstelle des 4-Byte- "Sandwich" -Konstrukts funktionieren sollte ⟨⊆⊇⟩.


1
Ich denke, Sie sind die erste Person, die ein Sandwich in einer PPCG-Antwort verwendet (und es ist eine schöne symmetrische :))
Fatalize


2

Ruby , 35 Bytes

->l{l.any?{|a|l&[*1..a]|l==l.sort}}

Probieren Sie es online!

Wie?

  • l & [*1..a] | lWendet eine Schnittmenge und dann eine Vereinigung an: Ermitteln Sie zuerst die Elemente l, die vorhanden sind, <=aund fügen Sie dann die übrigen Elemente hinzu, lohne die Reihenfolge zu ändern. Wenn a die gesuchte Zahl ist, entspricht dieser Vorgang dem Sortieren l.


2

Pyth, 5 Bytes

}SQy+

Testsuite

}SQy+

    +QQ  concatenated two copies of the (implicit) input
   y     all subsequences of it
}        contain an element equaling
 SQ      the input list sorted 

Überprüft, ob die Liste der doppelten Eingaben eine sortierte Version von sich selbst als Teilsequenz enthält.

Dank an Erik den Outgolfer für 1 Byte, der implizite Eingaben besser ausnutzt +QQals *2Q.


5 Bytes }SQy+. Es wird erweitert um }SQy+QQ.
Erik der Outgolfer

@EriktheOutgolfer Schön, danke.
Donnerstag,

1

Pyth , 9 Bytes

!t-.+xLQS

Testsuite.

3 Bytes dank isaacg gespart .

Pyth , 14 Bytes

}SQm.nS.Tcd2./

Probieren Sie es hier aus! oder Überprüfen Sie alle Testfälle.

Ausgänge Trueund Falsefür Riffle-Shuffle bzw. Nicht-Riffle-Shuffle.

Wie?

} SQm.nS.Tcd2./ ~ Volles Programm. Liest die Eingabe von STDIN und gibt sie an STDOUT aus.

            ./ ~ Alle Unterteilungen der Eingabe in getrennte Teilzeichenfolgen (Partitionen) zurückgeben.
   m ~ Map über das Obige mit einer Variablen d.
         cd2 ~ Zerhacke d in Listen mit zwei Elementen.
       .T ~ Begründete Umsetzung, Abwesenheiten ignorieren.
      S ~ Sortieren (lexikographisch).
    .n ~ Tief drücken.
} ~ Überprüfen Sie, ob das oben genannte enthält ...
 SQ ~ Die sortierte Eingabe.

Weiterhin <#0kann durch -2 weitere Bytes ersetzt werden.
Isaacg

@isaacg Oh yeah facepalm danke. Bearbeitet Bearbeitet
Mr. Xcoder



Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.