Mengocok merata

8

Beberapa kartu perdagangan memiliki nilai nyata dan dapat dijual dengan uang. Membungkuk kartu disukai karena mengambil nilainya dan membuat mereka terlihat kurang baru. Katakanlah Anda memiliki setumpuk kartu perdagangan (Pokemon, Magic, dll.) Dan Anda ingin mengocoknya. Alih-alih melakukan jembatan yang menekuk semua kartu, cara sederhana lain untuk mengocok kartu adalah dengan menumpuknya. Inilah yang saya maksud.

Latar Belakang

Dengan setumpuk 60 kartu yang perlu diacak, Anda dapat memisahkan 60 kartu menjadi tiga tumpukan 20 kartu. Ada beberapa cara untuk melakukan ini, yang paling sederhana adalah dengan meletakkan kartu ke tumpukan A, lalu satu ke tumpukan B, lalu satu ke tumpukan C. Cara lain adalah dengan memasukkan kartu ke tumpukan C, lalu B, lalu A. Ada juga cara untuk menyebarkan kartu ke tumpukan tidak merata. Ini salah satunya: letakkan kartu di tumpukan A, masukkan kartu lain di A, lalu masukkan kartu di tumpukan B, lalu masukkan kartu di tumpukan C.

Tantangan

Buat program lengkap yang akan menampilkan evenjika cara tertentu untuk mengocok tumpukan menyebar kartu di tumpukan secara merata, dan keluaran unevendan jumlah kartu di setiap tumpukan sebaliknya.

Memasukkan

Input akan diambil melalui STDIN atau alternatif terdekat (tidak ada fungsi).

[sequence] [deck size]
  • sequenceadalah serangkaian karakter. Ini memberitahu pola kartu diletakkan ke dalam tumpukan. Setiap karakter yang berbeda sesuai dengan satu tumpukan. String ini akan selalu berada di bawah ukuran dek dan hanya akan berisi huruf kapital AZ.
  • deck sizeadalah bilangan bulat yang menentukan jumlah kartu di dalam kartu. Jika ukuran dek adalah 60, jumlah kartu di dek adalah 60.

Keluaran

even

Jika jumlah kartu di setiap tumpukan di ujung acak adalah sama, program Anda harus menampilkan ini.

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

Jika jumlah kartu di setiap tumpukan di ujung pengocokan tidak sama, program Anda harus menampilkan unevendan jumlah kartu di setiap tumpukan seperti ini: uneven 20 30jika tumpukan A berisi 20 canrds dan tumpukan B berisi 30. Urutan dari nomor tumpukan tidak masalah.

Informasi lainnya

  • Ini adalah tantangan kode golf, jadi kode terpendek dalam byte pada 25 September menang. Jika ada ikatan dalam jumlah byte, kode yang diajukan pertama kali menang.
  • Program Anda harus berupa program, bukan fungsi.
  • Jika memungkinkan, harap sertakan tautan ke juru bahasa online atau tautan ke tempat saya dapat mengunduh juru bahasa untuk bahasa Anda dalam jawaban Anda.
  • Apa pun yang saya tidak tentukan dalam tantangan ini adalah permainan yang adil, artinya jika saya tidak mengatakannya, terserah Anda. Jika ada yang kabur, beri tahu saya dan saya akan mengedit jawaban sesuai. (Semoga ini berjalan lebih lancar dari tantangan terakhir saya.)

Contohnya

     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
sumber
1
Saya tidak mengerti sequenceseperti apa atau bagaimana cara kerjanya. Bisakah Anda menambahkan beberapa test case?
xnor
@xnata Ya, tambahkan sekarang.
The_Basset_Hound
2
... Saya tidak pernah bermain kartu dengan Anda. :P
Conor O'Brien
@ThomasKwa Input harus diambil melalui input standar atau alternatif terdekat.
The_Basset_Hound
Apakah ABDD 12input yang valid? Apa yang seharusnya menjadi output? Juga, apakah saya mengerti benar itu adil AABBB 12?
xnor

Jawaban:

5

Pyth, 33 31 byte

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

Input contoh:

ABACBC
120
orlp
sumber
4

Python 3.x, 106 128 138 byte

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)

Ini menggandakan urutan input (lebih banyak dari yang dibutuhkan, yang cukup baik) dan kemudian hanya mengambil nkarakter pertama . Ini dihitung dan salah unevenatau evendipilih, dan jika yang pertama, jumlah juga dicetak dengan print(*z), yang secara otomatis membongkar zuntuk saya.

Disimpan 32 byte berkat xnor dan Sp3000!

Juga, Python 3.5 memiliki fitur baru yang memungkinkan solusi 102 byte ini:

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})>1membongkar daftar z, membuat satu set dari itu, lalu memeriksa untuk melihat apakah ia memiliki lebih dari satu elemen. Hal ini {*z}khusus yang baru.

El'endia Starman
sumber
1
Senang melihat pegolf Python baru! Beberapa tips cepat. Daftar comp [t.count(x) for x in set(t)]bisa dilakukan sebagai map: map(t.count,set(t)). Pertanyaannya memungkinkan tumpukan dalam urutan apa pun, jadi saya pikir Anda dapat menghindari melakukan sorted, bahkan jika itu berarti Anda harus melakukan sesuatu yang sedikit lebih lama daripada z==z[::-1]suka z[1:]==z[:-1].
xnor
Juga, Python 3 memungkinkan Anda print*untuk mencetak elemen-elemen daftar yang dipisahkan oleh ruang. Ini biasanya lebih pendek dari ' '.join.
xnor
@ xnor: Sangat dihargai!
El'endia Starman
2

CJam, 35 byte

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

Cobalah online di penerjemah CJam .

Bagaimana itu bekerja

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
sumber