Berikan kartu kepada para pemain

15

Malam ini adalah malam permainan kartu! Anda adalah dealer dan tugas Anda adalah menulis program untuk memberikan kartu kepada para pemain.

Diberikan berbagai kartu dan jumlah pemain, Anda perlu membagi array kartu menjadi satu tangan untuk setiap pemain.

contoh untuk 4 pemain dengan setumpuk 10 kartu

Aturan

Program Anda akan menerima larik non-kosong A, serta bilangan bulat positif tidak nol n. Array kemudian harus dibagi menjadi ntangan. Jika panjang tali tidak dapat dibagi oleh nkartu sisa di akhir harus dibagikan serata mungkin.

  • Jika n==1, Anda harus mengembalikan array dengan Akarena hanya elemen
  • Jika nlebih besar dari panjangnya A, Anda harus mengembalikan setiap tangan dan tangan kosong. jika n = 4dan array A = [1,2,3], Anda harus kembali [[1],[2],[3]]atau [[1],[2],[3],[]]. Anda bebas menangani tangan kosong dengan kosong, tidak terdefinisi atau nol.

  • Array dapat berisi jenis apa saja dan bukan angka.

  • Anda seharusnya tidak mengubah urutan array saat berhadapan. Sebagai contohif n = 2 dan A= [1,2,3], hasil apa pun alih-alih [[1,3],[2]]akan tidak valid.

Uji Kasus

n   A               Output

1   [1,2,3,4,5,6]   [[1,2,3,4,5,6]]
2   [1,2,3,4,5,6]   [[1,3,5],[2,4,6]]
3   [1,2,3,4,5,6]   [[1,4],[2,5],[3,6]]
4   [1,2,3,4,5,6]   [[1,5],[2,6],[3],[4]]
7   [1,2,3,4,5,6]   [[1],[2],[3],[4],[5],[6]] // or [[1],[2],[3],[4],[5],[6],[]]

Program Demo

def deal(cards, n):
	i = 0
	players = [[] for _ in range(n)]
	for card in cards:
		players[i % n].append(card)
		i += 1
	return players

hands = deal([1,2,3,4,5,6], 2)

print(hands)

Cobalah online!

Ini adalah , sehingga Anda byte terpendek dari setiap bahasa akan menjadi pemenangnya.

Terinspirasi dari Buat potongan dari array oleh chau giang

aloisdg pindah ke codidact.com
sumber
1
Anda harus mengembalikan setiap tangan dan tangan kosong bertentangan dengan kemungkinan hasil tes pertama yang terakhir.
Adám
6
Di masa depan saya akan merekomendasikan menggunakan Sandbox untuk menyelesaikan masalah dan mengukur umpan balik komunitas sebelum mengirim pertanyaan Anda ke utama
Jo King
2
@JoKing, saya sepenuhnya setuju. Saya tidak berpikir saya akan memiliki begitu banyak pengeditan untuk dilakukan. Ini seperti mendorong untuk mendorong tanpa menggunakan beta terlebih dahulu. Terima kasih atas bantuannya.
aloisdg pindah ke codidact.com
1
@aloisdg Saya tidak dapat menguraikan aturan alternatif yang disarankan. Jika idenya seperti orang sering berurusan dengan lingkaran, maka semua pemain yang berakhir dengan sebagian besar kartu ada di awal, dan pemain yang pada akhirnya mungkin tidak mendapatkan kartu.
Adám
2
Bagaimana jika array input berisi a 0?
Shaggy

Jawaban:

12

05AB1E , 3 1 byte

Disimpan 2 byte berkat Adnan

ι

Cobalah online! atau sebagai Test Suite

Penjelasan

ι  # uninterleave

Melakukan apa yang diminta tantangan

Emigna
sumber
5
Saya pikir ini harus bekerja juga:ι
Adnan
@ Adnan: Ya terima kasih :) Hanya perbedaan untuk daftar kosong n=7, tapi itu adalah format output yang dapat diterima. Saya benar-benar merindukan built-in: /
Emigna
Jadi ada bahasa dengan built-in untuk ini! : D
aloisdg pindah ke codidact.com
9

R , 46 25 byte

function(A,n)split(A,1:n)

Cobalah online!

