IMP : 암시 적 곱셈 파서


9

Jack은 C 프로그래밍 언어를 좋아하지만 V=a*b*h; 값을 곱하는 식을 쓰는 것을 싫어 합니다.

그는 V=abh;대신 에 작성하고 싶습니다 . 왜냐하면 컴파일러 가 정의 된 abh이후 int a, b, h;정의 되지 않은 기호에 대해 신음해야 하므로 곱셈을 추론 할 수 있습니까?

현재 범위에 정의 된 변수 세트가 알려진 경우 단일 곱셈 항을 해독하는 구문 분석기를 구현하는 데 도움이됩니다.

단순화를 위해 숫자를 (로 2*a*b) 곱하는 것은 고려되지 않으며 변수 만 나타납니다.

입력 값은 정규 표현식을 충족 하는 곱셈 항 T입니다 .

[a-zA-Z_][a-zA-Z_0-9]*

가변 설정 Z .

변수 세트 Z에 대한 용어 T의 구문 분석 P는 다음을 충족하는 문자열입니다.

  1. *P에서 발생하는 모든 것을 제거한 후 우리는 T를 받는다.
  2. Z의 변수 이름이거나 단일 *문자로 분할 된 Z의 적절한 변수 이름으로 구성됩니다 .

솔루션은 용어의 모든 구문 분석을 인쇄해야합니다.

견본:

Vars           a, c, ab, bc
Term           abc
Solution       ab*c, a*bc

Vars           ab, bc
Term           abc
Solution       -

Vars           -
Term           xyz
Solution       -

Vars           xyz
Term           xyz
Solution       xyz

Vars           width, height
Term           widthheight
Solution       width*height

Vars           width, height
Term           widthheightdepth
Solution       -

Vars           aaa, a
Term           aaaa
Solution       aaa*a, a*aaa, a*a*a*a

입력 (변수 목록 및 용어)은 언어에 적합한 방식으로 제공 될 수 있습니다.

출력은 합리적인 형식 (행당 하나의 구문 분석 또는 쉼표로 구분 된 목록 등) 일 수 있지만 모호하지 않고 읽을 수 있어야합니다.

용어의 구문 분석이 불가능한 경우 빈 출력이 허용됩니다 (예에서는 명확성을 위해 '-'를 사용했습니다).

이것은 코드 골프이므로 가장 짧은 코드가 승리합니다.


1
첫 번째 예에서 허용되는 변수가 아니기 ab*c때문에 잘못된 구문 분석 이라고 생각 c합니다.
isaacg

1
재귀 스캔을 통해 샘플에서 결과를 정확하게 찾을 수 있습니다. 그러나 그것은 의심의 : 왜 a*aaa aaa*a하지ab*c c*ab
edc65

구문 분석의 규칙 1. 때문에. 그렇습니다. 곱셈은 일반적으로 정답이지만 지금까지는 진행되지 않습니다. 곱셈은 "순서대로"재구성하고 싶습니다. 실제로 Jack의 언어로 우리는 행렬 유형을 가질 수 있습니다. 그리고 "aaaa"는 "aaa"와 "a"또는 "a"와 "aaa"의 병치 일 수 있습니다. 이것은 정통성을위한 것이 아니라 모호성을 위해 우리 모두를 고려하고 있습니다.
pawel.boczarski

답변:


4

피 이스, 18 자

mj\*dfqzsTsm^Qkhlz

이 솔루션은 나의 통역 물고기 솔루션 에서 채택되었습니다 . 문제는 실제로 매우 비슷합니다.

다음과 같이 입력을 예상합니다.

aaaa
"a", "aaa"

다음과 같은 출력을 제공합니다.

['a*aaa', 'aaa*a', 'a*a*a*a']

여기에서 시도하십시오.

  • sm^Qkhlz: 입력 문자열 수의 변수 길이까지 포함하는 모든 변수 시퀀스를 생성합니다.

  • fqzsT: 입력 문자열과 일치하는 변수 시퀀스를 필터링합니다.

  • mj\*d: *기호를 삽입 하고 인쇄합니다.


3

파이썬 2-147 94 바이트


R=lambda S,V,F=[]:S and[R(S[len(v):],V,F+[v])for v in V if v==S[:len(v)]]or print("*".join(F))

이것은 다음 R과 같이 사용될 함수 를 정의합니다 :

>>> R("abc", ["a", "bc", "ab", "c"])

다음과 같이 출력을 인쇄합니다.

a*bc
ab*c

1

자바 스크립트 (ES6) 111

내 "물고기"답변 에서 적응 한 주요 차이점은 첫 번째 솔루션뿐만 아니라 모든 솔루션을 찾는 것입니다.

F=(v,t)=>(k=(s,r)=>s?v.map(v=>s.slice(0,l=v.length)==v&&k(s.slice(l),[...r,v])):console.log(r.join('*')))(t,[])

출력이 콘솔에 인쇄됩니다. 함수 결과는 의미가 없으므로 버려야합니다.

Firefox / FireBug 콘솔에서 테스트

F(['a','c','ab','bc'],'abc')  
a*bc  
ab*c

F(['ab','bc'],'abc')

F(['aaa','a'],'aaaa')
aaa*a
a*aaa
a*a*a*a

F(['xyz'],'xyz')
xyz
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.