ボードの回転をシミュレートする


14

前書き

コインが上部に挿入され、重力のために下部に(上部のコインに)落ちるマッチングゲームをプレイしています。

したがって、この

O <- inserting this coin

OO O
OOOOO

これになります

O
OO O
OOOOO

誰かがボードを時計回りに回転させると想像してください。次のことが起こります。

1.ボードが回転します

OOO
OO
O
OO
O

2.重力によりコインが落ちる

O
O
OO
OO
OOO

あなたのタスク

あなたの仕事は、プログラムや関数を書くことでボードの回転をシミュレートすることです。簡単にするために、1種類のコインのみを扱っています(あまりにもエキサイティングなマッチングゲームではありませんよね...)。回転が完了した後にのみ重力が適用されると仮定できます。ボードは時計回りに回転します。

入力

入力は3種類の文字を含む文字列になります。

  • O(大文字o)OR 0(ゼロ)-コイン(ソリューションがサポートするものを決定します)
  • (スペース)-空のフィールド
  • \ n(改行)-行の終わり

入力はボードの状態を表します。入力は整形式で、ボードの有効な状態を含んでいると想定できます(コインが浮いていない)。入力は関数パラメーターにすることも、標準入力またはファイルから読み取ることもできます。

出力

出力は、回転後のボードの新しい状態です。出力には、入力と同じ3種類の文字が含まれます。出力は関数から返すことも、標準出力またはファイルに書き込むこともできます。

サンプル

入力1:

O
OO O
OOOOO

出力1:

O
O
OO
OO
OOO

入力2:

O O
O O

出力2:

OO
OO

任意の言語と、選択した言語の標準ライブラリを使用できます。バイト単位の最短プログラムが優先されます。


短い行には末尾スペースが埋め込まれていますか?
Ventero

必要な場合は、はい。
デビッドフランク14年

ボードサイズの要件は何ですか?妥当な最大サイズを選択できますか、またはアプリケーション/機能はすべての可能なサイズで動作する必要がありますか?
Fors 14年

2
回転後に重力がかかった場合、Input2はどのようにOutput2になりますか?私はそれがトップコインを落とすが、水平ではないと思っていただろうか?
マット14年

2
@Mattは、Input2にもOutput2にも空の行がないことに注意してください(SEは行間のマージンを表示します)。
デビッドフランク14年

回答:


16

GolfScript、14 12文字

' '-n%zip$n*

入力はSTDINで行う必要があります。コインの文字は空白以外の任意の文字にすることができます。こちらをお試しください。2文字の削減を指摘してくれたPeterに感謝します。


ああ、何私は明らかにしなかったtranspose長さの異なる配列を扱うことができるRubyで...
Ventero

@Venteroほとんどの場合、このハッキングバージョンを使用します([nil]*a.map(&:size).max).zip(*a)。しかし、ゴルフには向いていません。
ハワード14年

2文字を保存できます。最も長い行は常に最後に来るため-1%、で置き換えることができます$
ピーターテイラー14年

@PeterTaylorそうですね-文字を保存できます。ありがとうございました。
ハワード14年

1
@PeterTaylorさて、に1文字のエイリアスを含めました" "
aditsu

6

Javascript(E6)103

最初に試してみてください、ただ行列演算です。入力文字列の各行はパディングする必要があります。
かなり冗長です。

R=t=>(x=t.split('\n').reverse().map(x=>[...x].sort()),x.map((c,i)=>x.map(r=>r[i]).join('')).join('\n'))

擬似コード

  1. 文字列->行の配列
  2. 上下逆配列
  3. 各行-> char配列
  4. 各行を並べ替えます(右に「落ちる」コイン)
  5. 転置
  6. 行の各文字配列->文字列
  7. 結合配列->単一の文字列

ああ、ソートは賢い(+1)です!盗んだら気になりますか?
seequ 14年

[...x]以前に構文を見たことがありません。それはなんと呼ばれていますか?
ComFreek 14年

