カウントアップ、交換、繰り返し!


18

定義

CURRシーケンスのn 番目の配列を次のように定義します。

  1. シングルトン配列A = [n]から始めます。

  2. 各整数のためにKA、エントリ交換Kを用いてKからカウントアップ、自然数1K

  3. 前のステップn-1をさらに繰り返します。

たとえば、n = 3の場合、配列[3]から始めます。

31、2、3に置き換えて、[1、2、3]を生成します。

私たちは今取り替える12、および311、2および1、2、3(それぞれ)、[ 1、1、2、1、2、3 、]を生成します。

最後に、配列内の6つの整数すべてに対して前のステップと同じ置換を実行し、[ 1、1、1、2、1、1、2、1、2、3 ]を生成します。これは3番目のCURR配列です。

仕事

入力として厳密に正の整数nが与えられると、n 番目の CURR配列を計算する関数のプログラムを作成します。

出力は、ある種のフラットリストである必要があります(関数から返された配列、言語の配列構文の文字列表現、空白区切りなど)。

これはです。バイト単位の最短コードが勝つように!

テストケース

 1 -> [1]
 2 -> [1, 1, 2]
 3 -> [1, 1, 1, 2, 1, 1, 2, 1, 2, 3]
 4 -> [1, 1, 1, 1, 2, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4]
 5 -> [1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 2, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 1, 1, 2, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 1, 1, 2, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 2, 3, 4, 5]
 6 -> [1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 2, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 2, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 1, 1, 2, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 2, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 1, 1, 2, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 1, 1, 2, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 2, 3, 4, 5, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 2, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 1, 1, 2, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 1, 1, 2, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 2, 3, 4, 5, 1, 1, 1, 1, 2, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 2, 3, 4, 5, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 2, 3, 4, 5, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 6]


入力を[2]整数ではなくシングルトン配列(など)として受け取ることはできますか?
メゴ

@Mego整数のままにします。
デニス

これにはOEISシーケンスが必要だと思います。
DanTheMan

@DanTheManこれは実際には現在の形式の整数シーケンスではありませんが、すべての正の整数の結果を連結することで1つに変換できると思います。
デニス

回答:



16

Python、50バイト

lambda i:eval("[i "+"for i in range(1,i+1)"*i+"]")

スコープの乱用!たとえば、の場合、i=3評価される文字列は展開されます。

[i for i in range(1,i+1)for i in range(1,i+1)for i in range(1,i+1)]

どういうわけか、関数の入力変数iをすべてに使用しているにもかかわらず、Pythonは各反復インデックスをあたかも式が

[l for j in range(1,i+1)for k in range(1,j+1)for l in range(1,k+1)]

i関数への入力。


このトリックはFirefox 30以降でも機能し、3バイト節約しました、ありがとう!
ニール

@DigitalTrauma pythonとJavaScriptの両方にeval、明らかにコード自体を移植する必要がありますが、とにかくそれを仮定できると思いました。
ニール

@ニールああ、私は-私は完全に誤解しました:)
デジタル外傷

12

05AB1E、6 3バイト

DFL

説明した

D     # duplicate input
 F    # input times do
  L   # range(1,N)

オンラインで試す

@Adnanのおかげで3バイト節約


DFL3バイト短くなります:)
Adnan

1
@アドナン:Lがリストでそのように働いていることを知らなかった。自動的に平らになることは少し驚くべきことです。
エミグナ

3
それは実際には私が一度も修正したことのないバグです。
アドナン


6

Python 2、82バイト

lambda n:[1+bin(i)[::-1].find('1')for i in range(1<<2*n-1)if bin(i).count('1')==n]

これは最短の解決策ではありませんが、興味深い方法を示しています。

  • 最初の2^(2*n-1)数字をバイナリで書き留めます
  • 正確に持つものに保つnものを
  • 各数値について、末尾のゼロの数をカウントし、1を追加します。

4

実際には、9バイト

;#@`♂RΣ`n

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

説明:

;#@`♂RΣ`n
;#@        dupe n, make a singleton list, swap with n
   `♂RΣ`n  call the following function n times:
    ♂R       range(1, k+1) for k in list
      Σ      concatenate the ranges

1バイトはLeaky Nunに、もう2バイトはインスピレーションに感謝します。


;#@"♂R♂i"*ƒバイトを保存
リーキー修道女

@LeakyNun良いキャッチ- ;#@`♂R♂i`n別のものを保存します!
メゴ

合計しようとしました、笑
リーキー修道女

私は9は、ここで最適解になるだろうと思う
MEGO

リンクはまだ古くなっています。
リーキー修道女

4

C#、128バイト

