Você sabe o que é um palíndromo , um primo e um encontro .
Sua tarefa é listar todas as datas em 100 milhares de anos que atendem às três características.
Não se esqueça de nada, exceto os números, use os seguintes formatos: AAAAMMDD e AAAAAMMDD .
As datas entre 0000-01-01 e 9999-12-31 devem ser impressas como palíndromos de 8 dígitos (se houver alguma) e as datas entre 10000-01-01 e 99999-12-31 devem ser impressas como palíndromos de 9 dígitos .
Não é obrigatório listar as datas em ordem cronológica.
Exemplo de parte da saída válida.
Primeiras três datas palindrômicas primárias de 9 dígitos:
...
100111001
100131001
100161001
...
Regras
Aplicam-se brechas padrão .
02-29
existe apenas para os anos divisíveis por 400 ou (divisível por 4 e não divisível por 100).Respostas:
Ruby ,
144141 bytes (134 + 7 para o-rprime
sinalizador)Economizou 3 bytes graças a benj2240 !
Experimente online!
O algoritmo:
Time
instância com os dadosy
,m
,d
valores. Se o objeto de hora resultante tiver um#day
valor igual ad
, essa era uma data válida. Caso contrário, ele mudaria a data (por exemplo,Time.new 2018,2,30
retornos2018-03-02
).O loop interno foi inicialmente uma função que foi chamada para cada elemento no
(?0..?9)
intervalo, bem como para a sequência vazia.Como a sequência vazia não produziu resultados (não há palíndromos primos válidos de 8 dígitos), decidi removê-la e refatorar para esta versão.
fonte
t
variável: TIOPython 2 ,
116107128122119 bytesA segunda metade da quarta linha é inspirada por mxdsp 's resposta aqui a outra pergunta de golfe .
Explicação
A função
g()
usa um argumento apenas para inicializar an
variável usando seu valor padrão. O valor inicial é um número ímpar, o mais curto possível e o maior possível, mas ainda sendo menor que a primeira resposta válida 100111001.Faça um loop até
n
atingir o final do período 10 9 . O incrementon
de 2.m
é o mês da datan
.Se
n
for uma data válida, palíndromo e prime, imprima-a:0 < m < 13
verifica sem
é um mês válido.n % 100 < 31 + (m+m/8)%2
verifica sen
o dia do mês é válido.(m+m/8)%2
adiciona1
para todos os meses com 31 dias. O crédito por isso vai para a resposta da ArmanX . Não há números primos de 29 a 30 de fevereiro.`n`[::-1] == `n`
. Os backticks estremecemn
.[::-1]
inverte a string.2**n % n == 2
é um teste de primalidade de Fermat . Esse teste é apenas probabilístico. Também existem não primos correspondentes. Mas não no intervalo de números que estamos vendo.fonte
APL (Dyalog Unicode) , 155 bytes
Experimente online!
Esta é uma Tradfn ( trad itional f unctio n ) que leva um argumento
arg = yyyymmdd
ouarg = yyyyymmdd
. O uso éf arg
.Isso não produzirá nada quando o argumento iniciar,
10000101
pois não encontra uma data principal do palíndromo em 60 segundos.Aqui está uma abordagem menos eficiente que produzirá o exemplo de saída do OP de
( Experimente online! )
Observe que os dois códigos são exatamente os mesmos até a direita antes de chamar a função recursivamente para a próxima data. Enquanto a versão golfista apenas chama assim
f arg+1
, o código menos golfado salta de dia31
para dia01
e de mês12
para mês01
, o que acelera bastante.Como funciona:
fonte
Python 3, 163 bytes
A solução é bastante longa (e provavelmente pode ser aprimorada), mas não usa nenhuma função interna para verificação de prime / date / palíndromo. Uma versão um pouco não destruída para maior clareza:
Datas válidas são geradas escolhendo um mês e dia. Como comentado anteriormente, apenas o tamanho 9 precisa ser considerado. Observe também que os anos bissextos não são considerados. Isso não é necessário devido à coincidência afortunada de que os primos palíndricos de comprimento 9 que terminam em 0229 simplesmente não existem (outras anomalias de datas como 30 de fevereiro de 1712 podem ser descartadas pelo mesmo motivo).
Em seguida, o dígito do meio é escolhido livremente e um teste principal é executado. Por causa do teste principal, ele tinha que ser o mais curto possível, é muito ingênuo e, portanto, extremamente lento. Usar uma biblioteca externa poderia resolver isso (e salvar alguns bytes), mas, como mencionado anteriormente, eu não queria usar nenhum.
fonte
WolframLanguage (Mathematica) 187 bytes
Pode haver alguma redução no tamanho a ser encontrada. Explicação a seguir ...
Casos de teste
(* {"100111001", "100131001", "100161001"} *)
Explicação do código
DayRange[d@#,d@#2]
retorna todas as datas entre{10011, 10, 1}
e{10017, 1, 1}
. Nesse caso, ele retorna aproximadamente 5 anos, 4 meses de datas (precisamente 1920 datas). Os anos bissextos são levados em consideração.As datas são retornadas na formatação padrão da Wolfram. Por exemplo, a primeira data aparecerá como
DateObject[List[1,1,1],"Day","Gregorian",-5.
] `#[[1]] & /@
removerá a parte da data, em cada data, que nos interessa. No exemplo,DateObject[List[1,3,7],"Day","Gregorian",-5.]
retorna a data abreviada{1,3,7}
,.t/@p[#3,2]}
ouToString/@Padleft[#3,2]
preenche o terceiro elemento, ou seja, o 7 em pé "para o 7º dia do mês" como"07"
. Preenchimento semelhante é fornecido para o símbolo de um dígito para o mês de março, ou seja,3
é retornado como"03"
.p[#, If[Length@# < 5, 4, 5]]
preenche o ano com zeros para atingir o comprimento de uma sequência de 4 ou 5 dígitos. Nesse caso, janeiro, ou seja1
, é retornado como "" 00001 "'."" <>...
junta as cordas. Nesse caso, ele retorna"000010307"
.Cases[...x_ /; PalindromeQ@x && PrimeQ@ToExpression@x]
retorna aqueles casos, entre as datas de 1920, que são palíndromos e primos.fonte
Javascript ,
187177Pressupostos: sem anos de 4 dígitos correspondentes; Não há dias correspondentes entre 29 e 30 de fevereiro
Funciona assim:
História:
Notas:
Através dos testes, descobri que não há correspondências válidas com anos de quatro dígitos ou que caem nos dias 29 ou 30 de fevereiro. Infelizmente, pelo bem do código, exatamente cinco resultados (inválidos) que caem no dia 31 de vários meses que têm apenas 31 dias.
fonte
Java 10,
329327320318312308307264 bytes-1 byte graças a @assylias .
Explicação:
Experimente on-line (observação: a parte da verificação do prime foi substituída por um método separado mais eficiente, embora mesmo assim ele expire após 60 segundos, produzindo apenas as primeiras ~ 115 datas primárias palindrômicas).
Colar pasta de todas as 197 saídas de uma execução local.
fonte
if(t.equals(new StringBuffer(t).reverse()+"")
->if(t.contains(new StringBuffer(t).reverse())
para salvar 1 caractere (funciona porque sabemos que as duas seqüências têm o mesmo comprimento). Isso não é muito :-(VBA, 347
fonte
DateString
é um nome de variável arbitrário, então você deve ser capaz de reduzi-lo a um único caractere, certo?Limpo ,
262... 213 bytesExperimente online!
fonte
Javascript ,
234229 bytesUm pouco volumoso, mas publicá-lo para fazer a bola JS rolar. Todas as sugestões são bem-vindas!
Ungolfed:
Como funciona:
A mágica dos lançamentos de dígitos é baseada principalmente em experiências.
Comecei descobrindo qual número subtrair para obter a versão invertida. Eu só me importava com os dois últimos dígitos.
Então, se pegarmos
n
, encontrek
assimn+k=flip(n)
. Para10<n<20
k
começar em 101 e aumentar em incrementos de 9. No entanto, paran<10
, este foi 100. Supusk
aumento a cada salto de 10, e depois de um pouco de brincadeira, achei que estava correto.Então,
k=100+9*n+n//10
onde // significa divisão inteira.Assim, chegamos
n+k = n+(100+9*n+n//10) = 100+10*n+n//10 = flipped(n)
.Não posso provar, nem afirmar que isso funciona para qualquer número, mas produziu resultados corretos para os números usados aqui.
Para o teste de primalidade, credite a resposta de Kevin Cruijssen . Eu tinha uma versão um pouco mais curta, mas não conseguia acertar:
Eu pulei no teste do palíndromo, fazendo um loop por meses, dias e um dígito do meio para que eu pudesse criar strings como
dDmMxMmDd
, ondeD
é o primeiro dígito do dia,d
o segundo, etc.História
Economizou 5 bytes ao se livrar da parte condicional de q
fonte
f
o resultado de s como parâmetro paraq
, então recorte o intermediário e escrevaf=n=>''+n%10+(n/10|0)
, e o resultado de q é sempre usado como uma string, para que você possa escreverq=n=>n<10?'0'+n:n
.APL NARS 626 bytes, 313 caracteres
esta impressão o que encontrar em 50 segundos, do que parar a si mesmo (porque senão não consigo parar o programa para copiar e colar o teste, porque não sei como parar o programa sem fechar as janelas do intérprete) test:
fonte
Julia 0.6 , 109 bytes
O link vai para uma versão mais longa com duas diferenças:
Experimente online!
fonte