Codegolf - Вычислить Сумму Первых N Простых Чисел

  • Автор темы Роман3648
  • Обновлено
  • 23, Oct 2024
  • #1

Я удивлен, что этой проблемы еще нет, ведь она настолько очевидна. (Или я удивлен, что не смог его найти, и кто-нибудь отметит его как дубликат.)

Задача

Учитывая неотрицательное целое число \$n\$, вычислите сумму первых \$n\$ простых чисел и выведите ее.

Пример №1

Для \$n = 5\$ первые пять простых чисел:

  • 2
  • 3
  • 5
  • 7
  • 11

Сумма этих чисел равна \$2 + 3 + 5 + 7 + 11 = 28\$, поэтому программа должна вывести \$28\$.

Пример №2

Для \$n = 0\$ простые числа «первые нули» отсутствуют. И сумма без чисел, конечно же, равна \$0\$.

Правила

  • Вы можете использовать встроенные функции, например, чтобы проверить, является ли число простым.
  • Это так, поэтому побеждает наименьшее количество байтов на каждом языке!

#код-гольф #код-гольф #простые числа

Роман3648


Рег
11 Jun, 2013

Тем
86

Постов
209

Баллов
649
  • 26, Oct 2024
  • #2

6502 машинный код подпрограмма, 75 байт

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 ;    sum of first n terms for input n

pz  each term is the next prime after the previous term
 

Ожидает указатель на какое-то временное хранилище в ;pz / Seq.sum и количество простых чисел, в которых нужно суммировать n . Returns the sum in Seq.take (регистр аккума).

Никогда не делал простых проверок в машинном коде 6502, так что вот оно наконец ;)

Обратите внимание, что это начинает давать неправильные результаты для входных данных >= 14. Это из-за переполнения, код работает с «натуральным» диапазоном чисел 8-битной платформы, который Seq.filter for без подписи.

Комментируемая дизассемблирование

id

Пример программы на ассемблере C64, использующей процедуру:

Онлайн демо

Код в синтаксисе ca65:

Seq.initInfinite ||answer||

Питон 2, 49 байт

let f n=Seq.initInfinite id|>Seq.filter(fun p->p>1&&Seq.exists(fun x->p%x=0){2..p-1}|>not)|>Seq.take n|>Seq.sum

Использует теорему Вильсона (как я полагаю, представленную на сайте xnor) здесь)

Попробуйте онлайн!

Функция Explanation: 0{{T1+:Tmp!}gT}li*]:+ Original code { }li* Repeat n times { } Block T Get variable T | stack: T 1+ Add one | Stack: T+1 :T Store in variable T | Stack: T+1 mp! Is T not prime? | Stack: !(isprime(T)) g Do while condition at top of stack is true, pop condition T Push T onto the stack | Stack: Primes so far 0 ] Make everything on stack into an array, starting with 0 (to not throw error if n = 0)| Stack: array with 0 and all primes up to n :+ Add everything in array is recursive, with an initial input of 0{{T1+:Tmp!}gT}li*]:+ и хвост, когда ~p - prime_numbers > - first_n(^, input) s - sum(^) reaches zero, yielding that zero (due to the logical ~p>s ); n,s=input(),0 x=2 while n: if all(x%i for i in range(2,x)):n-=1;s+=x x+=1 print s is decremented whenever f=lambda n:n and prime(n)+f(n-1) from sympy import* , тестовый номер, который увеличивается с каждым вызовом s , is prime. The prime test is then whether \$(n-1)!\ \equiv\ -1 \pmod n\$ for which we keep a track of a square of the factorial in ʁ # Range from 0 to input ǎ # Map to a_th prime .

 

Istorik


Рег
13 Jun, 2010

Тем
82

Постов
188

Баллов
638
  • 26, Oct 2024
  • #4

05AB1E, 3 байты

s

Попробуйте онлайн.

Объяснение:

in # Read input and convert to int dQ2j;o_ # Check if input is 0. If so, output and exit 1-2~d:^= # Subtract 1 from input and save it as `^` [d@P~1-] # Duplicate the top of the stack (call it k) and push the k-th prime. Finally swap the two top items in the stack and subtract 1. Stack before: [k] Stack after: [k-1, k-th prime] :^`* # Repeat the above a `^` number of times. Stack before: [n] Stack after: [0, 3, 5, ..., n-th prime, 2] [+]:^`1+* # Add the two top items in the stack a total of (`^`+1) number of times o; # Output the sum and exit. ||answer||

