배열 자동


12

모두 중첩 된 목록을 좋아합니다! 그러나 때로는 중첩 목록을 만들기가 어렵습니다. 더 깊게 중첩할지, 더 얕게 중첩해야하는지 결정해야합니다. 따라서 도전을 위해 목록을 "자동화"해야합니다. 목록을 자동화하려면 목록의 모든 항목 쌍을 비교하십시오.

  • 두 번째 항목이 더 작 으면 다음과 같이 닫고 여는 괄호를 두 요소 사이에 삽입하여 두 요소를 분리하십시오.

      } {
    {2 , 1}
    

    예를 들어 {2, 1}된다 {2}, {1}{3, 2, 1}진다{3}, {2}, {1}

  • 두 번째 항목이 동일하면 아무것도 변경하지 마십시오. 예를 들어, {1, 1, 1}동일하게 유지 {2, 1, 1, 1}되고 {2}, {1, 1, 1}됩니다.

  • 두 번째 항목이 더 크면 모든 다음 항목을 한 수준 깊게 중첩시킵니다. 예를 들어, {1, 2}될 것입니다 {1, {2}}{1, 2, 3}될 것{1, {2, {3}}}

도전

숫자 목록을 사용하고 자동 중첩 된 후 동일한 목록을 반환하는 프로그램이나 함수를 작성해야합니다. 이 입력을 언어 기본 목록 형식 (또는 가장 가까운 대안) 또는 문자열로 사용하십시오. 예에서와 같이 중괄호를 사용할 필요는 없습니다. 일관된 한 언어에 가장 적합한 대괄호 유형을 사용할 수 있습니다. 리스트가 정수만 포함한다고 가정 할 수 있습니다. 또한 목록에 최소 2 개의 숫자가 있다고 가정 할 수 있습니다. 다음은 샘플 IO입니다.

{1, 3, 2}                         -->   {1, {3}, {2}}
{1, 2, 3, 4, 5, 6}                -->   {1, {2, {3, {4, {5, {6}}}}}}
{6, 5, 4, 3, 2, 1}                -->   {6}, {5}, {4}, {3}, {2}, {1}
{7, 3, 3, 2, 6, 4}                -->   {7}, {3, 3}, {2, {6}, {4}}
{7, 3, 1, -8, 4, 8, 2, -9, 2, 8}  -->   {7}, {3}, {1}, {-8, {4, {8}, {2}, {-9, {2, {8}}}}}

표준 허점이 적용되고 바이트 단위의 최단 답변이 승리합니다!


2
언어의 문자열 형식으로 입력 할 수 있습니까?
Downgoat

정수의 최대 크기는 얼마입니까?
thepiercingarrow 2016 년

@ thepiercingarrow 나는 너무 신경 쓰지 않습니다. 어리석은 일이 아닙니다. 최소한 처리 할 수 ​​있어야 [-100, 100]하지만 거대한 의견을 제시 할 계획은 없습니다.
제임스

"두 번째 항목이 작은 경우, 둥지 모두 닫는 괄호를 삽입하여, 한 단계 높은 요소를 다음과 같습니다. 다음에, 여는 괄호를 삽입, 반드시 모든 괄호 일치를 유지하게 할 수 있습니다. 예를 들어, {2, 1}이된다 {2}, {1}"어떻게 하나 개 수준 높은 ? 한 수준 더 높을 것입니다 {2}, 1. 당신이 가진 것은 같은 수준입니다.
msh210

@ msh210 그래, 그 설명은 좋지 않았다. 현재 문구가 더 낫습니까?
제임스

답변:


1

MATL , 48 43 바이트

YY_XKx"@K<?93]44@K-?91]@XKV]v93Gd0>sQY"h4L)

입력 및 출력에 대괄호가 사용됩니다. 출력은 공백없이 쉼표를 구분자로 사용합니다.

출력은 MATL에서 중첩 목록으로 해석되지 않습니다. 다른 언어로도 가능하며 문제의 출력 사양을 충족시킵니다.

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

설명

