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.
Respostas:
GolfScript
6659574948Embora 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):
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):
fonte
Python,
121110109108104103 caracteresNa 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 ...
fonte
#
, você não conta seriamente os caracteres à mão, não é? javascriptkit.com/script/script2/charcount.shtmlif 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 exemploa=1;b=2;f()
).JavaScript,
90857874 caracteresCódigo curto (Google Closure Compiler - Otimizações avançadas; algumas edições manuais; mais edições por @ MT0 )
Código Longo
Resultado
Teste bastante ineficiente para números primos, mas dessa maneira ele usa menos caracteres.
Primeiro post aqui, então desculpe qualquer erro.
fonte
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)}
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)
Mathematica,
114108Permite 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.
Amostra de saída (são as que ele pega nos primeiros 30 anos):
Código não destruído:
fonte
≠
?Haskell -
122116114112110Expressão de lista principal (ineficiente) roubada de Will Ness .
Eu nunca soube
x|y=z|w=q
que seria válido.fonte
MATLAB
10489Apenas implementou o método básico, verificando todas as divisões possíveis.
Resultado:
fonte
octave
e issoinf
não funciona (e a impressão é adiada até o loop terminar). O matlab tem avaliação de faixa lenta?76 caracteres, dogelang
Convertido da minha versão do Python :
Resultado:
fonte
Golfscript,
595150 caracteresHomem cada personagem é extremamente difícil de perder:
Saída :
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
é a diferença máxima até agora. De cima para baixo:Dentro do loop:
Como ele coloca todos os divisores em uma lista? Vamos fazê-lo passo a passo
O que faz se os divisores estiverem vazios?
Dois caminhos: sim e não. Se sim (observe que
if
consome o valor máximo na pilha):Se não:
Observe nos dois casos que nossa pilha está agora no formato
... | g [ c | c | c
.Agora, o
do
valor máximo é retirado da pilha - semprec
- 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 parac
, a marca da matriz está no mesmo lugar eg
ainda está onde esperamos.Estas são as operações complicadas do GolfScript. Espero que tenham gostado de acompanhar!
fonte
Ruby, 110
Somente para Ruby 2.0 devido ao
lazy
método:Resultado:
fonte
Perl, 105 bytes
Ungolfed:
O algoritmo é simples,
$p
lembra o número primo anterior. Então$i
vai de3
até, 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:
O resultado começa com:
fonte
Python,
9391 caracteresVerificação primária ingênua (verifique se divisível por algo de 2 a
n
(menos caracteres que an/2
)):O segundo nível de recuo é um caractere de tabulação.
Resultado:
fonte
n
apenas cheques atén-1
Bash e algum Perl para regex principal (
167 157 143112 bytes)alguma saída:
fonte
test
está protestando bastante e não funciona para mim. Você também pode usar algunslet n++
elet f=c-p
e substituirtest
com[
. Ou, possivelmente, teste(())
onde você não precisa$
ou espaços.test -n $d
retornado 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 tudotest $d
bem. E, portanto,[ $d ]
também. Eg = 0 teve que ser inicializado.Perl
9590 bytesversão antiga não golfe:
Isso é semelhante à minha outra submissão, sans bash.
fonte
for($n=$c=2;$p=$c;$c-$p>$g&&printf"$p $c %d\n",$g=$c-$p){$c=$n if(1x++$n)!~/^(11+?)\1+$/}
C (100)
Minha própria contribuição, nenhum algoritmo especial, apenas golfe:
fonte
r
ep
terá menos caracteres e obterá o bônus :) #Haskell, 134C
Golfe:
Ungolfed:
fonte
C:
493302272246Eu usei recursão, não o loop usual de
for
ouwhile
.Resultado:
fonte
leaking
no 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.return
no main. Pule o últimoelse
. Substitua&&
->&
enum%i==0
pornum%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).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);}
Oracle SQL,
216202196172 + 10 = 182Só notei isso na pergunta:
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.
que pretende:
Resposta antiga (196)
e em um formato legível:
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.
fonte
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 :
Versão legível :
fonte
JAVASCRIPT 174 char
versão curta:
fonte
Javascript 138
Copie esse código no console do navegador. Será uma eternidade, já que o número máximo é algo em torno de
1.79*10^308
.Ungolfed:
fonte
C #
162161 caracteres151 caracteres + 10 caracteres de penalização = 161 caracteres
Versão curta:
Versão longa:
Na verdade, era melhor aplicar 10 caracteres de penalidade, uma vez que é uma escrita mais curta
g
(11 caracteres com penalidade) do quep+" "+i+" "+g
(13 caracteres sem penalidade).fonte
Ruby
90868483 caracteresAlguns curtos-circuitos booleanos, avaliação de abuso de expressão, etc.
fonte
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.
fonte
Haskell,
154 144 137123Os primos
p
são gerados usando a peneira de erastotenos#
e depois filtrados e impressos usando%
.A saída parece
o que espero que esteja bem.
fonte
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).fonte
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).O script
p
está abaixo:fonte
Perl, 87 bytes ( usando um módulo )
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:
fonte
Perl 153
Código curto:
fácil de ler:
fonte