แจกการ์ดให้กับผู้เล่น


15

คืนนี้เป็นคืนการ์ดเกม! คุณเป็นตัวแทนจำหน่ายและงานของคุณคือการเขียนโปรแกรมเพื่อแจกไพ่ให้ผู้เล่น

เมื่อมีอาร์เรย์ของการ์ดและจำนวนของผู้เล่นคุณจะต้องแบ่งไพ่ออกเป็นมือสำหรับผู้เล่นแต่ละคน

ตัวอย่างสำหรับผู้เล่น 4 คนที่มีไพ่ 10 ใบ

กฎระเบียบ

โปรแกรมของคุณจะได้รับอาเรย์ไม่ว่างเปล่าเช่นเดียวกับที่ไม่ใช่ศูนย์จำนวนเต็มบวกA nอาเรย์จะถูกแบ่งออกเป็นnสองส่วน หากความยาวของสตริงไม่สามารถหารด้วยnการ์ดที่เหลือใด ๆ ในตอนท้ายควรแจกจ่ายให้เท่า ๆ กัน

  • หากn==1คุณจะต้องส่งกลับอาร์เรย์ของอาร์เรย์ด้วยAเนื่องจากเป็นองค์ประกอบเท่านั้น
  • หากnมากกว่าความยาวAคุณจะต้องกลับมือทุกครั้งและมือเปล่า ถ้าn = 4และarray A = [1,2,3]คุณควรจะกลับหรือ[[1],[2],[3]] [[1],[2],[3],[]]คุณมีอิสระในการจัดการมือเปล่าด้วยเปล่า, ไม่ได้กำหนดหรือเป็นโมฆะ

  • อาร์เรย์สามารถมีชนิดใดก็ได้แทนที่จะเป็นตัวเลข

  • คุณไม่ควรเปลี่ยนลำดับของอาเรย์ขณะทำการซื้อขาย ตัวอย่างเช่นif n = 2และA= [1,2,3]ผลลัพธ์ใด ๆ ที่มากกว่า[[1,3],[2]]จะไม่ถูกต้อง

กรณีทดสอบ

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

โปรแกรมสาธิต

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)

ลองออนไลน์!

นี่คือดังนั้นคุณจึงไบต์สั้นที่สุดของแต่ละภาษาจะเป็นผู้ชนะ

แรงบันดาลใจจากสร้างชิ้นจากอาร์เรย์โดยchau giang


1
คุณจะต้องกลับมาทุกมือและมือเปล่าขัดแย้งกับความเป็นไปได้ครั้งแรกของผลการทดสอบครั้งสุดท้าย
อดัม

6
ในอนาคตฉันขอแนะนำให้ใช้Sandboxเพื่อแก้ปัญหาและวัดความคิดเห็นของชุมชนก่อนโพสต์คำถามของคุณไปยังหน้าหลัก
Jo King

2
@ โจกิ้งฉันเห็นด้วยอย่างเต็มที่ ฉันไม่คิดว่าฉันจะต้องแก้ไขอะไรมากมาย มันเหมือนกับการผลักดันไปยังผลิตภัณฑ์โดยไม่ต้องปรับใช้กับเบต้าก่อน ขอบคุณสำหรับความช่วยเหลือ.
aloisdg ย้ายไปยัง codidact.com

1
@aloisdg ฉันไม่สามารถแยกกฎทางเลือกที่คุณแนะนำได้ หากความคิดนั้นเหมือนคนมักจะวนเป็นวงกลมผู้เล่นทุกคนที่จบด้วยไพ่ส่วนใหญ่จะอยู่ที่จุดเริ่มต้นและผู้เล่นที่อยู่ท้ายที่สุดอาจไม่ได้รับไพ่
อดัม

2
เกิดอะไรขึ้นถ้าอาร์เรย์อินพุตมี a 0?
Shaggy

คำตอบ:


12

05AB1E , 3 1 ไบต์

บันทึก 2 ไบต์ต้องขอบคุณAdnan

