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


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


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.


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





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

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

+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.


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!



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


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


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)


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


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"]]

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


0

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

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

Cobalah online!


@ 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.


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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.