Бінарний прайм-чункс


19

Ми шукаємо послідовність

Візьміть натуральні числа
1,2,3,4,5,6,7,8,9,10,11,12,13,14...

Перетворити на базу-2
1,10,11,100,101,110,111,1000,1001,1010,1011,1100,1101,1110...

Об’єднайте наведені числа
110111001011101111000100110101011110011011110...

Розділіть це число в прайм-камах
(фрагменти, що містять просте число цифр).
Прайми приймаються у порядку зростання2,3,5,7,11,13,17...

[11][011][10010][1110111][10001001101][0101111001101][1110...]

і знайдіть суму цифр кожного куска

Primes 2 3 5 7 11 13 17
Chunks [11][011][10010][1110111][10001001101][0101111001101][1110...]
SumOfDigits 2 2 2 6 5 8

Послідовність

2, 2, 2, 6, 5, 8, 9, 10, 14, 22, 11, 18, 25, 27, 32, 21, 28, 32, 40, 40, 49, 49, 32, 41, 49, 53, 63, 55, 63, 70, 87, 73, 51, 63, 71, 78, 78, 90, 107, 86, 96, 108, 115, 128, 138, 92, 83, 95, 102, 110, 130, 106, 122, 141, 149, 163, 130, 140, 151, 165, 181, 165, 204, 200, 234, 100, 130, 138, 167, 149, 169, 180, 209, 166, 189, 194, 222, 205, 234, 260, 216, 206, 217, 241, 240, 267, 289, 242, 274, 308, 286, 329, 338, 155, 189, 225, 197, 240, 272, 217, 254, 282, 287, 317, 281, 256, 299, 286, 331, 337, 316, 350, 354, 391, 367, 282, 327, 313, 364, 358, 348, 397, 406, 466 ...

Змагання

Знайдіть nthтермін вищезазначеної послідовності

Вхідні дані

Ціле число n>0

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

1->2   
3->2    
6->8    
36->78 
60->165    
160->581     
260->1099    
350->1345

Це Найкоротша відповідь у байтах виграє!


2
Пов'язані (перші три кроки однакові)
Лайконі

4
Зрозуміло, тому що це занадто сильно схоже на купу викликів, що розійшлися разом.
Esolanging Fruit

Відповіді:



6

Желе , 12 байт

RÆNµSRBFṁRṪS

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

Як це працює

RÆNµSRBFṁRṪS  Main link. Argument: n

R             Range; yield [1, ..., n].
 ÆN           N-th prime; yield P := [p(1), ..., p(n)].
   µ          Begin a new, monadic chain with argument P.
    S         Take the sum of P, yielding s := p(1) + ... + p(n).
     R        Range; yield [1, ..., s].
      B       Binary; convert all integers from 1 to s to base 2.
       F      Flatten the resulting array.
         R    Range; yield [[1, ..., p(1)], ..., [1, ..., p(n)]].
        ṁ     Mold; reshape the result to the left like the result to the right.
          Ṫ   Tail; take the last chunk.
           S  Take the sum, counting the set digits.

5

05AB1E , 12 байт

Код

Можна отримати досить повільно для великої кількості:

ÅpDOLbJs£`SO

Використовує кодування 05AB1E. Спробуйте в Інтернеті!

Пояснення

Åp              # Get a list of the first <input> primes
  DO            # Duplicate and sum the primes
    L           # Create the list [1, .., <sum>]
     bJ         # Convert to binary and join into a single string
       s£       # Get the slices [a[0:2], a[2:2+3], a[2+3:2+3+5], a[2+3+5:2+3+5+7], ...] 
                  corresponding to the list of primes
         `SO    # Get the last one and sum up it's digits



2

Желе , 16 байт

RBFṁ
RÆNSÇṫÆNC$S

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

Пояснення

RBFṁ  Helper link. Input: integer k
R     Range, [1, 2, ..., k]
 B    Convert each to a list of its binary digits
  F   Flatten
   ṁ  Shape it to length k

RÆNSÇṫÆNC$S  Main link. Input: integer n
R            Range, [1, 2, ..., n]
 ÆN          Get i'th prime for each
   S         Sum
    Ç        Call helper link
         $   Monadic chain
      ÆN       Get n'th prime
        C      Complement, 1 - n'th prime
     ṫ       Tail, take the last n'th prime digits
          S  Sum

2

R , 206 200 байт

function(n){a=p=j=y=2
for(i in 2:n-1){while(sum(y)<4*a){x=as.double(rev(intToBits(j)))
y=c(y,x[cumsum(x)>0])
j=j+1}
b=1:a
y=y[-b]
z=outer(k<-b+a,p,'%%')
p=c(a<-k[!apply(z<1,1,sum)][1],p)}
sum(y[1:a])}

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

Алгоритм також намагається "заощадити" на просторі шляхом ітеративного вилучення бітів, коли він переходить через праймери. Я вважаю, що перетворення десятків у біти, ймовірно, може бути коротшим, але я не міг з'ясувати інших альтернатив.

Збережено 6 байт завдяки Джонатану Французу.


1
Я думаю, що R підтримує ланцюгові завдання; p=j=2на два байти коротше, ніж p=2;j=2.
Джонатан Фрех

... що, можливо, також можна зробити a=p, заощадивши ще два байти.
Джонатан Фрех

