둥지 제거 목록


12

그 안에 중첩 된 목록이있는 목록이 있으면 중첩 된 목록의 항목이 중첩 해제 된 목록을 반환합니다.

입력

이 목록에는 최대 4 개의 중첩 된 목록이 있습니다. 입력 내의 모든 0을 널 공백으로 계산합니다.

산출

각 항목을 개별적으로 인쇄하십시오. 출력을 목록으로 인쇄하지 마십시오. 각 항목을 모든 종류의 공백으로 분리 할 수 ​​있습니다.

사례 사례

[[1, 0], [2, 0], [2, 3]] -> 1 2 2 3
[[[4, 5, 8]], [[5, 6, 20]], [[1, 20, 500]]] -> 4 5 8 5 6 20 1 20 500
[[[1, 0], [0, 0], [0, 0]], [[1, 0], [1, 2], [2, 0]], [[2, 0], [0, 0], [0, 0]]] -> 1 1 1 2 2 2

가장 짧은 코드가 승리합니다.


4 개 딥 목록의 예를 하나 이상 포함해야합니다. 내가 올바르게 이해한다면 4 깊이는 다음과 같습니다 [[[[5]]]].
sergiol

[[[[5]]]]tio.run/… 에서는 작동 하지만 tio.run/… 에서는 작동 하지 않음
sergiol

Count all 0's within the input as a null space.의미 를 인식하기 ignore zeros
어렵다

답변:


7

APL (10)

0~⍨⍎⍞~'[]'