splits Ake dalam kelompok yang ditentukan oleh 1:n, didaur ulang 1:nsampai cocok dengan panjangnya A.

Giuseppe
sumber
7

Perl 6 , 33 24 byte

->\b{*.classify:{$++%b}}

Cobalah online!

Blok kode kari anonim yang mengambil nomor dan mengembalikan lambda apa pun yang mengambil daftar dan mengembalikan daftar daftar. Ini mengambil opsi kedua ketika diberi nomor yang lebih besar dari panjang daftar, misalnya f(4)([1,2,3])pengembalian[[1],[2],[3]]

Penjelasan:

->\b{                  }  # Anonymous code block that takes a number
     *                    # And returns a Whatever lambda
      .classify           # That groups by
               :{$++%b}   # The index modulo the number
Jo King
sumber
7

Bahasa Wolfram (Mathematica) , 28 byte

(s=#;GatherBy[#2,#~Mod~s&])&

Cobalah online!

J42161217
sumber
Sangat cerdik dilakukan!
Greg Martin
"Array dapat berisi tipe apa saja dan bukan angka."
attinat
6

Japt, 2 byte

Mengambil array sebagai input pertama.

óV

Cobalah

Shaggy
sumber
5

Python 2 , 37 byte

Kode:

lambda x,n:[x[i::n]for i in range(n)]

Cobalah online!

Adnan
sumber
5

Jelly , 6 2 byte

sZ

Cobalah online!

Terima kasih kepada @JonathanAllan karena telah menghemat 4 byte

Nick Kennedy
sumber
Tidak sZbekerja
Jonathan Allan
@ Jonathan Allan ya, entah bagaimana melewatkannya. Apakah Anda ingin memposting sebagai jawaban terpisah atau haruskah saya mengedit jawaban saya?
Nick Kennedy
Tidak, Anda dipersilakan untuk mengedit :)
Jonathan Allan
4

J , 13 , 11 , 10 , 9 byte

(|#\)</.]

Cobalah online!

bagaimana (penjelasan sebelumnya, pada dasarnya sama)

] </.~ (| #\)
  </.~          NB. box results of grouping
]               NB. the right arg by...
         |      NB. the remainders of dividing...
       [        NB. the left arg into...
           #\   NB. the length of each prefix of...
              ] NB. the right arg,
                NB. aka, the integers 1 thru
                NB. the length of the right arg
Jonah
sumber
3

Arang , 9 byte

IEθ✂ηιLηθ

Cobalah online! Tautan adalah untuk mengucapkan versi kode. Mengambil input dalam urutan [n, A]dan mengeluarkan setiap nilai pada barisnya masing-masing dan masing-masing spasi ganda dari sebelumnya. Penjelasan:

  θ         First input `n`
 E          Map over implicit range
    η       Second input `A`
   ✂        Sliced
     ι      Starting at current index
      Lη    Ending at length of `A`
        θ   Taking every `n`th element
I           Cast to string
            Implicitly print
Neil
sumber
+1 untuk membuat simbol "slice" menjadi gunting!
Jonah
2

Haskell , 39 byte

import Data.Lists
(transpose.).chunksOf

Catatan: Data.Listsberasal dari daftar perpustakaan pihak ketiga , yang tidak ada di Stackage dan karenanya tidak akan muncul di Hoogle.

dfeuer
sumber
Data.Listssepertinya tidak ada. Saya akan berasumsi bahwa Anda berarti Data.List, tetapi tidak mengandung chunksOf.
Joseph Sible-Reinstate Monica
chunksOfsepertinya hanya muncul dengan tanda tangan Int -> Text -> [Text]. 1
Post Rock Garf Hunter
@ YosephSible, ada dalam listspaket.
dfeuer
@ SriotchilismO'Zaic, banyak hal tidak muncul di Hoogle. Ada dalam splitpaket dan diekspor kembali oleh listspaket. Ada versi chunksOfuntuk daftar, teks, urutan, dan mungkin hal-hal lain.
dfeuer
2

Kotlin , 53 51 49 byte

{a,n->(0..n-1).map{a.slice(it..a.size-1 step n)}}

Solusi lama dan salah hanya bekerja untuk pembagi panjang array. Saya yakin ini bisa diturunkan.

Cobalah online!