ι

ลองออนไลน์! หรือเป็นชุดทดสอบ

คำอธิบาย

ι  # uninterleave

ทำสิ่งที่ท้าทายตรงตามความต้องการ


5
ฉันคิดว่ามันน่าจะใช้ได้ดี:ι
Adnan

@Adnan: ใช่ขอบคุณ :) ความแตกต่างเป็นรายการที่ว่างเปล่าn=7แต่นั่นเป็นรูปแบบผลลัพธ์ที่ยอมรับได้ ฉันพลาดทั้งหมดในตัว: /
Emigna

ดังนั้นจึงมีภาษาที่มีในตัวสำหรับสิ่งนี้! : D
aloisdg กำลังย้ายไปยัง codidact.com


7

Perl 6 , 33 24 ไบต์

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

ลองออนไลน์!

บล็อกโค้ด curried แบบไม่ระบุชื่อที่รับหมายเลขและส่งกลับค่าแลมบ์ดาอะไรก็ตามที่รับรายการและส่งกลับรายการของรายการ นี้จะใช้เวลาตัวเลือกที่สองเมื่อได้รับหมายเลขที่มีขนาดใหญ่กว่าความยาวของรายการเช่นf(4)([1,2,3])ผลตอบแทน[[1],[2],[3]]

คำอธิบาย:

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




5

เยลลี่ , 6 2 ไบต์

sZ

ลองออนไลน์!

ขอบคุณ @JonathanAllan สำหรับการบันทึก 4 ไบต์


ใช้งานไม่sZได้?
Jonathan Allan

@JanathanAllan ใช่แล้วก็พลาดไป คุณต้องการโพสต์เป็นคำตอบแยกต่างหากหรือฉันจะแก้ไขของฉัน?
Nick Kennedy

ไม่สามารถแก้ไข :)
Jonathan Allan

4

J , 13 , 11 , 10 , 9 ไบต์

