上昇型エンドウ豆パターンジェネレーター


8

エンドウ豆パターンに慣れていない人にとっては、それは単純な数学的パターンです。

このパターンには複数のバリエーションがありますが、1つに焦点を当てます。

エンドウ豆パターンの上昇

次のようになります。

1
11
21
1112
3112
211213
...

次の行を取得するのは本当に難しいようですが、それは本当に簡単です。次の行を取得する方法は、前の行で数字が繰り返された回数を数えることです(最低から最大まで数え始めます)。

one
one one
two ones
one one, one two
three ones, one two
two ones, one two, one three
...

要件/ルール:

  • から始めます 1
  • スニペットになります
  • 生成する行数を指定する方法が必要です(たとえば5 、最初の5行が表示されます)
  • コードはできるだけ短くする必要があります
  • 最低から最大まで数え始める必要があります(昇順のバリエーション)

私はここに新しいのですが、どうすれば改善できるか教えてください。たとえば、日付の制限を指定する必要がありますか?
ajax333221 2012年

1
I / Oまたはスニペットで完全なプログラムが必要かどうかを指定することもできます(または気にしない場合)。しかし、一見すると十分に指定されているように見えます。
JB

@JBあなたの啓発的な言葉をありがとう。投稿を更新しました
ajax333221 '14 / 01/12


13回目以降のすべての反復は21322314です。これは正しいです?
Joey Adams、

回答:


4

APL、32文字

⍪⌽({⍵,⍨,/{⌽⍵,+/⍵⍷d}¨⍳⌈/d←⊃⍵}⍣⎕)1

これは、ユーザー入力で指定されたとおり、0から始まる行を生成します(つまり、0生成11生成の1後に続き1 1ます)。これにはDyalog APLを使用⎕IOしており、デフォルトの1に設定する必要があります。

例:

      ⍪⌽({⍵,⍨,/{⌽⍵,+/⍵⍷d}¨⍳⌈/d←⊃⍵}⍣⎕)1
⎕:
      0
1

      ⍪⌽({⍵,⍨,/{⌽⍵,+/⍵⍷d}¨⍳⌈/d←⊃⍵}⍣⎕)1
⎕:
      13
               1 
             1 1 
             2 1 
         1 1 1 2 
         3 1 1 2 
     2 1 1 2 1 3 
     3 1 2 2 1 3 
     2 1 2 2 2 3 
     1 1 4 2 1 3 
 3 1 1 2 1 3 1 4 
 4 1 1 2 2 3 1 4 
 3 1 2 2 1 3 2 4 
 2 1 3 2 2 3 1 4 
 2 1 3 2 2 3 1 4

時間があれば、説明を書きます。⍨


3

Python(2.x)、81 80文字

l='1'
exec"print l;l=''.join(`l.count(k)`+k for k in sorted(set(l)))\n"*input()

すべてのヒントやコメントを歓迎します!

使用法:python peapattern.py
15#反復回数を入力
1
11
21
1112
3112
211213
312213
212223
114213
31121314
41122314
31221324
21322314
21322314
21322314

2

Perl、83

一部のPerlの達人がこれをしのぐことができると確信していますが、次のようになります。

