リバースレンジサクセサ


21

正の整数nを指定して、次の操作を実行します(すべてのステージを出力します)。

  1. nコピーを含むリストから始めnます。
  2. 次のn時間を実行します。
  3. i目のステップ、徐々にデクリメントiそれが到達するまで、リストの番目のエントリをi

与えられたがあれば、例えば、nある4、あなたはで始まり[4,4,4,4]、あなたが持っている最初のステップで、その後、および[3,4,4,4][2,4,4,4][1,4,4,4]。2番目のステップでは[1,3,4,4]、があり[1,2,4,4]ます。3番目のステップでがあり[1,2,3,4]ます。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]]です。


合理的な入力/出力形式はすべて許可されます。


標準の抜け穴が適用されます。これはです。バイト数が最小の答えが勝ちです。


チェック用のPython実装


1
ithは常に1インデックス付きであると明示的に述べたい場合があります。
ケビンCruijssen

本当に配列を操作する必要がありますか?配列を操作せずに短い答えを得ると、許容可能な出力が生成されます。
オリビエグレゴワール

2
@OlivierGrégoire手順に従う必要はありません。出力を適切な形式で作成するだけです。(すなわち先に行く)
リーキー修道女

回答:


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

あなたはアウトゴルフ不可能なものをアウトゴルフしました。
リーキー修道女

5

R83 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

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

オンラインでお試しください!


Pythonでコードをインデントするには1スペースで十分です。不要なスペースを削除してpython 2に切り替えると10バイト節約されます。チェックアウト
デッドポッサム

@DeadPossum、私はPython 2でもっと上手くできると知っていたが、すぐに時代遅れになるので、できるだけPython 3のスキルを練習したかった。
ダット

2

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

クレジット:

ジョナサン・フレッシュのおかげで-8バイト!

Kevin Cruijssenのおかげで-16バイト!

Okxのおかげで-1バイト!


4
これimport java.util.*;は、私が恐れているバイトカウントの一部です。そして、@ JonathanFrechのコードは、,i=0後にを挿入しr[]、に変更<-~aすることで、さらに4バイト増やすことができます<=a。(オンラインで試してみてください。144バイト)(そして読みやすくするために変更~-ii-1ました。)
ケビンクルーイッセン

1
およびをimport java.util.*;使用してを削除して139バイトjava.util.Arrays x=null;x.fillx.toString(現在のソリューションは、必要な155バイトであることに注意してくださいimport java.util.*;。)
ケビンCruijssen

1
for(;r[i-1]>i;ではなくを使用してバイトをゴルフしますfor(;r[i-1]!=i;
Okx

2
@KevinCruijssenにゴルフ++i<=aをすることで別のバイトを保存できますi++<a
ジョナサンフレッチ

1
最後の部分をに変更する別の-2バイトfor(r[0]++;i<a;r[i++]++)for(;--r[i]>i;System.out.print(x.toString(r)));。:) 135バイトでオンラインで試す
ケビンクルーッセン


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を知らないことに注意してください。
ジュゼッペ

ええ、ただ編集してください、ありがとうございます。
フランシスコハーン





1

網膜、49バイト

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

オンラインでお試しください!説明:

.+
*

入力を単項に変換します。

_
$`_,$= 

i,nwhere iがコピーのインデックスであるn個のコピーのリストを作成します。

.

何も印刷しません(ループが終了したとき)。

{

パターンが変更されなくなるまでループします。

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

isを一時的に削除し、nsを10進数に変換して出力します。

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

値がインデックスを超える最初のリストエントリを取得し、デクリメントします。


1

Pythonの370の 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(clang)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(clang)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回答を更新しました。私はこれが許可されるべきであるかどうか常に疑問に思い、私の心を決めることができませんでした。
GPS

1
関連するメタ投稿は次のとおり
ジョナサン

ゴルフm[j]--,p()p(m[j]--)てバイトを節約できます。
ジョナサンフレッチ


0

Clojure、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

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

私はおそらく印刷でもっとゴルフをすることができましたが、私は自分のコンピューターから離れていて、印刷する変数の設定に関するpython 2のルールが完全にはわかりません。後でコンピューターにアクセスしたとき、またはコメントで誰かが明確にしたときに更新します。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.