설명:

  • ⍞~'[]': 사용자 입력 ( (없음) ~문자는) '[]'
    이 같은 것을 제공'1,2,0,2,3'
  • :이 문자열을 평가하십시오. 너무 그렇게 ,: 그래서 지금 우리가 목록을 가지고, 연결 연산자입니다 1 2 0 2 3(APL 목록은 공백으로 구분 된 기본적으로 있습니다)
  • 0~⍨:이 목록에서 모든 숫자 0을 제거하십시오. (지금까지는 문자열이 아닌 숫자 목록이므로 숫자 내의 0은 제거되지 않습니다.
  • 이 값이 출력됩니다 (기본적으로 Golfscript와 같은 전체 프로그램의 값이므로). APL 목록은 기본적으로 공백으로 구분되어 있으므로 질문과 정확히 같습니다.

가장 짧은 대답이므로 케이크를 가져갑니다. 답변이 아닌 모든 답변에 대해 코드가 실제로 짧거나 독창적이라면 +를주었습니다.
beary605

7

Sed, 20 자

솔루션은 POSIX Extended Regular Expression을 기반으로합니다.

s;[^0-9]+0|[],[]+;;g

출력 :

bash-3.2$ sed -rf sedFile <<< "[[[4, 5, 8]], [[5, 6, 20]], [[1, 20, 500]]]" 
4 5 8 5 6 20 1 20 500

편집 : POSIX 기본 정규 표현식 ( @clueless 's solution), 19 자 :

s/[^0-9][^1-9]*/ /g

1
s/[^0-9][^1-9]*/ /g또한 작동하며 확장 정규 표현식이 필요하지 않습니다.
Clueless

7

파이썬, 45

w00, 골프 예외 처리!

def d(x):
 try:map(d,x)
 except:print`x`*(x!=0)

유형을 확인하는 매우 영리한 방법입니다.
beary605

나는 해결책을 좋아하지만 d(input())문자 수에 줄을 포함시키지 않는 것이 부정 행위라고 생각합니다 .
Clueless 2016 년

I / O와 관련하여 문제는 모호합니다.
boothby

5

펄, 20 16 13 자

perl -ple 's/\D+0?/ /g'

-l스위치 출력의 마지막 개행을 보존 할 필요가있다.

다음은 실제로 목록에서 의미 적으로 작동하는 대체 버전입니다 (51 자).

perl -E '$,=$";sub p{map{ref$_?p(@$_):$_||""}@_}say p eval<>'

이 두 프로그램은 "각 항목을 모든 종류의 공백으로 분리 할 수있다"는 문제의 규정을 이용하며 0을 공백으로 바꾸지 않고 완전히 제거합니다.


4

K, 12

{x@?&x:,//x}

.

k){x@?&x:,//x}((1;0);(2;0);(2;3))
1 2 2 3
k){x@?&x:,//x}(((4;5;8));((5;6;20));((1;20;500)))
4 5 8 5 6 20 1 20 500
k){x@?&x:,//x}(((1;0);(0;0);(0;0));((1;0);(1;2);(2;0));((2;0);(0;0);(0;0)))
1 1 1 2 2 2

K의 버전에 따라 "를 제외시켰다"(사용을 할 수 있습니다 x^y:과 같이) {(,//x)^0}또는 {,/x^0}/. johnearnest.github.io/ok/index.html
ngn

3

Perl 13 , 14 문자 dit : p한 문자 수

s/\D+|\b0/ /g

용법:

cat '[[1, 0], [2, 0], [2, 3]]' | perl -pe 's/\D+|\b0/ /g'

잘 했어. 카운트는 실제로 14 자이지만 카운트에 p스위치 를 포함해야합니다 .
breadbox

@breadbox : 그렇습니다. 나는 그것을 놓쳤다.
Toto

컷 대신 에코를 사용하면 문자 수의 중립적 인 작동이 가능합니다.
사용자가 알 수 없음

2

루비, 38 자

puts eval(gets).flatten.reject &:zero?

숫자는 줄 바꿈으로 구분되어 인쇄됩니다.


2

골프 스크립트 15

~{[]*}4*{},' '*

입력

다음과 같이 명령 행에서 실행하십시오.

echo [[[1 0] [0 0] [0 0]] [[1 0] [1 2] [2 0]] [[2 0] [0 0] [0 0]]] | ruby golfscript.rb x.gs

( x.gs파일에 위에 제시된 코드가 포함되어 있다고 가정 ).

,배열을 정의 할 때 쉼표 ( ) 가 없습니다 . 이것이 Golfscript 구문입니다

산출

입력 섹션에 설명 된 명령 이 발행되면 출력은 다음과 같습니다.

1 1 1 2 2 2

2

파이썬 3, 49 자

import re
print(*re.findall('[1-9]\d*',input()))

파이썬 2, 58 자

import re
print re.sub('\D[^1-9]*',' ',raw_input())[1:-1]

2

Japt , 5 바이트

c f ¸

그것을 테스트


설명

배열의 암시 적 입력 U. 로 배열을 평평하게합니다 c. 필터를 사용 f하여 0s 를 제거하십시오 . 공백을 사용하여 문자열에 연결하십시오 ¸. 결과 문자열의 암시 적 출력.


2

자바 10, 106 바이트

void c(Object i){for(var o:(Object[])i)try{System.out.print((int)o>0?o+" ":"");}catch(Exception e){c(o);}}

중첩으로 입력 Object[]하고 STDOUT에 출력을 인쇄합니다.

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


46 바이트

s->s.replaceAll("[^0-9 ]","").replace(" 0","")

로 입력 및 출력 String.

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


@ 주세페 웁스. 그건 꽤 바보 같은 실수입니다. 지금 수정해야합니다.
Kevin Cruijssen

1

C, 45 자

for(;s=strtok(s,"[], ");s=0)atoi(s)&&puts(s);

입력이로 표시된 수정 가능한 메모리 영역에 있다고 가정합니다 s.


답은 프로그램이나 최소한 기능이 아니어야합니까? 번호에 실패하면 01(나에게 합법적 인 것으로 보입니다). 그리고 *s-49&&puts(s)더 짧습니다.
ugoren

@ugoren 나는 완전한 프로그램 / 기능에 대한 답변을 제한하는 요구 사항을 찾지 못했습니다. 거기 아무도 없나요?
Alexander Bakulin

@ugoren 앞에 0이있는 숫자를 처리하도록 다시 작성되었습니다. 제안을 단축 해 주셔서 감사합니다!
Alexander Bakulin

1

파이썬 99 개 111 문자

def d(l):
    if list==type(l):return[y for x in l for y in d(x)]
    return[str(l)]*(l!=0)
print" ".join(d(input()))

이전 99 자 버전-0이있는 목록 만 포함되면 실패합니다.

d=lambda l:list==type(l)and[y for x in l for y in d(x)]or[str(l)]*(l!=0)
print" ".join(d(input()))

d(l)l0을 필터링하고 숫자를 문자열로 변환하는 동안 재귀 적으로 목록을 평탄화합니다 .


세 번째 테스트 사례에 대해 1 [0, 0] [0, 0] 1 1 2 2 2 [0, 0] [0, 0]을 반환합니다.
beary605

@ beary605, 나는이 하나의 테스트를 건너 뛰었습니다 ... a and b or cC 대신에 사용 a?b:c하지만 bfalse로 평가 되면 실패합니다 (이 경우 빈 목록).
ugoren

1

스칼라, 42 문자

숫자가 아닌 숫자와 숫자가 아닌 숫자로 문자열을 토큰 화했습니다.

print(readLine split"\\D|\\b0"mkString" ")

1

프롤로그 (79)

목록을 용어로 입력하므로 '.'를 넣어야합니다. 입력에서 목록 다음에.

실제로는 목록을 평탄화합니다.

x([H|T]):-x(H),x(T).
x(0). x([]).
x(M):-write(M),put(32).
:-read(X),x(X),halt.



0

스칼라 147 :

문자열이 아닌 실제 목록에 대한 작업 :

def f[A](l:List[_]):List[_]=l match{
case Nil=>l
case(l:List[_])::s=>(f(l):::f(s))
case e::s=>e::f(s)}
def p(l:List[_])=f(l)filter(!=0)mkString " "

이제 테스트 데이터 :

val l1 = List (List (1, 0), List (2, 0), List (2, 3))
val l2 = List (List (List (4, 5, 8)), List (List (5, 6, 20)), List (List (1, 20, 500)))
val l3 = List (List (List (1, 0), List (0, 0), List (0, 0)), List (List (1, 0), List (1, 2), List (2, 0)), List (List (2, 0), List (0, 0), List (0, 0)))
val l4 = List (l1, l2, l3)

scala> l4.map(p)
res94: List[String] = List(1 2 2 3, 4 5 8 5 6 20 1 20 500, 1 1 1 2 2 2)

scala> p(l4)
res95: String = 1 2 2 3 4 5 8 5 6 20 1 20 500 1 1 1 2 2 2

0

bash : 29 자

l=$(echo "[[[1, 0], [0, 0], [0, 0]], [[1, 0], [1, 2], [2, 0]], [[2, 0], [0, 0], [0, 0]]]")
echo $l|tr -d '][,'|sed 's/\b0\b/ /g'
1           1   1 2 2   2          

'echo $ l |'없이 2 행만 계산합니다. 3 개 샘플에 대한 테스트 :

  1    2    2 3
   4 5 8   5 6 20   1 20 500
   1               1    1 2  2     2            





0

Brachylog , 8 바이트

ċ∋↰|ℕ₁ẉ⊥

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

입력 변수를 통해 입력을 받아서 줄 바꿈으로 구분하여 출력을 인쇄합니다. 일반적으로 출력 형식에 대해 불평하지만 실제로 다른 방법으로는 생각하지 않은 방식으로 바이트를 절약 ẉ⊥했습니다 {}ᶠ.

ċ           If the input is a list,
 ∋          pick some element of it
  ↰         and recur with it as the input.
   |        Otherwise, if the input
    ℕ₁      is a natural number,
      ẉ     print it with a trailing newline
       ⊥    then trigger backtracking.

목록 항목이 음이 아닌 정수로 제한되지 않은 경우 :

Brachylog , 11 바이트

ċ!∋↰|0!⊥|ẉ⊥

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


0

PHP , 70 바이트

function($a){array_walk_recursive($a,function($a){echo$a?"$a ":'';});}

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

이것은 가장 짧지 않을 수도 있지만 사용할 수있는 기회가 될 것이라고 생각했습니다. array_walk_recursive()오늘날까지 나는 그것을 사용할 수 있다고 생각할 수 없습니다! 최소한 임의 수준의 딥 중첩 목록을 처리 할 수 ​​있어야합니다.


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