Penerus Rentang Terbalik

21

Dengan bilangan bulat positif n, lakukan hal berikut (dan hasilkan setiap tahap):

  1. mulai dengan daftar yang berisi nsalinan n.
  2. lakukan waktu berikut n:
  3. pada ilangkah ke-5, secara bertahap kurangi ientri ke-daftar sampai tercapaii

Jadi, misalnya, jika diberi nadalah 4, maka Anda mulai dengan [4,4,4,4], dan kemudian pada langkah pertama yang harus [3,4,4,4], [2,4,4,4], [1,4,4,4]. Pada langkah kedua, Anda harus [1,3,4,4], [1,2,4,4]. Pada langkah ketiga yang Anda miliki [1,2,3,4]. Tidak ada yang dilakukan pada langkah keempat.

Jadi output Anda [[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]].


Setiap format input / output yang masuk akal diizinkan.


Celah standar berlaku. Ini adalah : jawaban dengan byte-count terkecil menang.


Implementasi python untuk keperluan pengecekan .

Biarawati Bocor
sumber
1
Anda mungkin ingin secara eksplisit menyatakan bahwa ith selalu 1-diindeks.
Kevin Cruijssen
Apakah kita benar-benar harus memanipulasi array? Saya mendapatkan jawaban yang lebih pendek tanpa memanipulasi array apa pun, menghasilkan output yang dapat diterima.
Olivier Grégoire
2
@ OlivierGrégoire Anda tidak harus mengikuti langkah-langkahnya, Anda hanya perlu menghasilkan output dalam format yang masuk akal. (yaitu, lanjutkan)
Leaky Nun

Jawaban:

6

Jelly , 9 byte

r€⁸Œp»\QṚ

Cobalah online!

Bagaimana?

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

* Mungkin lebih mudah untuk melihat apa yang terjadi dengan produk Cartesian yang digunakan di atas dengan input berbeda:

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]]
Jonathan Allan
sumber
Anda mengalahkan yang tidak mampu outgolf.
Leaky 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

Cobalah online!

Alih-alih double for-loop, whileloop cukup di sini: kami menemukan indeks pertama di mana daftar lebih besar dari indeks, dan penurunan di sana.

Kmemiliki di TRUEmana saja N[i]>i, which(K)mengembalikan indeks yang benar, dan kami mengambil yang pertama [1].

Giuseppe
sumber
2

JavaScript (ES6), 75 byte

f=(n,a=Array(n).fill(n))=>[[...a],...a.some(v=>v>++j,j=0)?f(a[j-1]--,a):[]]

Cobalah online!

Arnauld
sumber
2

APL + WIN, 54 byte

Meminta input layar integer

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

Menghasilkan matriks dengan setiap baris yang mewakili hasil dari setiap langkah misalnya untuk 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
Graham
sumber
2

Jelly , 11 byte

