분명히 괄호 안에 APL 열차


19

APL에서는 trains 라는 암묵적 기능을 작성할 수 있습니다 . 그들이 일하는 방식은이 도전과 관련이 없습니다. 함수로 사용하여 그룹화 할 수있는 다른 방법은 다음과 같습니다 .

⍴      -> ⍴
⍴⍴     -> ⍴⍴
⍴⍴⍴    -> ⍴⍴⍴
⍴⍴⍴⍴   -> ⍴(⍴⍴⍴)
⍴⍴⍴⍴⍴  -> ⍴⍴(⍴⍴⍴)
⍴⍴⍴⍴⍴⍴ -> ⍴(⍴⍴(⍴⍴⍴))
...

순서는 동일하게 유지됩니다. 절차는 3 개 이상의 기능이 엄격히 존재하는 한 마지막 3 개의 기능이 하나의 기능으로 그룹화되는 것입니다. 중첩 된 기차를 만나면 계속하기 전에 먼저 괄호를 씁니다. 적용되는 절차는 다음과 같습니다 ⍴⍴⍴⍴⍴⍴.

Step 0: ⍴⍴⍴⍴⍴⍴
There are strictly more than 3 functions, repeat.
Step 1: ⍴⍴⍴(⍴⍴⍴)
There are strictly more than 3 functions, repeat.
Step 2: ⍴(⍴⍴(⍴⍴⍴))
There are 3 or less functions, we're done.

다음과 동일한 절차가 적용됩니다 ⍴⍴⍴(⍴⍴)⍴(⍴⍴⍴⍴(⍴⍴⍴))⍴⍴.

Step 0: ⍴⍴⍴(⍴⍴)⍴(⍴⍴⍴⍴(⍴⍴⍴))⍴⍴
There are strictly more than 3 functions, repeat.
We have met a nested train, applying procedure to that first:
  Step 0: ⍴⍴⍴⍴(⍴⍴⍴)
  There are strictly more than 3 functions, repeat.
  We have met a nested train, applying procedure to that first:
    Step 0: ⍴⍴⍴
    There are 3 or less functions, we're done.
  Step 1: ⍴⍴(⍴⍴(⍴⍴⍴))
  There are 3 or less functions, we're done.
Step 1: ⍴⍴⍴(⍴⍴)⍴((⍴⍴(⍴⍴(⍴⍴⍴)))⍴⍴)
There are strictly more than 3 functions, repeat.
We have met a nested train, applying procedure to that first:
  Step 0: ⍴⍴
  There are 3 or less functions, we're done.
Step 2: ⍴⍴⍴((⍴⍴)⍴((⍴⍴(⍴⍴(⍴⍴⍴)))⍴⍴))
There are strictly more than 3 functions, repeat.
Step 3: ⍴(⍴⍴((⍴⍴)⍴((⍴⍴(⍴⍴(⍴⍴⍴)))⍴⍴)))
There are 3 functions or less, we're done.

입력

이 과제를 위해 입력이 단순화됩니다. 즉, 괄호 열기 및 닫기에 2 개의 다른 문자를, 괄호에 선택된 것과 다른 1 개의 문자를 선택할 수 있습니다. 선택한 문자는 일관성이 있어야합니다. 입력 내용은 비워 두지 않으며 내용이없는 괄호 (예 :)를 포함하지 않습니다 ().

산출

다시, 당신은 3 개의 다른 문자, 괄호는 2, 함수는 1을 선택할 수 있습니다. 입력을 위해 선택한 것과 동일 할 필요는 없지만 일관성이 있어야합니다.

규칙

  • 입력에서 하나의 함수 만 묶는 괄호가 있으면 출력에서 ​​제거해야합니다. 출력에 불필요한 괄호가 포함되어 있지 않을 수 있습니다 (즉, 하나의 함수 만 포함하거나 전체 출력을 포함).
  • 솔루션이이 과제에 유효한 경우 여기에 사용 된 알고리즘을 구현할 필요가 없습니다.
  • 입력 및 출력은 입력 및 출력 섹션에 설명 된 형식의 문자열입니다. 입력은 하나 이상의 문자를 갖습니다.
  • 표준 허점을 사용하는 것은 엄격히 금지되어 있습니다.
  • 이것은 이므로 가장 짧은 답변이 이깁니다. 그러나 이는 언어 별 경쟁이므로 다른 언어로 작성된 코드와 비교하여 더 긴 코드를 생성하는 언어로 응답하도록 장려하기 때문에 허용되는 답변은 없습니다.

테스트 사례

여기에 사용 된 문자는 ()⍴선택한 문자로 바꿔야합니다.

