반복 해석!


11

이 과제는 반복에 관한 두 가지 도전 과제 시리즈 중 첫 번째 과제입니다. 두 번째는 곧 올 것이다.

반복 (I 방금 만든 뭔가)라는 언어에서의 무한 문자열이 구성 12345678901234567890...으로, 1234567890영원히 반복합니다.

숫자를 출력하기 위해 다음 구문을 사용할 수 있습니다.

  • +-*/: 반복 숫자 문자열에 연산자를 삽입합니다.
    • 예 :
      • +-> 1+2= 3( 와 사이에 +삽입 )+12
      • +*-> 1+2*3= 1+6= 7(현재 두 개의 연산자가 사용되는 것을 제외하고 위와 동일)
      • /-> 1/2= 0(반복은 정수 나누기를 사용합니다)
      • //-> 1/2/3= 0/3= 0(반복은 여러 뺄셈과 나눗셈으로 "왼쪽 연결"을 사용합니다)
    • 각 연산자는 왼쪽에 하나의 숫자가 있도록 삽입됩니다 c(아래 참조).
  • c: 문자열에서 다음 숫자와 연결합니다.
    • 예 :
      • c+-> 12+3= 15( c"계속" 1하고 다음 숫자와 연결 2하여 12)
      • +c-> 1+23=24
      • ccc -> 1234
  • (): 숫자 처리를위한 괄호.
    • 예 :
      • (c+)*-> (12+3)*4= 15*4= 60(반복은 연산 순서를 사용합니다)
      • (c+)/c-> (12+3)/45= 15/45=0
      • (cc+c)/-> (123+45)/6= 168/6=28
  • s: 숫자를 건너 뜁니다 (무한 문자열에서 숫자를 제거합니다).
    • s+-> 2+3= 5( s건너 뛰기 1)
    • csc-> 124(제 cconcats 12상기 s스킵 3, 최종 cconcats 124)
    • +s+-> 7(첫 번째 +추가 12만들기 3, s건너 뛰기 3및 마지막 +추가 3하기 4위해 만들기 7)
    • cs*(++)-> 12*(4+5+6)= 12*15=180

위의 예에서는 무한 문자열의 유한 자릿수 만 사용됩니다. 사용 된 자릿수는 number of operators, concats and skips + 1입니다.

반복 코드 문자열이 주어지면 결과가 출력됩니다.

입력 및 출력의 예는 다음과 같습니다.

++ -> 6
- -> -1
(-)* -> -3
cscc -> 1245
(cc+c)/ -> 28
cc+c/ -> 130
cs*(++) -> 180

이것은 코드 골프이므로 바이트 단위의 가장 짧은 코드가 이깁니다!

명세서:

  • 결과가 절대로 올라가지 않도록 보장합니다 2^31-1.
  • 또한 입력은 기호로만 구성됩니다 +-*/cs().
  • 빈 프로그램이 출력 1됩니다.

무엇에 대한 ~의? 우리를 매달아 두지 마십시오.
Robert Fraser

@RobertFraser Whoops, 그건 실수 였어-c는 원래 ~ 였지만, 나는 그것을 완전히 고치지 않은 것으로 보인다.
clismique

1
@TonHospel Ooh, 당신은 거기에 좋은 지적이 있습니다. "s"기호는 기본적으로 무한 문자열에서 연결된 숫자를 모두 제거하므로 두 시나리오에서 모두 그렇습니다.
clismique

2
귀하의 사양 그러나 말한다는 s+것입니다 2+3최초의 예로서. 그리고 여전히 s나를 괴롭힌다. 어떻게 +s()+확장 되는지 궁금합니다 . 이 경우 1+(2)+4다음 (전에 제공 2하지만 s도 전에 오는 (겉으로는 여전히 스킵 3하지 2. 그러나 결과는 1+(3)+4다음의 결과에 s따라 달라집니다 (와 비교 +s+)
Ton Hospel

1
sc이다 23s+이다 1+3? 않습니다 s을 건너 1지금 나 2? 모든 예제는 피연산자의 첫 번째 작업을 사용 1하고 2그래서 ... sc해야한다 13.
Titus

답변:


4

자바 스크립트 (ES6), 110 바이트

s=>eval((" "+s)[R='replace'](/[^\)](?!\()/g,x=>x+i++%10,i=1)[R](/c| (\ds)+|s\d/g,"")[R](/\d+\/\d+/g,"($&|0)"))

매우 간단하지만 정수 나누기는 25 바이트를 더합니다. 어떤 이유로 JS의 정규 표현식은 문자열의 시작과 첫 번째 문자 모두와 일치 할 수 없으므로 몇 바이트도 추가됩니다.

작동 원리

  1. 입력에 공백을 추가하십시오.
  2. )바로 앞에 있지 않은 각 문자 (제외 )에 다음 숫자를 추가하십시오 (.
  3. c, s시작시 자릿수 + ( 1s2-> 2) 및 각 s+ 자릿수 ( 3s4-> 3)를 제거하십시오.
  4. 각 나눗셈 연산을 int-division ( 1/2-> (1/2|0)) 으로 바꿉니다 .
  5. 평가하고 반환하십시오.

확인 ... 프로그램에 버그가 있습니다 ... ss+반환 6할 때 반환합니다 7(둘은 s건너 뛰기 12이므로 +add 34).
clismique

@ Qwerp-Derp 감사합니다.
ETHproductions

같은 뭔가가 /^|,|$/g두 경기가 같은 색인이 때문에 단지 시작에 한 번 일치합니다. $일치하는 다른 일치하는 것보다 큰 인덱스를 가지고 있기 때문에 같은 문제가 없습니다.
Neil

0

배치, 332 바이트

@echo off
set s=
set e=
set d=
set r=
set/ps=
:d
set/ad=-~d%%10
:l
if "%s%"=="" goto g
set c=%s:~0,1%
set s=%s:~1%
if %c%==( set e=%e%(&goto l
if %c%==) set r=%r%)&goto l
if %c%==s goto d
if %c%==c set c=
if "%r%"=="" set/ar=d,d=-~d%%10
set e=%e%%r%%c%
set/ar=d
goto d
:g
if "%r%"=="" set/ar=d
cmd/cset/a%e%%r%

동작 s은 이것을 매우 어색하게 만듭니다. (아마 cs로 평가해야 13하고 -s-2?) 변수 :

  • s 입력 문자열 (아무 것도 입력하지 않으면 set / p가 변수를 변경하지 않으므로 명시 적으로 비워짐)
  • e정규 정수 산술 부분 표현 ( set/a의 형태로 전달할 수 있음 eval)
  • d 무한 자릿수의 다음 자릿수
  • r최신 작업자의 오른쪽. 우리는 (먼저 와야 하기 때문에 이것을 즉시 연결할 수 s는 없지만 증가시키지 않도록 저장해야 합니다. 다행히도 처리가 )약간 더 쉬워졌습니다.
  • c 현재 캐릭터.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.