Pierwiastki binarne

19

Szukamy sekwencji

Weź liczby naturalne
1,2,3,4,5,6,7,8,9,10,11,12,13,14...

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

Połącz powyższe liczby
110111001011101111000100110101011110011011110...

Partition ten numer w prime-Kawałki
(kawałki zawierające doskonałą liczbę cyfr)
Najwyżsi są podejmowane w celu asceding2,3,5,7,11,13,17...

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

i znajdź sumę cyfr każdego fragmentu

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

Sekwencja

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

Wyzwanie

Znajdź nthtermin powyższej sekwencji

Wejście

Liczba całkowita n>0

Przypadki testowe

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

To jest Najkrótsza odpowiedź w bajtach wygrywa!


źródło
2
Powiązane (pierwsze trzy kroki są takie same)
Laikoni
4
Odebrane, ponieważ wydaje się, że jest to zbyt wiele wyzwań połączonych razem.
Esolanging Fruit

Odpowiedzi:

14

Łuska , 8 bajtów

Σ!CİpṁḋN

Wypróbuj online!

Wyjaśnienie

Σ!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
źródło
6

Galaretka , 12 bajtów

RÆNµSRBFṁRṪS

Wypróbuj online!

Jak to działa

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
źródło
5

05AB1E , 12 bajtów

Kod

Może być dość powolny w przypadku dużych liczb:

ÅpDOLbJs£`SO

Wykorzystuje kodowanie 05AB1E. Wypróbuj online!

Wyjaśnienie

Å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
źródło
4

Mathematica, 71 bajtów

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

Wypróbuj online!

J42161217
źródło
2

Galaretka , 16 bajtów

RBFṁ
RÆNSÇṫÆNC$S

Wypróbuj online!

Wyjaśnienie

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
mile
źródło
2

R , 206 200 bajtów

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

Wypróbuj online!

Algorytm próbuje także „zaoszczędzić” na przestrzeni, iteracyjnie usuwając bity podczas przechodzenia przez liczby pierwsze. Wydaje mi się, że konwersja dziesiętna na bit może być prawdopodobnie krótsza, ale nie mogłem wymyślić innych alternatyw.

Zaoszczędź 6 bajtów dzięki Jonathanowi Frenchowi.

Nie dotyczy
źródło
1
Myślę, że R wspiera powiązane zadanie; p=j=2jest dwa bajty krótszy niż p=2;j=2.
Jonathan Frech,
... co prawdopodobnie można zrobić a=p, oszczędzając jeszcze dwa bajty.
Jonathan Frech,
1
... i - nie wiem dlaczego - wydaje się również działać dla y=1, zastąpiony y=2, co daje 200 bajtów .
Jonathan Frech,
Dziękuję Ci. Y = 2 zastępuje bit dla cyfry 1. Działa, ponieważ dla n> 1 jest przycinany przy pierwszej iteracji, a dla n = 1 pętla for zapętla się do tyłu, zapewniając w ten sposób odpowiedź dla n = 3, która to wciąż 2 (nie tak źle).
NofP
2

JavaScript (ES6), 144 bajty

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

Nie golfił

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
}

Przypadki testowe

Justin Mariner
źródło
2

Python 2 , 114 bajtów

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

Wypróbuj online!

Dennis
źródło
2

JavaScript (ES6), 138 132 123 bajtów

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

Przypadki testowe

Wypróbuj online!

Próbny

Uwaga: Uwzględniono tutaj tylko „bezpieczne” przypadki testowe (gwarantowane działanie w Chrome, Firefox i Edge). Być może będziesz musiał zwiększyć rozmiar stosu wywołań swojego silnika, aby przejść inne.

Sformatowane i skomentowane

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
źródło
1

Perl 6 , 67 bajtów

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

Sprawdź to

Rozszerzony:

{  # 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
źródło
1

Python 2 , 143 139 133 bajtów

-4 bajty dzięki @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')

Wypróbuj online!

ovs
źródło
-2 bajty poprzez usunięcie niezgodnej wiązki testowej. Kolejne -2 przez przestawienie niektórych rzeczy.
Erik the Outgolfer
@EriktheOutgolfer bardzo dziękuję. Nadal byłem w stanie dodać moje stare testy z powrotem.
ovs
1

J, 48 bajtów

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

wyjaśniono

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

Wypróbuj online!

Jonasz
źródło
30 bajtów za pomocą key ( /.):_1({]+//.$$&;<@#:@#\)[:#~p:@i.
mil
super sprytny. dzięki mile.
Jonasz
0

JavaScript 1+ + substr, 135 bajtów

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
źródło
Co rozumiesz przez „4”? nie jesteś pewien wersji? Rozwinięcie tego, co masz na myśli, pomoże ulepszyć ten post.
FryAmTheEggman
Wiem, że działa, gdy JS5 nie przyszedł, ale nie jestem pewien, kiedy dokładnie
l4m2