Giải quyết các thẻ cho người chơi


15

Đêm nay là đêm chơi bài! Bạn là đại lý và nhiệm vụ của bạn là viết một chương trình để chia bài cho người chơi.

Đưa ra một loạt các thẻ và số lượng người chơi, bạn cần chia mảng thẻ thành một tay cho mỗi người chơi.

ví dụ cho 4 người chơi với bộ bài gồm 10 lá

Quy tắc

Chương trình của bạn sẽ nhận được một mảng không trống A, cũng như một số nguyên dương khác không n. Các mảng nên được chia thành ntay. Nếu độ dài của chuỗi không chia hết cho nbất kỳ thẻ còn lại nào ở cuối thì nên phân phối càng đều càng tốt.

  • Nếu n==1, bạn sẽ cần trả về một mảng với Aphần tử duy nhất
  • Nếu nlớn hơn chiều dài A, bạn sẽ cần trả lại mọi bàn tay và một bàn tay trắng. nếu n = 4array A = [1,2,3], bạn nên trở lại [[1],[2],[3]]hoặc [[1],[2],[3],[]]. Bạn có thể tự do xử lý bàn tay trống với trống, không xác định hoặc null.

  • Mảng có thể chứa bất kỳ loại nào hơn là một số.

  • Bạn không nên thay đổi thứ tự của mảng trong khi giao dịch. Ví dụ if n = 2A= [1,2,3], bất kỳ kết quả nào hơn là [[1,3],[2]]sẽ không hợp lệ.

Các trường hợp thử nghiệm

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],[]]

Chương trình 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)

Hãy thử trực tuyến!

Đây là , do đó, các byte ngắn nhất của mỗi ngôn ngữ sẽ là người chiến thắng.

Lấy cảm hứng từ Tạo khối từ mảng bởi chau giang


1
bạn sẽ cần phải trả lại mọi bàn tay và một bàn tay trắng mâu thuẫn với khả năng kết quả đầu tiên của trường hợp thử nghiệm cuối cùng.
Adám

6
Trong tương lai, tôi khuyên bạn nên sử dụng Hộp cát để giải quyết các vấn đề và đánh giá phản hồi của cộng đồng trước khi đăng câu hỏi của bạn lên chính
Jo King

2
@JoKing tôi hoàn toàn đồng ý. Tôi không nghĩ rằng tôi sẽ có rất nhiều chỉnh sửa để làm. Nó giống như đẩy lên prod mà không triển khai trên beta trước. Cảm ơn bạn vì sự giúp đỡ.
aloisdg chuyển đến codidact.com

1
@aloitorg Tôi không thể phân tích quy tắc thay thế được đề xuất của bạn. Nếu ý tưởng giống như mọi người thường xử lý một vòng tròn, thì tất cả những người chơi kết thúc với hầu hết các thẻ đều ở đầu và những người chơi ở cuối có thể không nhận được thẻ.
Adám

2
Nếu mảng đầu vào chứa a 0thì sao?
Shaggy

Câu trả lời:


12

05AB1E , 3 1 byte

Saved 2 byte nhờ Adnan

ι

Hãy thử trực tuyến! hoặc như một bộ thử nghiệm

Giải trình

ι  # uninterleave

Có chính xác những gì thách thức yêu cầu


5
Tôi nghĩ điều này cũng sẽ hoạt động tốt:ι
Adnan

@Adnan: Yeah cảm ơn :) Chỉ có sự khác biệt là danh sách trống cho n=7, nhưng đó là một định dạng đầu ra chấp nhận được. Tôi đã hoàn toàn bỏ lỡ sự tích hợp đó: /
Emigna

Vì vậy, có một ngôn ngữ tích hợp sẵn cho việc này! : D
aloisdg chuyển đến codidact.com


7

Perl 6 , 33 24 byte

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

Hãy thử trực tuyến!

Khối mã được ẩn danh ẩn danh lấy một số và trả về một lambda nào lấy danh sách và trả về danh sách các danh sách. Điều này có tùy chọn thứ hai khi được cung cấp một số lớn hơn độ dài của danh sách, ví dụ:f(4)([1,2,3]) trả về[[1],[2],[3]]

Giải trình:

->\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

