Ters Menzil Halefleri


21

Olumlu bir tamsayı verilen n, aşağıdakileri yapın (ve her aşamada çıktı):

  1. nkopyalarını içeren bir liste ile başlayın n.
  2. aşağıdakileri yapın n:
  3. En iinci adımda yavaş yavaş azaltma ivarıncaya kadar listenin inci girişii

Verilirse Yani, örneğin, nbir 4, o zaman başlamak [4,4,4,4]sahip ilk adımda daha sonra, ve [3,4,4,4], [2,4,4,4], [1,4,4,4]. İkinci adımda, var [1,3,4,4], [1,2,4,4]. Üçüncü adımda var [1,2,3,4]. Dördüncü adımda hiçbir şey yapılmaz.

Yani çıktınız [[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]].


Herhangi bir makul giriş / çıkış formatına izin verilir.


Standart boşluklar uygulanır. Bu : En küçük byte-count ile cevap kazanır.


Kontrol amaçlı Python uygulaması .


1
Açıkça iher zaman 1 indeksli olduğunu belirtmek isteyebilirsiniz .
Kevin Cruijssen

Diziyi gerçekten değiştirmek zorunda mıyız? Kabul edilebilir bir çıktı üreten herhangi bir diziyi değiştirmeden daha kısa bir cevaba ulaşıyorum.
Olivier Grégoire

2
@ OlivierGrégoire Adımları izlemenize gerek yok, çıktıyı makul bir biçimde üretmeniz gerekiyor. (yani devam edin)
Sızdıran Rahibe

Yanıtlar:


6

Jöle , 9 bayt

r€⁸Œp»\QṚ

Çevrimiçi deneyin!

Nasıl?

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

* Yukarıda kullanılan kartezyen ürünü ile farklı bir girdiyle neler olup bittiğini görmek daha kolay olabilir:

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

Sen-outgolf-kabiliyetini aştın.
Sızdıran Rahibe

5

R , 83 82 74 bayt

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

Çevrimiçi deneyin!

Bir çift for döngüsü yerine, whileburada bir döngü yeterlidir: listenin indeksten daha büyük olduğu ilk dizini buluruz ve burada azalır.

Kher TRUEyerde N[i]>i, which(K)gerçek endeksleri döndürür ve ilkini birlikte alırız [1].




2

APL + WIN, 54 bayt

Tamsayının ekran girişi için bilgi istemi

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

4 için her adımın sonucunu temsil eden her satırlı bir matris çıktılar:

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

Jöle , 11 bayt

