목록 목록을 Sad-List로 구문 분석


12

이 문제에서는 목록 목록을 더 간단한 목록 형식으로 구문 분석해야합니다.

이 도전은 내 슬픈 깃발 파서를 기반으로합니다. 내 sadflak 파서에서는 프로그램 시작 속도를 높이기 위해 모든 ()을 제거하고 목록 시작 부분에서 ()의 합계로 바꿨습니다.

Sad-List로 파싱하려면 다음을 수행해야합니다 (파이썬 구현, 튜플 튜플 사용).

def sadlistfunc(list):
    new-sadlist = [0]
    for i in list:
        if i == ():
            new-sadlist[0]+=1
        else:
            new-sadlist.append(sadlistfunc(i))

이것은 재귀 함수입니다. 목록의 경우, 목록 입력에서 ()의 수로 시작하여 새 목록을 시작하면이 목록의 나머지는 목록 입력에서 ()가 아닌 모든 목록의 슬픈 목록 버전입니다. 리스트를 돌려줍니다.

입력:

몇 가지 다른 형식으로 입력 할 수 있습니다.

  • 당신은 그것을 목록으로 가져갈 수 있습니다
  • 당신은 그것을 튜플로 가져갈 수 있습니다
  • 당신은 문자열로 취할 수 있습니다

문자열로 가져 가면 brain-flak에 표시된 것처럼 대괄호 세트를 사용해야합니다. 문자 1과 2를 사용할 수 없습니다

합리적이다

입력은 항상 하나의 목록 안에 있지만 프로그램은 입력 외부의 암시 적 목록 레이어를 가정 할 수 있습니다 (예 : () () () = (() () ())). 그렇지 않을 수도 있습니다. 예는 명시적인 외부 목록과 함께합니다

산출:

목록, 튜플 또는 문자열 등이 될 수 있습니다. 메타 합의와 같이 합리적인 출력 형식을 사용할 수 있습니다.

예:

(()()()) = [3]
(((()))) = [0,[0,[1]]]
((())()(())) = [1, [1], [1]]
() = invalid input, if the outside bracket is explicit.
((((())())())(())()) = [1, [1, [1, [1]]], [1]]

입력이 엄격하지는 않습니다. 이러한 입력은 다음과 같습니다.

[[],[],[]]
[[[[]]]]
[[[]],[],[[]]]
[]
[[[[[]],[]],[]],[[]],[]]

또는 다른 합리적인 형식

설명 된 테스트 사례 :

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

이것을 "슬픈"하기 위해, 우선 우리는 ()

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

3. 그런 다음 제거하고 시작 부분에 3을 추가하십시오.

(3,((())()))

이 목록에는 하나의 목록이 있습니다. 우리는 이것을 슬프게한다

((())())

몇 개입니까?

     ()
((())  )

1. 시작시 1을 제거하고 추가합니다

(1,(()))

여기에 하나의 목록이 있습니다

(())

카운트

 ()
(  )

카운트 제거 및 추가

(1)

우리는 이것을 다시 목록에 넣습니다.

(1,(1))

우리는 이것을 다시 목록에 넣습니다.

(3,(1,(1)))

끝난

이것은 이므로 짧을수록 좋습니다.


실제 sad-flak 파서에서 ()의 수는 실제로 목록의 두 번째 항목이고 첫 번째 항목은 명령의 색인입니다.
Destructible Lemon

좋은 ol 'JavaScript for... in, 당신이 왜 그것을 사용하지 않는지 기억하게 해주세요 : Fiddle
Stephen

나는 ((((())())())(())()) = [1, [1, [1, [1]], [1]]있어야 한다고 생각 합니다 ((((())())())(())()) = [1, [1, [1, [1]]], [1]].
Renzo

답변:


4

Pyth , 13 바이트

L+]/bYyM-b]Yy

테스트 스위트 .

작동 원리

L+]/bYyM-b]Yy
L               define a function y with argument b:
   /bY              list 1: count how many [] can be found in b
  ]                         wrap into singleton
        -b]Y        list 2: filter out [] from b
      yM                    apply y (this function) to each
 +                  concatenate the two lists above
            y   apply y to the input

먼저 제거 할 수 있습니다 ].
아웃 골퍼 에릭


