Đảo ngược kế vị


21

Cho một số nguyên dương n, hãy làm như sau (và đầu ra mỗi giai đoạn):

  1. bắt đầu với một danh sách chứa các nbản sao của n.
  2. làm những nlần sau :
  3. ibước thứ, giảm dần imục nhập của danh sách cho đến khi đạti

Vì vậy, ví dụ, nếu GIVEN n4, sau đó bạn bắt đầu với [4,4,4,4], và sau đó ở bước đầu tiên bạn có [3,4,4,4], [2,4,4,4], [1,4,4,4]. Tại bước thứ hai, bạn có [1,3,4,4], [1,2,4,4]. Ở bước thứ ba bạn có [1,2,3,4]. Không có gì được thực hiện ở bước thứ tư.

Vì vậy, đầu ra của bạn là [[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]].


Bất kỳ định dạng đầu vào / đầu ra hợp lý đều được cho phép.


Tiêu chuẩn áp dụng. Đây là : câu trả lời có số lần đếm byte nhỏ nhất.


Python thực hiện cho mục đích kiểm tra .


1
Bạn có thể muốn tuyên bố rõ ràng rằng iluôn luôn là 1 chỉ mục.
Kevin Cruijssen

Chúng ta có thực sự phải thao tác mảng? Tôi nhận được một câu trả lời ngắn hơn mà không cần thao tác bất kỳ mảng nào, tạo ra một đầu ra chấp nhận được.
Olivier Grégoire

2
@ OlivierGrégoire Bạn không cần phải làm theo các bước, bạn chỉ cần sản xuất đầu ra ở định dạng hợp lý. (tức là đi trước)
Leaky Nun

Câu trả lời:


6

Thạch , 9 byte

r€⁸Œp»\QṚ

Hãy thử trực tuyến!

Làm sao?

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]]

* Có thể dễ dàng hơn để xem những gì đang xảy ra với sản phẩm của Cartesian được sử dụng ở trên với một đầu vào khác:

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]]

Bạn đã vượt qua những kẻ không có khả năng.
Rò rỉ Nun

5

R , 83 82 74 byte

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

Hãy thử trực tuyến!

Thay vì một vòng lặp đôi, một whilevòng lặp là đủ ở đây: chúng tôi tìm thấy chỉ mục đầu tiên trong đó danh sách lớn hơn chỉ mục và giảm dần ở đó.

KTRUEbất cứ nơi nào N[i]>i, which(K)trả về các chỉ số thực sự, và chúng tôi lấy đầu tiên với [1].




2

APL + THẮNG, 54 byte

Lời nhắc cho màn hình nhập số nguyên

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

Xuất ra một ma trận với mỗi hàng biểu thị kết quả của từng bước, ví dụ như cho 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

Thạch , 11 byte