2
それは呼ばれています@ComFreak spread[ developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/...
edc65

2
@ edc65あなたは括弧であなた自身のリンクを壊しました。ここに正しいリンク
クリスサイレフィス14年

6

Ruby 2.0、59文字

puts$<.map(&:chars).reverse.transpose.sort[1,50].map &:join

stdinを介した入力。すべての行が同じ長さであると想定します。これはおそらく必要以上に長いです。しかし、少なくともそれは読みやすいです...


$<.map代わりに使用できると思います。
ハワード14年

@Howardそれは私がいつも忘れていることの1つです。ありがとう!
ヴェンテロ14年

1
[1,50]はそこで何をしていますか?
はないチャールズ14年

1
@Charles入力からのすべての改行を含む最初の行をスキップします。Davidはコメントで50x50が最大可能サイズであると述べたので、最初の行(1..-1)を除くすべてを選択する代わりに、2番目の行()から始めて50行を選択します1,50
ヴェンテロ14年

@Venteroが得た。涼しい。ありがとう!
チャールズではないチャールズ14年

3

J- 49 31 24バイト

私はそこに不必要な回転があるかもしれないと思うが、そうでなければそれはうまく機能する。これは、コインを指定されたとおりに入力する関数ですO。入力に末尾の空白は必要ありません。

edc65のJavascript回答に触発された新しいバージョン:

f=:[:|."1@|:[:/:~"1,;._2

説明:

f=:[:|."1@|:[:/:~"1,;._2
                   ,;._2 Split the string at every fret, which is the last character in the string (newline).
              /:~"1      Sort every row separately.
     |."1@|:             Rotate the array clockwise.

古いバージョン:

f=:[:|:((#~=&' '),=&'O'#])"1@|:@(|."1@|:)@(,;._2)

説明:

f=:[:|:((#~=&' '),=&'O'#])"1@|:@(|."1@|:)@(,;._2)
                                          (,;._2) Split the string at every fret, which is the last character in the string (newline).
                                (|."1@|:)@        Rotate the array clockwise.
                             |:@                  Reverse the axes (columns become rows and vice-versa).
       ((#~=&' '),=&'O'#])"1                      Function that applies the "gravity"
                          "1                       Apply to every row separately:
                  =&'O'#]                           Get the O's in the row.
       (#~=&' ')                                    Get the spaces in the row.
                ,                                   Join them, spaces come first.
  [:|:                                            Reverse axes again.

例(複数行の文字列0 : 0はブラケットで始まり、ブラケットで終わることに注意してください):

   f 0 : 0
O
OO O
OOOOO
) NB. output starts now
O  
O  
OO 
OO 
OOO
   f 0 : 0
O O
O O
) NB. Output starts now.

OO
OO

並べ替え回転する前に、可能であれば
edc65

@ edc65あなたは賢い人です。
seequ

2

ハスケル— 86

ただ学んでいるので、これは改善できると確信しています。

import Data.List
c=putStr.unlines.filter(/="").sort.map(filter(/=' ')).transpose.lines

サンプル入力:

let a = "O    \nOO O \nOOOOO"
let b = " O O \n O O "
c a
c b

サンプル出力:

O
O
OO
OO
OOO

OO
OO

2

Python 2(69)(79)

for c in sorted(zip(*raw_input().split("\\n"))):print''.join(c[::-1])

すべての行が同じ長さになるように、スペースで埋められた入力を受け取ります。split各ラインのarratを作成します。zip効果的に配列を転置します。次に、sortedタプルを辞書式順序でソートし、すべてのコインを最下位に分類します。最後に、各行を印刷して文字列に戻しますが、最初に逆にする必要があります。行うことprint'O'*c.count('O')は同等であり、同じ文字数を使用します。

実行例:

>> O    \nOO O \nOOOOO
O
O
OO
OO
OOO

1

C、167119バイト

この短いバージョンは(残念ながら?)元のものよりもはるかに明確です。

m;j;b[99];r;main(){while(j=getchar()+1)j-11?m+=j-33&&++b[r]>m:++r;for(j=r;m+1;putchar(j--?m<b[j]?79:32:(j=r,m--,10)));}

0

ラケット:130

(let l((a'()))(let((b(sort(string->list(read-line))char<?)))(if
(null? b)(apply map(λ x(map display x)(newline))a)(l(cons b a)))))

行が等しい長さになるようにスペースを埋め込む必要があります。


0

C#- -209 174バイト

そうです、私はこのコードゴルフを、ある時点で試さなければなりません。ボードを回転して印刷する関数(r)を作成しました。char配列を出力するときに少しごまかしていると思いますが、なぜ怒ってはいけないのかわからない場合は:)

ヒントを提供してくれたProgramFOXに感謝します:)

void r(string s){int x=s.IndexOf('\n'),j,i=-1,k,z=x+1;var y=new char[x*x+x];for(;++i<x;y[z*(i+1)-1]='\n')for(k=j=x;j>0;)if(s[i*z+--j]=='0')y[k--*z-i-2]='0';Console.Write(y);}

チート

new char[x*x+x]で配列を埋めません'\0'' '


1
改行を削除し、その間のスペースを削除するchar[]y、文字数が192文字に減少します。また、staticここに回答を投稿するときにキーワードを提供する必要はありません。これを削除すると、文字数が185文字に減ります。
ProgramFOX 14年

また、以前の試み以来忘れられていた 'ref'を削除することができました。
WozzeC 14年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.