x`’Jḟḣ1Ʋ¦ÐĿ

Çevrimiçi deneyin!

Nasıl çalışır

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 bayt

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)

Çevrimiçi deneyin!


Python'da kodu girintilemek için 1 boşluk yeterlidir. Gereksiz boşlukları kaldırmak ve python 2'ye geçmek 10 byte kazandırır: kontrol et
Dead Possum

@DeadPossum, Python 2'de daha iyisini yapabileceğimi bilmeme rağmen, çok geçmeden modası geçecek, bu yüzden Python 3 becerilerimi mümkün olduğunca pratik etmek istedim.
Dat,

2

Java (OpenJDK 8) , 135 bayt

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

Çevrimiçi deneyin!

Açıklama:

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

Kredi:

-8 byte Jonathan Frech sayesinde !

Kevin Cruijssen sayesinde -16 bayt !

Okx sayesinde -1 bayt !


4
import java.util.*;Korkarım bayt sayısı bir parçasıdır. Ve JonathanFrech kodunun @ koyarak 4 daha fazla bayt golfed edilebilir ,i=0sonra r[], ve değişen <-~aiçin <=a. ( . Çevrimiçi deneyin 144 bayt ) (ve değiştim ~-iiçin i-1daha okunabilir hale getirmek için ..)
Kevin Cruijssen

1
139 byteimport java.util.*; kullanarak java.util.Arrays x=null;ve x.fillve kullanarak kurtulabilirsiniz x.toString. (Mevcut çözümünüzün gerekli olan 155 bayt olduğunu unutmayınimport java.util.*;.)
Kevin Cruijssen 28:18

1
Golf for(;r[i-1]>i;yerine bir bayt kullanarak for(;r[i-1]!=i;.
Okx

2
@KevinCruijssen Başka bayt golf tarafından kaydedilmiş olabilir ++i<=aiçin i++<a.
Jonathan Frech

1
Son kısmı değiştiren bir başka -2 bayt for(r[0]++;i<a;r[i++]++)for(;--r[i]>i;System.out.print(x.toString(r)));. :) Çevrimiçi deneyin 135 bayt
Kevin Cruijssen

2

Haskell, 69 67 65 63 bayt

Özyinelemeli tanım:

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

2 bayt için Laikoni'ye teşekkürler!


İkincisi map, liste kavrayışına sahip iki bayt daha kısadır: Çevrimiçi deneyin!
Laikoni

2

PHP, 153 Bayt

Çevrimiçi deneyin!

kod

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

Baytları düşürmeye çalışacağım veya özyinelemeli işlevi tamamlayacağım

açıklama

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

Gereksiz beyaz boşluklara sahip gibisiniz, bu yüzden bu 153 bayt olmalı - PHP'yi bilmediğime dikkat edin.
Giuseppe

evet, şimdi farkına varma, teşekkür ederim, şimdi düzenleme.
Francisco Hahn,




1

J , 17 15 bayt

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

Çevrimiçi deneyin!

açıklama

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

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

Çevrimiçi deneyin! Açıklama:

.+
*

Girişi unary'ye dönüştürün.

_
$`_,$= 

Kopyanın indeksinin i,nbulunduğu n kopyaların bir listesini oluşturun i.

.

Hiçbir şey yazdırmayın (döngü bittiğinde).

{

Desen değişene kadar döngü.

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

S'yi geçici olarak silin ve is'yi nondalık basamağa ve çıkışa dönüştürün .

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

Değeri dizini aşan ilk liste girişini yapın ve düşürün.


1

Python 3 , 70 67 65 bayt

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

Çevrimiçi deneyin!

  • (67) Fonksiyona dönüştürme: -3 bayt
  • (65) Gereksiz parantezleri çıkarma: -2 bayt

Ungolfed versiyonu:

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 (clang) , 131 141 bayt

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

Çevrimiçi deneyin!

Bu, n99'a kadar olan herkes için işe yarayacak . TIO çıkışı keser. Bellek izin verdiği nölçüde dizinin boyutunu değiştirerek isteğe bağlı olarak daha büyük destekleyebilir m.


Aşağıdakiler n = 1..9 ile sınırlıdır ancak önemli ölçüde daha kısadır

C (clang) , 89 92 bayt

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

Çevrimiçi deneyin!

Güncelleme: Statik başlatmaya bağımlı olmamak için değiştirildi


Sizin static/global initialization because multiple test casesfonksiyonları kereden çağrılabilir daha olmak zorunda olduğu gibi, izin verilmez.
Jonathan Frech

@ Jonathan Güncelleme cevaplar. Buna izin verilip verilmeyeceğini merak ettim ve kararımı veremedim.
GPS,


Sen golf olabilir m[j]--,p()için p(m[j]--)ve bir byte tasarrufu.
Jonathan Frech


0

Clojure, 132 bayt

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

Bunun daha kısa olmasını umuyordum ...

Daha az durumlu ancak daha uzun 141 bayt:

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

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)

Muhtemelen baskı ile daha çok golf oynardım, ama bilgisayarımdan uzaktayım ve python 2'nin yazdırmak için bir değişken ayarlama kurallarından tam olarak emin değilim. Bir bilgisayara ulaştığımda veya yorumlarda biri açıklığa kavuşursa daha sonra güncellenirim.


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.