단순한 바가텔


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]

이것은 codegolf입니다-가장 짧은 솔루션이 승리합니다.


당신은 그들을 위해 내 생성 스크립트를 가질 수도 있습니다 :-). 나는 결국 그것을 공개하고 싶었지만 여전히 많은 작업을 조정 해야하는 한 그렇게하고 싶지 않았습니다.
Joey

@Joey 생성 스크립트는 유용한 도구입니다.
Gareth

두 테스트 세트가 모두 수정되었습니다.
Gareth

답변:


3

GolfScript, 60 59 자

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

그래서 기호를 재정 의하여 작동하는 솔루션을 작성하는 유혹했다 /, \등을 space하지만 (더 이상 원본을 사용할 수 있습니다, 특히 일단 사실은 꽤 비싼 없습니다 \).

31%4%(키스 랜달의 솔루션에서 흠집과의 ASCII 코드를 매핑되고 space, /그리고 \0, -1, 1각각. (기록 편집 참조).


1
놀랍게도 GolfScript가 길다. :-) 어떻게 테스트 스크립트를 사용하게 되었습니까? 내가 시도했을 때 오류 만 있었 ./test ruby golfscript.rb peter.gs습니까? 대신 파이프 입력으로 몇 가지 테스트를 던졌습니다.
Gareth

./test-bagatelle.sh `which golfscript.rb` bagatelle2.gs
피터 테일러

4

Python 2, 147132130

수입 시스템
s = 0
l = 목록 (sys.stdin)
l [-1] .tlit ()에서 t의 경우 :
 p = int (t) +1
 l [:-3]에서 r의 경우 : p- = "/".find(r[p])
 s + = 분 (p-1,20-p)
인쇄

2
아마도 s+=min(p,19-p)?
Keith Randall

2
for r in l[:-3]:p-=" /".find(r[p])몇 문자를 저장해야합니다
gnibbler

1
고마워요 특히 gnibbler의 트릭은 정말 대단합니다. 그러나 더 짧은 tri 함수를 아는 것도 아프지 않습니다.)
cemper93

1
@gnibbler 천재적인 속임수입니다.
Gareth

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

3

파이썬, 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

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

@migimaru : 참으로. 그러나 나는 두 줄이 아니라 세 줄을 잘라야합니다.
Lowjacker

권리. 나는 두 줄을 의미했다 . 죄송합니다.
migimaru

1
i-='\ /'...대신 하나 이상의 문자를 저장하기 위해 사용할 수 있습니다
gnibbler
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.