2

Brachylog , 21 바이트

;[[]]x{↰₀}ᵐA&{∋∅}ᶜg,A

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


바이트와 ​​문자는 동일하지 않습니다. UTF-8을 사용하면 21 자이지만 33 바이트를 차지합니다 .
Samadi

1
@Samadi Brachylog는 이 메타 답변에 허용되는 자체 코드 페이지를 사용 합니다 .
Leaky Nun

아, 알겠습니다 나는 약간 혼동. 설명해 주셔서 감사합니다!
Samadi

@Samadi 문제 없습니다,이 질문은 항상 묻습니다.
Leaky Nun

2

수학, 42 바이트

{#~Count~{0},##&@@#~DeleteCases~{0}}&//@#&

트리의 모든 노드에 함수를 매핑하는 //@( MapAll)를 사용하여 명시적인 재귀 를 피합니다. 이것은 또한 함수가 잎에서 위쪽으로 실행됨을 의미합니다. 그러나, 또한 적용됩니다 {}로 바뀌 취득하는 {0}과정에서. 우리가 {0}대신 계산하고 제거 하는 이유 {}입니다.



2

클로저, 59 바이트

(fn f[i](conj(map f(remove #{[]}i))(count(filter #{[]}i))))

CommonLisp 답변 과 크게 다르지 않습니다 . 그것 countremove조금 더 좋은 구조를 받아들이는 것 같습니다. 여기서는 세트를 사용해야했습니다.


2

실제로 12 바이트

;[]@c@;░Q£Mo

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

명시적인 외부 브랙 커가있는 쉼표로 구분 된 대괄호 목록으로 입력을받습니다.

설명:

;[]@c@;░Q£Mo
;[]@c         count the number of empty lists
     @;░      filter out empty lists
        Q£Mo  recurse with filtered list and append result

2

파이썬 2 , 69 46 45 바이트

f=lambda l:[l.count([])]+map(f,filter(len,l))

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


f=함수 f를 사용하고 있기 때문에 바이트 수에 추가해야한다고 생각합니다. 그렇지 않으면 이름을 지정하면 솔루션이 중단 될 것입니다.
Leo

@ 레오 당신이 맞아요.
ovs

1

젤리 , 10 바이트

Tị߀;@ċ“”$

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

목록을 목록 목록으로 입력합니다 ...

물론 다른 답변이 사용하는 알고리즘을 사용합니다. ;)


10 바이트가 아닙니다. 10 입니다. 바이트 수는 사용하는 인코딩에 따라 다릅니다.
Samadi

2
@Samadi 아니요, Jelly에는 기본적으로 전용 문자 세트가 있으며 해당 문자를 각각 1 바이트로 표시 할 수 있습니다. 여기를 참조 하십시오 .
Adám

내가 참조. 설명 주셔서 감사합니다!
Samadi

1

하스켈 , 102 바이트

data L=I Int|T[L]deriving Show
(I n:r)#m=r#(n+m)
(x:r)#m=x:r#m
_#m=[I m]
f(T[])=I 1
f(T t)=T$map f t#0

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

Haskell은 엄격하게 입력되므로 임의로 중첩 된 목록이 없습니다. 구제 수단 data L=I Int|T[L]deriving Show으로 Ints 또는 빈 목록을 리프로 사용하여 트리와 같은 중첩 목록을 선언합니다.

입력은 두 번째 예제 형식과 비슷하며 T각 여는 중괄호 앞에 추가 생성자가 T[T[T[]],T[],T[T[]]]있습니다. 각 번호 앞에 생성자가 오는 출력도 마찬가지 I입니다. 기능 f슬픔을 수행합니다 .

테스트 케이스의 출력 :

T [I 3]
T [T [T [I 1],I 0],I 0]
T [T [I 1],T [I 1],I 1]
T [T [T [T [I 1],I 1],I 1],T [I 1],I 1]

1

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

골프 :

let m=a=>!a.length||a.map(m).reduce((b,c)=>(c.length?b.push(c):b[0]++,b),[0])

언 골프 드 :

const traverse = arr => !arr.length || arr
    .map(traverse)
    .reduce(
        (accum, val) => (val.length ? accum.push(val) : accum[0]++, accum),
        [0]
    );

데모

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