Java 8, 89 байт

@P

Попробуйте онлайн.

Объяснение:

indQ2j;o_1-2~d:^=[d@P~1-]:^`*[+]:^`1+*o; ||answer||

Перл 6, 31 байт

./jael --explain '#&kȦ' ORIGINAL CODE: #&kȦ EXPANDING EXPLANATION: Ȧ => .a! EXPANDED CODE: #&k.a!, # , repeat (p1) times: & push number of iterations of this loop k push nth prime . push the value under the tape head a push p1 + p2 ! write p1 to the tape head ␄ print machine state

Попробуйте онлайн!

#&kȦ built-in is unfortunately long.

 

Swat5


Рег
24 Apr, 2005

Тем
74

Постов
199

Баллов
599
  • 26, Oct 2024
  • #6

Брахилог, 8 7 байт

->n{Prime.take(n).sum}

Попробуйте онлайн!

Сэкономлен 1 байт благодаря @sundar.

Объяснение

ruby -rprime ||answer||

Шелуха, 4 байта

+/pco∘⍳ ⍳ ⍝ Generate the range from 1 to the argument ∘ ⍝ Compose pco ⍝ P-colon (p:); without a left argument, it generates the first <right_arg> primes. +/ ⍝ Sum

Попробуйте онлайн!

Генерирует Ябесконечный список пчисла времени и вычисляет сумму первых \$N\$ ( ⎕CY'dfns' )

 

Vierlyidiorge60


Рег
25 Oct, 2024

Тем
82

Постов
171

Баллов
631
  • 26, Oct 2024
  • #8

сетчатка, 41 байт

+/pco∘⍳

Попробуйте онлайн! Я хотел продолжать добавлять 1, пока не найду r{|6m|+ Unpacked program, implicit input r 0-based range { m Map: |6 n-th prime (0-based) |+ Sum Implicit output primes but I couldn't work out how to do that in Retina so I resorted to a nested loop. Explanation:

ê☺Γ☼èY

Начните с 1.

f=(k,n=2)=>k&&(g=d=>n%--d?g(d):d<2&&k--&&n)(n)+f(k,n+1)

Петля ;@ }hA :Get the first n numbers in the sequence: a : Get the smallest number °X : Which is greater than the previous result _j} : And is prime :Implicitly output the sum times.

;@_j}a°X}hA

Сделайте копию предыдущего значения и увеличьте его.

-x

Продолжайте увеличивать его, пока он составной. ( T p(T)(T a){if(a<4)return 1;for(T i=2;i<a;)if(!(a%i++))return 0;return 1;}T f(T)(T n){T c,v=1;while(n)if(p(++v))c+=v,--n;return c;} closes the outer loop.)

for (int i = 0; i < 10; ++i) printf("%d => %d\n", i, f(i));

Удалить оригинал n .

f

Суммируем и переводим в десятичную дробь.

 

Jabra90


Рег
07 Apr, 2020

Тем
79

Постов
173

Баллов
598
  • 26, Oct 2024
  • #9

МАТЛ, 4 байта

p

Попробуйте онлайн!

Объяснение:

#define R return int p(int a){if(a<4)R 1;for(int i=2;i<a;++i)if(!(a%i))R 0;R 1;}int f(int n){int c=0,v=1;while(n)if(p(++v))c+=v,--n;R c;} ||answer||

PHP, 66 байт

с использованием моя собственная основная функция снова ...

int p(int a){if(a<4)return 1;for(int i=2;i<a;++i)if(!(a%i))return 0;return 1;}int f(int n){int c=0,v=1;while(n)if(p(++v)){c+=v;--n;}return c;}

Запустить как трубу с f(n,i,j,s){s=0;for(i=2;n;i++)for(j=2;j/i?s+=i,n--,0:i%j++;);return s;} or попробуй онлайн.

авария

True ||answer||

Хаскелл, 48 байт

\p-> all((>0).mod p)[2..p-1]

Попробуйте онлайн!

