배열 단순화 있는지 확인합니다. 깊이와

입력

배열 또는 양의 연속적인 오름차순 정수를 포함 할 수있는 배열입니다. 배열은 그 안에 여러 배열을 가질 수 있습니다. 배열이 비어 있지 않습니다.

산출

이 배열은 단순화되었습니다

배열을 단순화하는 방법

[1, [2, 3], [[4]], [[[5, 6], 7, [[[8]]]], 9]]예제로 배열을 사용합니다 .

먼저 값이 얼마나 깊이 중첩되어 있는지 확인합니다. 깊이와 깊이는 다음과 같습니다.

0  1
1  2 3 9
2  4 7
3  5 6
5  8

원래 배열에서 숫자를 가져 와서 얼마나 깊이 중첩되는지 그룹화 한 다음 요소의 원래 깊이 깊이에 그룹을 중첩하여 출력 배열을 구성합니다. 숫자를 오름차순과 오름차순으로 정렬하십시오.

우리의 결과는 [1, [2, 3, 9], [[4, 7]], [[[5, 6]]], [[[[[8]]]]]]

[1, [2, 3], [[4]], [[[5, 6], 7, [[[8]]]], 9]] -> [1, [2, 3, 9], [[4, 7]], [[[5, 6]]], [[[[[8]]]]]]
[[[1]], [2, [3]], 4, [5, [6, [7, [8], [9, [[10]]]]]]] -> [4, [2, 5], [[1, 3, 6]], [[[7]]], [[[[8, 9]]]], [[[[[[10]]]]]]]
[1] -> [1]
[1, [2], [[3]], [[[4]]], [[[[5]]]]] -> [1, [2], [[3]], [[[4]]], [[[[5]]]]]
[1, [[[[2], 3]]] [[4]]] -> [1, [[4]], [[[3]]], [[[[2]]]]]


답변

젤리 , 8 바이트

fFṄḟ@;/ß

출력은 한 줄에 한 수준이며 요소가없는 수준에 대해서는 빈 줄이 있습니다. 온라인으로 사용해보십시오!

작동 원리

fFṄḟ@;/ß  Main link. Argument: A (array)

 F        Flat; yield all integers (at any level) in A.
f         Filter; intersect A with the integers, yielding those at level 0.
  Ṅ       Print the filtered array and a linefeed. Yields the filtered array.
     ;/   Reduce by concatenation.
          This decreases the levels of all integers at positive levels by 1.
   ḟ@     Swapped filter-false; remove the integers at level 0 in A from the array
          with decreased levels.
       ß  Recursively call the main link on the result.
          The program stops once A is empty, since ;/ will result in an error.

답변

자바 스크립트 (ES6) 139 109 바이트

f=(a,v=b=>a.filter(a=>b^!a[0]))=>a[0]?v().concat((a=f([].concat(...v(1))),b=v())[0]?[b]:[],v(1).map(a=>[a])):[]

예제 입력을 사용하여 설명 : v배열 (매개 변수 사용 1) 또는 값 ( 매개 변수 없음 ) 을 리턴하는 헬퍼 메소드입니다 . a = [1, [2, 3], [[4]], [[[5, 6], 7, [[[8]]]], 9]]비어 있지 않은로 시작 합니다. 우리는 배열을 필터링하여을 제공 [1]합니다. 그런 다음 함께 연결된 배열을 재귀 적으로 호출 [2, 3, [4], [[5, 6], 7, [[[8]]]], 9]합니다. 결과는 [2, 3, 9, [4, 7], [[5, 6]], [[[[8]]]]]입니다. 배열을 다시 필터링하여 출력의 두 번째 항을 제공 [2, 3, 9]하지만 빈 배열을 여기에 삽입하지 않도록주의해야합니다. 배열 [4, 7], [[5, 6]], [[[[8]]]]내부의 배열 을 감싸서 출력에 추가하여 결과를 유지 [1, [2, 3, 9], [[4, 7]], [[[5, 6]]], [[[[[8]]]]]]합니다.


답변

05AB1E , 27 26 25 21 바이트

D˜gFvyydi„ÿ ?}}¶?.gG«

온라인으로 사용해보십시오! ( .g아직 TIO에없는 것처럼 약간 수정 됨 )

설명

D˜gF                    # flattened input length times do
    vy                  # for each y current level of list
      ydi„ÿ ?}          # if y is a digit, print with space
              }         # end v-loop
               ¶?       # print newline
                 .g     # calculate length of stack (this should be .g but I can't test)
                   G«   # length stack times, concatenate items on stack

주요 전략은 중첩 배열의 각 가능한 수준을 반복하고 한 행에 숫자를 인쇄하는 반면, 숫자가 아닌 목록 (목록)은 중첩되지 않은 수준으로 유지하는 것입니다.


답변

펄, 52 바이트

재귀 서브 루틴 (Perl 답변에 특이한 것이 있습니다 ..)

sub f{say"@{[grep!ref,@_]}";@_&&f(map/A/?@$_:(),@_)}

그것을 그렇게 부르십시오 :

