역전 후계자


21

양의 정수가 주어지면 n다음을 수행하십시오 (모든 단계에서 출력).

  1. n사본이 포함 된 목록으로 시작하십시오 n.
  2. 다음과 같이하십시오 n:
  3. 상기 i일 단계 서서히 감소 i가 될 때까지리스트의 엔트리 번째i

예를 들어 주어진 값 n4이면으로 시작한 다음 [4,4,4,4]첫 번째 단계 [3,4,4,4]에서 [2,4,4,4],, 을 갖습니다 [1,4,4,4]. 두 번째 단계에는 [1,3,4,4],이 [1,2,4,4]있습니다. 세 번째 단계에서 [1,2,3,4]. 네 번째 단계에서는 아무것도 수행되지 않습니다.

따라서 출력은 [[4,4,4,4],[3,4,4,4],[2,4,4,4],[1,4,4,4],[1,3,4,4],[1,2,4,4],[1,2,3,4]]입니다.


합리적인 입 / 출력 형식이 허용됩니다.


표준 허점이 적용됩니다. 이것은 : 가장 작은 바이트 수로 승리합니다.


검사 목적을위한 파이썬 구현 .


1
ith가 항상 1- 인덱싱 됨을 명시 적으로 명시 할 수 있습니다 .
Kevin Cruijssen

실제로 배열을 조작해야합니까? 배열을 조작하지 않고도 더 짧은 대답을 얻었으며 허용 가능한 출력을 생성합니다.
Olivier Grégoire

2
@ OlivierGrégoire 단계를 따를 필요는 없으며 합리적인 형식으로 출력을 생성하면됩니다. (즉, 계속)
Leaky Nun

답변:


6

젤리 , 9 바이트

r€⁸Œp»\QṚ

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

방법?

r€⁸Œp»\QṚ - Link: integer, N    e.g. 4
 €        - for €ach of implicit range of N (i.e. for i in [1,2,3,...N])
  ⁸       -   with the chain's left argument, N on the right:
r         -     inclusive range (for i<=N this yields [i, i+1, ..., N]
          - ...leaving us with a list of lists like the post-fixes of [1,2,3,....,N]
          -                     e.g. [[1,2,3,4],[2,3,4],[3,4],[4]]
   Œp     - Cartesian product* of these N lists
          -                     e.g. [[1,2,3,4],[1,2,4,4],[1,3,3,4],[1,3,4,4],[1,4,3,4],[1,4,4,4],[2,2,3,4],[2,2,4,4],[2,3,3,4],[2,3,4,4],[2,4,3,4],[2,4,4,4],[3,2,3,4],[3,2,4,4],[3,3,3,4],[3,3,4,4],[3,4,3,4],[3,4,4,4],[4,2,3,4],[4,2,4,4],[4,3,3,4],[4,3,4,4],[4,4,3,4],[4,4,4,4]]
      \   - cumulative reduce with:
     »    -   maximum (vectorises)
          -                     e.g. [[1,2,3,4],[1,2,4,4],[1,3,4,4],[1,3,4,4],[1,4,4,4],[1,4,4,4],[2,4,4,4],[2,4,4,4],[2,4,4,4],[2,4,4,4],[2,4,4,4],[2,4,4,4],[3,4,4,4],[3,4,4,4],[3,4,4,4],[3,4,4,4],[3,4,4,4],[3,4,4,4],[4,4,4,4],[4,4,4,4],[4,4,4,4],[4,4,4,4],[4,4,4,4],[4,4,4,4]]
       Q  - de-duplicate        e.g. [[1,2,3,4],[1,2,4,4],[1,3,4,4],[1,4,4,4],[2,4,4,4],[3,4,4,4],[4,4,4,4]]
        Ṛ - reverse             e.g. [[4,4,4,4],[3,4,4,4],[2,4,4,4],[1,4,4,4],[1,3,4,4],[1,2,4,4],[1,2,3,4]]

* 다른 입력으로 위에서 사용한 데카르트 제품의 진행 상황을보다 쉽게 ​​확인할 수 있습니다.

the Cartesian product of [[0,1,2],[3,4],[5]]
is [[0,3,5],[0,4,5],[1,3,5],[1,4,5],[2,3,5],[2,4,5]]

당신은 ungogoable을 능가했습니다.
Leaky Nun

5

R , 83 82 74 바이트

N=rep(n<-scan(),n);while({print(N);any(K<-N>1:n)})N[x]=N[x<-which(K)[1]]-1

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

이중 for 루프 대신 while루프로 충분합니다. 목록보다 인덱스가 큰 첫 번째 인덱스를 찾아서 감소시킵니다.

KTRUE어디에나 N[i]>i있고 which(K), 실제 인덱스를 반환하며 , 로 첫 번째를 가져옵니다 [1].




2

APL + WIN, 54 바이트

정수 화면 입력 프롬프트

((⍴m)⍴n)-+⍀m←0⍪(-0,+\⌽⍳n-1)⊖((+/+/m),n)↑m←⊖(⍳n)∘.>⍳n←⎕

각 단계의 결과를 나타내는 각 행을 가진 행렬을 출력합니다 (예 : 4).

4 4 4 4
3 4 4 4
2 4 4 4
1 4 4 4
1 3 4 4
1 2 4 4
1 2 3 4

2

젤리 , 11 바이트

x`’Jḟḣ1Ʋ¦ÐĿ

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

작동 원리

x`’Jḟḣ1Ʋ¦ÐĿ  Main link. Argument: n

x`           Repeat self; yield an array of n copies of n.
         ÐĿ  While the results are unique, repeatedly call the link to the left.
             Return the array of all unique results, including the initial value.
  ’     ¦      Decrement the return value at all indices specified by the chain
               in between.
       Ʋ         Combine the four links to the left into a monadic chain.
   J               Indices; yield [1, ..., n].
    ḟ              Filterfalse; remove all indices that belong to the return value.
     ḣ1            Head 1; truncate the result to length 1.

2

파이썬 3 , 91 바이트

n=int(input())
x=[n]*n;print(x)
for i in range(n):
    for j in[0]*(n-i-1):x[i]-=1;print(x)

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


1 공간이면 파이썬에서 코드를 들여 쓰기에 충분합니다. 불필요한 공간을 제거하고 python 2로 전환하면 10 바이트가 절약됩니다. 확인해보십시오
Dead Possum

@DeadPossum, Python 2에서 더 잘할 수 있다는 것을 알고 있지만 곧 폐기 될 예정이므로 가능한 한 Python 3 기술을 연습하고 싶었습니다.
Dat

2

자바 (OpenJDK 8) 135 바이트

a->{int r[]=new int[a],i=0;java.util.Arrays x=null;x.fill(r,a);for(r[0]++;i<a;r[i++]++)for(;--r[i]>i;System.out.print(x.toString(r)));}

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

설명:

int r[]=new int[a],i=0;    //Initialize array and loop counter
java.util.Arrays x=null;    //reduces the number of of “Arrays” needed from 3 to 1
x.fill(r,a);    //Sets each value in array length n to int n
for(r[0]++;i<a;r[i++]++)    //Increment everything!
  for(;--r[i]>i;    //If decremented array element is larger than element number:
     System.out.print(x.toString(r)));}    //Print the array

신용:

Jonathan Frech 덕분에 -8 바이트 !

Kevin Cruijssen 덕분에 -16 바이트 !

Okx 덕분에 -1 바이트 !


4
import java.util.*;난 두려워 바이트 카운트의 일부입니다. 그리고 @JonathanFrech의 코드는를 ,i=0뒤에 넣고로 r[]변경 <-~a하여 4 바이트 더 골프를 칠 수 있습니다 <=a. ( . 온라인으로 시도 144 바이트 ) (나는 변경 ~-ii-1더 읽을 수 있도록 ..)
케빈 Cruijssen에게


1
골프 사용하여 바이트 for(;r[i-1]>i;보다는 for(;r[i-1]!=i;.
Okx

2
@KevinCruijssen 다른 바이트를 골프 ++i<=a에 저장하여 저장할 수 있습니다 i++<a.
Jonathan Frech

1
마지막 부분을로 바꾸는 또 다른 -2 바이트 for(r[0]++;i<a;r[i++]++)for(;--r[i]>i;System.out.print(x.toString(r)));. :) 온라인으로 135 바이트
Kevin Cruijssen


2

PHP, 153 바이트

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

암호

function f($n){
$a=array_fill(0,$n,$n);$r=json_encode($a)."\n";$p=0;while($p<$n)
{if($a[$p]!=$p+1){$a[$p]--;$r.=json_encode($a)."\n";}else{$p++;}}echo$r;}

바이트를 낮추거나 재귀 함수를 끝내려고합니다.

설명

function f($n){
  $a=array_fill(0,$n,$n);          #start with $nlength array filled with $n
  $r=json_encode($a)."\n";         #pushed to the string to output
  $p=0;                            #first position
  while($p<$n){                    #on position $n ($n-1) we do nothing
    if($a[$p]!=$p+1){              #comparing the position+1 to the value
     $a[$p]--;                     #it gets decreased by 1
     $r.= json_encode($a)."\n";    #and pushed
   } else {
     $p++;                       #when position+1 = the value,
   }                               #position is changed ++
  }
   echo $r;
  }

불필요한 공백이있는 것처럼 보이므로 153 바이트 여야합니다 .PHP를 모른다는 점에 유의하십시오.
주세페

그래, 그냥 고마워, 고마워, 지금 편집 해.
Francisco Hahn




1

J , 17 15 바이트

+/\@,(#=)@i.&.-

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

설명

+/\@,(#=)@i.&.-  Input: n
              -  Negate n
          i.     Reverse of range [0, n)
       =           Identity matrix of order n
      #            Copy each row by the reverse range
              -  Negate
    ,            Prepend n
+/\              Cumulative sum of rows

1

레티 나 , 49 바이트

.+
*
_
$`_,$= 
.{*\`_+,(_+)
$.1
0`(\b(_+),\2)_
$1

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

.+
*

입력을 단항으로 변환하십시오.

_
$`_,$= 

사본 색인이있는 i,n곳 의 n 사본 목록을 작성하십시오 i.

.

아무 것도 인쇄하지 마십시오 (루프가 완료 될 때).

{

패턴이 변하지 않을 때까지 반복하십시오.

*\`_+,(_+)
$.1

is를 일시적으로 삭제하고 s n를 10 진수 및 출력으로 변환하십시오 .

0`(\b(_+),\2)_
$1

값이 색인을 초과하는 첫 번째 목록 항목을 가져 와서 줄이십시오.


1

파이썬 3 , 70 67 65 바이트

def f(n):
 k=0;a=[n]*n
 while k<n-1:print(a);k+=a[k]==k+1;a[k]-=1

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

  • (67) 함수로 변환 : -3 바이트
  • (65) 불필요한 괄호 제거 : -2 바이트

언 골프 버전 :

def f(n):
    k = 0
    a = [n] * n             # create n-item list with all n's
    while k < n - 1:        # iterate through columns 0..n-1
        print(a)            # print whole list
        if a[k] == k + 1:   # move to the next column when current item reaches k+1
            k += 1
        a[k] -= 1           # decrement current item

0

C (연타) , 131 (141) 바이트

i,j,k,m[99];p(){for(k=0;m[k];printf("%d ",m[k++]));puts("");}f(n){for(j=k=m[n]=0;k<n;m[k++]=n);p();for(;j<n;j++)for(i=1;i++<n-j;m[j]--,p());}

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

이것은 n99까지 모두 작동합니다 . TIO는 출력을 자릅니다. 메모리가 허용하는대로 n배열의 크기를 변경하여 임의로 더 크게 지원할 수 있습니다 m.


다음은 n = 1..9로 제한되지만 상당히 짧습니다.

C (클랑) , 89 92 바이트

i,j;char m[12];f(n){j=!puts(memset(m,n+48,n));for(;j<n;j++)for(i=1;i++<n-j;m[j]--,puts(m));}

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

업데이트 : 정적 초기화에 의존하지 않도록 수정되었습니다.


귀하는 static/global initialization because multiple test cases기능을 한 번 이상 호출 더해야로서, 허용되지 않습니다.
Jonathan Frech

@Jonathan 업데이트 된 답변입니다. 나는 이것이 허용되어야하는지 항상 궁금했고, 나의 마음을 구성 할 수 없었다.
GPS

1
관련 메타 포스트는 다음과 같습니다. codegolf.meta.stackexchange.com/a/4940/73111
Jonathan Frech

골프 m[j]--,p()를 치고 p(m[j]--)바이트를 절약 할 수 있습니다.
Jonathan Frech


0

클로저, 132 바이트

#(loop[R[(vec(repeat % %))]j(- % 2)i 0](if(> i j)R(recur(conj R(update(last R)i dec))(if(= i j)(- % 2)(dec j))(if(= i j)(inc i)i))))

나는 이것이 더 짧기를 바랐다.

덜 스테이트 풀하지만 141 에서 더 길다 바이트 :

#(apply map list(for[i(range %)](concat(repeat(nth(cons 0(reductions +(reverse(range %))))i)%)(range % i -1)(if(>(dec %)i)(repeat(inc i))))))

0

파이썬 3, 101 바이트

def f(n):
 p=print;m=[n for_ in range(n)];p(m)
 for i in range(n):
    while m[i]>1+i:m[i]-=1;p(m)

나는 아마도 인쇄로 더 많은 골프를 할 수는 있지만 컴퓨터에서 멀리 떨어져 있고 인쇄 할 변수를 설정하는 파이썬 2의 규칙을 완전히 확신하지는 못합니다. 컴퓨터에 도착했을 때 또는 누군가가 의견을 밝히면 나중에 업데이트하겠습니다.


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