Em 1946, Erdos e Copeland provaram que um determinado número é um número normal , ou seja, os dígitos em sua expansão decimal são distribuídos uniformemente.
Os usuários digitarão uma sequência de dígitos e você encontrará o menor primo que contém essa sequência na base 10.
Exemplo:
input -> output
"10" -> 101
"03" -> 103
"222" -> 2221
"98765" -> 987659
O menor código em bytes vence. Eu sei que algumas linguagens (mathematica, sage, pari-gp ...) vêm com funções internas relacionadas a números primos. -50 bytes se o seu programa não contar com essas funções. Não tente trapacear, por favor, se o seu idioma já tiver uma grande vantagem, não reivindique o bônus.
Editar
De acordo com alguns comentários abaixo, o menor primo que contém "03" é 3. Isso realmente faz alguma diferença? A única coisa em que consigo pensar é que talvez os números sejam mais fáceis de lidar do que as strings.
Em casos como "03", a saída preferida seria 103. No entanto, não considero que seja a parte fundamental do seu programa, portanto, você pode ignorar qualquer zero inicial se isso lhe conceder uma contagem de bytes mais baixa.
Respostas:
Golfscipt,
3332 bytes = -18 pontuaçãoExplicação:
2{...}{)}/
- começando com2
, enquanto algo é verdadeiro, incrementa o topo da pilha;;x
- descarte os valores intermediários coletados por{}{}/
e pela entrada e, em seguida, coloque o último valor testado lá:x,2>
- armazene o valor como ex
, em seguida, produza uma lista de2
parax-1
{x\%!},!!
- mantenha aqueles quex
são divisíveis por, então coagir ao booleano (não vazio)x`3?)!
- procure a entrada no formato de texto dex
(-1
se não for encontrado), incremente, negue.|
- oufonte
Programa Haskell, 97 caracteres = 47 pontos
Função Haskell, 75 caracteres = 25 pontos
o tipo de
p
é(Integral a, Show a) => [Char] -> a
. Se você fornecer seu próprio tipo integral, poderá procurar por infixo em sua própria representação desses valores. O padrãoInteger
usa a notação decimal esperada para números inteiros.Não é muito rápido. Quadrático no valor (não no tamanho) da saída.
versão não destruída:
exemplo:
fonte
Java - 175 caracteres.
fonte
indexOf(a[0])>=0)
e{System.out.println(n)
.boolean p=true
por algo assimint p=1
e assim por diante.Mathematica 58
Tempos relativos no meu Mac (2,6 GHz i7 com 8 GB de memória).
Encontre o menor primo contendo "01".
Encontre o menor primo contendo "012345".
Encontre o menor primo contendo "0123456".
fonte
StringFreeQ
para torná-lo mais curto.Sálvia , 72
Executa no prompt interativo
Primes().unrank(i)
dá oi
th número primo, com o 0º primo sendo 2.fonte
R, 56 caracteres -50 = 6
Tome a entrada como stdin. Incrementa k até que k seja primo (testado somando as instâncias para as quais k mod 2 e k são zeros, portanto, FALSO desde que 0 se transformou em um lógico é FALSE) e contém a string fornecida como entrada (testada com um grep simples, aqui grepl já que queremos um resultado lógico).
Uso:
fonte
shell oneliner (coreutils): 45chars
Não definindo uma função aqui ... apenas um oneliner que pega um argumento
$n
e varre o intervalo inteiro (na verdade, um pouco mais para tornar o código mais curto). A versão de 55 caracteres:Não é nem muito lento. Pois
n=0123456
ele retorna201234563
em81.715s
. Isso é impressionantemente rápido para um pipeline longo com dois processadores de string.Removendo dois caracteres (até 53) e um canal, podemos executá-lo ainda mais rápido:
E finalmente, algumas
sed
magias para reduzi-lo a 45 caracteres , embora a impressão seja feia:fonte
J - 38 char -50 = -12 pts
Normalmente, em J, você usaria os recursos internos muito otimizados dedicados a números primos, por isso não vou me desculpar por qualquer lentidão na execução.
Explicado:
>:@]^:(...)^:_&2
- Começando com 2, incremente até(...)
retornar falso.(+.i.)@]
- Pegue o GCD do contador com cada número inteiro menor que ele. (Usamos a convenção GCD (X, 0) = X.)]=*/@
- Leve o produto de todos esses números e teste a igualdade no balcão. Se o contador for primo, a lista era todos os 1s, exceto o GCD com 0; caso contrário, haverá pelo menos um GCD maior que 1; portanto, o produto será maior que o contador.>./@(E.":)
- Teste se a representação de string do contador (":
) contém a string (E.
) em qualquer ponto.>./
é a função max, e a usamos porqueE.
retorna um vetor booleano com 1 onde quer que a substring comece na string principal.*:
- NAND lógico os resultados juntos. Isso será falso apenas se as duas entradas forem verdadeiras, ou seja, se o contador for primo e contiver a substring.Uso:
Para a posteridade, aqui está a versão usando o builtin principal (30 caracteres, mas sem bônus):
1 p:]
testa o contador em busca de primalidade, em vez do truque da GCD.fonte
Brachylog (v2), 3 bytes na codificação de Brachylog
Experimente online!
Submissão de funções, recebendo entrada do argumento do lado direito, produzindo uma mutação do argumento do lado esquerdo. (Isso é o oposto da convenção Brachylog normal; consulte esta meta post para obter mais discussões. Trocar os argumentos na ordem mais usual custaria três bytes.) O link TIO possui um invólucro que chama a função com a convenção de chamada apropriada e imprime o resultado.
Explicação
Infelizmente, Brachylog é tão apropriado para esse problema que, de acordo com as regras do problema, eu não posso nem tentar obter o bônus (o que ironicamente significa que é incapaz de vencer).
Uma das razões pelas quais eu gosto tanto do Brachylog é que a programação é uma comunicação entre humanos e computadores e, portanto, uma linguagem "perfeita" permite traduzir a especificação do problema diretamente para o inglês; as idéias através das quais o problema foi declarado e através das quais o programa foi escrito seriam as mesmas. Brachylog pode atingir esse ideal surpreendentemente com frequência; a pergunta aqui é "encontre o menor primo que contém uma determinada substring" e eu posso literalmente agrupar os conceitos de "menor primo, contendo substring" na ordem correta e ter um programa de trabalho. Como tal, Brachylog diz muito mais sobre a natureza da comunicação do que uma linguagem na qual você tinha que especificar explicitamente um algoritmo para resolver o problema; às vezes quando conversamos com outros humanos, tentamos explicar um problema, explicando as etapas que você executaria para resolvê-lo, mas isso é raro. Então, por que nossas línguas devem ser diferentes?
fonte
JavaScript 83 bytes = 33 pontos
Golfe:
Ungolfed (um pouco):
fonte
Javascript (Node.JS) - 93 bytes = 43 pontos
Na forma extraída com nomes de variáveis sensíveis:
fonte
Ferrugem 0,9 136 bytes = 86 pontos
Muito explícito, apesar de compacto. Muito espaço gasto na localização de strings. :(
Aqui a versão sem espaço em branco (136 caracteres)
fonte
Japonês, 10 bytes
Tente
fonte
Arrumado , 37 bytes
Experimente online!
fonte
Perl 6 , 36 - 50 = -14 pontos
Experimente online!
Considerando que
$_%%one ^$_
são apenas os 2 bytesmenoresque.is-prime
, acho que vale a pena pelo bônus. Isso expira para o último caso de teste.Explicação:
fonte
:$
Python 3 ,
8079 bytes - 50 =3029 pontos-1 byte graças ao uso criativo de @ ASCII-only em
%s
vez destr
O caso de teste "98765" ainda não foi confirmado devido ao tempo que leva para testar.Confirmado para o caso de teste "98765" após algumas horas, mas com uma abordagem semelhante que utiliza avaliação de curto-circuito para evitar alguns testes de primalidade, ele funciona. muito mais rapido. Como alternativa, isso pode ser ~ 2x mais rápido se soubermos que "2" não é uma entrada (podemos evitar a verificação de números pares para primalidade) configurandoi=3
inicialmente ei+=2
no loop, sem custo adicional de bytes.Experimente online!
Explicação da
while
condição ((x in"%s"%i)*all(i%j for j in range(2,i))-1
):(x in"%s"%i)
:True
/1
se o contador atual contiver a seqüência desejada de números;False
/0
caso contrário.all(i%j for j in range(2,i))
:True
/1
se o contador atual sempre tiver um restante quando dividido por qualquer número inteiro de 2 (inclusive) para si mesmo (exclusivo), ou seja, é primo;False
/0
caso contrário.o
*
multiplica as duas condições e atua comoand
operador - o produto éTrue
/1
se e somente se as duas condições foremTrue
/1
.A
-1
atua como umnot
operador:False
/0
- 1 resultados em-1
, que é considerada verdadeira, ao passo queTrue
/1
- 1 resultados em0
, que é considerada falsa. Assim, o loop continua enquanto o número não contém a sequência desejada de números ou não é primo.Substitua
*
porand
e adicione parênteses em torno de tudo, exceto o-1
para uma solução equivalente muito mais rápida (que é um pouco mais longa).Uma solução de pontuação de 76 bytes - 50 = 26 no Python 2 fornecida por @ ASCII-only (utiliza em
``
vez destr()
,Experimente online!
fonte
return I
JavaScript, 65 - 50 = 15 pontos
Experimente online!
fonte