Реверс-інженер послідовності N-Бохань [и]


15

РЕДАКТИРУЙТЕ: Я прийму відповідь у понеділок, 15.02.2016. Нехай байти коли-небудь будуть на вашу користь!

У своєму «Друк N-Боначі послідовності» виклик , @DJMcGoathem описує N-Боначі послідовності, в якій попередні N числа підсумовуються, замість традиційних 2 з послідовності Фібоначчі ( як кажуть, « дует nacci послідовності»). Потім він попросив взяти два входи, X і N, а потім вивести X- й номер N-- каналів.

Я пропоную навпаки.
Дана послідовність, виведіть, яка послідовність N- символів є підмножиною. Я кажу "підмножина", тому що:

  • А) ці послідовності нескінченні
  • Б) якщо дано початок послідовності, ви можете просто порахувати кількість провідних 1с

У випадку, якщо він може належати до декількох послідовностей N- DNA, обрав найнижчу.
У тому випадку, якщо вона не належить до жодної послідовності N-nacci , тоді ваша програма може робити що-небудь, крім друку чогось, що може бути помилково виведено. Ці поведінки включають (але не обмежуються ними): нескінченний цикл, помилка, збій, видалення (* кашель від кашлю * бдіння * кашель кашлю *) або створення чорної діри (доки ця чорна діра не створює нічого, що могло б помиляються за дійсний вихід).
Заради цієї проблеми, ці послідовності починають з 1. Це означає , що будь-які N пуски -nacci послідовності з N одиницями. Крім того, Nмає бути натуральним числом. Так що ніяких -1 -бонарів тощо.

Тестові приклади:

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).Мої, спіралі чорної діри сходяться до золотого співвідношення! Він повинен бути дійсним для послідовності дуоакчі!
Conor O'Brien

1
@ CᴏɴᴏʀO'Bʀɪᴇɴ Це може бути гарне золоте співвідношення, але НЕ підходьте біля чорної діри! youtube.com/watch?v=TTUQyEr-sg0
рівень річки Св.

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 Якщо n == 1, то ми ніколи не збільшуватиметься, тому нам потрібен масив 1-х, однак довгий вхід. Якщо n > 1, тоді нам потрібно щонайменше n1 за послідовністю. Таким чином, s+a.sizeохоплює n == 1будь-яку довжину a, і вона охоплює початок будь-якої іншої послідовності, тому ми можемо просто почати додавати sцифри з бою. Чи має це сенс?
Не те, що Чарльз

@Cyoce, і якщо ви задаєте інше запитання, в Ruby [1]*numberнадається масив 1 з довжиною number. Так x=[1]*(s+z=a.size)правонаступників a.sizeдо z, потім привласнює xмасив довжини 1 в 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...

Досить просте рішення, просто для того, щоб все прокотилося. Я буду більше працювати над гольфом, коли хтось відповість. Тут використовується дещо модифікована версія генератора N-Bonnaci з відповіді @ Data , тому реквізит до нього. Потім для кожного N-Bonnaci в діапазоні введення перевіряється, чи є вхід його послідовністю.


спробуйте ті самі пропозиції, які я йому дав: змініть f.appendнаf+=
Cyoce

@Cyoce ой так. Я не можу повірити, що я пропустив щось таке основне. fp
Джеймс

Чи ;потрібна остання ?
Кіос

1

Луа, 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]))
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.