বিপরীত প্রকৌশলী এন-বোনাচি ক্রম [গুলি]


15

সম্পাদনা: 2/15/2016, সোমবার আমি একটি উত্তর গ্রহণ করব। বাইটস আপনার পক্ষে সর্বদা থাকুক!

তাঁর "এন-বোনাচি সিকোয়েন্স প্রিন্ট করুন" চ্যালেঞ্জে , @ ডিজেএমসিগোথেম এন-বোনাচি সিকোয়েন্সগুলি বর্ণনা করেছেন, যেখানে পূর্ববর্তী এন সংখ্যাগুলি সংশ্লেষ করা হয়েছে, ফিবোনাচি সিকোয়েন্সের 2 তিহ্যবাহী 2 এর পরিবর্তে (" ডুয়ো ন্যাক্সি সিকোয়েন্স" হিসাবে বলা হয়েছে)। এরপরে তিনি দুটি ইনপুট, এক্স এবং এন নিতে বললেন, তারপরে এক্স তম এন- এনসি নম্বরটি আউটপুট করুন ।

আমি বিপরীত প্রস্তাব।
একটি অনুক্রম দেওয়া, আউটপুট যা N -nacci ক্রম এটি একটি উপসেট হয়। আমি বলি "উপসেট" কারণ:

  • ক) এই ক্রমগুলি অসীম
  • খ) যদি ক্রমটি শুরু করা হয়, আপনি কেবল শীর্ষস্থানীয় 1 এর সংখ্যা গণনা করতে পারেন

যে ক্ষেত্রে এটি একাধিক এন- ননসি সিক্যুয়েন্সের অন্তর্ভুক্ত হতে পারে , সর্বনিম্নটি ​​বেছে নিয়েছে।
যদি এটি কোনও এন-ন্যাক্সি অনুক্রমের সাথে সম্পর্কিত না হয় তবে আপনার প্রোগ্রামটি এমন কিছু মুদ্রণ ব্যতীত অন্য কিছু করতে পারে যা আউটপুটটির জন্য ভুল হতে পারে। এই আচরণগুলির মধ্যে অন্তর্ভুক্ত রয়েছে (তবে সীমাবদ্ধ নয়): অসীম লুপ, ত্রুটি, ক্রাশ, নিজেকে মুছে ফেলুন (* কাশি কাশি * নজরদারি * কাশি কাশি *), বা একটি ব্ল্যাকহোল তৈরি করুন (যতক্ষণ না এই ব্ল্যাকহোলটি এমন কিছু উত্পাদন করতে পারে না) বৈধ আউটপুট জন্য ভুল হতে হবে)।
এই চ্যালেঞ্জের স্বার্থে, এই সিকোয়েন্সগুলি 1 দিয়ে শুরু হয় This এর অর্থ কোনও এন- ন্যানসি সিকোয়েন্স এন এর সাথে শুরু হয় । তদুপরি, এনঅবশ্যই একটি ধনাত্মক পূর্ণসংখ্যা হবে। সুতরাং -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).আমার, ব্ল্যাকহোলের সর্পিলগুলি সোনার অনুপাতে রূপান্তরিত হচ্ছে! এটি অবশ্যই একটি ডুয়েসি ক্রম জন্য বৈধ আউটপুট হতে হবে!
কনর ও'ব্রায়ান

1
@ CᴏɴᴏʀO'Bʀɪᴇɴ এটি একটি সুন্দর সোনার অনুপাত হতে পারে তবে ব্ল্যাকহোলের কাছে যাবেন না! youtube.com/watch?v=TTUQyEr-sg0
স্তর নদী সেন্ট

1
ওহ আমার, এটি আমি যা ভাবছিলাম তার থেকে অনেক বেশি কঠিন ...
গ্যামার কর্পস

@ 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}}

Ungolfed:

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)ঠিক কীভাবে কাজ করে ?
সাইওস