(|#\)</.]

ลองออนไลน์!

อย่างไร (คำอธิบายก่อนหน้าพื้นฐานเหมือนกัน)

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

ถ่าน 9 ไบต์

IEθ✂ηιLηθ

ลองออนไลน์! การเชื่อมโยงคือการใช้รหัสเวอร์ชันอย่างละเอียด รับอินพุตตามลำดับ[n, A]และเอาต์พุตแต่ละค่าบนบรรทัดของตัวเองและแต่ละมือเว้นระยะห่างสองเท่าจากก่อนหน้า คำอธิบาย:

  θ         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 สำหรับการทำสัญลักษณ์ของ "ชิ้น" กรรไกร!
Jonah

2

Haskell , 39 ไบต์

import Data.Lists
(transpose.).chunksOf

หมายเหตุ: Data.Listsมาจากรายการห้องสมุดบุคคลที่สามซึ่งไม่ได้อยู่ใน Stackage และด้วยเหตุนี้จะไม่ปรากฏใน Hoogle


Data.Listsดูเหมือนไม่มีอยู่จริง ฉันจะคิดว่าคุณหมายแต่มันไม่ได้มีData.List chunksOf
Joseph Sible-Reinstate Monica

chunksOfดูเหมือนว่าจะปรากฏพร้อมกับลายเซ็นInt -> Text -> [Text]เท่านั้น 1
โพสต์ Rock Garf Hunter

@JosephSible มีอยู่ในlistsแพ็คเกจ
dfeuer

@ SriotchilismO'Zaic มีหลายสิ่งที่ไม่ปรากฏใน Hoogle มันอยู่ในsplitแพ็คเกจและส่งออกซ้ำโดยlistsแพ็คเกจ มีรุ่นของchunksOfรายการข้อความลำดับและสิ่งอื่น ๆ
dfeuer

2

Kotlin , 53 51 49 ไบต์

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

วิธีการแก้ปัญหาแบบเก่าและไม่ถูกต้องใช้งานได้สำหรับตัวหารของความยาวอาร์เรย์เท่านั้น ฉันแน่ใจว่านี่สามารถลงสนามได้

ลองออนไลน์!



ไม่ทำงานเมื่อnไม่ใช่ตัวหารของความยาวของรายการ
Jo King

ฉันเห็นขอบคุณ แก้ไขได้ทันที
Adam

ฉันเชื่อว่าสิ่งนี้ได้รับการแก้ไข @ ASCII-only
Adam

1
ดูเหมือนว่าคุณสามารถลบ parens คู่คู่เสริมออกได้
ASCII-only


1

APL + ชนะ 26 หรือ 31 ไบต์

ถ้าแต่ละมือสามารถแสดงเป็นคอลัมน์ของเมทริกซ์ 2D แล้ว 26 ไบต์ถ้าอาร์เรย์ของอาร์เรย์นั้นเพิ่ม 5 ไบต์

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

ลองออนไลน์! ourtesy ของ Dyalog Classic

หรือ

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

ลองออนไลน์! ความอนุเคราะห์จาก Dyalog Classic

คำอธิบาย:

พรอมต์←⎕สำหรับอาร์เรย์ของการ์ด

((l ←⌈ (⍴a) ÷ n) × n ←⎕) ↑ขอเลขจำนวนเต็มให้ใส่แผ่น a ด้วยเลขศูนย์

(l, n) ⍴สร้างเมทริกซ์ 2D กับแต่ละคอลัมน์ที่แสดงถึงแต่ละมือ

⊂ [1] ถ้าต้องการแปลงเป็นเวกเตอร์ที่ซ้อนกัน - อาร์เรย์ของ APL


1

TSQL, 44 ไบต์

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

ลองดู


1
ทุกครั้งที่ฉันอยู่ในเว็บไซต์นี้ฉันเห็นสิ่งใหม่และไป "ว้าวมันน่าประทับใจ แต่ทำไม"
MindSwipe

@MindSwipe ฉันได้ตอบคำถามมากมายเกี่ยวกับ StackOverflow แต่คำถามเหล่านั้นหลายคำถามเหมือนกันหรือเกือบเหมือนกัน - ฉันรู้สึกเหมือนฉันทำงานฟรี คำถามรหัสกอล์ฟแตกต่างกันทุกครั้งและฉันสนุกกับมันมากกว่าเพราะฉันได้ใช้วิธีการที่ไม่ค่อยพบเจอ
t-clausen.dk

1

MathGolf , 9 ไบต์

\ô_í\%q╞;

ลองออนไลน์!

คำอธิบาย

\           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

Java (JDK) , 90 ไบต์

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;}

ลองออนไลน์!

ขอบคุณOlivier Grégoireสำหรับแลมบ์ดาและการเพิ่มขึ้นที่ดีขึ้นในขณะที่วนซ้ำ



@ OlivierGrégoireขอบคุณ! ค่อนข้างใหม่สำหรับสิ่งนี้และกำลังทำงานกับแลมบ์ดาเล็กน้อย แต่กำลังดิ้นรน
Daniel Widdis

1

Ruby, 81 ไบต์

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

ลองออนไลน์


1
คุณสามารถเพิ่มลิงค์ไปยังสภาพแวดล้อมการทดสอบออนไลน์เพื่อความสะดวกในการตรวจสอบหรือไม่?
Jonathan Frech

@ JonathanFrech คุณไปแล้ว
Avilyn

ยินดีต้อนรับสู่ PPCG! มีการปรับแต่งมากมายที่คุณทำได้นาน ตัวอย่างเช่นeach_with_indexค่อนข้างแพงเมื่อเทียบกับตัวนับที่เพิ่มขึ้นmap{[]}โดยทั่วไปจะทำเช่นเดียวกับmap(&:dup)เคล็ดลับ Proc ที่ไม่ระบุชื่อของคุณฯลฯ ที่สามารถลดรหัสของคุณลงเหลือ 59 ไบต์ ลองออนไลน์! ตรวจสอบหน้าเคล็ดลับ Ruby
Value Ink

