카운트 업, 교체, 반복!


18

정의

CURR 시퀀스 의 n 번째 배열을 다음과 같이 정의하십시오 .

  1. 싱글 톤 배열 A = [n]로 시작하십시오 .

  2. 각 정수를 들어 K 에서 , 엔트리 교체 KK 로부터 계산, 자연 숫자 1케이 .

  3. 이전 단계 n-1을 더 반복하십시오.

예를 들어, n = 3 이면 배열 [3]으로 시작합니다 .

31, 2, 3으로 대체 하여 [1, 2, 3]을 산출 합니다.

이제 1 , 231로 바꿉니다. 1, 21, 2, 3 (각각), [1, 1, 2, 1, 2, 3]을 산출 하였다 .

마지막으로, 배열의 6 개 정수 모두에 대해 이전 단계에서와 동일한 대체를 수행하여 [1, 1, 1, 2, 1, 1, 2, 1, 2, 3]을 생성 합니다. 이것은 세 번째 CURR 배열입니다.

직무

입력으로 엄격하게 양의 정수 n 을 주면 n 번째 CURR 배열을 계산 하는 함수의 프로그램을 작성 하십시오.

출력은 일종의 플랫 목록 이어야합니다 (그리고 함수에서 반환 된 배열, 언어 배열 구문의 문자열 표현, 공백으로 구분 등).

이것은 입니다. 가장 짧은 바이트 단위의 코드가 이길 수 있습니다!

테스트 사례

 1 -> [1]
 2 -> [1, 1, 2]
 3 -> [1, 1, 1, 2, 1, 1, 2, 1, 2, 3]
 4 -> [1, 1, 1, 1, 2, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4]
 5 -> [1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 2, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 1, 1, 2, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 1, 1, 2, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 2, 3, 4, 5]
 6 -> [1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 2, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 2, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 1, 1, 2, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 2, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 1, 1, 2, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 1, 1, 2, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 2, 3, 4, 5, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 2, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 1, 1, 2, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 1, 1, 2, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 2, 3, 4, 5, 1, 1, 1, 1, 2, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 2, 3, 4, 5, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 2, 3, 4, 5, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 6]


입력을 [2]정수가 아닌 단일 배열 (예 :)로 취할 수 있습니까 ?
Mego

@Mego 정수로 유지하자.
Dennis

이에 대한 OEIS 시퀀스가 ​​있어야한다고 생각합니다.
DanTheMan

@DanTheMan 실제로 현재 형식 의 정수 시퀀스는 아니지만 모든 양의 정수에 대한 결과를 연결하여 하나로 변환 할 수 있다고 생각합니다.
Dennis

답변:



16

파이썬, 50 바이트

lambda i:eval("[i "+"for i in range(1,i+1)"*i+"]")

범위 남용! 예를 들어의 i=3경우 평가할 문자열이 확장됩니다.

[i for i in range(1,i+1)for i in range(1,i+1)for i in range(1,i+1)]

어떻게 든 i모든 것에 함수 입력 변수 를 사용하더라도 파이썬은 각 반복 인덱스를 표현식이 마치 별도의 범위에 속하는 것으로 구별합니다.

[l for j in range(1,i+1)for k in range(1,j+1)for l in range(1,k+1)]

i기능에 대한 입력 과 함께 .


이 트릭은 Firefox 30 이상에서도 작동하며 3 바이트를 절약했습니다. 감사합니다!
Neil

@DigitalTrauma python과 JavaScript는 eval분명히 코드 자체를 포팅해야하지만 어쨌든 추측 할 수 있다고 생각했습니다.
Neil

@Neil 아, 나는 본다-나는 완전히 오해했다 :)
Digital Trauma

12

05AB1E, 6 3 바이트

DFL

설명

D     # duplicate input
 F    # input times do
  L   # range(1,N)

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

@Adnan 덕분에 3 바이트 절약


DFL3 바이트 더 짧습니다 :)
Adnan

1
@ Adnan : L이 목록에서 그렇게 작동한다는 것을 몰랐습니다. 그것이 자동으로 평평 해지는 것이 조금 놀랍습니다.
Emigna 2016 년

3
실제로 내가 수정하지 않은 버그입니다 : p.
Adnan


6

파이썬 2, 82 바이트

lambda n:[1+bin(i)[::-1].find('1')for i in range(1<<2*n-1)if bin(i).count('1')==n]

