Сегментовані числа


15

Послідовність сегментованих чисел або простих чисел вимірювання ( OEIS A002048 ) - це послідовність чисел таким чином, що кожен член є найменшим додатним (більшим за нуль) числом, яке не може бути складено з суми попередніх послідовних чисел, з a(0) = 1.

Приклад

Для обчислення a(7)спочатку обчислюємо a(0->6) = [1, 2, 4, 5, 8, 10, 14]. потім ми починаємо з нуля і переходимо через числа, поки не знайдемо одне, що не є сумою одного або кількох послідовних чисел у послідовності.

1  = 1
2  = 2
3  = 1 + 2
4  = 4
5  = 5
6  = 2 + 4
7  = 1 + 2 + 4
8  = 8
9  = 4 + 5
10 = 10
11 = 2 + 4 + 5
12 = 1 + 2 + 4 + 5
13 = 5 + 8
14 = 14
15 = ????

Оскільки п’ятнадцять не може бути здійснено шляхом підсумовування будь-якої послідовної послідовності, а кожне число менше може бути п’ятнадцять - це наступне число у послідовності. a(7) = 15

Завдання

Ваше завдання - взяти число (за допомогою стандартних методів) і вивести n-й член у цій послідовності (за допомогою стандартних методів виведення). Це код-гольф, і ви будете набрані як такі.

Випробування

0 -> 1
1 -> 2
2 -> 4
3 -> 5
4 -> 8
5 -> 10
6 -> 14
7 -> 15
8 -> 16
9 -> 21

Відповіді:


12

Haskell, 62 58 байт

-4 байти завдяки @xnor!

(x:y)#z=x:filter(`notElem`scanl(+)x z)y#(x:z)
([1..]#[]!!)

Послідовність 0-індексована.


1
Я думаю, вам потрібні ще два байти і оточити останній рядок, ()щоб зробити його належною функцією. Часткове застосоване !!- це розділ оператора, і його потрібно включити, ()щоб зробити його функцією. Без цього просто фрагмент, який лише стає функцією (або "значенням" для використання строгих термінів Haskell) з відсутнім аргументом.
німі

1
Прекрасний метод! Імпорт, здається, є надмірним; filter(`notElem`scanl(+)x z)yповинен робити.
xnor

7

Perl, 50 49 байт

Включає +1 для -p

Запустити з введенням даних на STDIN:

segmented.pl <<< 7

segmented.pl:

#!/usr/bin/perl -p
${$_-=$\}++for@F;1while${-++$\};++$#F<$_&&redo}{

Пояснення

@Fмістить перелік (негативних) сум послідовних чисел, які закінчуються поточним останнім номером. Коли буде знайдено нове число, список розширюється на 0, а потім усі значення зменшуються на нове число, підтримуючи інваріант.

Global %::використовується як хеш-картування всіх (негативних) чисел, які були переглянуті (через @F), до ненульового значення.

$\є поточним числом і збільшується до тих пір, поки воно не досягне значення, яке ще не є %::.

Трохи обережно ставлячись до порядку, у якому все відбувається, ініціалізація не потрібна, 1автоматично стане першим номером.

Оскільки розмір @F- скільки цифр, було сформовано, його можна використовувати як умову зупинки


4

05AB1E , 17 16 байт

Xˆ$µ>D¯ŒOså_i¼Dˆ

Пояснення

Xˆ                # initialize global array to [1]
  $               # push 1 and input to stack
   µ              # while counter != input
    >             # increase variable on stack
      ¯ŒO         # list of all sums of consecutive number in global array
     D   så_i     # if current stack value is not in the list
             ¼    # increase counter
              Dˆ  # add current stack value to global array

Спробуйте в Інтернеті!

Збережено 1 байт завдяки Аднану


Чи $замість Xsроботи?
Аднан

@Adnan: Так, звичайно. Дурний мене. Спасибі!
Емінья

4

Желе , 14 13 11 байт

Ḷ߀Ẇ;ḅ1‘ḟ$Ṃ

Спробуйте в Інтернеті!

Як це працює

Ḷ߀Ẇ;ḅ1‘ḟ$Ṃ  Main link. Argument: n

Ḷ            Unlength; yield [0, ..., n - 1].
 ߀          Recursively map the main link over the range.
   Ẇ         Window; yield all subarrays of consecutive elements of the result.
    ;        Append n to the array of subarrays.
     ḅ1      Convert all subarrays from base 1 to integer.
             This is equivalent to S€ (sum each), but it allows ; to hook.
         $   Combine the previous two links into a monadic chain.
       ‘       Increment all sums.
        ḟ      Filter; remove the original sums from the incremented ones.
          Ṃ  Compute the minimum.

2

Pyth - 19 17 байт

Чорт з-під одного руйнує всі мої наслідки. (Кол Однакові байт, literaly збільшенням Q: =hQesmaYf!}TsM.:Y)

esmaYf!}TsM.:Y)1h

Тестовий сюїт .


Використання скорочення зберігає (лише) один байт. Очікується більше ...eu+Gf!}TsM.:G))hQY
Jakube

1
Мапа @Jakube зазвичай коротша для таких референтних послідовностей, як ці
Малтісен

2

Javascript, 125 112 110 байт

Збережено 2 байти завдяки @Neil

f=n=>{a=[[]];for(i=1,z=0;z<=n;i++)a.some(b=>b.includes(i))||(a[z+1]=[0,...a[z++]||[]].map(v=>i+v));alert(i-1)}

Попередні відповіді

112 байт завдяки @Neil:

f=n=>{a=[[]];for(i=1,z=0;z<=n;i++)if(!a.some(b=>b.includes(i))){a[z+1]=[0,...a[z++]||[]].map(v=>i+v)}alert(i-1)}

125 байт:

f=n=>{a=[[]];for(i=1,k=z=0;z<=n;i++)if(a.every(b=>b.every(c=>c-i))){a[i]=[i].concat((a[k]||[]).map(v=>i+v));k=i,z++}alert(k)}

1
Бо b.every(c=>c-i)я б спробував !b.includes(i)або, можливо, !a.some(b=>b.includes(i))спрацював, хоча [0,...a[k]||[]].map(v=>i+v)міг би замінити [i].concat((a[k]||[]).map(v=>i+v)). Також вам справді потрібно k?
Ніл

1
Тепер, коли у вас if(!...){...}є лише одна заява, ви, ймовірно, можете її замінити на ...||(...)або ...?0:....
Ніл

1

Пітон, 113 105 92 80 байт

s=F={1}
x=1
exec"while{x}<=s:x+=1\nF={x+j for j in{0}|F};s|=F\n"*input()
print x

Остаточні байти, які я врятував, були натхнені відповіддю Перлана Тона: мій Fробить те саме, що і його @F; моє sробить по суті те саме, що і його %::.


1

JavaScript (ES6), 77 байт

(n,a=[],s=a,i=1)=>s[i]?f(n,a,s,i+1):--n?f(n,[0,...a].map(j=>s[j+=i]=j),s,i):i

В основному рекурсивний порт алгоритму відповіді Perl @ TonHospel.

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