Iccanobifシーケンスを出力する


22

nOEISにA014258として文書化されている、Iccanobifシーケンスのth番目までのシーケンスを出力または返すプログラムまたは名前付き関数を作成します。がゼロの0場合、シーケンスのゼロ番目の要素()のみが出力されることに注意してくださいn

シーケンスは、標準のフィボナッチシーケンスと同様に開始することで生成されますが、前の2つの数値を追加した後、結果を反転し、先行ゼロを削除します。少なくとも私にとって興味深い事実は、このシーケンスが厳密に増加していないことです(以下のリストを参照)。また、厳密にフィボナッチ数列以上であるようです(おそらくそうです)。

プログラムの入力は整数でなければなりません。

シーケンスの最初の20の数字は、視聴の楽しみのためにここに提供されています。

0, 1, 1, 2, 3, 5, 8, 31, 93, 421, 415, 638, 3501, 9314, 51821, 53116, 739401, 715297, 8964541, 8389769

標準的な抜け穴は禁止されています。

最短のプログラムが勝ちます。

編集:シーケンスがゼロ番目の要素で始まり、ゼロの場合に含める必要があることを明確にするためのメモを追加しましたn

IOの例:

0    ->    0
1    ->    0 1
6    ->    0 1 1 2 3 5 8
17   ->    [0, 1, 1, 2, 3, 5, 8, 31, 93, 421, 415, 638, 3501, 9314, 51821, 53116, 739401, 715297]

いくつかの答えがあるので、マークアップで隠そうと懸命に取り組んだPython 2での実装を以下に示します。

反復:

#私の最初のプログラムに最も近い。73バイト。また、このプログラムは
 スタックオーバーフローに到達できません。10秒未満でn = 5000実行されます。

i,a,b=input(),0,1
print a
while i:print b;i,a,b=i-1,b,int(str(a+b)[::-1])

再帰的:

#これはn末尾の改行を出力することに注意してください。64バイト。
 nの値が大きい場合、スタックオーバーフローエラーが発生します。

def f(n,i=0,j=1):print i,n and f(n-1,j,int(str(i+j)[::-1]))or'';


8
フィボナッチ数列と何か関係があると考えているため、これまでに行われていない+1
Level River St

@steveverrill私は別の挑戦をしたいと決心し、想像してからシーケンスがどのように見えるかを決めることから始めました。だから私はプログラムを書いた。次に、OEISを検索して、挑戦しました。
mbomb007

この質問に触発されましたか
-JohnE

@JohnEいいえ。以前に見ましたが、このチャレンジはこのサイトで最も簡単なチャレンジの1つです。いいえ、私はチャレンジとして使用できる想像力から純粋に数列を作成していました。
mbomb007

3
答えを受け入れる前にもう少し待つべきだと思います。回答の1つが明らかに無敵(1バイトのソリューションなど)でない限り、少なくとも1週間待つことをお勧めします。
デニス

回答:


3

Pyth、17 15 14