⍴                          -> ⍴
⍴                          -> ⍴
⍴⍴                         -> ⍴⍴
⍴⍴⍴                        -> ⍴⍴⍴
⍴⍴⍴⍴                       -> ⍴(⍴⍴⍴)
⍴⍴⍴⍴⍴⍴⍴⍴⍴⍴⍴⍴⍴⍴⍴            -> ⍴⍴(⍴⍴(⍴⍴(⍴⍴(⍴⍴(⍴⍴(⍴⍴⍴))))))
⍴⍴⍴⍴⍴(⍴⍴⍴)⍴⍴(⍴(⍴⍴⍴)⍴⍴⍴)⍴⍴⍴ -> ⍴(⍴⍴(⍴⍴((⍴⍴⍴)⍴(⍴(⍴(⍴⍴⍴)(⍴⍴⍴))(⍴⍴⍴)))))
(⍴⍴⍴)(⍴⍴⍴)(⍴⍴⍴)            -> (⍴⍴⍴)(⍴⍴⍴)(⍴⍴⍴)
(⍴⍴⍴)(⍴⍴⍴)⍴⍴⍴              -> (⍴⍴⍴)(⍴⍴⍴)(⍴⍴⍴)
⍴⍴(⍴)⍴⍴                    -> ⍴⍴(⍴⍴⍴)
((⍴⍴))                     -> ⍴⍴
⍴⍴((⍴⍴))⍴⍴                 -> ⍴⍴((⍴⍴)⍴⍴)

이 도전은 샌드 박스에 게시되었습니다. 필요한 권한이 있으면 여기 에서 샌드 박스 게시물을 볼 수 있습니다 .


2
나는 FullyClearly 보다 더 나은 타이틀 이라고 생각 합니다.
Adám


@ Adám 나는 그 참고 답변을 기대했지만 그것은 많은
공감대를

@ Adám 제목 의 분명한 부분은 불필요한 괄호를 제거해야한다는 사실을 나타냅니다. 완전 당신이 도전에 대답 할 때 어떻게해야하고 뭔가이며, P
에릭 Outgolfer

이 함수는 항상 dem 등식이라는 것이 사실입니까?
Esolanging Fruit

답변:


7

APL (Dyalog Classic) , 71 68 65 63 바이트

0{⍵≡⍕⍵:⍵⋄⍬≡⍵:'⍬'1=≢⍵:⍺∇⊃⍵⋄3≥≢⍵:⍺⌽')(',⍣⍺∊1∇¨⍵⋄⍺∇¯3(↓,∘⊂1∇↑)⍵}⍎

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

I는 I / O에 대해 선택한 문자는 '(', ')'하고 '⍬'.

이 솔루션 자체는 APL 열차입니다.

입력 값이 중첩 된 배열 인 것처럼 구문 분석합니다. 빈 숫자 형 벡터 ( )를 나뭇잎으로 사용 하는 트리입니다 .

dfn (즉, lambda- { })은 트리를 재귀 적으로 순회하여 적절히 괄호로 묶은 문자열로 변환합니다. 왼쪽 인수 는 필요한 경우 괄호를 현재 레벨에 추가해야하는지 여부를 제어합니다.

dfn은 올바른 인수를 기반으로 다음과 같은 경우를 처리합니다.

  • 이미 문자열 ( ⍵≡⍕⍵) 인 경우 반환

  • 이 경우 문자를 반환하십시오.'⍬'

  • 싱글 톤 인 경우 더 깊이 파고 들면 ( 재귀 호출의 상징 임)

  • 길이가 ≤3 인 경우 각 항목에 대해 되풀이하고 ()필요한 경우

  • 그렇지 않으면, 3- 꼬리를 재귀하고 3- 꼬리를 제외한 모든 부분을 추가 한 후 다시 재귀하십시오.


63 자, 대부분은 유니 코드입니다. 어떤 문자 인코딩이 63 바이트를 생성합니까? UTF8에서 141 바이트로 만듭니다.
Corey



@ Adám 감사합니다. 나는 그 답을 얻기 위해 무엇을 찾아야할지 몰랐다.
Corey

3

파이썬 (2) , 224 (208) 204 바이트

Xcoder 덕분에 -16 바이트 ovs 덕분에 -4 바이트

r=str.replace
p='p'
def c(l):
 while len(l)>3:l=l[:-3]+(l[-3:],)
 return l and map(c,l)or l
print r(r(r(r(r(`c(eval(r(r(r(input(),'(p)',p),p,'[],'),')','),')))`,'[]',p),*'[('),*'])'),' ',''),',','')[1:-1]

온라인으로 사용해보십시오! 또는 모든 테스트 사례를 시도하십시오

코드는 3 가지 주요 단계로 나눌 수 있습니다
. 입력을 중첩 된 목록으로 변환하고 바꾸기 (p)->p. 단일 기능 p은 빈 목록으로 대체됩니다.

eval(r(r(r(input(),'(p)',p),p,'[],'),')','),'))

현재 목록에 "3 이하"규칙을 적용하고 모든 하위 목록에서 자신을 호출하는 재귀 함수입니다.