이것은 가장 짧은 해결책은 아니지만 흥미로운 방법을 보여줍니다.

  • 2^(2*n-1)이진수로 첫 번째 숫자를 쓰십시오
  • 그것들을 정확히 n하나로 유지하십시오
  • 각 숫자에 대해 후행 0의 수를 세고 1을 더하십시오.

4

실제로 9 바이트

;#@`♂RΣ`n

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

설명:

;#@`♂RΣ`n
;#@        dupe n, make a singleton list, swap with n
   `♂RΣ`n  call the following function n times:
    ♂R       range(1, k+1) for k in list
      Σ      concatenate the ranges

한 바이트에 Leaky Nun과 다른 2 바이트에 대한 영감에 감사드립니다.


;#@"♂R♂i"*ƒ바이트를 절약
Leaky Nun

@LeakyNun Good catch- ;#@`♂R♂i`n다른 것을 저장합니다!
Mego

나는 요약을 시도하려고했다.
Leaky Nun

9가 최적의 솔루션이 될 것이라고 생각합니다
Mego

귀하의 링크는 여전히 구식입니다.
Leaky Nun

4

C #, 128 바이트

List<int>j(int n){var l=new List<int>(){n};for(;n>0;n--)l=l.Select(p=>Enumerable.Range(1,p)).SelectMany(m=>m).ToList();return l;

으로 using static System.Linq.Enumerable다음을 수행 할 수 있습니다.int[]J(int n){var l=new[]{n};while (n-- > 0){l = l.Select(p => Range(1, p)).SelectMany(m => m).ToArray();}return l;}
die maus

4

APL, 11 바이트

{∊⍳¨∘∊⍣⍵+⍵}

테스트:

      {∊⍳¨∘∊⍣⍵+⍵} 3
1 1 1 2 1 1 2 1 2 3

설명:

  • +⍵:로 시작 ,
  • ⍣⍵: 다음 시간을 수행하십시오 .
    • ⍳¨∘∊: 입력을 평준화 한 다음 입력의 각 N에 대한 목록 [1..N]을 생성합니다.
  • : 결과를 평평하게하다

2
더 간단하게 :{(∊⍳¨)⍣⍵⊢⍵}
Adám

@ Adám : 아, 그렇습니다. 열차는 J와 다르게 작동합니다. 처음부터 시작한 {(∊∘(⍳¨))⍣⍵+⍵}다음 어떻게
marinus

2

CJam, 14 바이트

{_a\{:,:~:)}*}

여기에서 테스트하십시오.

설명

_a   e# Duplicate N and wrap it in an array.
\    e# Swap with other copy of N.
{    e# Do this N times...
  :, e#   Turn each x into [0 1 ... x-1].
  :~ e#   Unwrap each of those arrays.
  :) e#   Increment each element.
}*

2

수학, 27 26 바이트

Essari의 답변에서 영감을 얻어 1 바이트를 절약했습니다.

