Sua tarefa, se você optar por aceitá-la, é escrever um programa / função que aceite um número inteiro N como entrada. O programa / função deve gerar / retornar uma lista dos primeiros N números primos. Mas aqui está o problema: você não tem permissão para usar caracteres primos no seu código. Um caractere primo é um caractere cujo ponto de código Unicode é um número primo. No intervalo de impressão ASCII, são eles:
%)+/5;=CGIOSYaegkmq
Mas a regra também se aplica a caracteres não ASCII se o seu código os usar.
- Uma entrada válida é um número inteiro N, onde 0 <N <= T , onde você pode escolher T , mas deve ser maior ou igual a 10000. T não precisa ser finito.
- Para entradas inválidas (não-inteiros, inteiros fora do intervalo), lance uma exceção ou produza / retorna nada / nulo.
- Um número inteiro com espaço em branco à esquerda / à esquerda como entrada é considerado inválido.
- Um número inteiro com um
+
caractere como sinal como entrada é considerado inválido. - Um número inteiro com zeros à esquerda como entrada é considerado válido.
- Se o seu idioma permitir que você passe um número inteiro já analisado como entrada, as regras de análise acima (exceto o intervalo um) não se aplicam, porque o int já foi analisado.
- A entrada é sempre a base 10.
- Não é permitido o uso de geradores primos e testadores de primalidade embutidos (isso inclui funções de fatoração primária).
- A restrição de origem é imposta aos caracteres Unicode, mas a contagem de bytes para a pontuação pode estar em outra codificação, se desejar.
- A saída pode conter uma única nova linha à direita, mas isso não é necessário.
- Se você produzir / retornar a lista de números primos como uma sequência, todos os números primos deverão ser delimitados por um ou vários caracteres não digitados. Você pode escolher qual delimitador você usa.
- Este é um desafio de código-golfe , o código mais curto em bytes vence.
Snippet de pilha para verificar seu código
Você pode usar o Snippet de pilha abaixo para verificar se seu código não contém caracteres principais:
var primes=[],max=10000;for(var i=2;i<=max;i++){primes.push(i);}for(var N=2;N<Math.sqrt(max);N++){if(primes.indexOf(N)===-1){continue;}primes=primes.filter(function (x){return x===N||x%N!==0;});}function setText(elem,text){var z=('innerText' in elem)? 'innerText' : 'textContent';elem[z]=text;}function verify(inputCode,resultSpan){var invalidChars=[];var success=true;for(var i=0;i<inputCode.length;i++){var cc = inputCode.charCodeAt(i);if (cc>max){setText(resultSpan,"Uh oh! The char code was bigger than the max. prime number calculated by the snippet.");success = false;break;}if (primes.indexOf(cc)!==-1){invalidChars.push(inputCode[i]);}}if (invalidChars.length===0&&success){setText(resultSpan, "Valid code!");}else if(success) { var uniqueInvalidChars = invalidChars.filter(function (x, i, self){return self.indexOf(x)===i;});setText(resultSpan, "Invalid code! Invalid chars: " + uniqueInvalidChars.join("")); }}document.getElementById("verifyBtn").onclick=function(e){e=e||window.event;e.preventDefault();var code=document.getElementById("codeTxt").value;verify(code,document.getElementById("result"));};
Enter your code snippet here:<br /><textarea id="codeTxt" rows="5" cols="70"></textarea><br /><button id="verifyBtn">Verify</button><br /><span id="result"></span>
code-golf
restricted-source
primes
ProgramFOX
fonte
fonte
;
isso seja banido ... #+
, parece decepcionante ser necessário descartá-las manualmente.Respostas:
CJam,
191830343319172120 bytesExperimente online.
Este é provavelmente um dos algoritmos mais terrivelmente ineficientes que já implementei. Mas eu fiz isso pelo tamanho!
Minha resposta consiste em um bloco de código, que age como uma função anônima no CJam. Execute-o com um número inteiro imediatamente anterior à pilha e a lista resultante é despejada na pilha. Trato o limite superior da entrada como infinito, para que não precise verificar esse limite.
Meu algoritmo começa aumentando 3 à
input
potência th, que é garantida para fornecer um número maior que oinput
-ésimo primo, se a entrada for válida. Em seguida, é gerada uma lista dos números inteiros de 2 a esse número menos um, o que é uma faixa grande o suficiente para conter todos os números primos que queremos. Para se livrar dos números compostos ... suspiro ... criamos uma lista de todos os produtos aos pares, que devem gerar todos os números compostos de 4 a um valor estupidamente grande, grande o suficiente para nossos propósitos. Depois, basta remover todos os elementos da lista original desta lista composta, apará-los até os primeirosinput
elementos e unir os elementos ao caractere de nova linha.O algoritmo deve funcionar para qualquer entrada. No entanto, se o intérprete / computador tem ou não memória ou tempo suficiente é outra questão, porque os requisitos de tempo e espaço são exponenciais em relação à entrada. Portanto, se a entrada for maior que cerca de 5 para o intérprete on-line ou cerca de 8 para o off-line, a resposta a essa pergunta provavelmente será não.
fonte
S*
?S
um personagem principal?Java. 474 bytes
Recebe entrada via argumento de função, sai via exceção lançada.
Recuado:
Caracteres escapados removidos:
Explicação:
Minha solução original usou uma
return
declaração. Depois de fazer essa pergunta no StackOverflow, regettman teve a gentileza de fornecer uma maneira de gerar / retornar sem usar letras maiúsculas.Como sempre, sugestões são bem-vindas :)
fonte
Ruby, 74
Explicação:
*o
inicializa uma matriz de saída vazia. até que ele tenhan
itens, encontramos o menor número> = 2 que não divide nenhum item no momentoo
e o adicionamos ao
. Para testar a divisão, caramba. Todos os bons operadores são proibidos, e eu nem posso usardivmod
. O melhor que pude ver foi usarx.div y
, que pega x dividido por y e arredonda para baixo, depois multiplica por y novamente. Se for igual a x, não houve arredondamento, então y divide x.1.>x.^
é um teste de igualdade, verificando se o resultado de xor é 0. O.
antes de todo operador é porque você não pode misturar.
chamadas de operadores livres e chamadas de método sem parênteses.Edit: As especificações de verificação de faixa foram adicionadas depois que eu postei isso, eu acho. Para cumprir requer 79 caracteres:
fonte
CJam,
383730 bytesExperimente aqui
Eu acho que isso deve estar em conformidade com todas as regras e funciona para qualquer N não negativo (ou seja, T é infinito). É terrivelmente ineficiente, portanto, não tente por grandes números.
Este é um bloco - a coisa mais próxima de uma função (sem nome) - que espera um número inteiro na pilha, imprime todos os números primos e deixa a pilha sem sua entrada. Para todas as entradas inválidas, ele gera um erro ou imprime nada.
A maior parte do código é validação de entrada, seguida pela peneira de Eratóstenes. Eu só precisava solucionar a restrição de entrada em 3 locais:
)
é incremento no CJam. Eu precisei disso uma vez, mas poderia substituí-lo por~
(complemento bit a bit) porque, ao mesmo tempo, estava quadrando os números.%
é módulo. Em37c~
vez disso, estou usando , o que primeiro cria o personagem%
e depois avalia. Isso torna o código muito mais lento.;
aparece e descarta um elemento da pilha. Eu preciso fazer isso no final. Em vez disso, estou usando o'<(~
que empurra o personagem<
, o diminui e o avalia.fonte
Bash + coreutils, 227 bytes
Isso foi bastante complicado. Eu encontrei algumas coisas:
while
euntil
) é inutilizável porque é mais próxima dadone
qual é uma palavra-chave shell e não pode ser o resultado de uma expansão variável (a menos queeval
seja usada, mas que também esteja fora). O único loop utilizável éfor
/in
que permite{
/ em}
vez dedo
/done
.for (( ; ; ))
também não é utilizável.=
está fora, então precisamos de outra maneira de atribuir variáveis.printf -v
é bom para isso.jot
gera a lista de fatores potenciais no loop interno. Se um fator potencial divide um primo em potencial, ele não é primo e iniciamos cedobreak
é um shell embutido e não uma palavra-chave; portanto, pode ser gerado como resultado de uma expansão.dc
converte um número base 13 no bytestreameak
./
ou%
shell. Portanto, isso é terceirizado paradc
o~
operador s , que envia o quociente e o restante para a pilha.-lt
- menor que - é o único operador de comparação de shell utilizável.echo
não serve para saída.printf
funciona embora contanto que evitemos%
Acertar a validação de entrada é um pouco trabalhoso. Isso não retorna nada no caso de entrada inválida.
Saída:
fonte
Haskell, 90 bytes
Esta é uma função anônima que recebe um número inteiro
n
como entrada.Como funciona:
[p|p<-[2..],not$or[b>p-1&&b-1<p|b<-[u*v|u<-[2..p-1],v<-[2..p-1]]]]
(o primeiro exemplo de linhas principais número um no wiki de Haskell, mas com aelem
função substituída) cria uma lista infinita de números primos.zip
com os números de1
an
para fazer uma lista de(prime, seq. number)
pares. Remova seq. número, novamente. Resultado é uma lista de números primos de comprimenton
.fonte
Ferrugem, 64897 bytes
(código cortado devido ao limite de caracteres, solução completa aqui )
Os seguintes recursos de ferrugem ficam indisponíveis devido à restrição principal:
O que você pode usar tecnicamente:
Eu simplesmente não conseguia fazer nada completo de Turing com essas ferramentas. Eu sinto Muito. Tudo o que restava era incluir os primeiros 10000 primos completos, limpos de 5. Pelo menos você pode cortá-lo e ter uma solução válida, no sentido mais restrito possível.
Eu gostaria muito que os especialistas em mergulho no tarpit de Turing (ou no Rust!) Me dissessem se eu poderia ter feito algo melhor!
fonte
GNU APL,
75 68 67 65 59 5655 caracteres⎕IO
deve ser1
.Voltei meses depois, percebendo que tinha um espaço extra!
fonte
Pitão - 12 bytes
Usa a função de fatoração principal de pyth para ver se # é primo. Usa o
!tPT
truque sugerido para mim na minha resposta para problemas com números primos abaixo de um milhão.Como o filtro funciona apenas para números primos abaixo de n e não no primeiro n, eu apenas procurei o inverso de pi (x) para 10.000 e obtive 104.000, então eu uso números primos abaixo de 10⁶ e obtive o primeiro n. Na verdade, isso não é executado; portanto, você deve testar substituindo
^T6
por^T3
e restringindo n abaixo de 1000. Entrada de stdin e saída para stdout.fonte