Calcular intervalos principais


19

Encontrar números primos é um rito de passagem da programação e, com muita frequência, é o primeiro programa sério que alguém cria (geralmente com divisão de teste).

Mas os primos sozinhos já estão desgastados. Uma próxima coisa muito mais interessante é obter as lacunas primárias: as lacunas até agora mais longas entre os primos consecutivos. Estes são bastante raros e "preciosos". Os primeiros pares e suas diferenças são:

2 3 1
3 5 2
7 11 4
23 29 6
89 97 8
113 127 14
...

Meu pai costumava calculá-las à mão para se divertir até 10k. Vamos ver o quão curto um código você pode obter.

Regras:

  • nenhuma função embutida para testes principais, geração principal ou intervalos principais
  • não é possível recuperar http://oeis.org/A002386 ou similar (sinto o cheiro de trapaceiros de longe :))
  • sem matrizes pré-computadas
  • continue imprimindo até que seu tipo inteiro interno falhe

Menor contagem de caracteres vence. +10 caracteres se você imprimir apenas as lacunas sem os números primos.

Você também pode exibir versões com funções internas, se forem interessantes. Seja criativo.

Esclarecimento: você passa por números primos e relata toda vez que vê uma lacuna maior do que qualquer lacuna que você já viu antes. Por exemplo, entre 3 e 5, existe uma diferença de 2 unidades de largura. A diferença entre 5 e 7 também é 2, mas isso é notícia antiga, não nos importamos mais. Somente quando você vê uma nova maior lacuna, você a denuncia. Isso reflete como os números primos estão ficando cada vez menos frequentes, à medida que as lacunas se tornam cada vez maiores.


EDIT : A maioria das respostas é brilhante e merece mais reconhecimento. No entanto, até agora, uma entrada GolfScript com 48 caracteres é a mais curta.


11
No seu exemplo, 3 é o final de um par e o início do próximo par, embora esse não seja o caso de outros números. O que você quer?
mmumboss

Deixa pra lá, eu entendi agora.
mmumboss

Você pode reescrever sua regra como "nenhuma função interna para teste inicial, cálculo inicial ou intervalos iniciais". Caso contrário, uma solução óbvia seria usar uma função que retorna o n º primo, então incremento n , execute a função novamente e encontrar a diferença.
user12205

2
Aww. eu amo OEIS #
TheDoctor

Tenho a mesma dúvida que @mmumboss. Você poderia, por favor, explicar?
Clyde Lobo

Respostas:


3

GolfScript 66 59 57 49 48

[2.0{:d{;\;.{).{(1$1$%}do(}do.2$-.d>!}do].p~.}do

Embora eu esteja tendo problemas para executá-lo aqui http://golfscript.apphb.com/ (talvez esse site não goste do loop infinito?), Mas funciona bem quando eu o executo no meu computador com golfscript.rb. Eu sou muito novo no GolfScript, então isso provavelmente pode ser ainda mais complicado. ATUALIZAÇÃO: Eu não acho que isso possa ser resolvido muito mais sem alterar o algoritmo de alguma forma.

Primeiras linhas impressas (se você não gostar do "" impresso, pode adicionar; no início do script, mas isso aumenta até 49 caracteres):

[2 3 1]
["" 3 5 2]
["" 7 11 4]
["" 23 29 6]
["" 89 97 8]
["" 113 127 14]
["" 523 541 18]
["" 887 907 20]
["" 1129 1151 22]
...

Idéia geral legível por humanos de como isso funciona (algumas coisas um pouco diferentes, pois não estou usando uma pilha nesta versão):

cur_prime = 2
next_prime = 2
gap = 0        

do {
    do {
        cur_prime = next_prime
        do {
            next_prime = next_prime + 1
            possible_factor = next_prime
            do {
                possible_factor = possible_factor - 1
            } while (next_prime % possible_factor > 0)
        } while (possible_factor != 1)
    } while (next_prime - cur_prime <= gap)

    gap = next_prime - cur_prime
    print [cur_prime next_prime gap]
} while (true)

11

Python, 121 110 109 108 104 103 caracteres

p,n,m=[2],3,0
while 1:
 if all(n%x for x in p):
  c=n-p[0]
  if m<c:m=c;print(p[0],n,c)
  p=[n]+p
 n+=1

Na primeira vez que tentei responder aqui, espero ter feito certo ... não tenho certeza de ter contado os caracteres direito.

Hmmm, eu poderia salvar outro caractere na impressão fazendo o downgrade para o Python 2.x ...


121 caracteres, transforme o título em um título #, você não conta seriamente os caracteres à mão, não é? javascriptkit.com/script/script2/charcount.shtml
user80551

Não, não contei à mão :) Mas já vi outras respostas do Python para algumas perguntas niveladas em uma linha, de forma a reduzir o espaço em branco e, francamente, não tenho certeza se uma nova linha é contada como 1 ou 2 caracteres ...
Tal