$_++;$n=<>;for(;$n--;){print$_.$/;$r='';$r.=length($&).$1 while(s/(.)\1*//);$_=$r;}

拡張:

$_++;$n=<>;

for(;$n--;)
{
    print $_.$/;

    $r='';$r .= length($&).$1 while (s/(.)\1*//);  # The magic
    $_=$r;
}

行数はSTDINを介して渡されます。


かなりの達人ではありませんが、もっと短い方法が見つかると思いますが、46ほぼ同じ方法を使用しています。オンラインで試してみてください!
Dom Hastings、

2

J、60 46 39 26文字

1([:,(#,{.)/.~@/:~)@[&0~i.

編集3:これを表現するはるかに優れた方法を思いつきました。

1([:;[:|."1[:/:~~.,.[:+/"1[:~.=)@[&0~i.

編集2:最後に、引数をシーケンスの最後に移動し、不要な割り当てのものを取り除く方法を見つけました。

以前は:

p=.3 :'([:,[:|."1[:/:~~.,.[:+/"1[:~.=)^:(i.y)1

編集1:th y行ではなく行であるはずの出力を修正しますy。また、物事を少し短くします。0s についての恥は、いまいましいものを取り除くことができないようです。

使用法:

   1([:,(#,{.)/.~@/:~)@[&0~i. 1
1

   1([:,(#,{.)/.~@/:~)@[&0~i. 6
1 0 0 0 0 0
1 1 0 0 0 0
2 1 0 0 0 0
1 1 1 2 0 0
3 1 1 2 0 0
2 1 1 2 1 3

   1([:,(#,{.)/.~@/:~)@[&0~i. 10
1 0 0 0 0 0 0 0
1 1 0 0 0 0 0 0
2 1 0 0 0 0 0 0
1 1 1 2 0 0 0 0
3 1 1 2 0 0 0 0
2 1 1 2 1 3 0 0
3 1 2 2 1 3 0 0
2 1 2 2 2 3 0 0
1 1 4 2 1 3 0 0
3 1 1 2 1 3 1 4

確かに使用法は今では醜いですが、かわいさはゲームの名前ではありません...


これは、「伝統的な言語」に勝るものはありません。たぶん、golfscriptやそれに類するものは、任務に任されています;-)
ChristopheD

1

Haskell、116

import Data.List
main=interact(unlines.map(show=<<).($iterate((>>=
 \x->[length x,head x]).group.sort)[1]).take.read)

使用法:

$ runhaskell pea.hs <<< 15
1
11
21
1112
3112
211213
312213
212223
114213
31121314
41122314
31221324
21322314
21322314
21322314

1

Common Lisp、140文字

(defun m(x)
  (labels((p(l n)
    (if(= 0 n)
       nil
       (cons l
             (p(loop for d in(sort(remove-duplicates l)#'<)
                  append(list(count d l)d))
               (1- n))))))
    (p'(1) x)))

これはLispなので、関数はリストのリストを返します。(mx)Xサブリストを生成します。



1

ゼリー13 11バイト(フィードバックあり)

1ṢŒrUFƲСṖY

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

1ṢŒrUFƲСṖY
1     Ʋ         starting with 1, run these 4 links...
 ṢŒr            Ṣort the list and get the Œrun-length encoding of it,
    U           reverse each member of the RLE list (so it goes [repetitions, digit] instead of [digit, repetitions]),
     F          and Flatten the RLE list-of-lists to just a list of digits, which is the next number.
       С       do that (input) number of times,
         ṖY     Ṗop the last line off the output (an extra line is always calculated) and then print the numbers, separated by newlines.

1
U€U行レベルまでベクトル化できます。次に、インライン化別のバイトを保存することができますṢŒrUF使用して、Ʋ:(モナドとしての最後の4個のリンク)1ṢŒrUFƲСṖY
リン・

@Lynnの改善に感謝します!5つ以上のリンクの文字列から4に移動するのは常に良いので、すばやく使用できます。
ハリー

1
どういたしまして!(小型ノート:ṢŒrU€FƲうまく働いているだろう-それは[ロールŒrU€Fモナドへ]を多分「それから」の私の使用が^^誤解を招く少しあった。同様に、のようなものに。abc$de$fƲ[4つのリンク上で動作しますabc$de$f]そしてそれらをモナドにロールします。これは、クイックを「解析時スタックオペレーター」と考えることができるという意味です。それらの結果はスタックにプッシュバックされ、将来のクイックの1つのリンクであるかのように機能します。 )
Lynn

1
@Lynnなるほど、ありがとうございます!「カウント」リンクが大幅に改善され、コメントのおかげでこの回答を完全にインライン化し 1バイト節約できました。
ハリー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.