Sie haben einen Stapel Pfannkuchen auf einem Teller mit einer Sirupkugel, die so dick ist, dass sie nicht über die Seiten rinnt. Sie werden nicht glücklich sein zu essen, bis beide Gesichter jedes Pfannkuchens mindestens den Sirup berührt haben, aber im Moment hat nur ein Gesicht des oberen Pfannkuchens.
Sie wissen, dass der Sirup nicht einmal einen Pfannkuchen durchtränkt, sondern unbegrenzt durch direkten Kontakt zwischen zwei Pfannkuchen übertragen werden kann. Sobald ein Gesicht eines Pfannkuchens Sirup berührt hat, wird es als für immer mit Sirup überzogen betrachtet, und es wird jedes nicht mit Sirup überzogene Gesicht erzeugt, das auch mit Sirup überzogen ist. Es ist auch möglich, Sirup von und zur Oberseite des Tellers zu befördern.
Sie beschichten jedes Pfannkuchengesicht mit Sirup, indem Sie einen Spatel unter einen oder mehrere Pfannkuchen legen und umdrehen, genau wie beim Sortieren von Pfannkuchen . (Leider ist dieser Spatel sirupbeständig und hilft nicht, den Sirup durch Berühren der Pfannkuchenflächen zu verteilen.) Leider verlieren Sie den Überblick darüber, welche Pfannkuchenflächen Sirup berührt haben, aber Sie erinnern sich an die von Ihnen gemachten Spiegelungen.
Können Sie in Anbetracht Ihrer vergangenen Flips feststellen, ob Ihre Pfannkuchen noch alle mit Sirup überzogen sind?
Herausforderung
Schreiben Sie ein Programm, das eine positive ganze Zahl N für die Anzahl der Pfannkuchen und eine Liste positiver ganzer Zahlen (alle <= N) für die von Ihnen bisher gemachten Flips enthält. Jede Zahl in der Liste steht für die Anzahl der Pfannkuchen, die umgedreht wurden. Geben Sie einen Wahrheitswert aus, wenn die Pfannkuchen überzogen sind, und einen falschen Wert, wenn nicht. ( wahrheitsgemäße / falsche Definition )
Die Eingabe sollte von stdin oder der Befehlszeile kommen und die Ausgabe sollte zu stdout (oder den nächsten Alternativen) gehen. Es ist in Ordnung , wenn Sie Ihre Eingabe ein wenig mehr benötigt Formatierung: zB [1, 1, 2, 2]
statt 1 1 2 2
für die Liste.
Beispiele
Angenommen, N = 2, so haben wir einen Stapel von zwei Pfannkuchen auf einem Teller, beginnend mit dem Sirup oben.
Wenn die Liste ist 1 1 2 2
, bedeutet dies, dass wir ...
- Drehen Sie den oberen Pfannkuchen um und beschichten Sie die Oberseite des unteren Pfannkuchens
- Drehen Sie die Oberseite wieder um - beschichten Sie die ursprüngliche Unterseite des oberen Pfannkuchens
- beide umdrehen - die Platte beschichten
- Drehen Sie beide wieder um - beschichten Sie die ursprüngliche Unterseite des unteren Pfannkuchens
Da alle vier Flächen beschichtet sind, wäre die Ausgabe so ähnlich wie True
oder 1
.
Wenn die Liste ist 1 2 2 1
, bedeutet dies, dass wir ...
- Drehen Sie den oberen Pfannkuchen um und beschichten Sie die Oberseite des unteren Pfannkuchens
- beides umdrehen - nichts beschichten
- beide wieder umdrehen - nichts beschichten
- Drehen Sie die Oberseite wieder um - beschichten Sie die ursprüngliche Unterseite des oberen Pfannkuchens
Da das die Platte berührende Gesicht noch sirupfrei ist, wäre die Ausgabe so ähnlich wie False
oder 0
.
Anmerkungen
- Die Klappliste kann beliebig groß und leer sein. In diesem Fall ist die Ausgabe falsch.
- Die Platte wirkt als Sirupträger, aber es spielt keine Rolle, ob sie beschichtet wird oder nicht. (In der Tat jede Flip - Lösung Willen Beschichtung der Platte , weil die pancake Fläche berührt müssen beschichtet werden, sondern unabhängig.)
- Die Platte kann nicht gewendet werden.
- Sie können annehmen, dass diese Pfannkuchen Einheitsscheiben ohne nennenswerte Seiten sind , sondern nur zwei gegenüberliegende Flächen.
Wertung
Das ist Code-Golf. Die kürzeste Lösung in Bytes gewinnt.
Put syrup on the pancakes!
Antworten:
CJam,
323029 BytesProbieren Sie es online aus.
Testfälle
Wie es funktioniert
quelle
Haskell,
929086841141109998Die Forderung nach einem vollen Programm ist so ärgerlich. Ich frage mich, warum jemand dies verlangen würde.
Bei dieser Lösung wird der Stapel der Pfannkuchen durch eine Liste der Seiten dargestellt, wenn benachbarte Pfannkuchen dieselbe Seite haben. Jede Seite ist eine Zahl, und eine Seite wird beschichtet, wenn sie den Wert Null hat.
Rennen wie:
quelle
Python, 92 Bytes
Ich denke das funktioniert:
Es verwendet eine Liste von Pfannkuchen-Gesichtern (Platte eingeschlossen), um sich zu erinnern, welche mit Sirup überzogen sind. Pfannkuchen werden durch Umkehren eines Teils der Liste gewendet, aber jeder Sirup wird zuerst zwischen der Oberseite und dem neu aufgedeckten Gesicht übertragen.
Verwendung:
quelle
Python 2: 75
Eine Vereinfachung der Lösung von grc und feersum.
Das Speichern des Sirupzustands von
2*n+1
Pfannkuchenrändern ist überflüssig, da sich berührende Ränder immer gleich sind. Dies erinnert sich stattdessen an den Zustand jedern+1
Pfannkuchenverbindung. Auf diese Weise wird die Sirupübertragung automatisch berücksichtigt.Das einzige Update, das benötigt wird, ist, den Sirup an der
x
Kreuzung zu konservieren, wenn ein Flip ihn schneidet. Dies geschieht, indem man den Sirup0
nach dem Umdrehen in die Pfanne gibtx
.Die zweimalige Eingabe wirkt sich nicht auf die Anzahl der Zeichen aus.
quelle
Python 2, 93 Bytes
Zuerst wollte ich meine Antwort posten, aber grc hatte bereits eine Minute zuvor eine sehr ähnliche Antwort gepostet. Also habe ich versucht, ein paar Verbesserungen zu finden. Das Einzige, was ich finden konnte, war, einen lexikografischen Listenvergleich anstelle von zu verwenden
all()
.Bearbeiten: Ein Fehler wurde behoben, der dadurch verursacht wurde, dass verschiedene Eingabemethoden erfolglos ausprobiert wurden, wodurch die Anzahl der Zeichen nicht geändert wurde.
Beispiel Input / Output:
quelle
APL, 77
quelle
Python 2, 107
quelle
Haskell,
129,125Wahrscheinlich noch nicht vollständig golfen, aber es funktioniert, ohne eine Liste der beschichteten Seiten zu manipulieren. Stattdessen arbeitet es sich rückwärts, um herauszufinden, ob eine bestimmte Seite eines bestimmten Pfannkuchens jemals mit etwas in Kontakt gekommen ist, das zu Beginn die Oberseite war.
foldr
Durchläuft die Liste der Klappen effektiv rückwärts, daher gibt es keinereverse
.Hier ist also der Algorithmus: Wir ordnen alle relevanten Seiten (
[0..m]
) zu und erstellen eine Liste der Seiten, von denen unsere Seite Sirup erbt, beginnend von hinten: Anfangs ist die Liste nur[i]
, aber mit einem Flip vonn
Pfannkuchen, jeder Eintrag wird[n-i]
wenni<n
,[n,0]
wenni==n
, und[i]
wenni>n
. Die betreffende Seite wurde genau dann beschichtet, wenn die resultierende Liste nach allen Umblättern ein0
(any (<1)
) enthält .all
erledigt den Rest undmain
wandelt alles in ein lauffähiges Programm um.Das Programm erhält seine Eingabe
stdin
in Form von[n_pancakes, flip1, flip2, flip3, ...]
, durch einen Zeilenumbruch abgeschlossenen.quelle
n%i|i>n=[i]|i<n=[n-i]|0<1=[n,0]
sondern stattdessen alle Vererbungen zuordnen und sie verbinden.foldr($)[].map(n%)
(=<<).(%)
[0..]
beschichteten Pfannkuchen als 0 beginnen kann, anstatt beschichtete Pfannkuchen ungleich Null herzustellen. Vielen Dank!