@ কয়েস যদি হয় n == 1, তবে আমরা কখনই বৃদ্ধি পাব না, সুতরাং ইনপুট দীর্ঘ হলেও আমাদের 1 এর অ্যারে প্রয়োজন। যদি n > 1, তবে nসিকোয়েন্সের জন্য আমাদের কমপক্ষে 1 এর প্রয়োজন । সুতরাং যে কোনও দৈর্ঘ্যের জন্য s+a.sizeকভার রয়েছে এবং এটি অন্য যে কোনও ক্রমের শুরুতে কভার করে যাতে আমরা কেবল লড়াইয়ের বাইরে অঙ্কগুলি যুক্ত করা শুরু করতে পারি । যে জানার জন্য? n == 1as
চার্লস

@ কিউস এবং আপনি যদি রুবিতে আলাদা প্রশ্ন জিজ্ঞাসা করছেন [1]*numberতবে দৈর্ঘ্য সহ 1 এর অ্যারে দেয় number। সুতরাং x=[1]*(s+z=a.size)নির্ধারিত a.sizeহয় z, তারপরে x1 দৈর্ঘ্যের একটি অ্যারেরকে বরাদ্দ করে s+z
চার্লস

3

পাইথন 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...

মোটামুটি সোজা সমাধান, কেবল জিনিসগুলিকে ঘূর্ণায়মান করার জন্য। অন্য কেউ উত্তর দিলে আমি এটি গল্ফ করে আরও কাজ করব। এটি @ ডেটার উত্তর থেকে এন-বোনাসি জেনারেটরের কিছুটা সংশোধিত সংস্করণ ব্যবহার করে , তাই তাকে প্রপস করে। তারপরে ইনপুটটির পরিসীমাতে প্রতিটি এন-বোনাচির জন্য, ইনপুটটি এটির একটি অনুচ্ছেদ কিনা তা পরীক্ষা করে।


পরিবর্তন: একই পরামর্শ আমি তাকে দিলেন চেষ্টা f.appendজন্যf+=
Cyoce

পছন্দ করুন আমি বিশ্বাস করতে পারি না যে আমি এমন কিছুকে মিস করেছি যে এটি মৌলিক। এফপি
জেমস

চলার ;দরকার কি?
সাইয়েস

1

অ্যাপ্লিকেশন Lua, 324 323 বাইট

আমি যখন অন্য জমা দিতে দেখি তখন আমার মনে হয় আমার কোডে কিছু ভুল আছে ... তবে তখন আমি মনে করি এটি লুয়া, এবং এই সমস্ত অভিনব কার্যকারিতা নেই: '(

এটি অনেক মজা ছিল, আমাকে কিছুটা সময় নিয়েছিল।

সম্পাদনা করুন: একটি সাধারণ কৌতুক সহ 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

অবহেলিত এবং ব্যাখ্যা

লুয়ার কোনও সেট, উপসেট, বা কোনও অ্যারে / টেবিলের কোনও সূচক / কী ব্যবহার না করে মান রয়েছে কিনা তা যাচাই করার কোনও উপায় নেই। সে কারণেই আমি প্যারামিটার হিসাবে নেওয়া অ্যারে থেকে উপাদানগুলি সরিয়ে নেওয়ার সিদ্ধান্ত নিয়েছি। এরই মধ্যে আমি কোন উপাদানগুলির ইতিমধ্যে গণনা করা হয়েছে এবং এটি যদি মিলে যায় তার রেকর্ড রাখি।

  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

আপনি লুয়া অনলাইনে চেষ্টা করতে পারেন এবং কয়েকটি পরীক্ষা চালানোর জন্য আপনি নীচের কোডের নমুনাটি অনুলিপি / পেস্ট করতে পারেন। উত্তরটি সন্ধান করার পরে এই ফাংশনটি প্রস্থান করার সাথে সাথে (অন্যথায় অসীম লুপটি পাওয়া যাবে), আপনাকে test[]ব্যবহৃত সূচকটি পরিবর্তন করতে হবে (লুয়া 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.