Gleichmäßig mischen

8

Einige Sammelkarten haben einen echten Wert und können für Geld verkauft werden. Das Biegen der Karten ist verpönt, weil es ihnen den Wert nimmt und sie weniger neu aussehen lässt. Angenommen, Sie haben ein Kartenspiel (Pokemon, Magie usw.) und möchten diese mischen. Anstatt die Brücke zu machen, die alle Karten biegt, besteht eine andere einfache Möglichkeit, Karten zu mischen, darin, sie in Stapel zu legen. Hier ist was ich meine.

Hintergrund

Mit einem 60-Karten-Deck, das gemischt werden muss, können Sie die 60 Karten in drei Stapel von 20 Karten aufteilen. Es gibt mehrere Möglichkeiten, dies zu tun. Die einfachste besteht darin, eine Karte in Stapel A, dann eine in Stapel B und eine in Stapel C zu legen. Eine andere Möglichkeit besteht darin, eine Karte in Stapel C, dann in B und dann in A zu legen Es gibt auch Möglichkeiten, die Karten ungleichmäßig über die Stapel zu verteilen. Hier ist eine: Lege eine Karte in Stapel A, lege eine weitere Karte in A, lege dann eine Karte in Stapel B und lege dann eine Karte in Stapel C.

Herausforderung

Erstellen Sie ein vollständiges Programm, das ausgegeben wird, evenwenn eine bestimmte Art des Mischens in Stapel die Karten in den Stapeln gleichmäßig verteilt und unevenansonsten die Anzahl der Karten in jedem Stapel ausgibt .

Eingang

Die Eingabe erfolgt über STDIN oder die nächstgelegene Alternative (keine Funktionen).

[sequence] [deck size]
  • sequenceist eine Zeichenfolge. Es zeigt das Muster an, in dem die Karten in die Stapel gelegt werden. Jedes unterschiedliche Zeichen entspricht einem einzelnen Stapel. Diese Zeichenfolge befindet sich immer unter der Deckgröße und enthält nur Großbuchstaben AZ.
  • deck sizeist eine Ganzzahl, die angibt, wie viele Karten sich im Deck befinden. Wenn die Deckgröße 60 beträgt, beträgt die Anzahl der Karten im Deck 60.

Ausgabe

even

Wenn die Anzahl der Karten in jedem Stapel am Ende des Shuffle gleich ist, sollte Ihr Programm dies ausgeben.

uneven [pile1] [pile2] [...]

Wenn die Anzahl der Karten in jedem Stapel am Ende des Mischens nicht gleich ist, sollte Ihr Programm Folgendes ausgeben unevenund die Anzahl der Karten in jedem Stapel wie uneven 20 30folgt : Wenn Stapel A 20 Kanonen enthält und Stapel B 30 enthält. Die Reihenfolge der Stapelnummern spielen keine Rolle.

Andere Informationen

  • Dies ist eine Code-Golf-Herausforderung, daher gewinnt der kürzeste Code in Bytes am 25. September. Wenn die Anzahl der Bytes gleich ist, gewinnt der zuerst übermittelte Code.
  • Ihr Programm muss ein Programm sein, keine Funktion.
  • Wenn möglich, fügen Sie Ihrer Antwort einen Link zu einem Online-Dolmetscher oder einen Link zu einem Ort hinzu, an dem ich einen Dolmetscher für Ihre Sprache herunterladen kann.
  • Alles, was ich in dieser Herausforderung nicht spezifiziere, ist faires Spiel. Wenn ich es nicht sage, liegt es an Ihnen. Wenn etwas vage ist, sag es mir und ich werde die Antwort entsprechend bearbeiten. (Hoffentlich läuft das reibungsloser als meine letzte Herausforderung.)

Beispiele

     Input | Output | Alternate outputs (if uneven)
           |
    ABC 30 | even
    ABC 31 | uneven 11 10 10 | uneven 10 11 10 | uneven 10 10 11
    BCA 60 | even
    BBA 24 | uneven 8 16 | uneven 16 8