1
... і - я не знаю чому - це також, здається, працює y=1, замінене на y=2, в результаті чого виходить 200 байт .
Джонатан Фрех

Дякую. Y = 2 замінює біт для цифри 1. Це працює, тому що для n> 1 він відрізається при першій ітерації, а для n = 1 - петлі циклу назад, таким чином забезпечуючи відповідь для n = 3, який ще 2 (не така вже й удача).
NofP

2

JavaScript (ES6), 144 байти

n=>eval("s=o=j=0;for(i=p=1;n;d>p&&(n--,s+=p))for(p++,d=2;p%d++;);while(b=Math.log2(++j)+1|0,i<=s)for(x=0;x++<b&i<=s;)o+=i++>s-p&&j<<x&1<<b?1:0")

Безумовно

n=>{
    s=o=j=0;
    for(i=p=1;n;d>p&&(n--,s+=p))
        for(p++,d=2;p%d++;);
    while(b=Math.log2(++j)+1|0,i<=s)
        for(x=0;x++<b&i<=s;)
            o+=i++>s-p&&j<<x&1<<b?1:0
    return o
}

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



2

JavaScript (ES6), 138 132 123 байт

N=>(n=k=1,g=s=>N?g((P=n=>n%--x?P(n):x<2)(x=++n)?s[n]?s.slice(--N&&n,n/!N):s+(n--,k++).toString(2):s):s.split`1`.length-1)``

Тестові справи

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

Демо

Примітка. Тут включені лише "безпечні" тестові випадки (гарантовано, що вони працюють у Chrome, Firefox та Edge). Можливо, вам доведеться збільшити розмір стека викликів вашого двигуна, щоб передати інші.

Відформатовано та прокоментовано

N => (                            // given N = index of the expected term
  n = k = 1,                      // n = current prime, k = current natural number
  g = s =>                        // g = recursive function taking s = binary string
    N ?                           //   if we haven't reached the correct chunk yet:
      g(                          //     do a recursive call to g():
        (P = n =>                 //       P() returns: true for prime
          n % --x ? P(n) : x < 2) //                    false for composite
        (x = ++n) ?               //       increment n; if n is prime:
          s[n] ?                  //         if s is long enough:
            s.slice(--N && n,     //           either remove this chunk (if N > 0)
                    n / !N)       //           or truncate it to the correct size (if N = 0)
          :                       //         else:
            s + (n--, k++)        //           append the next natural number to s
                .toString(2)      //           in binary format
        :                         //       else:
          s                       //         just look for the next prime
      )                           //     end of recursive call
    :                             //   else:
      s.split`1`.length - 1       //     return the number of 1's in the last chunk
)``                               // initial call to g() with an empty string

1

Perl 6 , 67 байт

{(1..*).map(|*.base(2).comb).rotor(grep *.is-prime,2..*)[$_-1].sum}

Перевірте це

Розширено:

{  # bare block lambda with implicit parameter 「$_」

  (

    1 .. *                # Range of all numbers starting with 1

  ).map(

    # WhateverCode lambda
    |                     # Slip each of these values into the outer list individually
      *                   # this is the parameter
      .base(2)            # convert base
      .comb               # split into digits


  ).rotor(                # split into chunks

    grep *.is-prime, 2..* # the sequence of prime numbers


  )[ $_ - 1]              # index into it using 1 based indexing

  .sum                    # find the sum
}

1

Пітон 2 , 143 139 133 байт

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

s='1';i=x=1
exec"s=s[i:];i+=1\nwhile~-all(i%x for x in range(2,i)):i+=1\nexec's+=bin(x)[2:];x+=1;'*i;"*input()
print s[:i].count('1')

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


-2 байти шляхом видалення несумісного тестового джгута. Ще -2 шляхом перестановки деяких речей.
Ерік Аутгольфер

@EriktheOutgolfer велике спасибі Я ще міг додати свої старі тести назад.
ов

1

J, 48 байт

([:+/-@{:{.+/{.[:}:[:(#:@[,])/1+[:i.1++/)@:p:@i.

пояснив

(                                                         )@:p:@i.  the first n primes, passed to...
       -@{: {.                    ...                               take "nth prime" elements from the tail of...
               +/                                                   sum the first n primes and...
                  {.                                                take that number of elements from...
                     [: }:                                          all but the last element of...   <----------------<
                                          1 + [: i. 1 + +/          sum first n primes, add 1 (so we have enough      |
                                                                    for case n=1) -- make that many natural numbers   |
                           [: (#:@[ , ])/                           reduce them by turning into lists of binary       |
                                                                    digits and catting, however the rightmost number  |
                                                                    won't get reduced, hence the need for ------------^
([: +/                                                              and sum those digits

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


30 байт за допомогою ключа ( /.):_1({]+//.$$&;<@#:@#\)[:#~p:@i.
миль

супер розумний. спасибі миль.
Іона

0

JavaScript 1+ + підряд, 135 байт

for(n=prompt(s=P=0),i=n*n*n*8;--i;)s=i.toString(2)+s;for(p=1;n;e=j?s:--n?P+=p:s.substr(P,p))for(j=p++;p%j--;);eval([].join.call(e,'+'))

Що ви маєте на увазі під "4?" ви не впевнені у версії? Розширення того, що ви маєте на увазі в організмі, допоможе покращити цю посаду.
FryAmTheEggman

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