def c(l):
 while len(l)>3:l=l[:-3]+(l[-3:],)
 return l and map(c,l)or l

원하는 출력 형식으로 포맷을 대체합니다.

r(r(r(r(r(`c(...)`,'[]',p),*'[('),*'])'),' ',''),',','')[1:-1]


1
이것은 단순화하지 않습니다 ((pp))(또는 p((pp))p).
Martin Ender

2

CJam , 56 바이트

APL을 친다!

lW%~]]]{{_,{K_,({~}|}&}%{_,3>}{3/(aa\+:~}w}:K~~`1>W<W%S/

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

이것은 효과가 있다고 생각합니다. 왜 그런지 모르겠습니다.

입력 문자는 ][T()⍴이며 출력 문자는 ][0용입니다.()⍴ (예, 예상과 반대임을 의미합니다 (예 :을 전달할 수 있음 TTT]TT[T]TTTT]TTT[[TT)).

고급 개요

프로그램이 더 편리하기 때문에 입력과 반대로 작동합니다. 입력을 구문 분석하기 위해 CJam의 파서를 활용합니다. 입력을 되돌리고 실행하면 (뒤로) 구문 분석 된 입력 형식이 제공됩니다.

그런 다음 절차를 정의합니다 K. K제출을 위해 대부분의 작업을 수행하며 다음과 같이 작동합니다.

  • 입력 배열은 0과 비어 있지 않은 하위 배열의 혼합입니다. 하위 배열을 식별하고 재귀 적으로 적용K . 결과는 다른 배열이어야하며이 배열이 단일 요소로만 구성된 경우 압축을 풉니 다 (중복 괄호 제거).
  • 결과에 세 개 이상의 요소가있는 경우 첫 세 개 (마지막 세 개가 아니라 입력이 뒤로 처리됨을 기억하십시오)를 단일 목록으로 그룹화하십시오.
  • 결과를 돌려줍니다.

적용하여 K입력에 , 우리는 적절하게 괄호로 묶은 형태의 입력을 얻습니다 (유일하게 주목할 점은 입력을 실제로 단일 톤 목록으로 포장하고 나중에 포장을 풀기 때문입니다. 그 이유는 싱글 톤을 풀고있는 스 니펫을 원하기 때문입니다. 하위 배열뿐만 아니라 최상위 프로그램에도 적용 할 수 있습니다. 그런 다음 결과를 얻기 위해 최소한의 서식 만 적용하면됩니다.

골프 비트에 대한 설명

내가 가장 자랑스럽게 생각하는 골프 ,는 정수와 배열 사이의 검사를 수행하는 데 사용 됩니다.

  • 스택 상단이 정수 n,경우 [0..n) 범위를 생성합니다 . 우리가 만나는 유일한 정수는이므로 0항상 비어있는리스트를 제공합니다 [].
  • 스택 상단이 배열 인 경우 ,길이가 걸립니다. 우리가 만나는 모든 배열은 비어 있지 않기 때문에 항상 양의 정수를 얻습니다.

관심있는 다른 골프는 배열의 처음 세 요소를 그룹화하는 데 사용하는 방법입니다. "Turing complete language 통역사 코드 골프"제출 과 다소 비슷합니다 . CJam은 배열을 두 조각으로 나눌 수있는 짧은 방법이 없습니다 (원래 배열과 인덱스를 스택에 유지하면서 첫 번째 부분과 다른 부분을 분리하려고 시도 할 수는 있지만 잘 작동하지는 않습니다) 대신 3/배열을 3 개의 블록으로 그룹화하는 use를 사용합니다 . 그런 다음 첫 번째 요소를 제거하고 (배열을 두 번 래핑 aa한 다음 목록의 시작 부분에 다시 추가 할 수 \+있습니다. 우리가 배열을 두 번 감싸는 이유는 배열 :~의 나머지 부분을 섹션으로 그룹화했기 때문에를 사용 하여 레이어를 제거해야하기 때문 입니다.


Nitpick : 내장없이 APL보다 뛰어납니다 .
아웃 골퍼 에릭

@EriktheOutgolfer 박람회 충분합니다.
Esolanging Fruit

0

자바 스크립트 (ES6) 149 146 바이트

i='a';f=s=>s==(s=s[R='replace'](/\((\w+)\)/,(q,t)=>(f[q=i+=0]=f(t),q)))&&s==(s=s[R](/(?!^)((a0+|p){3})$/,"($1)"))?s[R](/a0+/g,t=>`(${f[t]})`):f(s)
<textarea cols=80 id=I>ppp(pp)p(pppp(ppp))pp</textarea><br>
<button onclick=O.innerText=f(I.value)>Run</button><br>
<pre id=O></pre>

를 사용 ()p하지만 다른 문자를 사용하더라도 p끝을 향해 방향을 변경할 수 있습니다 .

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