プレイヤーにカードを配る


15

今夜はカードゲームの夜です!あなたはディーラーであり、あなたの仕事はカードをプレーヤーに配るプログラムを書くことです。

カードの配列とプレーヤーの数を考えると、各プレーヤーのカードの配列を手に分割する必要があります。

example for 4 players with a deck of 10 cards

ルール

プログラムは、空ではない配列Aとゼロ以外の正の整数を受け取りnます。配列は次に分割する必要がありますn手。文字列の長さがn残りのカードで割り切れない場合は、最後にカードをできるだけ均等に分配する必要があります。

  • の場合n==1、配列の配列を返す必要がありますA唯一の要素で
  • 場合nの長さよりも大きい場合Aは、すべての手と空の手を返却する必要があります。場合n = 4array A = [1,2,3]、あなたは返す必要があります[[1],[2],[3]][[1],[2],[3],[]]。空、未定義、またはnullの空のハンドを自由に処理できます。

  • 配列には、数値ではなく任意の型を含めることができます。

  • 処理中に配列の順序を変更しないでください。たとえば、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
将来的には私が使用してお勧めしたいサンドボックスをメインに質問を投稿する前に問題とゲージのコミュニティからのフィードバックから鉄に
ジョー・キング

2
@JoKing私は完全に同意します。そんなに編集する必要があるとは思いませんでした。最初にベータ版にデプロイせずに製品版にプッシュするようなものです。お手伝いありがとう。
aloisdgがcodidact.comに移動する

1
@aloisdg提案された代替ルールを解析できません。人々がしばしば円を扱うようなアイデアである場合、ほとんどのカードで終わるすべてのプレイヤーは最初にあり、最後にいるプレイヤーはカードを受け取らないかもしれません。
アダム

2
入力配列にが含まれている場合はどうなります0か?
シャギー

回答:


12

05AB1E 3 1バイト

Adnanのおかげで2バイト節約

ι

オンラインでお試しください! またはとしてテストスイート

説明

ι  # uninterleave

チャレンジが求めるものを正確に実行する


5
私はこれもうまくいくと思う: ι
アドナン

@Adnan:ええ、ありがとう:)の違いはの空のリストn=7だけですが、それは許容可能な出力形式です。私はその組み込みを完全に逃しました:/
エミナ

そのため、このための組み込みの言語があります!:D
aloisdgがcodidact.comに移動する


7

Perl 6の33の 24バイト

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

オンラインでお試しください!

番号を取り、リストを取り、リストのリストを返すWhateverラムダを返す匿名のカリー化されたコードブロック。リストの長さよりも大きい数を指定した場合、これは2番目のオプションを取ります。例えば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

J131110、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
ポストロックガーフハンター

@JosephSible、それはlistsパッケージに含まれています。
dfeuer

@ SriotchilismO'Zaic、Hoogleには多くのものが表示されません。splitパッケージ内にあり、パッケージによって再エクスポートされlistsます。chunksOfリスト、テキスト、シーケンスなどのバージョンがあります。
dfeuer

2

Kotlin53 51 49バイト

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

古い誤ったソリューションは、配列の長さの約数に対してのみ機能しました。これは確実にダウンできると確信しています。

オンラインでお試しください!



nリストの長さの除数でない場合は機能しません
ジョーキング

なるほど。今すぐ修正
アダムアダム

私は、これは固定されていると信じ@ ASCIIのみ
アダム・

1
あなたは余分なペアを削除することができるように見えます
のみ


1

APL + WIN 26または31バイト

個々の手を2Dマトリックスの列として表すことができる場合、配列の配列が5バイトを追加する場合は26バイトです。

(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マトリックスを作成します

nested [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
このWebサイトにアクセスするたびに、何か新しいものが表示され、「すごいな、それはなぜですか」と表示されます。
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;}

オンラインでお試しください!

ラムダを提供してくれたOlivierGrégoireに感謝します。



@OlivierGrégoireありがとう!これはやや新しいもので、ラムダビットに取り組んでいましたが、苦労していました。
ダニエルウィッディス

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)コードを59バイトに減らすことができるトリック、匿名Procなどと同じことを行います。オンラインでお試しください!また、チェックアウト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

1

O_o説明pls
ASCIIのみ

@ ASCII-only ;; ;;は単なるスライスであり、Pythonのものとほぼ同等: :です。これはすべてのスライスを取得しますnオフセット1 ... nのth要素
-attinat

そうそう、それは笑では;;なかったことを忘れていました;。この予定を見ていた「WTHすることであるi ; ; ; ; #
ASCIIのみ

0

C#(Visual C#Interactive Compiler)、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 OK次回はそれを考慮に入れます。それとrpgでは問題ありませんが、codegolfの競争的な側面から、直接投稿するのは少し不公平だったと思います。理にかなっています。
aloisdgがcodidact.comに移動します

@ジョーキングあなたは正しいです!タイプミスをしました:/
aloisdgがcodidact.comに移動します

0

C(gcc)、5バイト

コンパイラフラグ-Df=(先頭スペースが必要)は仕様を満たします。f(n_cards,n_hands,card_ptr)針のリストへのポインタに評価されます。

説明

Cでは、リストの数は一定のままですが、すべてのリストを拡張できる場合、リストのリストを単一のインターリーブ配列として実装するのが一般的です。たとえば、このようなカードを扱う場合、各ハンドに追加するよりも多くのカードを追加する方が一般的であるため、インターリーブリストとしてハンドのリストを実装するのが合理的です。偶然にも、「デッキ」はそのようなリストなので、パラメーターを変更せずに返します。

この課題はおそらくサンドボックス化されるべきでした。


私たちは、すべてのサンドボックスのために同意すると思う
codidact.comに移動aloisdg

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.