No Programming, No Life

プログラミング関連の話題や雑記

Re:3年間の進歩(10分でコーディング)

Groovy! (挨拶)

はじめに

id:uehajさんが、3年間の進歩 - uehaj's blog で楽しそうなお題を解いていたので私もやってみました。こういう三年越しの計画とかっていいですね。昔自分で解いたお題を今の知識で再トライするとか素敵です。

お題

あなたはこれからトランプを配っていきます。
あなたにはトランプを配る人数、
そしてトランプが渡されます。
今回はとても簡単なので例題で説明します。

例)
2つの引数がもらえます。

3
"123123123"

最初の3はプレイヤーの人数を示しています。
"123123123" はトランプの並びを示しています。あなたはこのなかのトランプを
配っていかなければなりません。
この場合、あなたのプログラムは
{"111","222","333"}
を返さなければなりません。
"111"は一番めのプレイヤーが受け取るトランプです。
"222"が2番目のプレイヤーが受け取るトランプです。
"333"が2番目のプレイヤーが受け取るトランプです。
ところが、以下のような場合もあります。
すべてのプレイヤーは同じ数だけのトランプを受け取らなければなりません。
ですので

4
"123123123"

この場合、あなたのプログラムは
{"12","23","31","12"}
を返さなければなりません。
{"123","23","31","12"} は駄目です。
では、以下にもうすこし例をのせます。

例1)
6
"012345012345012345"
Returns: {"000", "111", "222", "333", "444", "555" }

例2)
4
"111122223333"
Returns: {"123", "123", "123", "123" }

例3)
1
"012345012345012345"
Returns: {"012345012345012345" }

例4)
6
"01234"
Returns: {"", "", "", "", "", "" }

例5)
2
""
Returns: {"", "" }

クラス名、などは以下のとおりです。
Class:    Cards
Method:    deal
Parameters:  int, String
Returns:   String
Method signature: String
deal(int numPlayers, String deck)

10分でコーディング|プログラミングに自信があるやつこい!!

回答

v1.8.6から追加された #collate を使いたくて調べてたら10分を軽々オーバーしてしまった罠です。*1

追記 (2013-01-27)

#collate は こっち の第二引数にboolean keepRemainderを指定する方を利用したほうが効率的だったので、コードを修正しました。

おわりに

こういう時間を制限されてるお題は本来、アルゴリズムは極シンプルなものにしておくベキだとは思うんですが、
今回はやっぱり #collate が使いたかったので、時間をかけてでもコーディングを楽しみました。

Enjoy! Coding.

*1:結局30分くらいかかった