均等にシャッフル


8

いくつかのトレーディングカードは実際の価値があり、お金で売ることができます。カードを曲げると、価値がなくなり、見た目が新しくなります。トレーディングカード(ポケモン、マジックなど)のデッキがあり、それらをシャッフルしたいとします。すべてのカードを曲げるブリッジを行う代わりに、カードをシャッフルする別の簡単な方法は、カードを山に置くことです。これが私の意味です。

バックグラウンド

60枚のカードデッキをシャッフルする必要がある場合、60枚のカードを20枚のカードの3つの山に分けることができます。これには複数の方法があります。最も明白なのは、カードをパイルAに入れ、次に1つをパイルBに入れ、次に1つをパイルCに入れることです。別の方法は、カードをパイルC、次にB、次にAに入れることです。カードを山に均等に広げる方法でもあります。これは1つです。カードを山Aに置き、別のカードをAに置き、次にカードを山Bに置き、次にカードを山Cに置きます。

チャレンジ

evenパイルにシャッフルする特定の方法がカードを山に均等に広げた場合に出力unevenし、そうでない場合は各山のカードの数と出力する完全なプログラムを作成します。

入力

入力は、STDINまたは最も近い代替(関数なし)から取得されます。

[sequence] [deck size]
  • sequence文字列です。カードが山に置かれているパターンを示します。それぞれの異なるキャラクターは1つのパイルに対応します。この文字列は常にデッキサイズの下にあり、大文字のAZのみが含まれます。
  • deck sizeデッキにあるカードの数を指定する整数です。デッキのサイズが60の場合、デッキ内のカードの数は60です。

出力

even

シャッフル終了時の各山のカードの数が同じである場合、プログラムはこれを出力する必要があります。

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

シャッフルの終わりにある各山のカードの数が同じでない場合、プログラムは次のように出力unevenし、各山のカードの数を出力する必要uneven 20 30があります。パイル数は関係ありません。

その他の情報

  • これはコードゴルフの課題なので、9月25日にバイト単位で最短のコードが勝ちます。バイト数が同数の場合、最初に送信されたコードが優先されます。
  • プログラムは関数ではなくプログラムでなければなりません。
  • 可能であれば、オンラインインタープリターへのリンクまたはあなたの言語のインタープリターをダウンロードできる場所へのリンクを回答に含めてください。
  • このチャレンジ内で私が指定しないものは公平なゲームです。つまり、私がそれを言わなくても、それはあなた次第です。何か曖昧なことがあれば、教えてください。それに応じて回答を編集します。(うまくいけば、これは私の最後の挑戦よりスムーズに行きます。)

     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

1
どのようにsequence見えるのか、どのように機能するのかわかりません。テストケースをいくつか追加していただけませんか?
xnor

@xnorはい、追加します。
The_Basset_Hound 2015

2
...私はあなたとトランプをすることはありません。:P
Conor O'Brien

@ThomasKwa入力は、標準入力または最も近い代替物を通じて取得する必要があります。
The_Basset_Hound 2015

あるABDD 12有効な入力?出力はどうあるべきですか?また、私はそれが正しいことを理解しAABBB 12ていますか?
xnor

回答:


5

Pyth、33 31バイト

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

入力例:

ABACBC
120

4

Pythonの3.xの、106の128 138バイト

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)

これにより、入力シーケンスが複製され(必要な回数より多く、これで十分です)、最初のn文字のみが取得されます。これらはカウントされ、unevenまたはevenが選択されます。前者の場合、カウントもで出力されprint(*z)、自動的に解凍さzれます。

xnorとSp3000のおかげで32バイト節約されました!

また、Python 3.5には、この102バイトのソリューションを可能にする新機能があります。

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})>1リストをアンパックzし、そこからセットを作成してから、リストに複数の要素があるかどうかを確認します。特にそれは{*z}新しいです。


1
新しいPythonゴルファーに会えてうれしい!いくつかの簡単なヒント。リストCOMPは[t.count(x) for x in set(t)]として行うことができますmapmap(t.count,set(t))。質問はパイルを任意の順序で許可しているので、それsortedよりも少し長い何かをしなければならないことを意味する場合でも、あなたはそうすることを避けることができると思いますz==z[::-1]好きz[1:]==z[:-1]
xnor

また、Python 3では、 print*、スペースで区切られたリストの要素を印刷。これは通常、よりも短くなり' '.joinます。
xnor

@xnor:とても感謝しています!
El'endia Starman、2015

2

CJam、35バイト

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

CJamインタープリターでオンラインで試してください。

使い方

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.
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.