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


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стоит сделать.
кнор

7

Perl, 50 49 байтов

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

Запустить с вводом на STDIN:

segmented.pl <<< 7

segmented.pl:

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

объяснение

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

Глобальный %:: используется как хэш, отображающий все (отрицательные) числа, которые были просмотрены (сквозные @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

Тестовый пакет .


Использование Reduce сохраняет (только) один байт. Ожидается больше ...eu+Gf!}TsM.:G))hQY
Якуб

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

Python, 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

Последние байты, которые я сохранил, были вдохновлены ответом Тоня на Perl: my 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.