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 .


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

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




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

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.

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!


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 !


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!


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

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

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

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.


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

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


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


Anda bisa golf m[j]--,p()untuk p(m[j]--)dan menyimpan 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))))

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

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.


Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.