점프와 달리기


18

매튜는 퍼즐 풀기를 좋아합니다. 그가 해결할 때마다 행복하게 건너 뜁니다. 최근에 그는 유성우가 떨어지고 싶지 않은 땅에 분화구와 구멍을 열었을 때 이것을 실제로 해야 합니다.

매튜가 건너고 싶은 풍경의 일부가 주어 졌으면 좋겠다. 접지는 미터 단위로 제공되며 각 미터는 일반 접지 또는 구멍입니다. 그가 달리면 그는 한 걸음마다 1 미터를 넘습니다. 대안은 단계 당 4 미터를 넘는 점프입니다. Matthew는 첫 번째 지상 미터의 맨 왼쪽에서 시작하여 마지막 미터에 도달하려고합니다.

입력

입력은 표준 입력에서 한 줄로 제공되며 줄 바꿈으로 종료됩니다. 선은 각각 접지 또는 구멍 미터를 나타내는 대시 ( -) 또는 밑줄 ( _) 로 구성됩니다 . 샘플 입력은 다음과 같습니다.

----__--___---

주어진 조경은 최소 1 미터에서 최대 30 미터이며 항상 지상에서 시작합니다.

산출

출력은 표준 출력으로 제공되며 실행 ( R) 또는 점프 ( J) 중 하나 인 Matthew에게 일련의 이동 명령을 나타냅니다 . 위에서 언급했듯이, 뛰기 명령은 Matthew가 1 미터를 달리는 동안 점프는 그를 4 미터 앞으로 옮깁니다. 위의 예에서 다음과 같은 움직임이 가능합니다.

RRJRJRR

대략 다음과 같이 보입니다.

운동 RRJRJRR의 삽화

가로 방향으로 안전한 경로가 없으면 느낌표 하나 ( !)를 인쇄해야합니다.

샘플 입력

--------
----__--___---
-_______
-_-_-_-_-_-
-

샘플 출력

JRRR
RRJRJRR
!
!

(이동이 필요하지 않으므로 마지막 출력은 비어 있지만 Markdown 은이를 구문 분석 할 수 없습니다)

노트

가능한 단일 경로 만 필요하므로 프로그램 출력이 샘플 출력과 정확히 일치 할 필요는 없습니다. 솔루션이 존재하고 모든 이동 명령이지면으로 이동하고 마지막 미터에 도달하면 출력이 유효합니다.

표준 오류에 대한 추가 출력은 무시됩니다.

승리 조건

골프에서 관례 적으로 가장 짧은 코드가 승리합니다. 동점 인 경우에는 이전 솔루션이 우선합니다.

테스트 사례

동일한 테스트 사례를 포함하는 두 개의 테스트 스크립트가 있습니다.

호출은 두 경우 모두에 해당합니다. <test script> <my program> [arguments]예 : ./test ruby jumprun.rb또는 ./test.ps1 ./jumprun.exe.

다른 메모

이 과제는 2011-W24 년에 제 대학에서 열린 골프 대회의 일부였습니다. 참가자의 점수와 언어는 다음과 같습니다.

  • 104 – 하스켈
  • 131 – 하스켈
  • 154 – C
  • 170 – C
  • 275 – VB.NET
  • 286 – 공통 리스프

우리 자신의 솔루션은

  •   92 – 루비
  • 124 – PowerShell

내가 가진 test.sh을 실행하는 동안 오류 얻을 @Joey ./test.sh perl jump.pl-를 ./test.sh: line 42: syntax error near unexpected token 'done'bash는 3.2.48에서,
swilliams

@Joey 캐시를 지우고 다시 다운로드하면 제대로 작동합니다. 감사.
swilliams

솔루션을 살펴보면 실제로 너무 사소한 것이 었습니다. 사과.
Joey

1
뒤로 달리기 / 점프가 허용되지 않는다고 가정합니다. 가 있다면, 그것은 풍경이 좋아 할 것 - - - 풀수.
Keith Randall

키이스 : 이제 작업을 변경하기에는 너무 늦었습니다.
Joey

답변:


7

펄, 53 자

s/-...(?=(-|-...)*-$)/J/g;y/-/R/;/_/?$_="!":s/.$//

로 이것을 실행하십시오 perl -p jumpnrun.pl. 나는 3 문자를 세었다-p옵션에 . perl jumpnrun.pl와 사이의 길이 차이 perl -p jumpnrun.pl입니다.

나는 Perl에 유창하지 않기 때문에 이것이 더 짧아 질 수 있다고 확신합니다. 이것은 Howard의 솔루션 과 비슷한 정규 표현식을 사용합니다 .


3

루비, 93 90 79 70 자

정규식 솔루션이 상당히 훌륭하고 컴팩트 할 것이라고 생각했습니다 (매치가 작업을 수행하도록하십시오). 불행히도 모든 엣지 케이스와 특수 처리로 인해이 길이가 길어졌습니다. 적어도 100 ;-)에 닿지 않았습니다.

puts gets.gsub(/-...(?=(-|-...)*-$)/,?J).tr(?-,?R)=~/^([JR]*)R$/?$1:?!

제공된 스크립트의 모든 테스트 케이스를 전달합니다.

이전 스크립트와 비교하여 여러 문자를 저장했습니다 (현재 한 번의 호출 gsub만으로 충분).

편집 1 : 테스트 스크립트가 테스트 사례 1에 대한 출력을 허용하지 않은 후에 변경 puts z!=?-??!:''되었습니다 z!=?-&&$><<?!.

편집 2 : 이전 버전은

z=gets.chop
z.chars{z.sub!(/^(-|-...)((-|-...)*-)$/){$><<($1==?-??R:?J);$2}}
z!=?-&&$><<?!