Примечание: sum.(`take`[p|p<-[2..],all((>0).mod p)[2..p-1]]) is not a valid prime check, since it is for(;$k<$argn; # while counter < argument $i-1|| # 3. if divisor is 1 (e.g. $n is prime) $s+=$n # add $n to sum +!++$k # and increment counter ) for($i=++$n; # 1. increment $n --$i&&$n%$i;); # 2. find largest divisor of $n smaller than $n: echo$s; # print sum и для \$0,1\$. Но мы можем обойти это, начав с \$2\$, так что в данном случае этого достаточно.

 

WEB-SCHOOL1


Рег
21 Feb, 2018

Тем
61

Постов
218

Баллов
533
  • 26, Oct 2024
  • #11

C, C++, D: 147 142 байта

for(;$k<$argn;$i-1||$s+=$n+!++$k)for($i=++$n;--$i&&$n%$i;);echo$s;

5-байтовая оптимизация для C и C++:

-2 байта благодаря Захарию

% Implicit input: 5 : % Range: [1, 2, 3, 4, 5] Yq % The n'th primes: [2, 3, 5, 7, 11] s % Sum: 28

:Yqs tests if a number is a prime, _ суммирует 1 first numbers

Код, используемый для тестирования:

С/С++:

^_

D Оптимизированный ответ Захари, 133 131 байт

D имеет систему шаблонов для гольфа

) ||answer||

Япт )/¶(__+)\1+$/+`$ _ , 11 bytes

$ $%"_

Попробуйте онлайн!

Сэкономлено несколько байт благодаря новой языковой функции.

Объяснение:

n ||answer||

JavaScript (ES6), 55 байт

"$+"{`

Попробуйте онлайн!

 

Даринкаалекса


Рег
10 Apr, 2011

Тем
64

Постов
198

Баллов
528
  • 26, Oct 2024
  • #12

Стакс, 6 байты