1

PHP ,85 83 82 ไบต์

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

ลองออนไลน์!

นี่จะไม่ใช่รายการที่สั้นที่สุด แต่ฉันคิดว่ามันสนุกที่จะลองทำโดยใช้ฟังก์ชันอาร์เรย์ของ PHP ผล: ยาว

เอาท์พุต

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
แค่ FYI แทนที่จะprint_flatคุณสามารถทำjson_encode แซนด์บ็อกซ์ได้ - อย่าเปลี่ยนคำตอบจริงๆแค่คิดว่าฉันจะพูดถึงมันไชโย!
ArtisticPhoenix

@ ศิลปะฟีนิกซ์แน่นอน! (facepalm) ขอบคุณ! :)
640KB

1

ภาษา Wolfram (Mathematica)ขนาด 25 ไบต์

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

ลองออนไลน์!


O_o คำอธิบายกรุณา
ASCII เท่านั้น

@ ASCII-only ;; ;;เป็นเพียงส่วนหนึ่งซึ่งเทียบเท่ากับ python : :; นี้ได้รับชิ้นส่วนของทุกคนnองค์ประกอบที่ 1 สำหรับออฟเซ็ต 1 ... n
attinat

โอ้ใช่ลืมไปแล้วว่ามัน;;ไม่ได้;ฮ่า ๆ ถูกมองที่จะไปนี้ "wth is i ; ; ; ; #"
ASCII เท่านั้น

0

C # (Visual C # Interactive คอมไพเลอร์) , 43 ไบต์

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

ลองออนไลน์!


@JoKing ควรเอาท์พุท[1,2,3], 4 [[1],[2],[3]]คุณกำลังเล่นไพ่ 3 ใบกับผู้เล่น 4 คน ฉันจะอัปเดตคำถามหลัก
aloisdg ย้ายไปยัง codidact.com

1
โดยทั่วไปเราไม่แนะนำให้โพสต์วิธีแก้ไขปัญหาของคุณในทันที
Shaggy

1
@Shaggy ตกลงฉันจะคำนึงถึงมันในครั้งต่อไป มันดีและสมมุติ แต่ฉันคิดว่าแง่มุมการแข่งขันของ codegolf ทำให้มันค่อนข้างไม่ยุติธรรมที่จะโพสต์ด้วยตนเองโดยตรง เข้าท่า
aloisdg ย้ายไปยัง codidact.com

@ โจราชาคุณพูดถูก! ฉันพิมพ์ผิด: /
aloisdg ย้ายไปที่ codidact.com

0

C (gcc) 5 ไบต์

ธงคอมไพเลอร์-Df=(ต้องมีช่องว่างนำหน้า) เป็นไปตามข้อกำหนด f(n_cards,n_hands,card_ptr)ประเมินเป็นตัวชี้ไปยังรายการมือ

คำอธิบาย

ใน C มันเป็นวิธีปฏิบัติทั่วไปในการใช้รายการของรายการเป็นอาร์เรย์ interleaved เดียวเมื่อจำนวนรายการยังคงที่ แต่รายการทั้งหมดสามารถขยายได้ ตัวอย่างเช่นในกรณีของการซื้อขายไพ่มันเป็นเรื่องธรรมดามากที่จะมีการเพิ่มไพ่ในแต่ละมือมากกว่ามือที่เพิ่มเข้ามาดังนั้นจึงมีเหตุผลที่จะใช้รายการของมือเป็นรายการอินเตอร์เลด บังเอิญ "สำรับ" เป็นรายการดังกล่าวดังนั้นเราจึงคืนค่าพารามิเตอร์ที่ไม่ได้แก้ไข

ความท้าทายนี้น่าจะถูก sandboxed


ฉันคิดว่าเราทุกคนเห็นด้วยกับกล่องทราย
aloisdg ย้ายไปที่ codidact.com

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.