내 원래의 아이디어는 다음과 같은 룩앤필 및 룩어 헤드 전략을 사용하여 캐릭터를 교체하는 것이 었습니다 ^(?<=[RJ]*)(-|-...)(?=(-|-...)*-$). 불행히도 루비는 가변 길이의 비하인드를 허용하지 않으며 첫 번째 부분에 대한 다른 캡처 그룹은 코드를 더 길게 만들었습니다.

따라서 반복적 인 접근 방식을 수행했습니다. 단계로 시작하거나 ^(-|-...)일련의 다른 단계를 수행하거나 마지막 플랫폼까지 점프 (-|-...)*-$하면 해당 문자를 인쇄하고 첫 번째 1 / 4 문자를 제거한 다음 다시 시작하십시오. On은 표현식 내부의 선택을 전환하여 RJ 대 JR 우선 순위를 조정할 수도 있습니다 (현재는 RJ를 선호 함).

편집 3 : 단일 세분화 나누기

puts (z=gets.chop.gsub(/(-...|-)(?=(-|-...)*-$)/){$1==?-??R:?J})=~/_/??!:z.chop

둘로

puts (z=gets.chop.gsub(/-...(?=(-|-...)*-$)/,?J).tr(?-,?R))=~/_/??!:z.chop

다른 몇 문자를 주었다. 마지막으로이 단종 문제를 제거했지만 비용이 들었습니다. 오류 감지에는 문자가 더 필요합니다.


마지막 줄을로 변경하여 3자를 저장할 수 있습니다 z!=?-&&$><<?!. 그 외에는 훌륭한 솔루션, +1!
Ventero

@Ventero 나는 "-";-)에 대한 출력이 없기 때문에 첫 번째 테스트에 실패했다는 것을 알았습니다.
Howard

흠, 내 PowerShell 스크립트에 작은 버그가있는 것 같습니다. 분명히 테스트 2에 대한 입력을 허용 하지 않으며 테스트 1에 대해서는 입력을 허용 하지 않습니다. 내가 고치려고 노력 할게
Joey

테스트 스크립트는 수정되어야하고 더 이상 테스트 1에 대해 실제로 빈 결과를 거부하지 않아야합니다. 이제 수정해야합니다.
Joey

@Joey Danke. Nun sind es 90 ;-)
Howard

1

-71 60

$_=<>;y/-/R/;s/R...(?=(R(...)?)*R$)/J/g;print/_/?"!":s/.$//r

이제 모든 테스트 케이스를 통과했습니다. :) 마지막 문자를 너무 빨리 제거하고 있었고 원래 정규 표현식의 절반이 완전히 중복되었습니다.

$ _ = $ ARGV [0]; y /-/ R /; s / (R ... (? = R)) (R * (? = R)) / J $ 2 / g; chop; print / /? "!": $ , $ /

또 다른 정규식 솔루션은 게시물의 5 가지 테스트 사례를 통과합니다.

-Esay대신에 하나의 라이너로 실행하여 단축 될 수 print있지만 펄은 입력을 스위치로 해석하려고 시도합니다 ... ( Unrecognized switch: -_-_-_-_-_-)


질문은 입력이 stdin에 제공된다는 것을 나타냅니다. 를 사용하는 대신 stdin에서 읽도록 솔루션을 변경할 때 $ARGV테스트 스크립트에서 108 개의 테스트 케이스가 계속 실패합니다.
Ventero

@Ventero Oh oops ... 왜 그런지 알 것 같아요. 곧 수정을하겠습니다 ... 모든 테스트 케이스를 거치지 않으면 얻을 수있는 것 입니다 ...> _>
swilliams

대본의 의도는 사람들이 사양에 대한 타당성과 적합성을 쉽게 확인할 수 있도록하는 것이 었습니다 :-)
Joey

@Joey 문제는 Ventero가 자신의 의견을 게시 할 때까지 어떻게 든 '테스트 스크립트'를 '참조 구현'과 혼동 할 수 있다는 것입니다.) ... 스크립트는 이제 거의 수정되었지만 현재는 20 개만 실패합니다. 모든 거짓 부정
swilliams

1

파이썬 -89 93 97 93 자

으니까.

import re;i=re.sub('...(?<!---)-','J',input()[1:]);print('!'if'_'in i else re.sub('-','R',i))

현재 유효한 테스트 솔루션이 여러 개있는 경우를 고려하여 10 개의 테스트 사례 만 실패합니다. 나중에 완전히 수정하겠습니다.


작업 정규식 중 하나를 빌리면 다음과 같이 끝납니다.

import re;i=re.sub('-...(?=(-|-...)*-$)','J',input());print('!'if'_'in i else re.sub('-','R',i))

96 자로.


1
728 개의 테스트 사례 만 통과합니다. 실제로 테스트 스크립트를 거기에 넣었습니다.
Joey

@Joey : 입력에서 선행 문자를 잘라내는 것을 잊어 버린 것 같습니다. 바보 나. 이제 수정되었습니다.
JAB

여전히 766/849 테스트 케이스 만 통과합니다.
Ventero

1

하스켈, 90 자 :

내 첫 번째 솔루션은 길지만 동적 프로그래밍을 사용하여 선형 시간으로 작동합니다. :) 150 자 :

x!y="!"
q '-'=max
q c=(!)
s i=r where r=zipWith3 q i(0&'R')$3&'J';n&c="":replicate n"!"++map(c#)r
c#"!"="!"
c#s=c:s
main=interact$reverse.last.s.init

두 번째 해결책-훨씬 느리지 만 (지수 시간) 훨씬 짧습니다 : 90 자

s"-\n"=""
s('-':t)=max('R'#s t)$'J'#s(drop 3 t)
s _="!"
c#"!"="!"
c#s=c:s
main=interact s
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.