N-Bonacciシーケンスのリバースエンジニアリング


15

編集:2016年2月15日月曜日に回答を受け付けます。バイトがあなたに有利になるように!

彼に挑戦「N-Bonacciシーケンスを印刷」以前ここで、@DJMcGoathemは、N-bonacciシーケンスを記述するNの番号が加算され、代わりに、フィボナッチ数列の2伝統の、(「と言わデュオ nacciシーケンス」)。次に、XとNの2つの入力を取得し、X番目のN -nacci数を出力するように求めました。

私は反対を提案します。
シーケンスが与えられると、N- nacciシーケンスのサブセットを出力します。私は「のサブセット」と言います:

  • A)これらのシーケンスは無限です
  • B)シーケンスの開始が指定されている場合は、先頭の1の数を数えるだけです

複数のN -nacciシーケンスに属する可能性がある場合は、最も低いものを選択します。N-nacciシーケンスに
属していない場合、プログラムは出力と間違える可能性のある何かを出力する以外の何かをするかもしれません。これらの動作には、以下が含まれます(ただし、これらに限定されません):無限ループ、エラー、クラッシュ、自身の削除(*咳咳* 警戒 *咳咳*)、またはブラックホールの作成(このブラックホールが発生する可能性のあるものがない限り)有効な出力と間違われる可能性があります)。
この課題のために、これらのシーケンスは1から始まります。これは、N -nacciシーケンスがNから始まることを意味します。さらに、N正の整数でなければなりません。したがって、-1 -nacciなどはありません。

テストケース:

1,1,1 -> 1
49, 97 -> 7
55, 89, 144 -> 2
1 -> 1
6765 -> 2
12, 23, 45, 89 -> 12
100, 199 -> 100

1
create a black hole (as long as this black hole does not produce anything that could be mistaken for valid output).私、ブラックホールのらせんは黄金比に収束しています!それはしなければならない duoacciシーケンスの有効な出力可能!
コナーオブライエン

1
@CᴏɴᴏʀO'Bʀɪᴇɴそれは美しい黄金比かもしれませんが、ブラックホールの近くに行かないでください!youtube.com/watch?v=TTUQyEr-sg0
Level River St

1
ああ、これは私が当初考えていたよりずっと難しい
...-GamrCorps

@ mbomb007正の整数と自然数の違いは何ですか?
チャールズではない

1
@ mbomb007ああ。1は最初の自然数だと思いました。私は数を数えることを考えていたに違いあり
ません

回答:


7

ルビー、94

同じアルゴリズム内でこれまでゴルフをすることができたのには驚いた!私は200以上で始めました!

->a{1.step.find{|s|x=[1]*(s+z=a.size)
x<<x[-s,s].inject(:+)while x.max<a.max&&s>1
x[-z,z]==a}}

ゴルフをしていない:

l=->a{
    # ooh! a built-in infinite incrementer!
    1.step.find{|s|
        # if n == 1, z is important, otherwise s.
        x=[1]*(s+z=a.size)
        ## add the next nacci number until we hit or overshot max. 
        ## if s == 1, we don't increment, so don't bother
        x<<x[-s,s].inject(:+)while x.max<g&&s>1
        # eval to true if there's a match, false if not
        x[-z,z]==a
    }
}

x=[1]*(s+z=a.size)正確にどのように機能しますか?
チョイス

@Cyoce Ifの場合n == 1、増分しないため、入力が長くても1の配列が必要です。の場合n > 1nシーケンスには少なくとも1 が必要です。だからs+a.sizeカバーn == 1の任意の長さのためにa、それは任意の他の配列の先頭をカバーし、私達はちょうど追加を開始することができるようにsバットをオフ桁。それは理にかなっていますか?
チャールズ

@Cyoceと別の質問をしている場合、Rubyでは、[1]*number長さ1の配列を返しますnumber。だから、x=[1]*(s+z=a.size)譲受人a.sizezと、その後、譲受人x1の長さの配列s+z
チャールズ

3

Python 2、176バイト

def r(n,x):i,f=n,[1]*n;exec"f+=sum(f[i-n:]),;i+=1;"*(x-n);return f
l=input()
m=max(l)+len(l)
for i in range(1,m):
 if any(l==r(i,m)[b:b+len(l)]for b in range(m)):print i;break;

