単なるバガテル


13

チャレンジ

以下のようなバガテルボードを考えます。

|                    |
|    /\            / |
|      \            /|
|  \      \ /\    \  |
|   \   /       \    |
|\     /   /  \      |
|   \            / \ |
|    \               |
|  \    / \ /\    \  |
|\     /   /  \     /|
|                /   |
|    /\         /  / |
|              /     |
|\     /   /  /      |
|                    |
----------------------

あなたの仕事は「スロー」のリストをスコアに変えることです。

ボードは常に20文字(プラス2エッジ)幅ですが、高さは可変です。各「スロー」は、ボールがボードのどこに落ちるかを表す数値で、左端が0から始まり、右端が19までです。各ボールは、/またはに遭遇しない限り、まっすぐに落ち\ます。遭遇すると/、ボールは左に\1列シフトし、a はボールを右に1列シフトします。シフトされた後、ボールは前と同じようにまっすぐに続きます。スローのスコアは、ボールがボードの底に当たった場所に依存します。

各フィニッシングポジションのスコアは次のとおりです。

|                    |
----------------------
 01234567899876543210

すべてのボードで同じです。最初と最後の行は常に空です。ボールは関係なく、それがから削除された場合の底に到達することが保証されているので、何もそれがで閉じ込められてしまうことができますボードは存在しません\/\|または|/それらの組み合わせが挙げられます。

入力

入力はSTDINで行われ、ボードの後に​​空白行が続き、その後にスローを表す数字のスペース区切りリストが続きます。

出力

Ouputは、指定されたゲームの合計スコアでなければなりません。

いくつかの例

入力

|                    |
| \                  |
|  \                 |
|   \                |
|    \               |
|     \              |
|      \             |
|       \            |
|        \           |
|         \          |
|          \         |
|           \        |
|            \       |
|             \      |
|              \     |
|               \    |
|                \   |
|                 \  |
|                    |
|                    |
----------------------

1 4 2 19 0 2 4 3 17 13 16

出力

9

入力

|                    |
| \                / |
|  \              /  |
|   \            /   |
|    \          /    |
|     \        /     |
|      \      /      |
|       \    /       |
|        \  /        |
|                    |
|                    |
|                    |
|                    |
|                    |
|                    |
|                    |
|                    |
|                    |
|                    |
----------------------

15 10 3 8 18 19 0 6 7 10

出力

72

入力

|                    |
| ////////////////// |
| \\\\\\\\\\\\\\\\\\ |
| ////////////////// |
| \\\\\\\\\\\\\\\\\\ |
| ////////////////// |
| \\\\\\\\\\\\\\\\\\ |
| ////////////////// |
| \\\\\\\\\\\\\\\\\\ |
| ////////////////// |
| \\\\\\\\\\\\\\\\\\ |
|                    |
----------------------

1 4 18 17 14 2 0 19 15

出力

18

テストスクリプト

JoeyVenteroによって書かれたいくつかのテストスクリプト(気にしないことを願っています...)を使用して、このタスクのいくつかのテストを作成しました。

使用法: ./test [your program and its arguments]

これはcodegolfです-最短のソリューションが勝ちます。


彼らのために私の生成スクリプトを持っていることもできます:-) 最終的には公開したかったのですが、多くのタスクを微調整する必要がある限り、それはしたくありませんでした。
ジョーイ

@Joey生成スクリプトは、利用できる便利なツールです。
ガレス

テストの両方のセットは今修正されるべきです。
ガレス

回答:


3

GolfScript、60 59文字

n/{},)\);{1>:x,,{.x=31%4%(+}%}%[10,.-1%+]+0@[~]{2${=}/+}/\;

私はそうシンボルを再定義することによって機能するソリューションを書くために誘惑されなかった/\と、space(あなたは、もはや元を使用することができ、特に一度、それは実際には非常に高価です\)。

31%4%(キース・ランドールの溶液から、ニックの入ったとのためにASCIIコードをマッピングしているspace/\0-11それぞれ。(編集履歴を参照)。


1
GolfScriptには驚くほど長い。:-)テストスクリプトでどのように動作するようになりましたか?私が得たすべては私が試みたときにエラー./test ruby golfscript.rb peter.gsですか?代わりに、パイプ入力としていくつかのテストを投げました。
ガレス

./test-bagatelle.sh `which golfscript.rb` bagatelle2.gs
ピーターテイラー

4

パイソン2、147の132 130文字

インポートシステム
s = 0
l = list(sys.stdin)
l [-1] .split()のtの場合:
 p = int(t)+1
 l [:-3]:p- = "/".find(r[p])のr
 s + = min(p-1,20-p)
印刷する

2
たぶんs+=min(p,19-p)
キースランドール

2
for r in l[:-3]:p-=" /".find(r[p])いくつかの文字を保存する必要があります
ニブラー

1
よろしくお願いします。特にニブラーのトリックは本当に素晴らしいです-しかし、より短いトライ関数を知っていても害はありません;)
cemper93

1
@gnibblerそれは天才的なトリックです。
ガレス

1
19-p+1 == 20-p
ロージャッカー

3

Python、165 159文字

import sys
A=list(sys.stdin)
C=range(10)
C+=C[::-1]
for L in A[-4::-1]:C=[C[i+ord(L[i+1])%31%4-1]for i in range(20)]
print sum(C[int(x)]for x in A[-1].split())

スコアの行から始まり、ボトムアップで動作し、各行から始まるボールのスコアを計算します。


list(sys.stdin)代わりにreadlines()
ニブラー

3

ルビー、123 117 115 107 99 98 97

*b,_,_,n=*$<
p eval n.split.map{|k|i=k.to_i+1
b.map{|l|i-='\ /'.index(l[i])-1}
[i-1,20-i].min}*?+

1
なぜレスキューを使用するのですか?最初の割り当てでbから2行を切り取ることはできませんか?
みぎまる

@migimaru:確かに。しかし、2行ではなく3行を切り取らなければなりません。
ロージャッカー

正しい。私は2本の意味以上のラインを。ごめんなさい。
みぎ丸

1
i-='\ /'...代わりにもう1つの文字を保存するために使用できます
ニブラー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.