태그 보관물: simulation

simulation

공은 어디로 떨어질까요? \5 번에서 7 번 라인 에서

첫 줄에 공백이 있고 하나의 마침표 ( ., “공”)가 있고 그 뒤에 공백, 슬래시 ( /) 및 백 슬래시 ( )가 포함 된 줄이있는 \경우, 공이 시작 위치에서 떨어지면 어느 열이 들어갈 지 결정하십시오. . 각각 /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 자 솔루션이 있습니다. 그래도 재능있는 골퍼들이 그 기록을 조각으로 찢을 수 있다고 확신합니다. : ^)

이것은 이므로 월말에 가장 짧은 문자 답변이 허용됩니다!



답변

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

온라인으로 사용해보십시오!

_공이 막히면 무한대를 반환합니다 . 그 특별한 경우를 처리하는 많은 바이트를 잃었습니다. 그렇지 않으면 행을 간단하게 줄입니다. 확실히 더 골프를 쳤다.


답변