(|#\)</.]

Hãy thử trực tuyến!

Làm thế nào (giải thích trước, về cơ bản giống nhau)

] </.~ (| #\)
  </.~          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

Than , 9 byte

IEθ✂ηιLηθ

Hãy thử trực tuyến! Liên kết là phiên bản dài dòng của mã. Đưa đầu vào theo thứ tự [n, A]và xuất từng giá trị trên dòng riêng và mỗi tay cách nhau hai lần so với trước. Giải trình:

  θ         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 để làm biểu tượng "cắt" một cái kéo!
Giô-na

2

Haskell , 39 byte

import Data.Lists
(transpose.).chunksOf

Lưu ý: Data.Listslà từ danh sách thư viện của bên thứ ba , không nằm trong Stackage và do đó sẽ không xuất hiện trên Hoogle.


Data.Listsdường như không tồn tại Tôi cho rằng bạn có ý đó Data.List, nhưng nó không chứa chunksOf.
Joseph Sible-Phục hồi Monica

chunksOfchỉ dường như xuất hiện với chữ ký Int -> Text -> [Text]. 1
Post Rock Garf Hunter

@JosephSible, nó nằm trong listsgói.
dfeuer

@ SriotchilismO'Z cổ, rất nhiều thứ không hiển thị trong Hoogle. Nó nằm trong splitgói và được tái xuất bởi listsgói. Có các phiên bản chunksOfcho danh sách, văn bản, trình tự, và có thể những thứ khác.
dfeuer

2

Kotlin , 53 51 49 byte

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

Giải pháp cũ, không chính xác chỉ làm việc cho các ước của độ dài mảng. Tôi chắc chắn điều này có thể được đánh xuống.

Hãy thử trực tuyến!



Không hoạt động khi nkhông phải là ước số của độ dài của danh sách
Jo King

Tôi hiểu rồi, cảm ơn. Sửa nó ngay bây giờ
Adam

Tôi tin rằng điều này chỉ cố định @ ASCII
Adam

1
có vẻ như bạn có thể loại bỏ cặp parens phụ
ASCII chỉ có


1

APL + THẮNG 26 hoặc 31 byte

Nếu các tay riêng lẻ có thể được biểu diễn dưới dạng các cột của ma trận 2D thì 26 byte nếu một mảng các mảng thì thêm 5 byte.

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

Hãy thử trực tuyến! đặc quyền của Dyalog Classic

hoặc là

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

Hãy thử trực tuyến! Lịch sự của Dyalog Classic

Giải trình:

Dấu nhắc ← for cho mảng thẻ

((l ← (a) ÷ n) × n ← ⎕) ↑ nhắc về số nguyên, đệm a với các số 0 để đưa ra các tay chẵn

(l, n) tạo ma trận 2D với mỗi cột đại diện cho mỗi tay

[1] nếu được yêu cầu chuyển đổi sang vector lồng nhau - mảng APL của mảng


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

Dùng thử


1
Mỗi lần tôi vào trang web này, tôi lại thấy một cái gì đó mới và "Wow thật ấn tượng, nhưng tại sao?"
MindSwipe

@MindSwipe Tôi đã trả lời rất nhiều câu hỏi trên StackOverflow, nhưng nhiều câu hỏi trong số đó giống hoặc gần giống nhau - cũng có cảm giác như tôi đang làm việc miễn phí. Các câu hỏi golf-code khác nhau mỗi lần và tôi thích nó hơn bởi vì tôi có thể sử dụng các phương pháp mà tôi hiếm khi gặp phải.
t-clausen.dk

1

MathGolf , 9 byte

\ô_í\%q╞;

Hãy thử trực tuyến!

Giải trình

\           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

Dùng thử trực tuyến


1
Bạn có thể thêm một liên kết đến một môi trường thử nghiệm trực tuyến để dễ xác minh không?
Jonathan Frech

@JonathanFrech Có bạn đi.
Avilyn

Chào mừng đến với PPCG! Có rất nhiều tối ưu hóa bạn có thể làm cho chiều dài; ví dụ, each_with_indexkhá đắt so với bộ đếm tăng dần, map{[]}về cơ bản thực hiện tương tự như map(&:dup)thủ thuật của bạn , Proc ẩn danh, v.v. có thể giảm mã của bạn xuống còn 59 byte. Hãy thử trực tuyến! Ngoài ra hãy xem trang mẹo về Ruby
Ink Ink

1

PHP ,85 83 82 byte

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

Hãy thử trực tuyến!

Đây sẽ không phải là mục ngắn nhất, nhưng tôi nghĩ sẽ rất vui nếu thử và thực hiện bằng cách sử dụng chức năng mảng PHP. Kết quả: dài.

Đầu ra

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
Chỉ cần FYI, thay vì print_flatbạn chỉ có thể làm json_encode hộp cát - không thực sự thay đổi câu trả lời, chỉ cần nghĩ rằng tôi sẽ đề cập đến nó, chúc mừng!
ArtisticPhoenix

@ArtisticPhoenix tốt, tất nhiên! (facepalm) Cảm ơn! :)
640KB


0

C # (Trình biên dịch tương tác Visual C #) , 43 byte

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

Hãy thử trực tuyến!


@JoKing [1,2,3], 4nên xuất [[1],[2],[3]]. Bạn đang giao dịch 3 thẻ cho 4 người chơi. Tôi sẽ cập nhật câu hỏi chính.
aloisdg chuyển đến codidact.com

1
Nói chung, không khuyến khích đăng các giải pháp cho các thách thức của riêng bạn ngay lập tức.
Xù xì

1
@Shaggy ok tôi sẽ đưa nó vào tài khoản cho lần tiếp theo. Nó là tốt trên như vậy và rpg nhưng tôi đoán khía cạnh cạnh tranh của codegolf làm cho nó hơi không công bằng để tự đăng trực tiếp. Có lý.
aloisdg chuyển đến codidact.com

@Joe vua bạn nói đúng! Tôi đã đánh máy: /
aloisdg chuyển sang codidact.com

0

C (gcc), 5 byte

Cờ trình biên dịch -Df=(req. Không gian hàng đầu) đáp ứng đặc điểm kỹ thuật.f(n_cards,n_hands,card_ptr)ước tính cho một con trỏ đến một danh sách các bàn tay.

Giải trình

Trong C, thông thường là thực hiện danh sách các danh sách dưới dạng một mảng xen kẽ, khi số lượng danh sách không đổi nhưng tất cả các danh sách có thể được mở rộng. Ví dụ, trong trường hợp giao dịch thẻ này, thông thường sẽ có nhiều thẻ được thêm vào mỗi bàn tay hơn là thêm nhiều tay, vì vậy sẽ hợp lý khi thực hiện danh sách các bàn tay dưới dạng danh sách xen kẽ. Thật trùng hợp, "bộ bài" là một danh sách như vậy, và do đó chúng tôi trả về tham số không thay đổi.

Thử thách này có lẽ đã được đóng hộp cát.


Tôi nghĩ rằng tất cả chúng ta đều đồng ý cho hộp cát
aloisdg chuyển đến codidact.com 21/03/19

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.