发牌给玩家


15

今晚是纸牌游戏之夜!您是发牌人,您的任务是编写一个程序以将牌分发给玩家。

给定纸牌阵列和玩家数量,您需要将每个玩家的纸牌阵列分成一手。

4张牌有10张牌的玩家示例

规则

您的程序将收到一个非空数组A,以及一个非零正整数n。然后应将阵列拆分为n双手。如果字符串的长度不能被n剩余的卡片所整除,则应尽可能均匀地分配。

  • 如果为n==1,则您需要返回的数组,A因为它是唯一元素
  • 如果n大于的长度A,则需要退回每手和空手。如果n = 4array A = [1,2,3],您应该返回[[1],[2],[3]][[1],[2],[3],[]]。您可以自由处理空,未定义或空值的空手。

  • 数组可以包含任何类型,而不是数字。

  • 您不应在处理时更改数组的顺序。例如if n = 2A= [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)

在线尝试!

这是,因此每种语言的最短字节将成为赢家。

从激发从阵列创建块通过查·吉


1
您将需要全力以赴,而空手与最后一个测试用例的第一个结果可能性相矛盾。
亚当

6
在未来,我会建议使用沙箱,以消除问题和压力表社区的反馈您的问题发布到主前
乔金

2
@JoKing我完全同意。我没想到我会做很多编辑工作。这就像在不先部署Beta的情况下推动产品生产一样。感谢您的帮助。
aloisdg移至codidact.com,

1
@aloisdg我无法解析您建议的替代规则。如果这个想法就像人们经常打个圈,那么所有获得多数卡牌的玩家都在开始时,而处于结尾的玩家可能没有卡。
亚当

2
如果输入数组包含一个0
毛茸茸的

Answers:




7

Perl 6的33 24个字节

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

在线尝试!

匿名咖喱代码块,它接受一个数字并返回随便一个lambda,该lambda接受一个列表并返回一个列表列表。如果给定的数字大于列表的长度,则采用第二个选项,例如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





4

Ĵ131110,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使“切片”的符号成为剪刀!
乔纳

2

Haskell,39个字节

import Data.Lists
(transpose.).chunksOf

注意:Data.Lists来自第三方库列表,它不在Stackage上,因此不会出现在Hoogle上。


Data.Lists似乎不存在。我认为你的意思是Data.List,但它不包含chunksOf
约瑟夫·西布尔-恢复莫妮卡

chunksOf似乎只出现了签名Int -> Text -> [Text]1
发布Rock Garf Hunter,

@JosephSible,在lists包装中。
dfeuer

@ SriotchilismO'Zaic,很多事情都没有出现在Hoogle中。它在split包装中,并由lists包装重新导出。有chunksOffor列表,文本,序列和其他可能版本的版本。
dfeuer



1

APL + WIN 26或31个字节

如果单个手可以表示为2D矩阵的列,则如果数组为数组,则为26个字节,然后加5个字节。

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

在线尝试!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

Ruby,81个字节

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

在线试用


1
您是否可以添加指向在线测试环境的链接以便于验证?
乔纳森·弗雷希

@JonathanFrech你去。
阿维林

欢迎来到PPCG!您可以为长度做很多优化。例如,each_with_index与递增计数器相比,它是相当昂贵的,map{[]}基本上与map(&:dup)技巧,匿名Proc等功能相同,可以将代码减少到59个字节。在线尝试!还检查了Ruby的提示页面
价值油墨

1

PHP85 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
仅供参考,而不是print_flat您只能做json_encode 沙盒 -真的没有改变任何答案,只是以为我会提到它,加油!
ArtisticPhoenix

@ArtisticPhoenix好吧,当然!(facepalm)谢谢!:)
640KB


0

C#(Visual C#交互式编译器),43字节

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

在线尝试!


@JoKing [1,2,3], 4应该输出[[1],[2],[3]]。您正在向4个玩家分发3张牌。我将更新主要问题。
aloisdg移至codidact.com,

1
通常不建议立即发布解决方案以应对自己的挑战。
毛茸茸的

1
@Shaggy好的,下次我会考虑到它。在rpg上这样很好,但是我想codegolf的竞争优势使其直接自发布有点不公平。合理。
aloisdg移至codidact.com,

@乔金,你是对的!我
打错

0

C(gcc),5个字节

编译器标志-Df=(必需的前导空格)符合规范。f(n_cards,n_hands,card_ptr)计算指向指针的指针。

说明

在C中,通常的做法是在列表的数量保持不变但所有列表都可以扩展时,将列表的列表实现为单个交错数组。例如,在发牌的情况下,向每手添加更多的牌而不是要添加的更多的手,是更常见的,因此将手的列表实现为交错列表是合理的。巧合的是,“ deck”就是这样一个列表,因此我们返回未修改的参数。

这个挑战可能应该被沙盒化。


我想我们大家都同意的沙箱
aloisdg移动到codidact.com

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.