K`_

Запустите и отладьте его

Объяснение:

n ||answer||

APL (Диалог Юникод), 7 + 9 = 16 байт

K`_ "$+"{`$ $%"_ )/¶(__+)\1+$/+`$ _ ^_ _

Попробуйте онлайн!

9 дополнительных байтов для импорта Sum@Primes (and every other) Dfn: Σ↑

Как:

Σ↑İp ||answer||

Рубин, 22 + 7 = 29 байт

Беги с ~l Create a list of length input ṗᵐ Each element of the list must be prime ≠ All elements must be distinct ≜ Find values that match those constraints + Sum (+7)

~lṗᵐ≠≜+ ||answer||

Париж/GP, 20 байт

1#.p:@i.

Попробуйте онлайн!

 

Serdanilo


Рег
18 Aug, 2011

Тем
71

Постов
184

Баллов
549
  • 26, Oct 2024
  • #13

ИАЭЛЬ, 5 байт

is-prime

Пояснение (создается автоматически):

{sum grep(&is-prime,2..*)[^$_]} ||answer||

Ретикулярный, 52 40 байт

n->{ // Method with integer as both parameter and return-type int r=0, // Result-sum, starting at 0 i=2, // Prime-integer, starting at 2 t,x; // Temp integers for(;n>0 // Loop as long as `n` is still larger than 0 ; // After every iteration: r+=t>1? // If `t` is larger than 1 (which means `t` is a prime): t // Increase `r` by `t` +0*n-- // And decrease `n` by 1 : // Else: 0) // Both `r` and `n` remain the same for(t=i++, // Set `t` to the current `i`, and increase `i` by 1 afterwards x=2; // Set `x` to 2 x<t; // Loop as long as `x` is still smaller than `t` t=t%x++<1? // If `t` is divisible by `x`: 0 // Set `t` to 0 : // Else: t); // `t` remains the same // If `t` is still the same after this loop, it means it's a prime return r;} // Return the result-sum

Попробуйте онлайн!

Объяснение

Интересный факт: Reticular не считает 2 простым числом, поэтому инструкция n->{int r=0,i=2,t,x;for(;n>0;r+=t>1?t+0*n--:0)for(t=i++,x=2;x<t;t=t%x++<1?0:t);return r;} which gives the \$n\$-th prime in reality gives the \$(n+1)\$-th prime and due to this we have to add the first prime 2 manually.

Åp # List of the first N primes (N being the implicit input) # i.e. 5 → [2,3,5,7,11] O # Sum of that list # i.e. [2,3,5,7,11] → 28 ||answer||

Виксал, 2 байта, ÅpO

RÆNS

Попробуйте!

Объяснение

p

Наконец, просуммируйте с f flag

Отказ от ответственности: мой первый ответ Vyxal

 

Filantrop


Рег
07 Nov, 2004

Тем
63

Постов
191

Баллов
536
  • 26, Oct 2024
  • #16

F#, 111 байт

f=lambda n,t=1,p=1:n and p%t*t+f(n-p%t,t+1,p*t*t)

Попробуйте онлайн!

.import primesum ; link with routine above .segment "BHDR" ; BASIC header .word $0801 ; load address .word $080b ; pointer next BASIC line .word 2018 ; line number .byte $9e ; BASIC token "SYS" .byte "2061",$0,$0,$0 ; 2061 ($080d) and terminating 0 bytes .bss linebuf: .res 4 ; maximum length of a valid unsigned ; 8-bit number input convbuf: .res 3 ; 3 BCD digits for unsigned 8-bit ; number conversion primebuf: .res $100 ; buffer for primesum function .data prompt: .byte "> ", $0 errmsg: .byte "Error parsing number, try again.", $d, $0 .code lda #$17 ; set upper/lower mode sta $d018 input: lda #<prompt ; display prompt ldy #>prompt jsr $ab1e lda #<linebuf ; read string into buffer ldy #>linebuf ldx #4 jsr readline lda linebuf ; empty line? beq input ; try again lda #<linebuf ; convert input to int8 ldy #>linebuf jsr touint8 bcc numok ; successful -> start processing lda #<errmsg ; else show error message and repeat ldy #>errmsg jsr $ab1e bcs input numok: sta $2 lda #<primebuf sta $fb lda #>primebuf sta $fc jsr primesum ; call function to sum primes tax ; and ... lda #$0 ; jmp $bdcd ; .. print result ; read a line of input from keyboard, terminate it with 0 ; expects pointer to input buffer in A/Y, buffer length in X .proc readline dex stx $fb sta $fc sty $fd ldy #$0 sty $cc ; enable cursor blinking sty $fe ; temporary for loop variable getkey: jsr $f142 ; get character from keyboard beq getkey sta $2 ; save to temporary and #$7f cmp #$20 ; check for control character bcs checkout ; no -> check buffer size cmp #$d ; was it enter/return? beq prepout ; -> normal flow cmp #$14 ; was it backspace/delete? bne getkey ; if not, get next char lda $fe ; check current index beq getkey ; zero -> backspace not possible bne prepout ; skip checking buffer size for bs checkout: lda $fe ; buffer index cmp $fb ; check against buffer size beq getkey ; if it would overflow, loop again prepout: sei ; no interrupts ldy $d3 ; get current screen column lda ($d1),y ; and clear and #$7f ; cursor in sta ($d1),y ; current row output: lda $2 ; load character jsr $e716 ; and output ldx $cf ; check cursor phase beq store ; invisible -> to store ldy $d3 ; get current screen column lda ($d1),y ; and show ora #$80 ; cursor in sta ($d1),y ; current row lda $2 ; load character store: cli ; enable interrupts cmp #$14 ; was it backspace/delete? beq backspace ; to backspace handling code cmp #$d ; was it enter/return? beq done ; then we're done. ldy $fe ; load buffer index sta ($fc),y ; store character in buffer iny ; advance buffer index sty $fe bne getkey ; not zero -> ok done: lda #$0 ; terminate string in buffer with zero ldy $fe ; get buffer index sta ($fc),y ; store terminator in buffer sei ; no interrupts ldy $d3 ; get current screen column lda ($d1),y ; and clear and #$7f ; cursor in sta ($d1),y ; current row inc $cc ; disable cursor blinking cli ; enable interrupts rts ; return backspace: dec $fe ; decrement buffer index bcs getkey ; and get next key .endproc ; parse / convert uint8 number using a BCD representation and double-dabble .proc touint8 sta $fb sty $fc ldy #$0 sty convbuf sty convbuf+1 sty convbuf+2 scanloop: lda ($fb),y beq copy iny cmp #$20 beq scanloop cmp #$30 bcc error cmp #$3a bcs error bcc scanloop error: sec rts copy: dey bmi error ldx #$2 copyloop: lda ($fb),y cmp #$30 bcc copynext cmp #$3a bcs copynext sec sbc #$30 sta convbuf,x dex copynext: dey bpl copyloop lda #$0 sta $fb ldx #$8 loop: lsr convbuf lda convbuf+1 bcc skipbit1 ora #$10 skipbit1: lsr a sta convbuf+1 lda convbuf+2 bcc skipbit2 ora #$10 skipbit2: lsr a sta convbuf+2 ror $fb dex beq done lda convbuf cmp #$8 bmi nosub1 sbc #$3 sta convbuf nosub1: lda convbuf+1 cmp #$8 bmi nosub2 sbc #$3 sta convbuf+1 nosub2: lda convbuf+2 cmp #$8 bmi loop sbc #$3 sta convbuf+2 bcs loop done: lda $fb clc rts .endproc creates an infinitely-long sequence with a generator function which takes, as a parameter, the item index. In this case the generator function is just the identity function ; function to sum the first n primes ; ; input: ; $fb/$fc: pointer to a buffer for temporary storage of primes ; $2: number of primes to sum (n) ; output: ; A: sum of the first n primes ; clobbers: ; $fd: current number under primality test ; $fe: number of primes currently found ; $64: temporary numerator for modulo check ; $65: temporary divisor for modulo check ; X, Y .primesum: A0 01 LDY #$01 ; init variable for ... 84 FD STY $FD ; next prime number to test 88 DEY ; init number of found primes .mainloop: 84 FE STY $FE ; store current number of found primes C4 02 CPY $02 ; compare with requested number F0 32 BEQ .sum ; enough primes -> calculate their sum .mainnext: E6 FD INC $FD ; check next prime number A0 00 LDY #$00 ; start check against first prime number .primecheckloop: A5 FD LDA $FD ; load current number to check C9 04 CMP #$04 ; smaller than 4? 90 1F BCC .isprime ; is a prime (shortcut to get list started) 85 64 STA $64 ; store to temp as numerator B1 FB LDA ($FB),Y ; load from prime number table 85 65 STA $65 ; store to temp as divisor A9 00 LDA #$00 ; init modulo to 0 A2 08 LDX #$08 ; iterate over 8 bits .bitloop: 06 64 ASL $64 ; shift left numerator 2A ROL A ; shift carry into modulo C5 65 CMP $65 ; compare with divisor 90 02 BCC .bitnext ; smaller -> to next bit E5 65 SBC $65 ; otherwise subtract divisor .bitnext: CA DEX ; next bit D0 F4 BNE .bitloop C9 00 CMP #$00 ; compare modulo with 0 F0 DC BEQ .mainnext ; equal? -> no prime number C8 INY ; next index in prime number table C4 FE CPY $FE ; checked against all prime numbers? D0 DB BNE .primecheckloop ; no -> check next .isprime: A5 FD LDA $FD ; prime found A4 FE LDY $FE ; then store in table 91 FB STA ($FB),Y C8 INY ; increment number of primes found D0 C8 BNE .mainloop ; and repeat whole process .sum: A9 00 LDA #$00 ; initialize sum to 0 18 CLC A8 TAY ; start adding table from position 0 .sumloop: C4 FE CPY $FE ; whole table added? F0 05 BEQ .done ; yes -> we're done 71 FB ADC ($FB),Y ; add current entry C8 INY ; increment index D0 F7 BNE .sumloop ; and repeat .done: 60 RTS .

0 - 255 selects only the numbers created by the infinite sequence that are prime.

A takes the first $2 элементы этой последовательности.

И, наконец, $fc sums them up.

 

Troll9000


Рег
15 Jun, 2007

Тем
76

Постов
173

Баллов
593
  • 26, Oct 2024
  • #17

cQuents, 3 байта

$fb

Попробуйте онлайн!

Объяснение

A0 01 84 FD 88 84 FE C4 02 F0 32 E6 FD A0 00 A5 FD C9 04 90 1F 85 64 B1 FB 85 65 A9 00 A2 08 06 64 2A C5 65 90 02 E5 65 CA D0 F4 C9 00 F0 DC C8 C4 FE D0 DB A5 FD A4 FE 91 FB C8 D0 C8 A9 00 18 A8 C4 FE F0 05 71 FB C8 D0 F7 60
 

Vetalzon


Рег
27 Sep, 2011

Тем
62

Постов
177

Баллов
517
Тем
403,760
Комментарии
400,028
Опыт
2,418,908

Интересно