첫 줄에 공백이 있고 하나의 마침표 ( .
, “공”)가 있고 그 뒤에 공백, 슬래시 ( /
) 및 백 슬래시 ( )가 포함 된 줄이있는 \
경우, 공이 시작 위치에서 떨어지면 어느 열이 들어갈 지 결정하십시오. . 각각 /
1 열씩 왼쪽으로 \
이동하고 1 열씩 오른쪽으로 이동합니다.
샘플 입력
.
/ \ \
/ /
\ \/ \
\ /\
\ /\ \
\ /
샘플 출력
공은 5 열에서 시작하여 /
3 번 라인에서 3 번을 치고 \
5 번에서 7 번 라인 에서 3 번의 최종 위치는 다음과 같습니다.
7
열은 1- 인덱싱되며 대부분 텍스트 편집기 규칙과의 일관성을 유지합니다.
가장자리 케이스
공이 /
첫 번째 열에서 a 를 치면 , 존재하지 않는 열 0에 영원히 붙어 있습니다 0
. 프로그램은 이것을 인쇄하여 올바르게 처리해야합니다 .
볼이 \/
패턴 의 양쪽에 닿으면 결과는 정의되지 않습니다. 귀하의 프로그램은 출력없이 종료되거나 무한 루프되거나 오류 메시지를 -1
인쇄 할 수 있지만 (내 솔루션은 인쇄합니다 ) 유효한 출력으로 인식 될 수있는 것을 인쇄해서는 안됩니다.
공이 \\
패턴 에서 왼쪽 슬래시에 닿으면 오른쪽이 아닌 오른쪽 슬래시 바로 아래로 끝나야합니다. 원래 구상 한 솔루션은이 문제가 발생하기 쉽기 때문에 그 길을 놓치지 마십시오!
.
마지막 /
또는 \
각 줄 다음에 공백이있을 수도 있고 없을 수도 있습니다 . 프로그램은 이러한 패딩을 사용할 수 있어야합니다. 비슷한 메모에서 첫 번째 줄 다음에 줄이있을 수도 있고 없을 수도 있습니다.
첫 번째 줄에 0 개 이상의 공백이 있고 정확히 1 개가 있다고 가정 할 수 있습니다 .
. 후속 행은 공백이없고 슬래시가 0 이상입니다.
구현 세부 사항
프로그램은 사용자 편의에 따라 파일 (명령 줄 인수로 지정)에서 읽거나 표준 입력에서 읽을 수 있습니다.
프로그램은 단일 숫자를 표준 출력으로 출력해야합니다. (예, 후행 줄 바꿈은 괜찮습니다. 예, 숫자가 두 자리 이상일 수 있습니다.)
테스트 사례
입력:
.
산출:
1
여기서 입력은 정확히 1 바이트입니다. 처리 할 수있는 가장 작은 경우입니다.
입력:
. \ \ \ \
산출:
6
이 슬래시 다음에는 공백이 없습니다.
입력:
. / /\\ / \ //\ \/// // \\/ \/\ /\/
산출:
0
입력:
. / / / \\\ /\\ / \
산출:
1
입력:
. \ / / \
산출:
4
입력:
. \ \/\/\/
산출:
(anything but a nonnegative number)
맺음말
이 질문은 (중력 기반) 당구 공 유형 컴퓨터 시뮬레이션 과 유사 하지만 훨씬 더 단순하므로 더 많은 관심을 끌기를 바랍니다.
파이썬에는 169 자 솔루션이 있습니다. 그래도 재능있는 골퍼들이 그 기록을 조각으로 찢을 수 있다고 확신합니다. : ^)
이것은 code-golf 이므로 월말에 가장 짧은 문자 답변이 허용됩니다!
답변
파이썬, 143B
import sys
for l in sys.stdin:
a=l.find('.')
if a>-1:F=a
elif F>-1:
if'\\/'in l[F-1:F+2]:z
F+={'\\':1,'/':-1}.get((l+' '*F)[F],0)
print F+1
스페이스 / 탭 들여 쓰기 트릭 사용 나는 여기서 영리한 일을하지 않았습니다. F
현재 색인이고 l
현재 행입니다. z
정의되지 않았으므로 \/
상황을 처리하는 양의 정수가 아닌 예외가 발생 합니다.
답변
05AB1E , 37 바이트
¶¡ð«ć'.ksvU…/ \yXD>‚èJD„\/Qiõqëнk<X+]>
여러 줄 문자열로 입력하십시오. \/
볼이 붙어 있으면 출력 합니다.
온라인으로 시도 하거나 모든 테스트 사례를 확인하십시오 .
설명:
¶¡ # Split the (implicit) input-string on newlines
# (work-around instead of `|`, because it will stop at empty lines)
ð« # Add a trailing space to each line (work-around because indexing
# -1 in 05AB1E will wrap around to the other side)
ć # Extract head; pop and push the remainder-lines and first line
# separated to the stack
'.k '# Get the 0-based index of "." in this first line
s # Swap to get the remainder-list of lines
v # Loop over each line `y`:
U # Pop and store the top value (the index) in variable `X`
X # Push the current index `X`
D> # Duplicate it, and increase the copy by 1
‚ # Pair to [X, X+1]
y è # Index both of those into the current line `y`
JD # Join the two characters together, and duplicate it
„\/Qi # If it's equal to "\/":
q # Stop the program
# (after which the string is output implicitly as result)
ë # Else:
н # Only leave the first character (at index `X`)
…/ \ k # Get its 0-based index in string "/ \"
< # Decrease it by 1
X+ # And add it to `X`
] # After the loop:
> # Increase the top of the stack (`X`) by 1
# (after which it's output implicitly as result)
답변
CJam, 61 바이트
qN/('.#)\_:,0+:e>f{' e]" /"f#0\+}{1$1$=\@2$-_@=@[\]$[W1]#/z}/
관련 규칙 \/
이 해제되면 (그리고 처리 할 필요가없는 경우) 41 바이트 로 단축 할 수 있습니다 .
qN/('.#)\_:,:e>f{' e]" /"f#0\+0+}{1$=-}/
답변
자바 10 213 208 190 바이트
s->{int r=s.indexOf('.'),c;for(var x:s.split("\n")){for(;r>x.length()-2;x+=" ");c=x.charAt(r);if(c==46)continue;r/=c>47&x.charAt(r+1)==47?0:1;r+=c<33?0:c<48?-1:1;if(r<0)return 0;}return-~r;}
우리가 안에 갇혀있을 때 0 오류로 나누기를 던집니다. \/
.
@EdgyNerd 덕분에 -5 바이트 .
설명:
s->{ // Method with String parameter and integer return-type
int r=s.indexOf('.'), // Get the index of the dot on the first line
c; // Temp integer
for(var x:s.split("\n")){ // Split the input by newlines, and loop over the lines:
for(;r>x.length()-2;x+=" "); // Append trailing spaces if necessary
c=x.charAt(r); // Get the character at the current index of this line
if(c==46) // If this is the first line (the char is the dot)
continue; // Continue to the next iteration of the loop
r/=c>47&x.charAt(r+1)==47? // If we're stuck in a `\/`
0 // Divide by 0 to exit the function with an error
:1; // Else: divide by 1 as no-op
r+=c<33? // If the current character is a space:
0 // `r` remains at the same index
:c<48? // Else if it's a `/`:
-1 // Index `r` is decreased by 1
: // Else (if it's a `\`):
1; // Index `r` is increased by 1
if(r<0) // If `r` is now -1:
return 0;} // Return 0
return-~r;} // After the loop: return the index `r` + 1
답변
파이썬 3 , 124 바이트
import sys
for l in sys.stdin:i=('.'in l)*l.find('.')or(i<0)*i-2*('\\/'in l[i-1:i+2])or' \\'.find((l+i*' ')[i])+i
print(i+1)
파이썬 2에서도 작동합니다.
설명
for l in sys.stdin:i= # Change value i for each line in the input
('.'in l)*l.find('.') # Set i to (0-indexed) dot position if present
or(i<0)*i # Keep i fixed if it is below zero
-2*('\\/'in l[i-1:i+2]) # Set i to -2 if \/ trap is encountered
or' \\'.find((l+i*' ')[i])+i # Else: move position based on character
print(i+1) # Print final 1-indexed position
답변
J , 95 바이트
[:>[:(<"1@|.@}.([:(1&{+_*0>[:*/2-/\])(]+{~ ::])^:(<3))&.>/@,2<@i.~{.)[:(0,'/ \'<:@i.]);._1 LF,]
_
공이 막히면 무한대를 반환합니다 . 그 특별한 경우를 처리하는 많은 바이트를 잃었습니다. 그렇지 않으면 행을 간단하게 줄입니다. 확실히 더 골프를 쳤다.