YY_XKx   % Push -inf. Copy to clipboard K (represents previous input entry). Delete
"        % Take numerical array implicitly. For each entry:
  @K<    %   Is current entry less than the previous one?
  ?93]   %   If so, push 93 (ASCII for ']')
  44     %   Push 44 (ASCII for comma)
  @K-    %   Is current entry different from the previous one?
  ?91]   %   If so, push 91 (ASCII for '[')
  @XKV   %   Push current entry, copy into clipboard K, convert to string
]        % End for each
v        % Concat vertically all stack contents, converting to char
93       % Push 93 (ASCII for ']') (to be repeated the appropriate number of times)
Gd0>sQ   % Determine how many times the input increases, plus 1
Y"       % Repeat 93 that many times
h        % Concat horizontally with previous string. Gives a row array, i.e. string
4L)      % Remove first char, which is an unwanted comma. Display implicitly

3

하스켈, 96 바이트

a#b|a<b=",{"|a>b="},{"|1<2=","
f(a:b:c)=show a++a#b++f(b:c)++['}'|a<b]
f[x]=show x++"}"
('{':).f

사용 예 : ('{':).f $ [7,3,3,2,6,4]-> "{7},{3,3},{2,{6},{4}}".

Haskell에는 중첩 목록이 없으므로 결과를 문자열로 반환합니다. 중첩 알고리즘 쉽다 : a) 인쇄 번호의 다음 번호가 큰 (이하, 동일한 경우, b)), 인쇄 ,{( },{, ,), c)가)리스트의 나머지 D의 재귀 호출을 인쇄 할 }수 있는지 다음 것보다 적다. e) {와 안에 모든 것을 넣는다 }.


죄송합니다,
실수입니다

3

파이썬 3, 98 바이트

p,*i=eval(input())
c=[p]
a=b=[c]
for x in i:
 if x>p:b=c
 if x!=p:c=[];b+=[c]
 c+=[x];p=x
print(a)

예:

$ python3 autonest.py <<< "[7, 3, 1, -8, 4, 8, 2, -9, 2, 8]"
[[7], [3], [1], [-8, [4, [8], [2], [-9, [2, [8]]]]]]

2

Java 8 197187 193192 바이트


이 괴물에 대해 나와 함께 일한 모든 주석가들에게 감사합니다. 값 비싼 버그를 발견 할 때까지 187 바이트로 줄었습니다. 그러나 Black Magic 의 힘으로 인해 "" "> 연산자"까지 바이트 수는 정상적인 192 바이트입니다.


String a(int[]b){int l=b.length,d=1,i=0;String c="{";for(;i<l-1;i++)if(b[i]>b[i+1])c+=b[i]+"},{";else if(b[i]<b[i+1]){d++;c+=b[i]+",{";}else c+=b[i]+",";c+=b[l-1];while(d-->0)c+="}";return c;}

죄송합니다 @Blue에서 올림
Rohan Jhunjhunwala

또한 몇 가지 팁 : 1. 시퀀스 대신 입력을 배열로 사용할 수 있습니다. (int [] b) 2. 쉼표를 사용하여 동시에 여러 정수를 정의 할 수 있습니다 (int l = b.length, d = 1, i = 0). 3. 가능한 한 많은 화이트 페이스를 제거해야합니다 (예 : 변수 할당 사이). 도움이 되었기를 바랍니다!
Blue

안녕하세요, PPCG에 오신 것을 환영합니다! 스 니펫은 챌린지 제출이 아닌 브라우저에서 실행되는 자바 스크립트 코드를위한 것입니다. 또한, 당신은 공간을 잊었다length,
Maltysen

오케이 내 사과 @Maltysen 나는 완전한 자바 프로그램에 포함시킬 것이다. 방금 "반환"하는 "기능 또는 프로그램"이라고 말하면서 작전을 중단했습니다. 그래서 난 내 출력을 인쇄하려면이 옵션을 리팩토링한다
로한 Jhunjhunwala에게