Adam
sumber
tidak valid
ASCII
Tidak berfungsi ketika nbukan merupakan pembagi dari panjang daftar
Jo King
Begitu ya, terima kasih. Perbaiki sekarang
Adam
Saya percaya ini sudah diperbaiki @ ASCII-only
Adam
1
sepertinya Anda dapat menghapus pasangan ekstra atau parens
ASCII
1

APL + WIN 26 atau 31 byte

Jika masing-masing tangan dapat direpresentasikan sebagai kolom dari matriks 2D maka 26 byte jika array array kemudian tambahkan 5 byte.

(l,n)⍴((l←⌈(⍴a)÷n)×n←⎕)↑a←⎕

Cobalah online! ourtesy dari Dyalog Classic

atau

⊂[1](l,n)⍴((l←⌈(⍴a)÷n)×n←⎕)↑a←⎕

Cobalah online! Atas perkenan Dyalog Classic

Penjelasan:

← ⎕ prompt untuk array kartu

((l ← ⌈ (⍴a) ÷ n) × n ← ⎕) ↑ meminta integer, pad a dengan nol untuk diberikan tangan yang rata

(l, n) ⍴ buat matriks 2D dengan setiap kolom mewakili masing-masing tangan

⊂ [1] jika perlu dikonversi ke vektor bersarang - array array APL

Graham
sumber
1

TSQL, 44 byte

-- @       : table containing the input 
-- column c: value of the card, 
-- column a: position on the card in the deck
-- @n      : number of players

DECLARE @ table(a int identity(0,1), c varchar(9))
DECLARE @n int = 4

INSERT @ values('1a'),('2c'),('3e'),('4g'),('5i'),('6k')

SELECT string_agg(c,',')FROM @ GROUP BY a%@n

Cobalah

t-clausen.dk
sumber
1
Setiap kali saya di situs web ini saya melihat sesuatu yang baru dan berkata, "Wah itu mengesankan, tapi mengapa?"
MindSwipe
@MindSwipe Saya telah menjawab banyak pertanyaan di StackOverflow, tetapi banyak dari pertanyaan itu sama atau hampir sama - juga rasanya seperti saya bekerja secara gratis. Pertanyaan kode-golf berbeda setiap kali dan saya lebih menikmatinya karena saya bisa menggunakan metode yang jarang saya temui.
t-clausen.dk
1

MathGolf , 9 byte

\ô_í\%q╞;

Cobalah online!

Penjelasan

\           swap top elements (pops both input onto stack)
 ô          start block of length 6
  _         duplicate TOS (will duplicate the list)
   í        get total number of iterations of for loop (the other input)
    \       swap top elements
     %      modulo (picks every n:th item of the list
      q     print without newline
       ╞    discard from left of string/array (makes the next player pick cards starting with the next in the deck)
        ;   discard TOS (removes some junk in the end)
maks
sumber
1

Java (JDK) , 90 byte

A->n->{var o="";for(int h=0,i;h<n;o+="\n")for(i=h++;i<A.length;i+=n)o+=" "+A[i];return o;}

Cobalah online!

Terima kasih Olivier Grégoire untuk lambda dan peningkatan yang lebih baik saat iterasi.

Daniel Widdis
sumber
Dan di sini, saya memasukkan golf ke 90 byte .
Olivier Grégoire
@ OlivierGrégoire terima kasih! Agak baru untuk ini dan sedang mengerjakan lambda sedikit tetapi berjuang.
Daniel Widdis
1

Ruby, 81 byte

def s a,n;a.each_with_index.inject(([[]]*n).map(&:dup)){|b,(c,d)|b[d%n]<<c;b};end

Cobalah secara Online

Avilyn
sumber
1
Bisakah Anda menambahkan tautan ke lingkungan pengujian online untuk kemudahan verifikasi?
Jonathan Frech
@ JonathanFrech Ini dia.
Avilyn
Selamat datang di PPCG! Ada banyak optimasi yang dapat Anda lakukan untuk jangka waktu lama; misalnya, each_with_indexcukup mahal dibandingkan dengan penghitung tambahan, map{[]}pada dasarnya melakukan hal yang sama seperti map(&:dup)trik Anda , Proc anonim, dll. yang dapat mengurangi kode Anda hingga 59 byte. Cobalah online! Lihat juga halaman tips Ruby
Value Ink
1

PHP ,85 83 82 byte

function($a,$n){while($x<$n)$c[]=array_column(array_chunk($a,$n),+$x++);return$c;}

Cobalah online!

Ini bukan entri terpendek, tapi saya pikir akan menyenangkan untuk mencoba dan melakukannya menggunakan fungsi array PHP built-in. Hasil: panjang.

Keluaran

1   [1,2,3,4,5,6]   [[1,2,3,4,5,6]]
2   [1,2,3,4,5,6]   [[1,3,5],[2,4,6]]
3   [1,2,3,4,5,6]   [[1,4],[2,5],[3,6]]
4   [1,2,3,4,5,6]   [[1,5],[2,6],[3],[4]]
7   [1,2,3,4,5,6]   [[1],[2],[3],[4],[5],[6],[]]
5   ["9C","QD","2S","4H","6D","AS","9D","TH","5C"]  [["9C","AS"],["QD","9D"],["2S","TH"],["4H","5C"],["6D"]]
640KB
sumber
1
Hanya FYI, alih-alih print_flatAnda hanya dapat melakukan json_encode sandbox - jangan benar-benar mengubah jawabannya, hanya berpikir saya akan menyebutkannya, tepuk tangan!
ArtisticPhoenix
@ArtisticPhoenix dengan baik, tentu saja! (facepalm) Terima kasih! :)
640KB
1