ABACBC 120 | even
  BBABA 50 | uneven 20 30 | uneven 30 20
  AABBB 12 | even
The_Basset_Hound
quelle
1
Ich verstehe nicht, sequencewie es aussieht oder wie es funktioniert. Könnten Sie bitte einige Testfälle hinzufügen?
xnor
@xnor Ja, jetzt hinzufügen.
The_Basset_Hound
2
... Ich spiele nie Karten mit dir. :P
Conor O'Brien
@ThomasKwa Die Eingabe sollte über die Standardeingabe oder die nächstgelegene Alternative erfolgen.
The_Basset_Hound
Ist ABDD 12eine gültige Eingabe? Was soll die Ausgabe sein? Verstehe ich auch richtig, dass gerade AABBB 12ist?
xnor

Antworten:

5

Pyth, 33 31 Bytes

jd+>"uneven"yK!tl{J/L@LzQ{z*J!K

Beispieleingabe:

ABACBC
120
orlp
quelle
4

Python 3.x, 106 128 138 Bytes

s,n=input().split()
n=int(n)
t=(s*n)[:n]
*z,=map(t.count,set(t))
b=z[:-1]!=z[1:];print("un"*b+"even",*z*b)

Dies dupliziert die Eingabesequenz (öfter als nötig, was gut genug ist) und nimmt dann nur die ersten nZeichen auf. Diese werden gezählt und entweder unevenoder evenausgewählt, und wenn erstere, werden auch die Zählungen mit gedruckt print(*z), die zfür mich automatisch ausgepackt werden .

32 Bytes dank xnor und Sp3000 gespart!

Außerdem verfügt Python 3.5 über eine neue Funktion, die diese 102-Byte-Lösung ermöglicht:

s,n=input().split()
n=int(n)
t=(s*n)[:n]
*z,=map(t.count,{*t})
b=len({*z})>1;print("un"*b+"even",*z*b)

len({*z})>1entpackt die Liste z, erstellt daraus einen Satz und prüft dann, ob mehr als ein Element vorhanden ist. Es ist {*z}speziell neu.

El'endia Starman
quelle
1
Freut mich, einen neuen Python-Golfer zu sehen! Einige schnelle Tipps. Die Listenerstellung [t.count(x) for x in set(t)]kann wie folgt erfolgen map: map(t.count,set(t)). Die Frage erlaubt die Stapel in beliebiger Reihenfolge, daher denke ich, dass Sie dies vermeiden können sorted, auch wenn dies bedeutet, dass Sie etwas länger als z==z[::-1]gewünscht tun müssen z[1:]==z[:-1].
xnor
Mit Python 3 können Sie auch print*die Elemente einer Liste durch Leerzeichen getrennt drucken. Dies ist normalerweise kürzer als ' '.join.
xnor
@xnor: Sehr geschätzt!
El'endia Starman
2

CJam, 35 Bytes

rri_@*<$e`0f=_)-"uneven":Ua@+S*U2>?

Probieren Sie es online im CJam-Interpreter aus .

Wie es funktioniert

rri      e# Read a string (s) and an integer (n) from STDIN.
_@       e# Push a copy of n and rotate s on top of it.
*        e# Repeat s n times.
<        e# Keep only the first n characters.
$e`      e# Sort and perform run-length encoding.
0f=      e# Keep only the multiplicities.
_)-      e# Push a copy, pop the last element and remove its remaining occurrences.
         e# The result with be an empty array (falsy) iff all elements are equal.
"uneven" e# Push that string.
:Ua      e# Save it in U and wrap it in an array.
@+       e# Concatenate ["uneven"] with the array of multiplicities.
S*       e# Join, separating by spaces.
U2>      e# Push "even".
?        e# Select the result depending on whether _)- pushed an empty array.
Dennis
quelle