Há um número bastante grande de funções geradoras primárias. Praticamente todos eles são construídos e são baseados na peneira de Eratóstenes, na função de Möbius ou no teorema de Wilson e geralmente são inviáveis de calcular na prática. Mas também existem geradores, que possuem uma estrutura muito fácil e foram encontrados por acidente.
Em 2003, Stephen Wolfram explorou uma classe de equações de recorrência aninhadas em um experimento com computador ao vivo na NKS Summer School. Um grupo de pessoas ao redor de Matthew Frank seguiu com experimentos adicionais e descobriu uma propriedade interessante da simples recorrência
a(n) = a(n-1) + gcd(n,a(n-1))
com o valor inicial de a(1) = 7
. A diferença a(n) - a(n-1) = gcd(n,a(n-1))
sempre parecia ser 1 ou primo. As primeiras diferenças são ( OEIS A132199 ):
1, 1, 1, 5, 3, 1, 1, 1, 1, 11, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 23, 3, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 47, 3, 1, 5, 3, ...
Se omitirmos apenas os 1s, obteremos a seguinte sequência ( OEIS A137613 ):
5, 3, 11, 3, 23, 3, 47, 3, 5, 3, 101, 3, 7, 11, 3, 13, 233, 3, 467, 3, 5, 3,
941, 3, 7, 1889, 3, 3779, 3, 7559, 3, 13, 15131, 3, 53, 3, 7, 30323, 3, ...
Eric S. Rowland provou a primidez de cada elemento nesta lista alguns anos depois. Como você pode ver, os números primos são misturados e alguns deles aparecem várias vezes. Também foi comprovado que a sequência inclui infinitamente muitos primos distintos. Além disso, é conjecturado que todos os números primos ímpares apareçam.
Como esse gerador principal não foi construído, mas simplesmente encontrado por acidente, o gerador primário é chamado de "ocorrência natural". Mas observe que, na prática, esse gerador também é bastante inviável de calcular. Como se vê, um primo p aparece somente após (p–3)/2
1s consecutivos. Não obstante, implementar este gerador principal será sua tarefa.
Desafio:
Escreva uma função ou um programa que imprima os primeiros n
elementos da sequência A137613
(a sequência sem os 1s). Você pode ler o número de entrada n >= 0
via STDIN, argumento de linha de comando, prompt ou argumento de função. Envie os primeiros n
elementos em qualquer formato legível para STDOUT ou retorne uma matriz ou uma lista com esses valores.
Isso é código-golfe. Portanto, o código mais curto vence.
Entre os melhores:
Aqui está um snippet de pilha para gerar uma classificação regular e uma visão geral dos vencedores por idioma. Para garantir que sua resposta seja exibida, inicie-a com um título, usando o seguinte modelo de remarcação:
# Language Name, N bytes
onde N é o tamanho do seu envio. Se você melhorar sua pontuação, poderá manter as pontuações antigas no título, identificando-as. Por exemplo:
# Ruby, <s>104</s> <s>101</s> 96 bytes
var QUESTION_ID=55272;function answersUrl(e){return"http://api.stackexchange.com/2.2/questions/"+QUESTION_ID+"/answers?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+ANSWER_FILTER}function getAnswers(){jQuery.ajax({url:answersUrl(page++),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){answers.push.apply(answers,e.items),e.has_more?getAnswers():process()}})}function shouldHaveHeading(e){var a=!1,r=e.body_markdown.split("\n");try{a|=/^#/.test(e.body_markdown),a|=["-","="].indexOf(r[1][0])>-1,a&=LANGUAGE_REG.test(e.body_markdown)}catch(n){}return a}function shouldHaveScore(e){var a=!1;try{a|=SIZE_REG.test(e.body_markdown.split("\n")[0])}catch(r){}return a}function getAuthorName(e){return e.owner.display_name}function process(){answers=answers.filter(shouldHaveScore).filter(shouldHaveHeading),answers.sort(function(e,a){var r=+(e.body_markdown.split("\n")[0].match(SIZE_REG)||[1/0])[0],n=+(a.body_markdown.split("\n")[0].match(SIZE_REG)||[1/0])[0];return r-n});var e={},a=1,r=null,n=1;answers.forEach(function(s){var t=s.body_markdown.split("\n")[0],o=jQuery("#answer-template").html(),l=(t.match(NUMBER_REG)[0],(t.match(SIZE_REG)||[0])[0]),c=t.match(LANGUAGE_REG)[1],i=getAuthorName(s);l!=r&&(n=a),r=l,++a,o=o.replace("{{PLACE}}",n+".").replace("{{NAME}}",i).replace("{{LANGUAGE}}",c).replace("{{SIZE}}",l).replace("{{LINK}}",s.share_link),o=jQuery(o),jQuery("#answers").append(o),e[c]=e[c]||{lang:c,user:i,size:l,link:s.share_link}});var s=[];for(var t in e)e.hasOwnProperty(t)&&s.push(e[t]);s.sort(function(e,a){return e.lang>a.lang?1:e.lang<a.lang?-1:0});for(var o=0;o<s.length;++o){var l=jQuery("#language-template").html(),t=s[o];l=l.replace("{{LANGUAGE}}",t.lang).replace("{{NAME}}",t.user).replace("{{SIZE}}",t.size).replace("{{LINK}}",t.link),l=jQuery(l),jQuery("#languages").append(l)}}var ANSWER_FILTER="!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe",answers=[],page=1;getAnswers();var SIZE_REG=/\d+(?=[^\d&]*(?:<(?:s>[^&]*<\/s>|[^&]+>)[^\d&]*)*$)/,NUMBER_REG=/\d+/,LANGUAGE_REG=/^#*\s*([^,]+)/;
body{text-align:left!important}#answer-list,#language-list{padding:10px;width:290px;float:left}table thead{font-weight:700}table td{padding:5px}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script><link rel="stylesheet" type="text/css" href="//cdn.sstatic.net/codegolf/all.css?v=83c949450c8b"><div id="answer-list"> <h2>Leaderboard</h2> <table class="answer-list"> <thead> <tr><td></td><td>Author</td><td>Language</td><td>Size</td></tr></thead> <tbody id="answers"> </tbody> </table></div><div id="language-list"> <h2>Winners by Language</h2> <table class="language-list"> <thead> <tr><td>Language</td><td>User</td><td>Score</td></tr></thead> <tbody id="languages"> </tbody> </table></div><table style="display: none"> <tbody id="answer-template"> <tr><td>{{PLACE}}</td><td>{{NAME}}</td><td>{{LANGUAGE}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody></table><table style="display: none"> <tbody id="language-template"> <tr><td>{{LANGUAGE}}</td><td>{{NAME}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody></table>
a(n)-a(n-1)
n
ser zero?//
) e explique-o no seu envio. Se alguém discordar de você, você sempre pode editar sua postagem.Respostas:
Pitão,
1413 bytesUsa
a(n) = Lpf(6 - n + sum(a(i) for i in range(1, n))
ondeLpf
significa menos fator primo.Experimente aqui online.
fonte
Python 3.5.0b1 +,
9593 bytesLink para o Python 3.5.0b1 + release
Uma implementação direta da recorrência, apresentando:
1%x
, emath.gcd
, ao contrário defractions.gcd
.fonte
1%x
faz? Pergunta secundária: onde encontro a documentação do histórico de revisões do Python que inclui betas? Edit: Nevermind, encontrou-o no final do histórico de revisões .x >= 1
,1%x
retorna 0 sex == 1
, 1 caso contrário (usado para decidir se deseja adicionarx
à lista)Julia, 110 bytes
Ungolfed:
fonte
n<2
vez den==1
. Além disso, se você olhar para a frente em vez de para trás, você pode usari=1
ex=a(i)-a(i+=1)
, em seguida,println(-x)
e-x>1
para corrigir a negatividade, evitando assim a necessidade de um incremento separada dei
. E≥
são três bytes, enquanto>=
são dois ... mas então, você pode usar emn<1||()
vez den>=1&&()
... e, no entanto, nem é necessário em primeiro lugar (abandone o condicional, n nunca será menor que 1). Você também não precisa dos colchetes mais externos ao definir a (n). Com essas alterações, você deve ter no mínimo 97 bytes.PHP,
1019699987772 bytesUso:
Chame o Script com um argumento:
php -d error_reporting=0 script.php 30
Se você quiser testá-lo, precisará descomentar
;extension=php_gmp.dll
no seu php.ini->
extension=php_gmp.dll
Devo adicionar a extensão à minha contagem de bytes? Alguma ideia?
Log:
salvou 3 bytes graças a Ismael Miguel.
Economizou 26 bytes graças ao primo.
fonte
<?
e remover a definição de$j
.<
in$j<=$argv[1]
(imprime demais) (-1). Deixe$e
não inicializado, use$e+7
(-3). Use emfor(;;)
vez dewhile()
, usando as expressões pré e pós (-2). Substituaecho$t.' ';$j++
por$j+=print"$t "
, largue os suportes (-3). Substituaif($t>1)
por2>$t||
(-2). Combine a atribuição$t
com a condicional, alterne||
paraor
, solte os colchetes (-5). Vá$argv[1]
para o$j
incremento, mova a expressão inteira para ofor
condicional (-2). Mude>=$j+=print
para-=print
(-3). Passo a passo: codepad.org/s6LNSPSM$e+7
com$e+=$t
(-2). Deixe$i
não inicializado, use~++$i
(-3). codepad.org/fDIImajpHaskell, 51 bytes
Observe que
f
é uma função que retornará os primeiros n elementos.Em vez de
a(n)
calcular as diferençasd(n)
e depois calcular as diferenças, calculamos as diferenças e as somamos para obtera(n)
. (Aqueles que não estão familiarizados com Haskell podem protestar que precisamosa(n)
primeirod(n)
, mas é claro que uma avaliação preguiçosa nos ajuda a solucionar esse problema!)Ungolfed:
fonte
Pitão, 30 bytes
Muito mal jogado, pode ser consideravelmente reduzido. Define a função recursiva na frente, filtra
.f
irst-n e mapeia a diferença.Experimente aqui online .
fonte
n = 0
Julia,
6967 bytesEsta é uma solução iterativa simples para o problema.
x
é a diferença (que é agcd
) e, em seguida, atualizoa
adicionandox
.fonte
JavaScript (ES6), 91
GCD recursivo, função principal iterativa. Não tão rápido.
Nota habitual: teste de execução do snippet em qualquer navegador compatível com EcmaScript 6 (principalmente o Chrome, não o MSIE. Eu testei no Firefox, o Safari 9 pode ir)
fonte
Haskell,
747166 bytesUsou o truque aqui: https://codegolf.stackexchange.com/a/39730/43318 e deixou de fazer sentido.
(Anterior: 71 bytes)
Primeiro faça a sequência de a e depois faça as diferenças.
(Anterior: 74 bytes)
Funções de lista padrão, além de uso inteligente da função lambda. Observe que este é 1 byte menor que o mais óbvio
Se não contarmos as importações, posso reduzir para 66.
fonte
PARI / GP, 60 bytes
Retirado mais ou menos direto da definição a (n) - a (n-1) = gcd (n, a (n-1))
Saída para
a(20)
:fonte
C ++,
193182180172 bytesObrigado @Jakube - salvou 8 bytes na saída.
fonte
f
que retorna uma matriz com os resultados. Dessa forma, você pode remover a inclusão, o scanf e a impressão.Mathematica, 59 bytes
fonte