A tarefa em questão é, dado um número n
, encontrar o menor primo que começa com PELO MENOS n
do número 2
no início do número. Esta é uma sequência que encontrei no OEIS ( A068103 ).
Os primeiros 17 números da sequência são dados abaixo; se você quiser mais, terei de implementar a sequência, o que não me importo de fazer.
0 = 2
1 = 2
2 = 223
3 = 2221
4 = 22229
5 = 2222203
6 = 22222223 # Notice how 6 and 7 are the same!
7 = 22222223 # It must be **AT LEAST** 6, but no more than necessary.
8 = 222222227
9 = 22222222223 # Notice how 9 and 10 are the same!
10 = 22222222223 # It must be **AT LEAST** 9, but no more than necessary.
11 = 2222222222243
12 = 22222222222201
13 = 22222222222229
14 = 222222222222227
15 = 222222222222222043
16 = 222222222222222221
Só pensei que isso seria uma combinação legal de manipulação de cordas, detecção de primos e seqüências. Isso é código-golfe , a menor contagem de bytes será declarada a vencedora provavelmente no final do mês.
x
. Por exemplo, se o seu idioma suportar apenas números inteiros de 32 bits, você pode explicar isso.Respostas:
Braquilog ,
1211 bytesExperimente online!
Isso se traduz em Brachylog surpreendentemente diretamente. Essa é uma função, não um programa completo (embora fornecer o intérprete
Z
como argumento da linha de comando faça com que ele adicione o wrapper apropriado para transformar a função em um programa; foi isso que eu fiz para que o link TIO funcionasse). Também é bastante lamentável quej
pareça estar indexado a -1 e precise de uma correção para permitir isso.Você pode argumentar razoavelmente que isso
=
não é necessário, mas acho que, dada a maneira como o problema está redigido, é; sem, a função está descrevendo o conjunto de todos os números primos que começam com o número especificado de2
s, e sem alguma declaração explícita de que o programa deve fazer algo com essa descrição (nesse caso, gerando o primeiro valor), provavelmente não cumprir com as especificações.Explicação
Quando usado como uma função que retorna um número inteiro, nada solicita valores além do primeiro, portanto, o primeiro é tudo o que nos preocupa.
Uma sutileza (apontada nos comentários):
:Acb
eb:Ac
são matematicamente equivalentes (à medida que uma é removida do início e a outra é adicionada ao final, com a região entre nunca se sobrepondo); Eu tinha anteriormenteb:Ac
, o que é mais natural, mas ele quebra na entrada 0 (o que eu acho que é porquec
se recusa a concatenar uma lista vazia para qualquer coisa; muitos builds do Brachylog tendem a quebrar em listas vazias por algum motivo).:Acb
garante quec
nunca precise ver uma lista vazia, o que significa que o caso da entrada 0 também pode funcionar agora.fonte
0
, sem motivo aparente (Brachylog parece ser alérgico a zeros por algum motivo; suspeito quec
seja o responsável). Dito isto, é fácil de consertar, então vou consertar isso agora.b:Ac
não funciona porque, para a entrada,0
você recebe2b:Ac
:2b
dá0
e você não pode usarc
com um zero inicial. A razão para isso é evitar loops infinitos no caso geral em que você sempre pode acrescentar um zero e obter os mesmos resultados.:2rj
vez de,2:?j
r
; isso é apenas uma melhoria simples. Entendo o que está acontecendoc
(você não deseja infinitos resultados quando retrocede); no entanto, é provável que haja uma melhoria na proibição de entradas degeneradas apenas se elas não forem acopladas, permitindo-as quando a entrada já estiver vinculada a um valor degenerado.Java (OpenJDK 8) ,
164110 bytesObrigado a @FryAmTheEggman por um monte de bytes!
Experimente online!
fonte
new String(new char[i]))
torna uma sequência de comprimento unária igual ao número. Em seguida, o regex corresponde a um número composto, verificando se a repetição de um conjunto de dígitos se encaixa em toda a cadeia (basicamente divisão de teste). Se eu estiver certo, isso significa que você poderá jogar a segunda parte para não ter uma?
, informarei com certeza quando chegar a um computador.Pitão, 12 bytes
No pseudocódigo:
Faz um loop na
lambda
partidaT=1
, aumentando em 1 até que a condição seja satisfeita. A sequência de2
s deve ser uma substring desde o início da sequência, ou seja, o método index precisa retornar0
. Se a substring não for encontrada, ela retornará, o-1
que também é realmente conveniente, portanto, não existe um caso excepcional.Você pode experimentá-lo online aqui , mas o servidor permite apenas uma entrada de
4
.fonte
Perl, 50 bytes
49 bytes de código +
-p
sinalizador.Forneça a entrada sem nova linha final. Por exemplo:
Demora um pouco para executar números maiores que 4, pois ele testa todos os números (há 2 testes: o primeiro
/^2{$_}/
verifica se há 2 suficientes no início e o segundo(1x$\)!~/^1?$|^(11+)\1+$/
testa primalidade (com desempenhos muito ruins)).fonte
Haskell, 73 bytes
Exemplo de uso:
f 3
->2221
.Força bruta.
[1..n]>>"2"
cria uma lista den
2
s que é comparada com os primeirosn
caracteres na representação de sequência do primo atual.fonte
Mathematica, 103 bytes
Função sem nome, usando um argumento inteiro não negativo
#
e retornando um número inteiro. Ele literalmente testa todos os números inteiros positivos, por sua vez, até encontrar um que comece com#
2s e seja primo. Horrivelmente lento para entradas acima de 5.resultado anterior: Mathematica, 155 bytes
O Mathematica seria melhor para jogar golfe se não fosse tão fortemente digitado; precisamos alternar explicitamente entre os tipos inteiro / lista / string.
Estranhamente, esse algoritmo opera em listas de dígitos , começando com
{2,...,2,1}
. Contanto que esses não sejam os dígitos de um número primo, ele adiciona um ao último dígito, usando a regra{j___,k_}/;!PrimeQ@d@{j,k}:>({j,k+1}
... e, em seguida, implementa manualmente o carregamento do um para o próximo dígito, desde que qualquer um dos dígitos iguais a 10, usando a regra{a__,b_,10,c___}->{a,b+1,0,c}
... e, se formos tão longe que o último dos2
s principais se transformou em a3
, começa novamente com outro dígito no final, usando a regra{a,b+1,0,c}/.{a:Repeated[2,#-1],3,b:0..}->{a,2,0,b}
. O/. 23->2
no final apenas corrige o caso especial em que a entrada está1
: a maioria dos primos não pode terminar2
, mas2
pode. (Alguns erros são cuspidos nas entradas0
e1
, mas a função encontra o caminho para a resposta certa.)Esse algoritmo é bastante rápido: por exemplo, no meu laptop, são necessários menos de 3 segundos para calcular que o primeiro primeiro a começar com 1.000
2
s é22...220521
.fonte
Pitão, 17 bytes
Não consigo resolver
n = 4
online, mas é correto em teoria.Explicação
fonte
Perl 6 , 53 bytes
Tente
Expandido:
fonte
Gelatina , 14 bytes
Muito ineficiente. Experimente online!
fonte
Pyke, 14 bytes
Experimente aqui!
12 bytes após correção de bug e um novo recurso
Experimente aqui!
fonte
Sábio,
6968 bytesUsa um gerador para encontrar o primeiro (portanto o menor) de infinitos termos.
fonte
Japonês, 20 bytes
Teste online! Ele termina em dois segundos na minha máquina para todas as entradas de até 14 e, depois disso, perde naturalmente a precisão (o JavaScript só tem precisão de número inteiro até 2 53 ).
Muito obrigado a @obarakon por trabalhar nisso :-)
Explicação
Na versão mais recente do Japt, isso pode ter 12 bytes:
Teste online! Ele termina em meio segundo na minha máquina para todas as entradas de até 14.
fonte
2222203
, apenas222223
e logo em seguida2222210
. Ele também falha em qualquer entrada que requer três ou mais dígitos adicionais após a string de2
s, tais como a entrada 15.PHP, 76 bytes
recebe entrada do argumento da linha de comando. Corra com
-r
.demolir
fonte
Bash (+ coreutils), 53 bytes
Trabalhos com até 2 ^ 63-1 (9223372036854775807) , leva um tempo considerável para terminar com N> 8.
Golfe
Teste
fonte
Python 3, 406 bytes
código de teste
saída de teste
Decidi usar a velocidade em uma faixa bastante grande, em vez do tamanho de bytes. :) Uso um teste determinista de primalidade de Miller-Rabin, que é garantido até 3317044064679887385961981 com este conjunto de testemunhas. Prizes maiores sempre passarão com êxito no teste, mas alguns compostos também podem passar, embora a probabilidade seja extremamente baixa. No entanto, também testei os números de saída para i> 22 usando pyecm, um programa de fatoração de curva elíptica, e eles parecem ser primos.
fonte
p()
chamada ... OTOH, seria difícil escrever um programa significativamente menor que possa fornecer uma saída correta de i> 20 in em um segundo (que não "trapaceie" chamando um built-in verificador de primalidade). :)Python 3, 132 bytes
Qualquer esperança de desempenho foi sacrificada por uma contagem menor de bytes.
fonte
Java, 163 bytes
código de teste
saída:
582,5858 milissegundos
Explicação: faz um loop sobre números inteiros e os adiciona como strings à string raiz, que é a string "2's" fornecida, e verifica se é prime ou não.
fonte
isProbablePrime
tem ocasionais falsos positivos . Isso invalidaria a resposta, pois há circunstâncias em que ele retorna o valor errado.