$ perl -E 'sub f{say"@{[grep!ref,@_]}";@_&&f(map/A/?@$_:(),@_)}f(1, [2, 3], [[4]], [[[5, 6], 7, [[[8]]]], 9])'
1
2 3 9
4 7
5 6

8

출력의 각 라인은 어레이의 깊이 레벨에 해당합니다 (따라서 위 예제에서 빈 라인).

입력을 Perl 배열로 변환하기 위해 add -n플래그와 eval( @{ }입력을 arrayref가 아닌 배열로 변환하기 위해) add 플래그와 전체 프로그램으로 바꿀 수 있습니다 .

perl -nE 'sub f{say"@{[grep!ref,@_]}";@_&&f(map/A/?@$_:(),@_)}f(@{+eval})' <<< "[1, [2, 3], [[4]], [[[5, 6], 7, [[[8]]]], 9]]"

내 이전 접근법은 약간 길었지만 (65 바이트) 여전히 흥미 롭기 때문에 여기에 두겠습니다.

perl -nE '/\d/?push@{$;[$d-1]},$_:/]/?$d--:$d++for/\[|]|\d+/g;say"@$_"for@' <<< "[1, [2, 3], [[4]], [[[5, 6], 7, [[[8]]]], 9]]"

답변

자바 스크립트 (ES6) 121 144 152

편집 많은 수정, 1 바이트 절약 thx Patrick Roberts, 그리고 21 개 더 코드 검토

입력 및 출력의 배열에서 작동하는 재귀 함수. 깊이 1의 요소를 출력 배열의 단일 요소로 요구하는 것을 좋아하지 않습니다 (더 큰 레벨은 하나의 요소로 그룹화 됨) [l1,l1, [l2...], [[l3...]] ]. 이것이 더 직접적이지만 :[ [l1...], [[l2...]], [[[l3...]]] ]

f=(l,d=0,r=[])=>l.map(v=>v[0]?f(v,d+1,r):r[d]=[...r[d]||[],v])
r.reduce((r,v,d)=>d?[...r,(n=d=>d-->1?[n(d)]:v)(d)]:v,[])

가독성을 위해 줄 바꿈이 추가되었습니다.

몇 가지 참고 사항 : 2 번째 줄은 각 재귀 호출마다 반복해서 평가되지만 재귀 끝의 마지막 반복 만 유용합니다. 2 행에서
특수 처리 d==0는 레벨 1 요소에 대한 이상을 처리합니다. 재귀 함수는 출력에 중첩 배열 처리
n

테스트

f=(l,d=0,r=[])=>l.map(v=>v[0]?f(v,d+1,r):r[d]=[...r[d]||[],v])
&&r.reduce((r,v,d)=>d?[...r,(n=d=>d-->1?[n(d)]:v)(d)]:v,[])

console.log=x=>O.textContent+=x+'\n'

test=[
 [
   [1, [2,3], 4], /* -> */ [1, 4, [2,3]]
 ]
,[
   [1, [2, 3], [[4]], [[[5, 6], 7, [[[8]]]], 9]],
   // ->
   [1, [2, 3, 9], [[4, 7]], [[[5, 6]]], [[[[[8]]]]]]
 ]
,[
  [[[1]], [2, [3]], 4, [5, [6, [7, [8], [9, [[10]]]]]]],
  // ->
  [4, [2, 5], [[1, 3, 6]], [[[7]]], [[[[8, 9]]]], [[[[[[10]]]]]]]
 ]
,[
  [1], /* -> */ [1]
 ]
,[
  [1, [2], [[3]], [[[4]]], [[[[5]]]]],
  // ->
  [1, [2], [[3]], [[[4]]], [[[[5]]]]]
 ]
,[
  [1, [[[[2], 3]]], [[4]]],
  [1, [[4]], [[[3]]], [[[[2]]]]]
]]

test.forEach(t=>{
  var i=t[0], k=t[1], r=f(i),
      si=JSON.stringify(i),
      sr=JSON.stringify(r),
      sk=JSON.stringify(k)

  console.log((sr==sk?'OK ':'KO ')+si + " => " + sr)
})
<pre id=O></pre>

답변

자바 스크립트 (ES6) 168 바이트

f=a=>(s=[],b=-1,k=0,a.replace(/\d+|\[|\]/g,a=>a=='['?b++:a==']'?b--:(s[b]=s[b]||[]).push(a)),'['+s.map((a,b)=>k=a&&(k?',':'')+'['.repeat(b)+a+']'.repeat(b)).join``+']')

데모


답변

PHP, 145 바이트

<?function c($r){$n=[];foreach($r as$k=>$v)if(is_array($v)){$n=array_merge($n,$v);unset($r[$k]);}if($n)$r[]=c($n);return$r;}print_r(c($_GET[a]));

고장

function c($r){
  #usort($r,function($x,$y){return is_array($x)<=>is_array($y)?:$x<=>$y;});
#no need to sort and a simple sort($r); do it sort array after scalar
  $n=[];
  foreach($r as$k=>$v)if(is_array($v)){$n=array_merge($n,$v);unset($r[$k]);} # put arrays on the same depth together
  if($n)$r[]=c($n); # recursive if an array exists
  return$r; #return changes
}
print_r(c($_GET[a])); #Output and Input