1
@RohanJhunjhunwala 죄송합니다, 더 분명해야합니다. "스 니펫"이라고 말했을 때 코드가 아니라 형식에 대해 이야기했습니다. 게시물에 코드를 넣을 때 "스 니펫"버튼을 클릭하지 말고 대신 코드 블록 (4 칸 또는 ctrl-k)에
넣으십시오

2

C, 145 138 바이트

7 바이트 동안 Giacomo에 감사합니다!

#define P printf(
n;main(c,v,p,t)char**v;{p=-101;for(v++;*v;v++){t=atoi(*v);if(t<p)P"}{");if(t>p)P"{",n++);P"%d ",p=t);}for(;n--;)P"}");}

명령 행 인수를 통해 입력이 취해지고 stdout을 통해 출력이 제공됩니다.

샘플 실행 :

$ ./autonest 7 3 1 -8 4 8 2 -9 2 8
{7 }{3 }{1 }{-8 {4 {8 }{2 }{-9 {2 {8 }}}}}

1
소스t=atoi(*v); 대신 사용sscanf(*v,"%d",&t);
Giacomo Garabello

사용 for(;*++v;)처음 4 다음의 insted 저장을 위해 if(t<p)P"}{");if(t>p)P"{",n++);사용 t>p?P"}{"):P"{",n++);10에 대해.
Giacomo Garabello

1

CJam, 51 49 48 46 바이트

마지막 대괄호의 수가 배열에서 증가하는 인접한 쌍의 수보다 하나 이상이라는 사실을 이용합니다.

그리고 나는 ew다시 구현해야하기 전에 연산자를 모른다 .

입력은 공백으로 구분 된 목록이며 대괄호로 구분됩니다.

'[q~_W=\2ew_{~\_@-g)["["S"]["]=}%@@{~>M']?}%']

설명

'[q~_W=\2ew_{~\_@-g)["["S"]["]=}%@@{~>M']?}%']
'[                                             e# Opening bracket
  q~                                           e# Read the input
    _W=\2ew                                    e# Save the last item and turn array into array of pair of next item and the item itself.
            _                                  e# We need two copies of that item                                       
             {~\_@-g)["["S"]["]=}%             e# Build the "body" that consist of the item and the suitable delimiter, space if equal, opening brace if the first item is the smallest, otherwise, closing bracket and opening bracket.
                                  @@           e# Put in the last item. (It was omitted in previous phase)
                                    {~<']""?}% e# Create the closing bracket as many as the number of increasing adjacent pair
                                               '] e# And one more bracket.

prettyprinting 대신 실제 중첩 배열 로이 작업을 수행하는 방법을 알아 보겠습니다.

마지막으로 구타 MATL의 대답 과 동등 합니다.


마지막으로, MATL의 대답 구타 지금 - P되지 않음을
루이스 Mendo

@LuisMendo Ugh.
Akangka

1

망막, 71 70 바이트

리스트는 중괄호로 공백으로 구분됩니다 : {1 2 3}. 음수는 지원되지 않으므로 문제가 발생하면 답변을 삭제하겠습니다. 망막 + 음수 = 그만한 가치가 없습니다.

\d+
$*
+`\b(1+) (1+\1\b.*)
$1 {$2}
+`\b(1(1+)1*) (\2)\b
$1} {$2
1+
$.0

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


0

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

a=>a.map(r=>l-r?(n=l<r?m:n).push(m=[l=r]):m.push(l),l=a[0],o=n=[m=[]])&&o

설명 : 연속적인 동일한 항목의 경우는 쉽습니다. 항목은 가장 안쪽 배열에 추가됩니다 (여기서는 m변수로 표시됩니다 . 마지막 요소로 n포함 된 배열 m이지만 o출력 임). 다른 항목의 경우 항목은 항상 새로운 가장 안쪽 배열에 들어가지만 유일한 차이점은 해당 배열이 형제이거나 이전 가장 안쪽 배열의 자식인지 여부입니다. 추가적인 골프 성을 위해 초기 항목이 연속적인 동일한 항목으로 계산되도록 배열을 설정했습니다.

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