Bahasa Wolfram (Mathematica) , 25 byte

#2[[i;;;;#]]~Table~{i,#}&

Cobalah online!

attinat
sumber
O_o penjelasan tolong
ASCII-hanya
@ ASCII-only ;; ;;hanya sepotong, kira-kira setara dengan python : :; ini mendapat irisan setiapnElemen untuk offset 1 ... n
attinat
oh ya, lupa itu ;;bukan ;lol. sedang melihat ini "wth is i ; ; ; ; #"
ASCII-hanya
0

C # (Visual C # Interactive Compiler) , 43 byte

a=>b=>{int i=0;return a.GroupBy(_=>i++%b);}

Cobalah online!

aloisdg pindah ke codidact.com
sumber
@ JoKing [1,2,3], 4harus menampilkan [[1],[2],[3]]. Anda memberikan 3 kartu kepada 4 pemain. Saya akan memperbarui pertanyaan utama.
aloisdg pindah ke codidact.com
1
Biasanya tidak disarankan untuk segera mengirim solusi ke tantangan Anda sendiri.
Shaggy
1
@ Shaggy ok saya akan memperhitungkannya untuk waktu berikutnya. Baik-baik saja di jadi dan rpg tapi saya kira aspek kompetitif dari codegolf membuatnya sedikit tidak adil untuk memposting sendiri secara langsung. Masuk akal.
aloisdg pindah ke codidact.com
@ Raja kamu benar! Saya membuat kesalahan ketik: /
aloisdg pindah ke codidact.com
0

C (gcc), 5 byte

Bendera kompiler -Df=(req. Leading space) memenuhi spesifikasi. f(n_cards,n_hands,card_ptr)mengevaluasi ke penunjuk ke daftar tangan.

Penjelasan

Di C, itu adalah praktik umum untuk mengimplementasikan daftar daftar sebagai satu array yang disisipkan, ketika jumlah daftar tetap konstan tetapi semua daftar dapat diperpanjang. Sebagai contoh, dalam kasus kartu yang bertransaksi ini, lebih banyak kartu yang ditambahkan pada masing-masing tangan daripada lebih banyak tangan yang ditambahkan, sehingga masuk akal untuk mengimplementasikan daftar tangan sebagai daftar yang disisipkan. Secara kebetulan, "dek" adalah daftar seperti itu, dan dengan demikian kita mengembalikan parameter yang tidak dimodifikasi.

Tantangan ini mungkin seharusnya sudah di-sandbox.


sumber
Saya pikir kita semua setuju untuk sandbox
aloisdg pindah ke codidact.com
0

Perl 5 -la, 66 56 bytes

$,=<>;map{push@$_,shift@F}1..$,while@F;say"@$_"for 1..$,

Cobalah online!

Xcali
sumber