디코드 팩터 트리


11

Encode Factor Trees 를 놓친 경우 다음 은 Factor Tree의 정의입니다.

  • 빈 문자열은 1입니다.
  • 연결은 곱셈을 나타냅니다.
  • 괄호로 묶인 숫자 n (또는 쌍을 이루는 문자)은 n 번째 소수를 나타내며 2는 첫 번째 소수입니다.
    • 이 과정은 재귀 적으로 수행됩니다. n 번째 소수는 괄호 안의 n 에 대한 요소 트리입니다 .
  • 숫자의 요인은 가장 작은 것부터 가장 큰 것까지 주문해야합니다.

예를 들어, 2-10의 요인 트리는 다음과 같습니다.

()
(())
()()
((()))
()(())
(()())
()()()
(())(())
()((()))

이 과제는 비슷한 형식을 사용합니다. 그러나이 과제는 이러한 구조 를 디코딩 하는 것입니다.

테스트 사례

마지막 도전에서 뻔뻔스럽게 도용 되었습니다 .

위의 9 개 이외에 ...

()()((()))((())) => 100
(()(()(()))) => 101
(()())(((())))(()(())) => 1001
(((((((()))))))) => 5381
(()())((((()))))(()()(())(())) => 32767
()()()()()()()()()()()()()()() => 32768

규칙

  • 입력에서 쌍을 이루는 문자는 괄호, 괄호, 괄호 또는 꺾쇠 괄호 중에서 선택합니다. 요청이있을 경우 다른 형식 (예 : XML 태그)을 허용 할 수 있습니다.
  • 2-2 15 또는 32768의 숫자에 대해 요인 트리를 처리 할 수 ​​있어야합니다 .
  • 이것이 이므로 바이트 단위의 최단 답변이 이깁니다.

답변:



8

프롤로그 (SWI) , (134) 128 (127) 124 바이트

이 답변은 나와 0 '사이의 협력의 일부입니다. 우리는 둘 다 이것을 함께 일했는데, 내가 게시하는 유일한 이유는 Rock, Paper, Scissors에서 우승했기 때문입니다.

\Q-->{Q=1};"(",\N,")",\B,{findnsols(N,I,(between(2,inf,I),\+ (between(3,I,U),0=:=I mod(U-1))),L)->append(_,[Y],L),Q is Y*B}.

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

설명

이 답변은 프롤로그에서 골프를 즐겁게 만드는 이유를 완벽하게 보여줍니다.


이 답변은 명확한 절 문법에 Prologs 강력한 시스템을 사용합니다. 여기 문법이 약간 풀려 있습니다.

head(1)-->[].
head(Q)-->"(",head(N),")",head(B),{prime(N,Y),Q is Y*B}.
isprime(I):- \+ (between(3,I,U),0 =:= I mod(U-1)).
prime(N,Y):-
  findnsols(N,I,(
    between(2,inf,I),
    isprime(I)
  ),L),
  append(_,[Y],L),!.

첫 번째 건설 규칙은 다음과 같습니다.

head(1)-->[].

이것은 빈 문자열이 1에 해당함을 프롤로그에 알려줍니다.

우리의 두 번째 건설 규칙은 조금 더 복잡합니다.

head(Q)-->"(",head(N),")",head(B),{prime(N,Y),Q is Y*B}.

이것은 빈 문자열이 아닌 동일한 규칙을 가진 절의 오른쪽에 괄호가 포함되어 있음을 알려줍니다.

또한이 절 ( Q) 의 값이 규칙을 따릅니다.

{prime(N,Y),Q is Y*B}

이것을 세분화하면 Q2 개의 숫자 Y와 의 곱이 B됩니다. B왼쪽에있는 절의 값일 뿐이며 괄호 안에있는 절의 값 Y이있는 N첫 번째 소수 N입니다.

이 규칙은 요인 트리의 구성 규칙을 모두 포함합니다.

  • 연결 곱하기
  • 인클로저는 n 번째 프라임

이제 술어 정의에 대해. ungolfed 버전에는 두 가지 술어가 있습니다 (실제 코드에서는 술어를 앞으로 묶었습니다). 여기에 두 개의 관련 술어는 isprime/1소수 일치하고있는 prime/2부여하는, N그리고 Y, IFF 일치 Y는 IS N일 주요. 먼저 우리는

isprime(I):- \+ (between(3,I,U),0 =:= I mod(U-1)).

이것은 기본성에 대한 꽤 표준적인 정의로 작동합니다. 우리는 2를 I포함하여 2를 포함하지만 I그 사이에는 숫자가 없다고 주장합니다 I.

다음 술어도 꽤 간단합니다

prime(N,Y):-
  findnsols(N,I,(
    between(2,inf,I),
    isprime(I)
  ),L),
  append(_,[Y],L),!.

우리 는 소수 인 findnsols첫 번째 N숫자 를 찾은 다음 마지막 숫자를 반환합니다. 여기서 속임수 findnsols가장 작은 N 소수 를 찾을 수는 없지만 SWI가 처리하는 방식 때문에 between항상 작은 소수를 더 빨리 찾을 수 있다는 것입니다. 그러나 이것은 더 많은 소수를 찾지 못하도록 잘라 내야 함을 의미합니다.


골프

코드에서 이유를 두 번 전달할 수 있습니다. 이후로는 isprime해당 정의가 내부에 이동 가능 한번만 사용된다 prime. 다음 prime은 DCG 내부 로 직접 이동 하는 것입니다. 그러나 너무 많은 소수를 만들지 prime않기 위해 컷인을 사용하기 때문에 findnsols약간의 문제가 있습니다. 컷은 원하는 비트 대신 전체 DCG를 컷합니다. 약간의 문서 파기 후 우리는 once/1이 부분 만 잘라 내고 전체 DCG가 아니라는 데 사용될 수 있음 을 발견했습니다 . 그러나 더 많은 문서 파기 작업을 통해 ->운영자가 유사한 작업을 수행하는 데 사용될 수 있음이 밝혀졌습니다 . ->오퍼레이터는 대략 동등 ,!,우리의 반대편에가는 절단 이동되도록 append/3하고 그것을 대체 ->.

SWI-Prolog에서 술어 (및 규칙)는 연산자를 이름으로 제공하여 일반적으로 필요한 괄호를 삭제할 수 있습니다. 이에 의해 우리는 rule을 호출함으로써 6 바이트를 절약 할 수 있습니다 \.



1

JavaScript (ES6), 98 바이트

notjagan의 Python answer에서 영감을 얻었습니다 . 입력 표현식을 거대하고 추악한 실행 가능 문자열로 바꿉니다.

s=>eval(s.split`)(`.join`)*(`.split`(`.join`(g=(n,k)=>(C=d=>n%--d?C(d):k-=d<2)(++n)?g(n,k):n)(1,`)

Cg함수를 단일 바이트로 병합하면 일부 바이트가 절약 될 수 있지만 더 많은 재귀가 필요합니다.

테스트 사례

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