11
Contamos novas linhas como 1 caractere, a menos que as regras da pergunta indiquem explicitamente o contrário. Bem-vindo ao PPCG!
Jonathan Van Matre

3
Bem-vinda! Boa resposta, e também tem espaço para melhorias. Por exemplo, if all(n%x>0for x in p):é um pouco menor. Você também pode salvar alguns caracteres movendo instruções para a mesma linha (por exemplo a=1;b=2;f()).
grc 12/03

11
A última alteração quebrou o código ao não empurrar [n] para a frente, como declarado.
orion

4

JavaScript, 90 85 78 74 caracteres

Código curto (Google Closure Compiler - Otimizações avançadas; algumas edições manuais; mais edições por @ MT0 )

for(a=b=2,c=0;b++;)for(d=b;b%--d;)d<3&&(c<b-a&&console.log(a,b,c=b-a),a=b)

Código Longo

var lastPrime = 2,
    curNumber = lastPrime,
    maxDistance = 0,
    i;

// check all numbers
while( curNumber++ ) {

  // check for primes
  i = curNumber;
  while( curNumber % --i != 0 ) {}

  // if prime, then i should be equal to one here
  if( i == 1 ) {

    // calc distance
    i=curNumber-lastPrime;

    // new hit
    if( maxDistance < i ) {
      maxDistance = i;
      console.log( lastPrime, curNumber, maxDistance );
    }

    // remember prime
    lastPrime = curNumber;
  }
}

Resultado

2 3 1
3 5 2
7 11 4
23 29 6
89 97 8
113 127 14
523 541 18
887 907 20
1129 1151 22
1327 1361 34
9551 9587 36
15683 15727 44
19609 19661 52
31397 31469 72
...

Teste bastante ineficiente para números primos, mas dessa maneira ele usa menos caracteres.

Primeiro post aqui, então desculpe qualquer erro.


78 caracteres -for(a=b=2,c=0;b++;){for(d=b;b%--d;);1==d&&(c<b-a&&console.log(a,b,c=b-a),a=b)}
mt0

@ MT0 Obrigado. Não localizou aqueles. Editado.
Sirko

Ainda mais ineficiente, mas com 74 caracteres - #for(a=b=2,c=0;b++;)for(d=b;b%--d;)d<3&&(c<b-a&&console.log(a,b,c=b-a),a=b)
MT0

3

Mathematica, 114 108

Permite saída infinita, embora após um certo ponto na sequência o ventilador acelere e você comece a suspeitar que sua CPU esteja jogando Freecell enquanto faz o possível para parecer ocupada.