x`’Jḟḣ1Ʋ¦ÐĿ

Hãy thử trực tuyến!

Làm thế nào nó hoạt động

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

Python 3 , 91 byte

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)

Hãy thử trực tuyến!


1 khoảng trống là đủ để thụt mã trong python. Xóa các khoảng trống không cần thiết và chuyển sang python 2 tiết kiệm 10 byte: hãy kiểm tra nó
Dead Possum

@DeadPossum, mặc dù tôi biết rằng tôi có thể làm tốt hơn trong Python 2, nhưng nó sẽ sớm bị lỗi thời vì vậy tôi muốn thực hành các kỹ năng Python 3 của mình nhiều nhất có thể.
Đạt

2

Java (OpenJDK 8) , 135 byte

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)));}

Hãy thử trực tuyến!

Giải trình:

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

Tín dụng:

-8 byte nhờ Jonathan Frech !

-16 byte nhờ Kevin Cruijssen !

-1 byte nhờ Okx !


4
Các import java.util.*;là một phần của byte-count Tôi sợ. Và mã của @ JonathanFrech có thể được đánh dấu thêm 4 byte bằng cách đặt ,i=0sau r[]và đổi <-~athành <=a. ( Dùng thử trực tuyến. 144 byte ) (và tôi đã thay đổi ~-iđể i-1dễ đọc hơn ..)
Kevin Cruijssen

1
139 byte bằng cách loại bỏ các import java.util.*;bằng cách sử dụng java.util.Arrays x=null;x.fillx.toString. (Lưu ý rằng giải pháp hiện tại của bạn là 155 byte với yêu cầuimport java.util.*;.)
Kevin Cruijssen

1
Golf một byte bằng cách sử dụng for(;r[i-1]>i;chứ không phải for(;r[i-1]!=i;.
Okx

2
@KevinCruijssen byte khác có thể được cứu bởi chơi golf ++i<=ađể i++<a.
Jonathan Frech

1
-2 byte khác thay đổi phần cuối cùng thành for(r[0]++;i<a;r[i++]++)for(;--r[i]>i;System.out.print(x.toString(r)));. :) Hãy thử trực tuyến 135 byte
Kevin Cruijssen

2

Haskell, 69 67 65 63 byte

Định nghĩa đệ quy:

f 0=[[]]
f a=map(:(a<$[2..a]))[a,a-1..2]++[1:map(+1)x|x<-f$a-1]

Cảm ơn Laikoni cho 2 byte!


Thứ hai maplà hai byte ngắn hơn với một sự hiểu biết danh sách: Hãy thử trực tuyến!
Laikoni

2

PHP, 153 byte

Hãy thử trực tuyến!

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;}

Gonna cố gắng hạ thấp byte hoặc hoàn thành hàm đệ quy

Giải trình

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;
  }

có vẻ như bạn có một số khoảng trắng không cần thiết vì vậy đây phải là 153 byte - lưu ý rằng tôi không biết PHP.
Giuseppe

vâng, chỉ cần nhận ra, cảm ơn bạn, chỉnh sửa ngay bây giờ.
Francisco Hahn




1

J , 17 15 byte

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

Hãy thử trực tuyến!

Giải trình

+/\@,(#=)@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

Võng mạc , 49 byte

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

Hãy thử trực tuyến! Giải trình:

.+
*

Chuyển đổi đầu vào thành unary.

_
$`_,$= 

Tạo một danh sách n bản sao của i,nnơi ilà chỉ số của các bản sao.

.

Không in bất cứ điều gì (khi vòng lặp kết thúc).

{

Lặp lại cho đến khi mô hình không thay đổi.

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

Tạm thời xóa is và chuyển đổi ns thành thập phân và đầu ra.

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

Lấy mục nhập danh sách đầu tiên có giá trị vượt quá chỉ mục của nó và giảm nó.


1

Python 3 , 70 67 65 byte

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

Hãy thử trực tuyến!

  • (67) Chuyển đổi thành chức năng: -3 byte
  • (65) Xóa các dấu ngoặc đơn không cần thiết: -2 byte

Phiên bản bị đánh cắp:

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 (tiếng kêu) , 131 141 byte

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());}

Hãy thử trực tuyến!

Điều này sẽ làm việc cho tất cả ntối đa 99. TIO cắt đầu ra. Nó có thể hỗ trợ lớn hơn tùy ý nbằng cách thay đổi kích thước của mảng mkhi bộ nhớ cho phép.


Theo sau được giới hạn ở n = 1..9 nhưng ngắn hơn đáng kể

C (tiếng kêu) , 89 92 byte

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));}

Hãy thử trực tuyến!

Đã cập nhật: Sửa đổi để tránh phụ thuộc vào khởi tạo tĩnh


Của bạn static/global initialization because multiple test caseskhông được phép, vì các chức năng phải được gọi nhiều lần.
Jonathan Frech

@Jonathan Cập nhật câu trả lời. Tôi luôn tự hỏi liệu điều này có nên được cho phép không, và không thể quyết định được.
GPS

1
Đây là bài đăng meta có liên quan: codegolf.meta.stackexchange.com/a/4940/73111
Jonathan Frech

Bạn có thể chơi golf m[j]--,p()để p(m[j]--)và tiết kiệm một byte.
Jonathan Frech


0

Clojure, 132 byte

#(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))))

Tôi đã hy vọng điều này sẽ ngắn hơn ...

Ít trạng thái hơn nhưng dài hơn ở mức 141 byte:

#(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

Python 3, 101 byte

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)

Tôi có thể chơi golf nhiều hơn với bản in, nhưng tôi rời khỏi máy tính của mình và tôi không hoàn toàn chắc chắn về quy tắc của python 2 về việc đặt một biến để in. Tôi sẽ cập nhật sau khi tôi nhận được vào máy tính hoặc nếu ai đó làm rõ trong các nhận xét.


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.