x`’Jḟḣ1Ʋ¦ÐĿ

Cobalah online!

Bagaimana itu bekerja

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.
Dennis
sumber
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)

Cobalah online!

Dat
sumber
1 spasi cukup untuk membuat indentasi kode dalam python. Menghapus spasi yang tidak perlu dan beralih ke python 2 menghemat 10 byte: check it out
Dead Possum
@DeadPossum, meskipun saya tahu saya bisa melakukan yang lebih baik dengan Python 2, ini akan segera menjadi usang sehingga saya ingin melatih keterampilan Python 3 saya sebanyak mungkin.
Dat
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)));}

Cobalah online!

Penjelasan:

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

Kredit:

-8 Bytes berkat Jonathan Frech !

-16 bytes terima kasih kepada Kevin Cruijssen !

-1 byte terima kasih kepada Okx !

X1M4L
sumber
4
The import java.util.*;merupakan bagian dari byte-count aku takut. Dan @ JonathanFrech's code dapat di-golf dengan 4 byte lebih banyak dengan meletakkan ,i=0after r[], dan berubah <-~amenjadi <=a. ( Cobalah secara online. 144 bytes ) (dan saya berubah ~-iuntuk i-1untuk membuatnya lebih mudah dibaca ..)
Kevin Cruijssen
1
139 byte dengan menyingkirkan import java.util.*;menggunakan java.util.Arrays x=null;dan x.filldan x.toString. (Perhatikan bahwa solusi Anda saat ini adalah 155 byte dengan yang diperlukanimport java.util.*;.)
Kevin Cruijssen
1
Golf satu byte dengan menggunakan for(;r[i-1]>i;daripada for(;r[i-1]!=i;.
Okx
2
@KevinCruijssen byte lain dapat disimpan dengan golf ++i<=ake i++<a.
Jonathan Frech
1
Lain -2 byte mengubah bagian terakhir menjadi for(r[0]++;i<a;r[i++]++)for(;--r[i]>i;System.out.print(x.toString(r)));. :) Cobalah online 135 byte
Kevin Cruijssen
2

Haskell, 69 67 65 63 byte

Definisi rekursif:

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

Terima kasih kepada Laikoni untuk 2 byte!

Angs
sumber
Yang kedua mapadalah dua byte lebih pendek dengan pemahaman daftar: Cobalah secara online!
Laikoni
2

PHP, 153 Bytes

Cobalah online!

Kode

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

Akan mencoba untuk menurunkan byte, atau menyelesaikan fungsi rekursif

Penjelasan

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;
  }
Francisco Hahn
sumber
Sepertinya Anda memiliki spasi putih yang tidak perlu jadi ini harus 153 byte - perhatikan bahwa saya tidak tahu PHP.
Giuseppe
ya, sadari saja, terima kasih, sunting sekarang.
Francisco Hahn
1

Python 2 , 80 76 byte

i=input();l=[i]*i;print l
for x in range(i):
 while l[x]>x+1:l[x]-=1;print l

Cobalah online!

Agak boros memiliki dua printpernyataan tetapi saya tidak bisa memikirkan cara yang lebih baik saat ini.

ElPedro
sumber
75 byte .
Jonathan Frech
1

Python 2 , 70 byte

-2 byte terima kasih kepada @LeakyNun
-2 byte terima kasih kepada @JonathanFrech

i=I=input()
l=[I]*I
exec"exec'print l;l[-i]-=1;'*max(~-i,2);i-=1;"*~-I

Cobalah online!

Possum Mati
sumber
1
(I-1)->~-I
Leaky Nun
1
70 byte , menginisialisasi i=Idan mengurangi.
Jonathan Frech
1

Java (JDK 10) , 112 byte

n->{var s="";for(int i=1,k=n,j;i<=n;k=--k>i?k:n-++i+i)for(j=0;j++<n;)s+=(j<i?j:j>i?n:k)+(j<n?",":";");return s;}

Cobalah online!

Olivier Grégoire
sumber
1

J , 17 15 byte

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

Cobalah online!

Penjelasan

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

Retina , 49 byte

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

Cobalah online! Penjelasan:

.+
*

Konversikan input ke unary.

_
$`_,$= 

Buat daftar n salinan di i,nmana iindeks salinan.

.

Jangan mencetak apa pun (saat loop selesai).

{

Loop sampai pola tidak berubah.

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

Hapus sementara idan konversikan nmenjadi desimal dan keluaran.

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

Ambil entri daftar pertama yang nilainya melebihi indeksnya dan kurangi.

Neil
sumber
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

Cobalah online!

  • (67) Konversi berfungsi: -3 byte
  • (65) Menghapus tanda kurung yang tidak dibutuhkan: -2 byte

Versi tidak disatukan:

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
xbarbie
sumber
0

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

Cobalah online!

Ini akan bekerja untuk semua nhingga 99. TIO memotong output. Ini dapat mendukung lebih besar secara sewenang-wenang ndengan mengubah ukuran array mjika memori memungkinkan.


Mengikuti terbatas pada n = 1..9 tetapi secara signifikan lebih pendek

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

Cobalah online!

Diperbarui: Dimodifikasi untuk menghindari ketergantungan pada inisialisasi statis

GPS
sumber
Anda static/global initialization because multiple test casestidak diizinkan, karena fungsi harus dapat dipanggil lebih dari sekali.
Jonathan Frech
@Jonathan Jawaban yang diperbarui. Saya selalu bertanya-tanya apakah ini harus diizinkan, dan tidak dapat mengambil keputusan.
GPS
1
Inilah pos meta yang relevan: codegolf.meta.stackexchange.com/a/4940/73111
Jonathan Frech
Anda bisa golf m[j]--,p()untuk p(m[j]--)dan menyimpan byte.
Jonathan Frech
128 byte
ceilingcat
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))))

Saya berharap ini lebih pendek ...

Lebih sedikit status tetapi lebih lama pada 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))))))
NikoNyrh
sumber
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)

Saya mungkin bisa bermain golf lebih banyak dengan hasil cetak, tetapi saya jauh dari komputer saya dan tidak sepenuhnya yakin dengan aturan python 2 tentang pengaturan variabel untuk dicetak. Saya akan memperbarui nanti ketika saya sampai di komputer atau jika seseorang mengklarifikasi dalam komentar.

sonrad10
sumber