p@x_:=NestWhile[#+1&,x+1,Divisors@#≠{1,#}&];m=0;q=1;While[1<2,If[p@q-q>m,Print@{q,p@q,p@q-q};m=p@q-q];q=p@q]

Amostra de saída (são as que ele pega nos primeiros 30 anos):

{1,2,1}
{3,5,2}
{7,11,4}
{23,29,6}
{89,97,8}
{113,127,14}
{523,541,18}
{887,907,20}
{1129,1151,22}
{1327,1361,34}
{9551,9587,36}
{15683,15727,44}
{19609,19661,52}
{31397,31469,72}
{155921,156007,86}
{360653,360749,96}
{370261,370373,112}
{492113,492227,114}
{1349533,1349651,118}
{1357201,1357333,132}
{2010733,2010881,148}

Código não destruído:

p@x_ := NestWhile[
   # + 1 &,
   x + 1,
   Divisors@# ≠ {1, #} &];
m = 0;
q = 1;
While[
 1 < 2,
 If[
  p@q - q > m,
  Print@{q, p@q, p@q - q}; m = p@q - q];
 q = p@q]

Reconhece ?
Riking 13/03

Sim, ele simplesmente não exporta dessa maneira, mas o analisa muito bem quando você cola o código no bloco de notas. Eu já pontuei de acordo, mas revisarei para simplificar.
Jonathan Van Matre

quantos caracteres se você fazer uso mathematica built-in funções Prime?
Michael Stern

76. Como a definição p @ x_ inteira é apenas uma reimplementação do NextPrime, ela pode ser substituída por p = NextPrime;
Jonathan Van Matre

3

Haskell - 122 116 114 112 110

q=[n|n<-[3..],all((>0).rem n)[2..n-1]]
d m((p,q):b)|q-p>m=print(p,q,q-p)>>d(q-p)b|q>p=d m b
main=d 0$zip(2:q)q

Expressão de lista principal (ineficiente) roubada de Will Ness .

Eu nunca soube x|y=z|w=qque seria válido.


2

MATLAB 104 89

Apenas implementou o método básico, verificando todas as divisões possíveis.

a=2;g=0;for n=3:inf;b=n*(sum(mod(n,1:n)<1)<3);h=b-a;if(h>g)g=h;[a,b,h]
end;a=max(a,b);end

Resultado:

  2     3     1
  3     5     2
  7    11     4
 23    29     6
 89    97     8
113   127    14
523   541    18
887   907    20

Estou ligado octavee isso infnão funciona (e a impressão é adiada até o loop terminar). O matlab tem avaliação de faixa lenta?
orion

O Matlab imprime em tempo real, cada iteração do loop. Quando inicio o programa, recebo um aviso de que o índice máximo é 2147483647 e, em seguida, ele inicia. Alternativamente, eu poderia substituir inf com intmax, mas isso significa três caracteres a mais.
mmumboss

2

76 caracteres, dogelang

Convertido da minha versão do Python :

g=0
i=l=2
while i+=1=>all$map(i%)(2..i)=>(i-l>g=>(g=i-l),print(l,i,g)),(l=i)

Resultado:

(2, 3, 1)
(3, 5, 2)
(7, 11, 4)
(23, 29, 6)
(89, 97, 8)
(113, 127, 14)
(523, 541, 18)
(887, 907, 20)
(1129, 1151, 22)
...

Deve ser selecionado como o vencedor!
Sarge Borsch

2

Golfscript, 59 51 50 caracteres

Homem cada personagem é extremamente difícil de perder:

0[2.{).,2>{\.@%!},{.2$-.4$>{].p~\[}{;\;}if..}or}do

Saída :

[2 3 1]
[3 5 2]
[7 11 4]
[23 29 6]
[89 97 8]
[113 127 14]
...

Explicação :

A pilha é configurada para que cada iteração comece com a pilha assim, com a parte superior à direita. O [indica o marcador de matriz corrente, ou seja, quando o intérprete encontra um ], tudo na pilha a partir da marca de topo é colocado em uma matriz.

g [ last | cur

gé a diferença máxima até agora. De cima para baixo:

 command         | explanation
-----------------+----------------------------------------
 0[2.            | initialize vars g=0, last=2, cur=2
 {...}do         | loop forever...

Dentro do loop:

 )               | cur += 1
 .,2>{\.@%!},    | put all divisors of cur into a list
 {...}or         | if the list is empty, cur is prime, so
                 | the block is executed. otherwise,
                 | 'do' consumes the stack, sees it is truthy,
                 | and loops again

Como ele coloca todos os divisores em uma lista? Vamos fazê-lo passo a passo

 Command         | explanation                                  | stack
-----------------+----------------------------------------------+----------------
                 | initial stack                                | n
 .,              | make list of 0..n-1                          | n [0,1,...,n-1]
 2>              | take elements at index 2 and greater         | n [2,3,...,n-1]
 {...},          | take list off stack, then iterate through    |
                 | the list. on each iteration, put the current |
                 | element on the stack, execute the block, and |
                 | pop the top of the stack. if the top is      |
                 | true then keep the element, else drop it.    |
                 | when done, push list of all true elements    |
                 | So, for each element...                      | n x
   \.            |   Swap & dup                                 | x n n 
   @             |   Bring x around                             | n n x
   %             |   Modulo                                     | n (n%x)
   !             |   Boolean not. 0->1, else->0. Thus this is 1 |
                 |   if x divides n.                            | n (x divides n)
                 | So only the divisors of n are kept           | n [divisors of n]

O que faz se os divisores estiverem vazios?

 Command         | explanation                                  | stack
-----------------+----------------------------------------------+----------------
                 | initial stack                                | g [ last | cur
  .              | dup                                          | g [ l | c | c
  2$             | copy 3rd down                                | g [ l | c | c | l
  -              | sub. This is the current gap, cur-last       | g [ l | c | c-l
  .              | dup                                          | g [ l | c | c-l | c-l
  4$             | copy 4th down                                | g [ l | c | c-l | c-l | g
  >              | is cur gap > max gap so far?                 | g [ l | c | c-l | c-l>g
  {#1}{#2}if..   | #1 if c-l > g, #2 otherwise, and do ".." in  | ... | g [ c | c | c
                 | either situation                             | 

Dois caminhos: sim e não. Se sim (observe que ifconsome o valor máximo na pilha):

 Command         | explanation                                  | stack
-----------------+----------------------------------------------+----------------
                 | initial stack. note that now the old `g` is  | XX [ l | c | g
                 | garbage and `c-l` is the new `g`.            |
 ]               | close the array                              | XX [l, c, g]
 .p              | duplicate it and print it, consuming the dup | XX [l, c, g]
 ~               | pump array back onto the stack. Note now the | XX | l | c | j
                 | array marker [ is gone.                      | 
 \               | swap.                                        | XX | l | g | c                         
 [               | mark the array                               | XX | l | g | c [
 .               | this is the part after the if. dups the top, | XX | l | g [ c | c
                 | but it does this in two steps, first popping | 
                 | c then putting two copies on top, so the     | 
                 | array marker moves                           | 
 .               | dup again                                    | XX | l | g [ c | c | c

Se não:

 Command         | explanation                                  | stack
-----------------+----------------------------------------------+----------------
                 | initial stack. In this case g is still the   | g [ l | c | c-l
                 | max gap so far                               | 
 ;\;             | dump top of stack, swap, and dump again      | g [ c
 ..              | the part after the if. dup twice             | g [ c | c | c

Observe nos dois casos que nossa pilha está agora no formato ... | g [ c | c | c .

Agora, o dovalor máximo é retirado da pilha - sempre c- e será repetido se for positivo. Desde ac sempre aumentando, isso é sempre verdade, então fazemos um loop para sempre.

Uma vez exibida, a parte superior da pilha é g [ c | c, ou seja , o último significado foi atualizado para c, a marca da matriz está no mesmo lugar e gainda está onde esperamos.

Estas são as operações complicadas do GolfScript. Espero que tenham gostado de acompanhar!


11
Excelente elucidação!
Jonathan Van Matre

1

Ruby, 110

Somente para Ruby 2.0 devido ao lazymétodo:

(2..1.0/0).lazy.select{|n|!(2...n).any?{|m|n%m==0}}.reduce([2,0]){|(l,t),c|d=c-l;p [l,c,d]if d>t;[c,d>t ?d:t]}

Resultado:

[2, 3, 1]
[3, 5, 2]
[7, 11, 4]
[23, 29, 6]
[89, 97, 8]
[113, 127, 14]
[523, 541, 18]
[887, 907, 20]
[1129, 1151, 22]
[1327, 1361, 34]
[9551, 9587, 36]
[15683, 15727, 44]
[19609, 19661, 52]
[31397, 31469, 72]
[155921, 156007, 86]
[360653, 360749, 96]
[370261, 370373, 112]
[492113, 492227, 114]
...

1

Perl, 105 bytes

$p=2;$d=0;L:for($i=2;++$i>2;){!($i%$_)&&next L for 2..$i-1;if($i-$p>$d){$d=$i-$p;print"$p $i $d\n"}$p=$i}

Ungolfed:

$p = 2;
$d = 0;
L: for ($i = 2; ++$i > 2; ){
    !($i % $_) && next L for 2..$i-1;
    if ($i - $p > $d) {
        $d = $i - $p;
        print "$p $i $d\n"
    }
    $p = $i
}  

O algoritmo é simples, $plembra o número primo anterior. Então $ivai de 3até, quando o tipo $ i "falha em mim" ou se torna negativo por causa do estouro. $ié testado da maneira bruta, verificando todos os divisores de 2 a $i-1. Uma linha é impressa, se a diferença atual for maior que a diferença impressa anterior $d.

Com mais alguns bytes, o tempo de execução pode ser melhorado:

$p = 2;
$d = 0;
L: for ($i=3; $i > 2; $i += 2){
    for ($j=3; $j <= sqrt($i); $j += 2){
        next L if !($i%$j)
    }
    if ($i - $p > $d) {
        $d = $i - $p;
        print "$p $i $d\n"
    }
    $p = $i
}

O resultado começa com:

2 3 1
3 5 2
7 11 4
23 29 6
89 97 8
113 127 14
523 541 18
887 907 20
1129 1151 22
1327 1361 34
9551 9587 36
15683 15727 44
19609 19661 52
31397 31469 72
155921 156007 86
360653 360749 96
370261 370373 112
492113 492227 114
1349533 1349651 118
1357201 1357333 132
2010733 2010881 148
4652353 4652507 154
17051707 17051887 180
20831323 20831533 210
47326693 47326913 220
...

11
Isso não está correto, você precisa encontrar a série de brechas crescentes. Veja, por exemplo, a resposta Ruby ou Matlab para a saída esperada.
mmumboss

11
@mmumboss: Oh, eu ignorei isso. Corrigido agora.
Heiko Oberdiek 12/03

Bom para um idioma em que todas as variáveis ​​requerem no mínimo 2 caracteres.
orion

1

Python, 93 91 caracteres

Verificação primária ingênua (verifique se divisível por algo de 2 a n(menos caracteres que a n/2)):

g=0;i=l=2
while 1:
 i+=1
 if all(i%x for x in range(2,i)):
    if i-l>g:g=i-l;print l,i,g
    l=i

O segundo nível de recuo é um caractere de tabulação.

Resultado:

2 3 1
5 7 2
7 11 4
23 29 6
89 97 8
113 127 14
523 541 18
...

Bom, eu esqueci que esse intervalo varia até napenas cheques atén-1
Claudiu

1

Bash e algum Perl para regex principal ( 167 157 143 112 bytes)

n=2
c=2
while p=$c
do perl -e\(1x$[++n]')=~/^(11+?)\1+$/&&exit 1'&&c=$n
((c-p>g))&&g=$[c-p]&&echo $p $c $g
done

alguma saída:

$./golfd.sh
2 3 1
3 5 2
7 11 4
23 29 6
89 97 8
113 127 14
523 541 18
887 907 20
1129 1151 22

Usar o NP do regex para contornar completamente quaisquer loops e estruturas de controle é pura perfeição. No entanto, testestá protestando bastante e não funciona para mim. Você também pode usar alguns let n++e let f=c-pe substituir testcom [. Ou, possivelmente, teste (())onde você não precisa $ou espaços.
orion

test -n $dretornado verdadeiro para uma sequência vazia. test -n "$d"estava bem, mas mais tempo. No entanto, a página de manual diz que -n é opcional, e tudo test $dbem. E, portanto, [ $d ]também. Eg = 0 teve que ser inicializado.
orion

@orion, desculpe por alguma razão ele parecia funcionar uma vez agora ele quebrou na minha máquina também, eu revertido para 167. Vou tentar adicionar algumas de suas outras sugestões
Newbrict

Seu ambiente talvez tenha variáveis ​​predefinidas.
orion

@orion, por algum motivo, sua edição foi rejeitada. Você pode reeditar?
Newbrict 12/03/14

1

Perl 95 90 bytes

for($n=$c=2;$p=$c;$c-$p>$g&&printf"$p $c %d\n",$g=$c-$p){$c=$n if(1x++$n)!~/^(11+?)\1+$/}

versão antiga não golfe:

$n=$c=2;
while($p=$c){
    $c=$n if (1x++$n)!~/^(11+?)\1+$/;
    if ($c-$p>$g) {$g=$c-$p;print "$p $c $g\n"}
}

Isso é semelhante à minha outra submissão, sans bash.


Não sou chata, só quero ver até onde isso pode ir. Aqui:for($n=$c=2;$p=$c;$c-$p>$g&&printf"$p $c %d\n",$g=$c-$p){$c=$n if(1x++$n)!~/^(11+?)\1+$/}
orion 13/03

@orion isso é sério para o abuso de loop haha!
Newbrict

1

C (100)

Minha própria contribuição, nenhum algoritmo especial, apenas golfe:

i,g,r,p=2;main(){for(;r=p;p-r>g?printf("%d %d %d\n",r,p,g=p-r):0)for(i=0;i-p;)for(i=1,++p;p%++i;);}

"+10 caracteres se você só imprimir as lacunas sem os primos." - se você remover a impressão de re pterá menos caracteres e obterá o bônus :) #
1416

Completness is pretty :)
orion

1

Haskell, 134C

Golfe:

c n=null[x|x<-[2..n-1],n`mod`x==0]&&n>1
p=filter c[1..]
g l(m:n:o)
 |(n-m)>l=do print(m,n,n-m);g(n-m)(n:o)
 |True=g l(n:o)
main=g 0 p

Ungolfed:

-- c function checks if n is a prime number
c n=null[x|x<-[2..n-1],n`mod`x==0]&&n>1

-- p is an infinite list of primes
p=filter c[1..]

-- g function prints a list of primes and differences.
--   l is the maximum difference seen so far
--   (m:n:o) is the list of unprocessed primes
g l(m:n:o)
 |(n-m)>l=do print(m,n,n-m);g(n-m)(n:o)
 |True=g l(n:o)

-- main starts the ball rolling with a default max-seen value of 0
main=g 0 p

Adoro essa avaliação preguiçosa!
Jonathan Van Matre

1

C: 493 302 272 246

int e(int j){for(int i=2;i<j;i++)if(j%i<1)return 0;return 1;}void f(int a,int b,int c){if(e(a)&e(b))if(c<b-a){printf("%d %d %d\n",a,b,b-a);f(a+1,b+1,b-a);}else f(a+1,b+1,c);if(e(b))f(a+1,b,c);if(e(a))f(a,b+1,c);f(a+1,b+1,c);}int main(){f(2,3,0);}

Eu usei recursão, não o loop usual de forou while.

int isPrime(int num){
    for( int i=2; i<num; i++ )
        if(num%i < 0) return 0;
    return 1;
}
void fun(int n1, int n2, int gap){
   if( isPrime(n1) & isPrime(n2) ){
        if( gap < n2-n1 ){
           printf("%d %d %d\n", n1, n2, n2-n1);
           fun(n1+1, n2+1, n2-n1);
        }else{
           fun(n1+1, n2+1, gap);
        }
   }
   if( isPrime(n2) ){
       fun(n1+1, n2, gap);
   }
   if( isPrime(n1) ){
       fun(n1, n2+1, gap);
   }
   fun(n1+1, n2+1, gap);
}

int main(){
   fun(2,3,0);
}

Resultado:

2 3 1
3 5 2
7 11 4
23 29 6
89 97 8
113 127 14
523 541 18
887 907 20
1129 1151 22
1327 1361 34
9551 9587 36
15683 15727 44
19609 19661 52

Isso não funciona. verdadeiro / falso não está definido, mas mesmo se corrigirmos isso, ele está relatando falhas incorretas. Por exemplo, existem MUITOS primos entre 25219 e 43237. Sua recursão está leakingno topo, porque você não está testando isPrime (n2), mas deixando primos entre n1 e n2. E isso realmente não pode ser corrigido, porque você não pode aumentar n2 sem conhecer os números primos.
orion

Você está certo! Está errado! Meu pensamento estava errado desde o começo.
Loukas 13/03

11
Agora é melhor .. :)
Loukas

+1 Agora que está corrigido, eu gosto - é bastante incomum (embora não seja eficiente). Você poderia jogar muito. Pule returnno main. Pule o último else. Substitua &&-> &e num%i==0por num%i<1. E pelos padrões c antigos (haverá avisos), você não precisa especificar valores de retorno para funções void e int (seus argumentos também assumem como padrão int).
orion

Eu estava jogando um pouco e conseguiu até 151 caracteres, com uma única chamada incondicional recursiva, apenas um tipo especificador ( int) e muito reduzida função primordial testes: e(j,i){while(j%++i);return i==j;}f(a,b,c){int A=e(a,1),B=e(b,1);if(A&B&&c<b-a)printf("%d %d %d\n",a,b,c=b-a);f(a+(B|!A),b+(A|!B),c);}main(){f(2,3,0);}
orion

1

Oracle SQL, 216 202 196 172 + 10 = 182

Só notei isso na pergunta:

Menor contagem de caracteres vence. +10 caracteres se você imprimir apenas as lacunas sem os números primos.

Como esse é o SQL e as palavras-chave são muito longas, é realmente melhor aplicar a penalidade, fornecendo o seguinte. É a mesma ideia que o original.

with c as(select level+1n from dual connect by level<1e124)select lead(n)over(order by n) from(select*from c a where not exists(select*from c where n<a.n and mod(a.n,n)=0))

que pretende:

with c as ( 
 select level + 1 n 
   from dual 
connect by level < 1e124
        )
select lead(n) over ( order by n ) 
  from ( select *
           from c a 
          where not exists( select * 
                              from c 
                             where n < a.n 
                               and mod(a.n, n) = 0
                                   )
                )

Resposta antiga (196)

with c as(select level+1n from dual connect by level<1e124)select n,p,p-n from(select n,lead(n)over(order by n)p from(select*from c a where not exists(select*from c where n<a.n and mod(a.n,n)=0)))

e em um formato legível:

with c as ( 
 select level + 1 n 
   from dual 
connect by level < 1e124
        )
select n, p, p-n 
  from ( select n, lead(n) over ( order by n ) p 
           from ( select * 
                    from c a 
                   where not exists (
                                select * 
                                  from c
                                 where n < a.n 
                                   and mod(a.n, n) = 0
                                       )
                         )
                )

Isso cria um gerador de números no c , a sub-seleção mais interna cria os números primos usando uma Peneira de Eratóstenes, a externa trabalha a prima anterior e, finalmente, a última seleção subtrai uma da outra.

Isso não retornará nada porque ele está executando 1 x 10 124 consultas recursivas ... Portanto, se você deseja que ele funcione, diminua esse número para algo sensato.


Quando se trata de um desafio como esse, penso no SQL não como Turing completo, mas Turing obstinado.
Jonathan Van Matre

Mas é o Turning-complete @Jonathan, embora chegar lá às vezes seja "interessante" :-)?
21414 Ben Ben

Sabendo que Turing está completo, eu estava tentando brincar. Perdeu a marca, aparentemente. :) Enfim, existem várias respostas T-SQL no meu perfil ... traga seu Oracle e vamos duelar!
Jonathan Van Matre 14/03

0

D - 153 + 10 = 163

Estou de bom grado aplicando a penalidade de +10 aqui, porque a contagem de caracteres ainda é menor do que teria sido se eu também tivesse impresso os números primos.

Golfe :

import std.stdio;bool p(int l){int n;foreach(i;1..l+1)n+=l%i==0?1:0;return n==2;}void main(){int g;foreach(l;0..int.max)if(l.p){if(g>0)(l-g).write;g=l;}}

Versão legível :

import std.stdio;

bool prime( int number )
{
    int divisors;

    foreach( i; 1 .. number + 1 )
        divisors += number % i == 0 ? 1 : 0;

    return divisors == 2;
}

void main()
{
    int lastPrime;

    foreach( number; 0 .. int.max )
        if( number.prime )
        {
            if( lastPrime > 0 )
                ( number - lastPrime ).write;

            lastPrime = number;
        }
}

0

JAVASCRIPT 174 char

var p=[2],l=2,g=0;
for(var n=3;n>0;n+=2){
  var o=0;
  for(var t=0;t<p.length;++t){
    if(n/p[t] == parseInt(n/p[t])){
      o=1;
    }
  }
  if(o==0){
    p.push(n);
    if(n-l>g){
      g=n-l;
      console.log(l,n,g);
    }
    l=n;
  }
}

versão curta:

var p=[2],l=2,g=0;for(var n=3;n>0;n+=2){var o=0;for(var t=0;t<p.length;++t){if(n/p[t] == parseInt(n/p[t])){o=1;}}if(o==0){p.push(n);if(n-l>g){g=n-l;console.log(l,n,g);}l=n;}}

0

Javascript 138

for(var a=2,b=0,c=0;a++;){var d;a:{for(var e=a,f=2;f<e;f++)if(0==e%f){d=!1;break a}d=!0}d&&(0!=b&&a-b>c&&(c=a-b,console.log(b,a,c)),b=a)}

Copie esse código no console do navegador. Será uma eternidade, já que o número máximo é algo em torno de1.79*10^308 .

Ungolfed:

var number = 2;
var lastPrime = 0;
var gap = 0;

while(number++)
{
    if (isPrime(number)) {
        if (lastPrime != 0) {            
            if (number - lastPrime > gap)
            {
                gap = number - lastPrime;
                console.log(lastPrime, number, gap);
            }
        }

        lastPrime = number;
    }
}

function isPrime(n){
    for (var i = 2; i < n; i++) {
        if (n % i == 0)
            return false;
    }
    return true;
}

0

C # 162 161 caracteres

151 caracteres + 10 caracteres de penalização = 161 caracteres

Versão curta:

using System;class P{static void Main(){int p=2,g=0;for(int i=3;;i++){for(int j=2;j<i;j++)if(i%j==0)goto e;if(i-p>g)Console.WriteLine(g=i-p);p=i;e:;}}}

Versão longa:

using System;

class PrimeGaps
{
    private static void Main()
    {
        int lastPrime = 2;
        int largestGap = 0;

        for (int i = 3; true; i++)
        {
            // Prime test
            for (int j = 2; j < i; j++)
                if (i%j == 0)
                    goto nextI; // Skip to next iteration of i

            // Largest gap check
            if (i - lastPrime > largestGap)
            {
                largestGap = i - lastPrime;
                Console.WriteLine(largestGap);
            }

            // Remember last prime
            lastPrime = i;

            nextI:
                ; // Do nothing
        }
    }
}

Na verdade, era melhor aplicar 10 caracteres de penalidade, uma vez que é uma escrita mais curta g(11 caracteres com penalidade) do que p+" "+i+" "+g(13 caracteres sem penalidade).


0

Ruby 90 86 84 83 caracteres

r,i,g=2,2,0;while i+=1 do(2...i).all?{|j|i%j>0}&&((i-r<=g||p([r,i,g=i-r]))&&r=i)end

Alguns curtos-circuitos booleanos, avaliação de abuso de expressão, etc.


0

C 248

O código compara os números primos consecutivos a, be verifica se as lacunas são maiores que g e encontra o próximo par de números primos.

#include <cstdio>
void f(int* a, int* b){*a =*b;int t=1;while (*b += 2){t=1;for(int i=3;i<*b;i+=2){if(*b%i==0){t=0; break;}}if(t)break;}}
int main(){int a=2,b=3,g=0;do{(b-a>g)?printf("%d %d %d\n",a,b,(g=b-a)): f(&a,&b);} while(b>=0);return 0;}

Isso é C ++, não é?
Zacharý 5/08

0

Haskell, 154 144 137 123

Os primos psão gerados usando a peneira de erastotenos #e depois filtrados e impressos usando %.

p=2:3#1
n#m|all((>0).mod n)$take m p=n:(n+1)#(m+1)|1<2=(n+1)#m
(l:u@(o:_))%k|o-l>k=print(l,o,o-l)>>u%(o-l)|1<2=u%k
main=p%0

A saída parece

(2,3,1)
(3,5,2)
(7,11,4)
(23,29,6)
(89,97,8)

o que espero que esteja bem.


0

Linguagem do Game Maker, 85

Assumindo todas as variáveis ​​não inicializadas como 0(este é o padrão em algumas versões do Game Maker).

a=2b=2for(d=2;b++;1)for(c<b-a;b mod --d;1)d<3&&(c=b-a&&show_message_ext("",a,b,c)a=b)

0

Idioma do criador de jogos, 74 + 55 = 129

Assumindo todas as variáveis ​​não inicializadas como 0(este é o padrão em algumas versões do Game Maker).

n=2while(n++){if p(n){if l{if n-l>g{g=n-l;show_message_ext("",l,n,g)}}l=n}

O script pestá abaixo:

r=1a=argument0for(i=2i<a;i++){if a mod i=0r=0}return r}

0

Perl, 87 bytes ( usando um módulo )

use Math::Prime::Util":all";$l=2;forprimes{if($_-$l>$m){say"$l $_ ",$m=$_-$l}$l=$_}1e14

Eu escrevi o módulo, mas teríamos que adicionar 565.000 caracteres extras à contagem. Principalmente postando por diversão, mas também para oferecer uma alternativa de desempenho, já que ainda não vejo nenhuma usando builtins. 4.6s para intervalos para 1e9, 36s para intervalos para 1e10, 6.5min para 1e11.

Pari / GP 2.8 pode ser feito basicamente da mesma maneira, embora mais de 2x mais lento:

l=2;m=0;forprime(p=2,1e14,if(p-l>m,print(l," ",p," ",m=p-l));l=p)

-1

Perl 153

Código curto:

$i=$a=2;while($a=$i++){if(p($i)){if($m<$m2=$i-$a){$m=$m2;print"$a $i $m$/"}}}sub p{$d=2;$s=sqrt$_[0];while(){return 0if!($_[0]%$d);return 1if$d>$s;$d++}}

fácil de ler:

$i=$a=2;
while($a=$i++){
  if(p($i)){
    if($m<$m2=$i-$a){
      $m=$m2;
      print"$a $i $m$/"
    }
  }
}
sub p {
  $d=2;
  $s=sqrt$_[0];
  while(){
    return 0if!($_[0]%$d);
    return 1if$d>$s;
    $d++;
  }
}

Isso gera todas as lacunas, não apenas as maiores até agora.
orion
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.