仅有的Bagatelle


13

挑战

给定一个像下面这样的面包板:

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

您的任务是将“投掷”列表转化为得分。

木板将始终为20个字符(加上2个边)宽,但高度可变。每个“掷球”都是一个数字,代表球落入棋盘的位置,从最左边的0开始到最右边的19。除非遇到a /或a 球,否则每个球都会掉落\。碰到一个/球会将球向左移动一列,而\将球向右移动一列。转移后,球仍然像以前一样一直笔直向下。罚球得分取决于球击中棋盘底部的位置。

每个完成位置的分数如下:

|                    |
----------------------
 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]

这是代码高尔夫-最短的解决方案胜出。


您也可以为他们提供我的生成脚本:-)。我最终希望将其公开,但是只要它仍然需要针对许多我不想做的任务进行调整。
乔伊,

@Joey生成脚本将是一个有用的工具。
加雷斯

两组测试现在都应该修复。
加雷斯

Answers:


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

Python 2,147132130个字符

导入系统
s = 0
l =列表(sys.stdin)
对于l [-1] .split()中的t:
 p =整数(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])应该节省一些字符
gnibbler 2011年

1
谢谢两个 特别是长嘴g的s俩确实很棒-但知道较短的三功能也不会伤害;)
cemper93 2011年

1
@gnibbler这是一个天才的把戏。
Gareth

1
19-p+1 == 20-p
Lowjacker

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()
gnibbler's

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砍掉两行吗?
migimaru 2011年

@migimaru:的确如此。但是我必须砍掉三行,而不是两行。
Lowjacker 2011年

对。我意味着两条以上线。抱歉。
migimaru 2011年

1
您可以使用它i-='\ /'...来保存一个以上的字符
gnibbler 2011年
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.