Flatten@Nest[Range,{#},#]&

매우 간단합니다 : 입력 x우리가 시작 {x}하고 적용 Range그것에 x번 ( Range이다 Listable자동 정수 내부의 임의의 중첩 된 목록에 적용하는 방법). 결국 Flatten결과.


2

클로저, 59 바이트

(fn[n](nth(iterate #(mapcat(fn[x](range 1(inc x)))%)[n])n))

설명:

문제를 해결하는 정말 직접적인 방법입니다. 내부에서 작업하기 :

(1) (fn[x](range 1(inc x))) ;; return a list from 1 to x
(2) #(mapcat (1) %)         ;; map (1) over each item in list and flatten result
(3) (iterate (2) [n])       ;; call (2) repeatedly e.g. (f (f (f [n])))
(4) (nth (3) n))            ;; return the nth value of the iteration

2

파이썬 3, 75 74 바이트

def f(k):N=[k];exec('A=N;N=[]\nfor i in A:N+=range(1,i+1)\n'*k+'print(N)')

이것은 문제 설명을 코드로 간단하게 변환 한 것입니다.

편집 : @ Dennis 덕분에 1 바이트가 절약되었습니다.


귀하는 print외부 갈 수 있습니다 exec.
xnor

네, 처음에 봤지만 [k]어떤 이유로 든 인쇄 됩니다. 나는 그것이 범위 문제인지 아니면 다른 것이 있는지 알아 내려고 포기했습니다.
앤드류 엡스타인

예, 범위 문제 처럼 보입니다 . 그것은 파이썬 2에서 잘 작동합니다.
xnor

2

R, 60 49 바이트

unlistand의 간단한 사용법 sapply.

y=x=scan();for(i in 1:x)y=unlist(sapply(y,seq));y

11 바이트를 절약 한 @MickyT 덕분에


팁에 대한 @MickyT thx seq, 바이트 수를 낮추는 데 사용할 수 있습니다
bouncyball

죄송합니다, 질문을 잘못
읽어

2

PHP 121

이 뒤에 숨어있는 속임수는별로 없습니다. PHP에서 배열을 평탄화하는 것은 짧지 않으므로 처음에 평평하게 빌드해야합니다.

<?php for($a=[$b=$argv[1]];$b--;)$a=array_reduce($a,function($r,$v){return array_merge($r,range(1,$v));},[]);print_r($a);

평평하게 유지하는 것이 좋습니다. 그러나 콜백 함수도 짧지 않습니다. 15 바이트를 이길 수 있습니다. 짧은 태그로 4 바이트를 저장 <?하거나 -r태그없이 6 바이트를 저장할 수 있습니다 .
Titus

2

하스켈, 33 바이트

f n=iterate(>>= \a->[1..a])[n]!!n

바이트를 저장 해준 nimi에게 감사합니다.

포인트없는 버전이 더 깁니다 (35 바이트).

(!!)=<<iterate(>>= \a->[1..a]).pure

iterate(>>= \a->[1..a])1 바이트 이하
nimi 2016 년

2

자바 스크립트 (Firefox 30-57), 63 60 바이트

f=n=>eval(`[${`for(n of Array(n+1).keys())`.repeat(n--)}n+1]`)

@xnor의 Python 답변 포트.


Firefox 42 ( SyntaxError: missing : in conditional expression) 및 Babel ( Unexpected token (1:21))으로 시도했습니다 . 내가 도대체 ​​뭘 잘못하고있는 겁니까?
Dennis

@Dennis 죄송 합니다만, 잘 모르겠습니다. 사실 어떤 이유로 내 컴퓨터 중 하나에 Firefox 42가 설치되어 있고 다시 확인한 결과 제대로 실행되었습니다. (저도 Firefox 37과 47을 확인했습니다.)
Neil

허, 페이지가 새로 고침되지 않고 이전 버전을 테스트했습니다. 새로운 것은 잘 작동합니다.
Dennis

@ 데니스 아, )어쨌든 그 버전으로 길 잃은 것처럼 보입니다 .
Neil

1

J, 18 바이트

([:;<@(1+i.)"0)^:]

당면 과제에 설명 된 프로세스를 기반으로하는 간단한 접근 방식.

용법

   f =: ([:;<@(1+i.)"0)^:]
   f 1
1
   f 2
1 1 2
   f 3
1 1 1 2 1 1 2 1 2 3
   f 4
1 1 1 1 2 1 1 1 2 1 1 2 1 2 3 1 1 1 2 1 1 2 1 2 3 1 1 2 1 2 3 1 2 3 4

설명

([:;<@(1+i.)"0)^:]  Input: n
                 ]  Identity function, gets the value n
(     ...     )^:   Repeat the following n times with an initial value [n]
      (    )"0        Means rank 0, or to operate on each atom in the list
         i.           Create a range from 0 to that value, exclusive
       1+             Add 1 to each to make the range from 1 to that value
    <@                Box the value
 [:;                  Combine the boxes and unbox them to make a list and return
                    Return the final result after n iterations


1

젤리, 7 바이트

Dennis가 대답하기 전에 빨리 (jk)

WR€F$³¡

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

WR€F$³¡  Main monadic chain. Argument: z

W        Yield [z].
     ³¡  Repeat the following z times:
 R€          Convert each number in the array to the corresponding range.
   F         Flatten the array.

1

F #, 63 바이트

fun n->Seq.fold(fun A _->List.collect(fun k->[1..k])A)[n]{1..n}

n을 입력으로 사용하는 익명 함수를 반환합니다.

A의 모든 항목 k를 [1..k]로 바꾸고 A = [n]으로 시작하여 프로세스 n을 반복합니다.


1

스위프트 3, 58 바이트

n을 입력으로 설정하여 놀이터에서 직접 실행해야합니다.

var x=[n];for i in 0..<n{x=x.reduce([]){$0+[Int](1...$1)}}

가장 짧은 손 표기법을 되 돌린 상태에서 언 골프 :

let n = 3 //input

var x: Array<Int> = [n]
for i in 0..<n {
    x = x.reduce(Array<Int>[], combine: { accumulator, element in
        accumulator + Array<Int>(1...element)
    })
}

1

자바, 159 바이트

순서

int[] q(int y){int z[]=new int[]{y};for(int i=0;i<y;i++){int d=0,a=0;for(int c:z)d+=c;int[]r=new int[d];for(int c:z)for(int j=0;j<c;)r[a++]=++j;z=r;}return z;}

용법

public static void main(String[] args){String out = "["; int [] b = q(6);for(int c:b)out+=c+", ";System.out.println(out+"]");}

public static int[] q(int y){int z[]=new int[]{y};for(int i=0;i<y;i++){int d=0,a=0;for(int c:z)d+=c;int[]r=new int[d];for(int c:z)for(int j=0;j<c;)r[a++]=++j;z=r;}return z;}

샘플 출력 :

[1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 2, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 2, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 1, 1, 2, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 2, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 1, 1, 2, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 1, 1, 2, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 2, 3, 4, 5, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 2, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 1, 1, 2, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 1, 1, 2, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 2, 3, 4, 5, 1, 1, 1, 1, 2, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 2, 3, 4, 5, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 2, 3, 4, 5, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 6, ]

1

파이썬 2, 69 68 66 바이트

def f(n):a=[n];exec'a=sum([range(1,i+1)for i in a],[]);'*n;print a

편집 : @xnor 덕분에 1 바이트가 절약되었습니다. @ Dennis ♦ 덕분에 2 바이트가 절약되었습니다.


주변의 괄호를 제거 할 수 있습니다 exec. 파이썬 2에서는 함수가 아닌 키워드입니다. 나는 68 바이트 btw를 셉니다.
Dennis

@Dennis Ah, 그것은 내가 잘못 계산 한 것을 의미하며 원래 69 바이트였습니다 ...
Neil

1

배쉬 + GNU 유틸리티, 49

  • @Dennis 덕분에 1 바이트가 절약되었습니다.

파이프 재귀 함수 FTW!

f()((($1))&&xargs -l seq|f $[$1-1]||dd)
f $1<<<$1

n명령 행에 전달됩니다. 출력은 줄 바꿈으로 구분됩니다.

를 사용 dd하면 통계가 STDERR로 전송됩니다. 나는 이것이 괜찮다고 생각하지만 그렇지 않은 경우 1 바이트의 비용 dd으로 대체 할 수 있습니다 cat.


1
STDERR에 대한 외부 출력은 기본적으로 허용됩니다. 당신은 대체 할 수 {...;}(...)바이트를 저장합니다.
Dennis

물론 @Dennis! 분명히 당신은 나 에게서이 을 얻었다 :)
Digital Trauma

0

펄 5, 53 바이트

서브 루틴 :

{($i)=@_;for(1..$i){my@c;push@c,1..$_ for@_;@_=@c}@_}

행동 그대로보기

perl -e'print "$_ " for sub{($i)=@_;for(1..$i){my@c;push@c,1..$_ for@_;@_=@c}@_}->(3)'


0

PHP, 100 98 바이트

로 실행하십시오 php -r '<code>' <n>.

for($a=[$n=$argv[1]];$n--;$a=$b)for($b=[],$k=0;$c=$a[$k++];)for($i=0;$i++<$c;)$b[]=$i;print_r($a);

각 반복에서 $a비어 있을 때까지 1 .. (첫 번째 값 제거)에서 임시 사본 루핑을 작성하십시오 .


이 두 가지는 여전히 100 바이트로 남아있을 것입니다.

for($a=[$n=$argv[1]];$n--;)for($i=count($a);$i--;)array_splice($a,$i,1,range(1,$a[$i]));print_r($a);

각 반복에서 각 숫자를 범위로 대체하여 배열을 거꾸로 반복합니다.

for($a=[$n=$argv[1]];$n--;)for($i=$c=0;$c=$a[$i+=$c];)array_splice($a,$i,1,range(1,$c));print_r($a);

각 반복 루프에서 배열을 통해 이전 수만큼 색인을 증가시키고 각 색인 요소를 범위로 대체

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