これには、次の形式の入力が必要であることに注意してください。

[1, 1, 2, 3...]

のではなく

1, 1, 2, 3...

物事を順調に進めるための、かなり簡単なソリューションです。誰か他の人が答えたら、それをゴルフで打ち落とすことにもっと取り組みます。これは@Data のanswerからのN-Bonnaciジェネレーターのわずかに変更されたバージョンを使用しているため、彼に賛成です。次に、入力範囲内の各N-Bonnaciについて、入力がそのサブシーケンスであるかどうかをチェックします。


私が彼に与えた同じ提案をしてみてください。変更f.appendのためにf+=
Cyoce

@Cyoceああ当たり前。こんな基本的なものを見逃したなんて信じられない。fp
DJMcMayhem

末尾は;必要ですか?
チョイス

1

Lua、324 323バイト

他の投稿を見ると、コードに何か問題があるように感じます...しかし、それはLuaであることを覚えています。

とても楽しかったです。実際に時間がかかりました。

編集:使用:簡単なトリックで保存された1バイト::label::+をgoto labelで行う代わりに、無限ループwhile''

function f(l)c=2 y,z=table.remove,os.exit while(l[1]<2)do y(l,1)if(#l<1)then print(1)z()end end ::q:: a={}for i=1,c do a[i]=1 end b={}for i=1,#l do b[i]=l[i]end while(a[#a]<b[1])do x=0 for i=(#a-c+1>0 and #a-c+1 or 1),#a do x=x+a[i]end a[#a+1]=x if a[#a]==b[1]then y(b,1)end if #b<1 then print(c)z()end end c=c+1 goto q end

非ゴルフと説明

Luaには、インデックスやキーを使用せずに、セットやサブセットを定義したり、配列やテーブルに値が含まれているかどうかを確認したりする方法はありません。そのため、パラメーターとして使用する配列から要素を削除することにしました。それはどの要素が既に計算されているか、それが一致したかどうかを記録する方法です。

  function f(l)
  c=2
  y,z=table.remove,os.exit           -- Create pointers on table.remove and os.exit
                                     -- saves a total of 9 bytes
  while(l[1]<2)                      -- loop used to remove leading 1
  do 
    y(l,1)
    if(#l<1)                         -- we also check if it was a 1-only array
    then 
      print(1)                       -- if so, we print 1 and exit
      z()
    end 
  end

  ::q::                              -- label q, start of the infinite loop
    a={}for i=1,c do a[i]=1 end      -- fill an array with c 1s
    b={}for i=1,#l do b[i]=l[i]end   -- copy the sequence array
    while(a[#a]<b[1])                -- while max(a)<min(b)
    do
      x=0 for i=(#a-c+1>0            -- iterate from index a.length-c to
                    and #a-c+1       -- to a.length
                    or 1),#a 
      do 
        x=x+a[i]                     -- summing a's elements
      end
      a[#a+1]=x                      -- append x to a
      if a[#a]==b[1]then y(b,1)end   -- if x is equal ot a member of the sequence
                                     -- remove it
      if #b<1 then print(c)z()end    -- if b is empty, it means the subset is in a
                                     -- we print c and exit
    end                              -- else we loop again
    c=c+1                            -- with c+1
  goto q                             -- return to the start of this block
end

Luaをオンラインで試すことができます。また、次のコードサンプルをコピーして貼り付けて、いくつかのテストを実行できます。この関数が答えを見つけると終了する(そうでない場合は無限ループ)ので、test[]使用済みのインデックスを変更する必要があります(luaが1インデックス付きであることを忘れないでください:))。

function f(l)c=2 y,z=table.remove,os.exit while(l[1]<2)do y(l,1)if(#l<1)then print(1)z()end end ::q:: a={}for i=1,c do a[i]=1 end b={}for i=1,#l do b[i]=l[i]end while(a[#a]<b[1])do x=0 for i=(#a-c+1>0 and #a-c+1 or 1),#a do x=x+a[i]end a[#a+1]=x if a[#a]==b[1]then y(b,1)end if #b<1 then print(c)z()end end c=c+1 goto q end

test={{1,1,1},
{49, 97},
{55, 89, 144},
{1},
{6765},
{12, 23, 45, 89},
{100, 199}}

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