Pu+Gs_`s>2GQU2

オンラインで試す

非常に基本的な実装でありrange(2)、入力に等しい数の要素から開始して追加し、最後の要素から余分な要素を切り取ります。

>逆転のことを指摘してくれた@Jakubeに感謝します。

説明

Pu+Gs_`s>2GQU2    : Q = eval(input) (implicit)
P                 : all but the last element
 u         QU2    : reduce Q times starting with [0, 1]
  +G              : add to the previous result
       s>2G       : sum of the last two elements of G
    s_`           : int(reversed(repr(above value)))

4

Python 2、58バイト

a=0;b=1
exec"print a;a,b=b,int(str(a+b)[::-1]);"*-~input()

strPython 2では十分な数の末尾にLが付いているため、逆ティックではなく変換に使用します。再帰関数を試してみましたが、より長くなりました(61):

f=lambda n,a=0,b=1:-~n*[0]and[a]+f(n-1,b,int(str(a+b)[::-1]))

3

ジュリア、79バイト

f=n->(t=[0,1];for i=2:n push!(t,t[i]+t[i-1]|>string|>reverse|>int)end;t[1:n+1])

これにより、整数を入力として受け入れ、整数配列を返す関数が作成されます。

Ungolfed +説明:

function f(n)
    # Start with the usual Fibonacci stuff
    t = [0,1]

    # Looooooooooooooop
    for i = 2:n
        # Compute the Iccanobif number by piping results
        iccanobif = t[i] + t[i-1] |> string |> reverse |> int

        # Jam it into t
        push!(t, iccanobif)
    end

    # Return the first n + 1
    t[1:n+1]
end

例:

julia> f(1)
2-element Array{Int64,1}:
 0
 1

julia> f(17)
18-element Array{Int64,1}:
      0
      1
      1
      2
      3
      5
      8
     31
     93
    421
    415
    638
   3501
   9314
  51821
  53116
 739401
 715297

3

T-SQL、149

再帰的なCTEクエリを使用する非常に単純なインラインテーブル関数。INTを使用しているため、これは37で最大になります。bigintのCASTを追加すると、さらに63に進むことができます。

create function i(@ int)returns table return with r as(select 0I,1N union all select n,reverse(i+n)+0from r)select 0n union all select top(@)n from r

次のように使用されます

select * from i(0)
n
-----------
0

(1 row(s) affected)

select * from i(1)
n
-----------
0
1

(2 row(s) affected)

select * from i(6)
n
-----------
0
1
1
2
3
5
8

(7 row(s) affected)

select * from i(17)
n
-----------
0
1
1
2
3
5
8
31
93
415
421
638
3501
9314
51821
53116
715297
739401

(18 row(s) affected)

3

K、25 23バイト

{-1_ x{x,.|$+/-2#x}/!2}

No Stinking Loopsの例の1つの単純な修正。

フレーズ.|$は、数値を文字列にキャストし、それを逆にして評価します。

編集:

私の側の境界条件にだらしない注意。より正確になりました:

  {-1_ x{x,.|$+/-2#x}/!2}'0 1 6 10
(,0
 0 1
 0 1 1 2 3 5 8
 0 1 1 2 3 5 8 31 93 421 415)

編集2:

(x+1)#に置き換えることができ-1_、2文字を節約できます。_x「ドロップ」演算子をという変数に適用したい場合は、そうでなければ識別子になるため、スペースが必要xです。


2
OPによると、出力はゼロで始まるはずです。
ストレッチマニアック

正解-今修正する必要があります。
-JohnE

1
ここに来て、まったく同じ回答があったことを確認するためだけに回答を投稿しました。よくできました。
tmartin

3

Haskell、64 49バイト

a!b=a:b!(read$reverse$show$a+b)
q n=0:take n(1!1)

使用例:q 15->[0,1,1,2,3,5,8,31,93,421,415,638,3501,9314,51821,53116]

仕組み:!最初の引数で始まるiccanobif番号の無限リストを再帰的に作成します(2番目の引数は次のiccanobif番号でなければなりません)。qn始まるiccanobifリストから最初の番号を取得し1, 1、先頭にa を追加します0


2

CJam、18バイト

U1{_2$+sW%i}ri*;]p

使い方

U1                      e# First two numbers in the series
  {        }ri*         e# Run the loop input numbers times
   _2$+                 e# Get sum of last two numbers in the series
       sW%i             e# Convert to string, inverse and convert back to a number
                ;       e# Remove the last number to get only first n + 1 numbers.
                 ]p     e# Wrap all numbers in an array and print the array

こちらからオンラインでお試しください


2

Java- 126 124

私はしばらくの間、このサイトの周辺でJavaを見たことはありません...

void f(int b){for(int c=0,d=1,g;b-->=0;d=Integer.valueOf(new StringBuilder(c+(c=d)+"").reverse()+""))System.out.println(c);}

f(5) プリント 0 1 1 2 3 5 8 31 93 421 415 638


私も受け入れます...System.out.println(c);
mbomb007

@ mbomb007ありがとう!2バイト節約しました。
ストレッチマニアック

Javaの文字列操作にはコストがかかるため、数値メソッドを使用して数値を逆にすると、おそらく短縮できます
mbomb007

私はそれがより1.5年ぶりだけど、あなたは置き換えることによって、6つのバイトを保存することができInteger.valueOf(new Long((その後、変更intにforループにlongも通り)。代わりに整数のみを使用したい場合、はよりnew Integer(も短くなりInteger.valueOf(ます。
ケビンCruijssen

2

SWI-Prolog、141 131 121バイト

a(X,R):-X>1,A is X-1,a(A,B),reverse(B,[K,L|_]),W is K+L,name(W,Z),reverse(Z,Y),name(E,Y),nth0(X,R,E,B);X=1,R=[0,1];R=[0].

実行中のa(17,X).出力:

[0, 1, 1, 2, 3, 5, 8, 31, 93, 421, 415, 638, 3501, 9314, 51821, 53116, 739401, 715297] 

結果をa(10000,X).コンピューターに出力するのに約10秒かかります。

編集:上記の121バイトバージョンは、1つの述語定義= 1つのライナーです。古い131バイトバージョンは次のとおりです(として実行する必要がありますp(17,X))。

a(0,[0]).
a(1,[1,0]).
a(X,[E|B]):-A is X-1,a(A,B),B=[K,L|_],W is K+L,name(W,Z),reverse(Z,Y),name(E,Y).
p(X,Y):-a(X,Z),reverse(Z,Y).

2

> <>(魚) 592254バイト

スーパーゴルフではありません(42/43のブランクは何もせず、合計30のリダイレクトトークン)が、そもそもそれが機能するのは興味深い運動でした。

10!/{:}0=?v/{1-}}:{+:0}!/a,:1%-:0=?!v~{:1!/$:@0=?!v$~}}:&{{&*\
/-$/    ;n/\oo", "n:    \       }+1{/     \$-1$*a /|.!20}}01@/
* :{:}(?v:{!":}-1!/$:@0=?!v$~{:}1!/$:@0=?!v$~}}}:&{{{&*:1%-*&{{&+}}{1+}02.
b .1 +bb   \      \$-1$*a /       \$-1$,a /
\*9{~~~{/

ここでテストし、初期スタックで目的の長さを提供できます。

編集:半分以上のバイトカウント


2

PHP、114、109のバイト

function f($n){if($n==0)return 0;$f=[0,1];for($i=2;$i<=$n;++$i){$f[$i]=strrev($f[$i-1]+$f[$i-2]);}return $f;}

派手なものは何もありません。ストリングリバースマジックを備えた平均的なフィボナッチアルゴリズムです。

ゴルフをしていない:

function f($n)
{
    if($n == 0) return 0;
    $f = [0, 1];
    for ($i=2; $i<=$n; ++$i){
        $f[$i] = strrev($f[$i-1] + $f[$i-2]);
    }
    return $f;
}

1

Excel VBA、279バイト

n = InputBox("n")
For i = 0 To n
If i < 2 Then
Cells(i + 1, 1) = i
ElseIf i > 6 Then
x = Cells(i, 1) + Cells(i - 1, 1)
l = Len(x)
v = CStr(x)
For j = 1 To l
r = r + Right(v, 1)
v = Left(v, l - j)
Next j
Cells(i + 1, 1) = r
r = ""
Else
Cells(i + 1, 1) = Cells(i, 1) + Cells(i - 1, 1)
End If
Next i

マクロを実行すると、ユーザーはnの値を入力するよう求められます。

結果は、列Aの行ごとに印刷されます。

出力


1
コードのスペースを削除して短くすることはできますか?
mbomb007

@ mbomb007 Excel VBAで書き込むとき、スペースは自動的に入力されるので、そのままにしておきます。
Wightboy15年

1

JavaScript(ES2015)、81 73バイト

(a,b=0,c=1)=>{for(;a-->-1;c=[...(b+(b=+c)+"")].reverse().join``)alert(b)}

この関数(名前付きf)を6次のように実行します。

f(6);// alerts: 0, 1, 1, 2, 3, 5, 8

1

ピップ、13バイト

この質問がされる前に、このプログラムで使用されているすべての機能がPipに存在していたと確信しています。

LaSio:+RVi+oi

入力をコマンドライン引数として受け取ります。オンラインでお試しください!

説明

               a is 1st cmdline arg; i is 0; o is 1 (implicit)
La             Loop (a) times:
       RVi+o   Reverse of i+o
      +        Unary + treats its operand as a number, thus removing leading 0's
    o:         Assign the result to o...
  Si           ... before swapping i and o
            i  After the loop, output i

2つの変数の値は次のように進化します。

Iter   o   i (output)
   0   1   0
   1   0   1
   2   1   1
   3   1   2
   4   2   3
   5   3   5
   6   5   8
   7   8  31
   8  31  93
   9  93 421
  10 421 415

0

Pushy、18バイト(非競合)

Z1{:2d+vFs@KjkvF;_

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

最もエレガントなプログラムではありませんが、機能します。

Z1     \ Push 0 and 1 to begin the sequence
{:     \ Input times do:
 2d+   \   Add the last two terms
 vF    \   Send to second stack
 s     \   Split into digits
 @Kjk  \   Reverse and join into one number
 vF;    \   Send back to first stack
_      \ At the end of the program, print the whole stack.

@ mbomb007うん、ごめんなさい!
FlipTack


0

R、134バイト

i=function(n){s=c(0,1);for(i in 3:n){s[i]=as.numeric(paste0(rev(strsplit(as.character(s[i-2]+s[i-1]),'')[[1]]),collapse=''))};cat(s)}

例:

> i(10)
0 1 1 2 3 5 8 31 93 421

誰かがあなたの番号を取り、それを文字列にして、それを逆にして再び番号に戻すよりも優れたRの代替手段を持っているかどうかを見てみたいです。


0

Groovy、70バイト

{r={"$it".reverse() as int};f={n->n<3?1:r(f(n-1))+r(f(n-2))};r(f(it))}

{
    r={"$it".reverse() as int};       // Reverse digits, costly using string.
    f={n->n<3?1:r(f(n-1))+r(f(n-2))}; // Recursive Iccanobbif implementation.
    r(f(it))                          // Reverse final output.
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.