Prime-Chunks Binários

19

Estamos procurando uma sequência

Pegue os números naturais
1,2,3,4,5,6,7,8,9,10,11,12,13,14...

Converter em base-2
1,10,11,100,101,110,111,1000,1001,1010,1011,1100,1101,1110...

Concatene os números acima
110111001011101111000100110101011110011011110...

Particionar esse número em Prime-Chunks
(pedaços contendo um número primo de dígitos)
Primes são obtidos em ordem de subida2,3,5,7,11,13,17...

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

e encontre a soma dos dígitos de cada pedaço

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

A sequência

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 ...

O desafio

Encontre o nthtermo da sequência acima

Entrada

Um inteiro n>0

Casos de teste

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

Este é o . A resposta mais curta em bytes vence!


fonte
2
Relacionados (os três primeiros passos são os mesmos) #
Laikoni 21/10
4
Voto negativo, porque isso parece muito com um monte de desafios reunidos.
Esolanging Fruit

Respostas:

14

Casca , 8 bytes

Σ!CİpṁḋN

Experimente online!

Explicação

Σ!CİpṁḋN
       N   Start with the infinite list of natural numbers.
     ṁḋ    Convert each to its binary representation and join them all together. (A)
   İp      Get the infinite list of primes. (B)
  C        Split (A) into chunks of lengths (B).
 !         Retrieve the nth chunk (where n is the input).
Σ          Sum the bits in this chunk.
Martin Ender
fonte
6

Gelatina , 12 bytes

RÆNµSRBFṁRṪS

Experimente online!

Como funciona

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.
Dennis
fonte
5

05AB1E , 12 bytes

Código

Pode ficar bem lento para grandes números:

ÅpDOLbJs£`SO

Usa a codificação 05AB1E. Experimente online!

Explicação

Å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
Adnan
fonte
4

Mathematica, 71 bytes

(Tr/@TakeList[Join@@IntegerDigits[Range[#^2+1],2],Prime~Array~#])[[#]]&   

Experimente online!

J42161217
fonte
2

Gelatina , 16 bytes

RBFṁ
RÆNSÇṫÆNC$S

Experimente online!

Explicação

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
milhas
fonte
2

R , 206 200 bytes

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])}

Experimente online!

O algoritmo tenta também "economizar" no espaço, removendo iterativamente os bits à medida que circula pelos primos. Eu sinto que a conversão decimal em bits provavelmente poderia ser mais curta, mas não consegui descobrir outras alternativas.

Economizou 6 bytes graças a Jonathan French.

NofP
fonte
11
Eu acho que R suporta atribuição encadeada; p=j=2é dois bytes menor que p=2;j=2.
Jonathan Frech
... o que provavelmente também pode ser feito a=p, economizando mais dois bytes.
Jonathan Frech
11
... e - não sei por que - também parece funcionar y=1, substituído por y=2, resultando em 200 bytes .
Jonathan Frech
Obrigado. Ey = 2 substitui o bit pelo numeral 1. Funciona porque para n> 1, é removido na primeira iteração e para n = 1, o loop for volta para trás, fornecendo a resposta para n = 3, que ainda é 2 (não é tão ruim assim).
NofP 21/10
2

JavaScript (ES6), 144 bytes

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")

Ungolfed

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
}

Casos de teste

Justin Mariner
fonte
2

Python 2 , 114 bytes

n=input();k=m=1;p=[0];s=''
exec's+=bin(k)[2:];p+=m%k*[k+p[-1]];m*=k*k;k+=1;'*n*n*2
print s[p[n-1]:p[n]].count('1')

Experimente online!

Dennis
fonte
2

JavaScript (ES6), 138 132 123 bytes

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)``

Casos de teste

Experimente online!

Demo

Nota: Apenas os casos de teste 'seguros' estão incluídos aqui (com garantia de funcionar no Chrome, Firefox e Edge). Pode ser necessário aumentar o tamanho da pilha de chamadas do seu mecanismo para passar pelos outros.

Formatado e comentado

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
Arnauld
fonte
1

Perl 6 , 67 bytes

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

Teste-o

Expandido:

{  # 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
}
Brad Gilbert b2gills
fonte
1

Python 2 , 143 139 133 bytes

-4 bytes graças a @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')

Experimente online!

ovs
fonte
-2 bytes removendo o equipamento de teste incompatível. Outro -2 reorganizando algumas coisas.
Erik the Outgolfer
@EriktheOutgolfer muito obrigado. Ainda consegui adicionar meus testes antigos novamente.
ovs 21/10
1

J, 48 bytes

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

explicado

(                                                         )@: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

Experimente online!

Jonah
fonte
30 bytes usando key ( /.):_1({]+//.$$&;<@#:@#\)[:#~p:@i.
miles
super esperto. graças milhas.
Jonah
0

JavaScript 1+ + substr, 135 bytes

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,'+'))
l4m2
fonte
O que você quer dizer com "4"? você não tem certeza da versão? Expandir o que você quer dizer no corpo ajudaria a melhorar esta postagem.
FryAmTheEggman #
Eu sei que é executado quando JS5 não veio, mas não sei exatamente quando
l4m2