List<int>j(int n){var l=new List<int>(){n};for(;n>0;n--)l=l.Select(p=>Enumerable.Range(1,p)).SelectMany(m=>m).ToList();return l;

using static System.Linq.Enumerable:、あなたがこれを行うことができますint[]J(int n){var l=new[]{n};while (n-- > 0){l = l.Select(p => Range(1, p)).SelectMany(m => m).ToArray();}return l;}
ダイのMAU

4

APL、11バイト

{∊⍳¨∘∊⍣⍵+⍵}

テスト:

      {∊⍳¨∘∊⍣⍵+⍵} 3
1 1 1 2 1 1 2 1 2 3

説明:

  • +⍵:で始まる
  • ⍣⍵:次の時間を実行します。
    • ⍳¨∘∊:入力を平坦化し、入力内の各Nに対してリスト[1..N]を生成します
  • :その結果を平坦化します

2
シンプル:{(∊⍳¨)⍣⍵⊢⍵}
アダム

@Adám:ああ、はい、電車はJとは異なる働きをします。私は最初から{(∊∘(⍳¨))⍣⍵+⍵}考えていたのですが、どうすればそれらのブレースを取り除くことができますか?
マリナス


2

Mathematica、27 26バイト

Essariの回答からインスピレーションを得て1バイトを保存しました。

Flatten@Nest[Range,{#},#]&

かなり簡単:入力のためにx我々が開始{x}してから適用するRangeことにx倍(RangeあるListable、それは自動的に任意の内部整数ネストされたリストに適用されることをどの手段)。最後Flattenに結果。


2

Clojure、59バイト

(fn[n](nth(iterate #(mapcat(fn[x](range 1(inc x)))%)[n])n))

説明:

問題を解決するための本当に簡単な方法。内部からの作業:

(1) (fn[x](range 1(inc x))) ;; return a list from 1 to x
(2) #(mapcat (1) %)         ;; map (1) over each item in list and flatten result
(3) (iterate (2) [n])       ;; call (2) repeatedly e.g. (f (f (f [n])))
(4) (nth (3) n))            ;; return the nth value of the iteration

2

Python 3、75 74バイト

def f(k):N=[k];exec('A=N;N=[]\nfor i in A:N+=range(1,i+1)\n'*k+'print(N)')

これは、問題の説明をコードに簡単に変換したものです。

編集:@Dennisのおかげで1バイト保存されました。


あなたprintは外に行くことができexecます。
xnor

ええ、それは私が最初に持っていたものですが、それは単に[k]何らかの理由で印刷されます。それがスコープの問題なのか、それとも何か他の問題なのかを理解しようとしてあきらめました。
アンドリューエプスタイン

はい、スコープの問題のように見えます。Python 2
では正常

2

R、60 49バイト

非常に簡単の使用unlistsapply

y=x=scan();for(i in 1:x)y=unlist(sapply(y,seq));y

11バイトを節約してくれた@MickyTに感謝


先端のためのTHX @MickyT、私が使用できるseqバイト数下げるために
bouncyball

申し訳ありませんが、質問を読み間違えました
MickyT

2

php 121

これの背後にあるトリックの方法では、実際にはあまりありません。PHPで配列を平坦化するのは短くないので、そもそもフラットに構築する必要があります

<?php for($a=[$b=$argv[1]];$b--;)$a=array_reduce($a,function($r,$v){return array_merge($r,range(1,$v));},[]);print_r($a);

平らに保つことをお勧めします。ただし、コールバック関数も短くはありません。あなたを15バイト倒します。短いタグで4バイト、タグなしで<?6バイトを保存できます-r
タイタス

2

Haskell、33バイト

f n=iterate(>>= \a->[1..a])[n]!!n

バイトを保存してくれたnimiに感謝します。

ポイントフリーバージョンはより長い(35バイト):

(!!)=<<iterate(>>= \a->[1..a]).pure

iterate(>>= \a->[1..a])1バイト少ない。
nimi

2

JavaScript(Firefox 30-57)、63 60バイト

f=n=>eval(`[${`for(n of Array(n+1).keys())`.repeat(n--)}n+1]`)

@xnorのPython回答のポート。


Firefox 42(SyntaxError: missing : in conditional expression)およびBabel(Unexpected token (1:21))でこれを試しました。何が間違っていますか?
デニス

@デニス申し訳ありませんが、わかりません。実際、何らかの理由でマシンの1つにFirefox 42をインストールしていますが、再確認したところ、正常に動作しました。(念のため、Firefox 37および47も確認しました。)
ニール

ええと、ページは更新されず、古いバージョンをテストしました。新しいものは問題なく動作します。
デニス

@Dennis Ah、どうやら)そのバージョンに迷い込んだようです。
ニール

1

J、18バイト

([:;<@(1+i.)"0)^:]

課題で説明されているプロセスに基づいた簡単なアプローチ。

使用法

   f =: ([:;<@(1+i.)"0)^:]
   f 1
1
   f 2
1 1 2
   f 3
1 1 1 2 1 1 2 1 2 3
   f 4
1 1 1 1 2 1 1 1 2 1 1 2 1 2 3 1 1 1 2 1 1 2 1 2 3 1 1 2 1 2 3 1 2 3 4

説明

([:;<@(1+i.)"0)^:]  Input: n
                 ]  Identity function, gets the value n
(     ...     )^:   Repeat the following n times with an initial value [n]
      (    )"0        Means rank 0, or to operate on each atom in the list
         i.           Create a range from 0 to that value, exclusive
       1+             Add 1 to each to make the range from 1 to that value
    <@                Box the value
 [:;                  Combine the boxes and unbox them to make a list and return
                    Return the final result after n iterations



1

F#、63バイト

fun n->Seq.fold(fun A _->List.collect(fun k->[1..k])A)[n]{1..n}

nを入力として取る匿名関数を返します。

Aのすべてのエントリkを[1..k]で置き換え、A = [n]で始まるプロセスをn回繰り返します。


1

Swift 3、58バイト

nを入力に設定して、プレイグラウンドで直接実行することを意味します。

var x=[n];for i in 0..<n{x=x.reduce([]){$0+[Int](1...$1)}}

Ungolfed、ほとんどの略記法が元に戻りました:

let n = 3 //input

var x: Array<Int> = [n]
for i in 0..<n {
    x = x.reduce(Array<Int>[], combine: { accumulator, element in
        accumulator + Array<Int>(1...element)
    })
}

1

Java、159バイト

手順

int[] q(int y){int z[]=new int[]{y};for(int i=0;i<y;i++){int d=0,a=0;for(int c:z)d+=c;int[]r=new int[d];for(int c:z)for(int j=0;j<c;)r[a++]=++j;z=r;}return z;}

使用法

public static void main(String[] args){String out = "["; int [] b = q(6);for(int c:b)out+=c+", ";System.out.println(out+"]");}

public static int[] q(int y){int z[]=new int[]{y};for(int i=0;i<y;i++){int d=0,a=0;for(int c:z)d+=c;int[]r=new int[d];for(int c:z)for(int j=0;j<c;)r[a++]=++j;z=r;}return z;}

サンプル出力:

[1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 2, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 2, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 1, 1, 2, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 2, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 1, 1, 2, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 1, 1, 2, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 2, 3, 4, 5, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 2, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 1, 1, 2, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 1, 1, 2, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 2, 3, 4, 5, 1, 1, 1, 1, 2, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 2, 3, 4, 5, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 2, 3, 4, 5, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 6, ]

1

Python 2、69 68 66バイト

def f(n):a=[n];exec'a=sum([range(1,i+1)for i in a],[]);'*n;print a

編集:@xnorのおかげで1バイトを保存しました。@ Dennis♦のおかげで2バイト節約されました。


周りの括弧を削除できexecます。Python 2では、関数ではなくキーワードです。ところで68バイトをカウントします。
デニス

@デニスああ、それは私が誤って数えたことを意味し、元は69バイトでした...-
ニール

1

Bash + GNUユーティリティ、49

  • @Dennisのおかげで1バイト節約されました。

パイプされた再帰関数FTW!

f()((($1))&&xargs -l seq|f $[$1-1]||dd)
f $1<<<$1

nコマンドラインで渡されます。出力は改行で区切られます。

を使用するとdd、統計がSTDERRに送信されます。これは問題ないと思いますが、そうでない場合は、1バイト余分にdd置き換えることができcatます。


1
STDERRへの外部出力はデフォルトで許可されています。を置き換え{...;}(...)バイトを保存できます。
デニス

@デニスはい、もちろん!どうやらあなたは私からこのヒントを得たようです:)
デジタル外傷

0

Perl 5、53バイト

サブルーチン:

{($i)=@_;for(1..$i){my@c;push@c,1..$_ for@_;@_=@c}@_}

実際にそれを見る

perl -e'print "$_ " for sub{($i)=@_;for(1..$i){my@c;push@c,1..$_ for@_;@_=@c}@_}->(3)'

0

Ruby、61バイト

def f(n);a=[n];n.times{a=a.map{|i|(1..i).to_a}.flatten};a;end

こんにちは!PPCGへようこそ。短い説明がいいでしょう!
TheCoffeeCup

PPCGへようこそ!チャレンジがこれを無効にしない限り、すべての提出は、スニペットだけでなく、完全なプログラムまたは機能である必要があります。(この場合、チャレンジは実際にこの要件を確認します。)
マーティンエンダー

0

PHP、100 98バイト

で実行しphp -r '<code>' <n>ます。

for($a=[$n=$argv[1]];$n--;$a=$b)for($b=[],$k=0;$c=$a[$k++];)for($i=0;$i++<$c;)$b[]=$i;print_r($a);

各反復で、1 ..(最初の値を削除)から$a空になるまでループする一時コピーを作成します。


これら2つはまだあり、おそらく100バイトのままです。

for($a=[$n=$argv[1]];$n--;)for($i=count($a);$i--;)array_splice($a,$i,1,range(1,$a[$i]));print_r($a);

各反復では、配列を逆方向にループして、各数値を範囲に置き換えます。

for($a=[$n=$argv[1]];$n--;)for($i=$c=0;$c=$a[$i+=$c];)array_splice($a,$i,1,range(1,$c));print_r($a);

配列内の各反復ループで、前の番号でインデックスを増やし、各インデックス付き要素を範囲で置き換えます

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