Não conte a ninguém, mas eu cortei a máquina de viagem no tempo do meu tio! Meu tio é obcecado por números primos, no entanto, e isso é mostrado na máquina - ele o programou para que ele só possa ir a datas que somam um número primo.
Portanto, não pode ser 1947-08-15
porque 1947 + 8 + 15 = 1970, que não é um número primo. Ele pode ir para 1947-07-25
, porque 1947 + 7 + 25 = 1979, que é primo. Então, se eu quiser voltar para assistir às celebrações da independência da Índia, parece que terei que ir algumas semanas antes e esperar esses 20 dias.
Tenho outras datas em que quero ir e também terei que ir a uma data anterior (ou, se tiver sorte, igual a) à minha data prevista, que totalize um número primo. No entanto, sou impaciente e não quero esperar muito; portanto, quero encontrar a data que posso usar que seja a mais próxima da minha data prevista.
Você pode me escrever um programa que atinja minha data prevista e me forneça a data em que devo inserir a máquina do tempo - a data mais próxima antes ou igual à data especificada cujas partes somam um número primo?
(Para esse desafio, estamos usando o calendário gregoriano proléptico - o que significa simplesmente que usamos o calendário gregoriano atual, mesmo em períodos em que as pessoas usavam o calendário juliano mais antigo.)
Entrada
- Um encontro
- idealmente, qualquer data na era atual (AD); praticamente, qualquer subconjunto do seu idioma possa lidar naturalmente
- em qualquer formato legível por humanos⁺ que você gosta
Saída
- A data mais próxima da data de entrada, que é menor ou igual à entrada e cuja data + mês + ano soma um número primo.
- em qualquer formato legível por humanos⁺ que você gosta
":" Legível por humanos ", como no dia, mês e ano, todos explicitados separadamente, em qualquer ordem
Casos de teste
1947-08-15
=> 1947-07-25
1957-10-04
=> 1957-09-27
1776-07-04
=> 1776-07-04
999-12-12
=> 0999-12-10
2018-06-20
=> 2018-06-15
1999-01-02
=> 1998-12-29
1319-12-29
=> 1319-07-01
(Obrigado a @Shaggy, @PeterTaylor e @Arnauld pela ajuda na pergunta.)
Fri Jul 25 02:46:39 CEST 1947
)Respostas:
Vermelho , 87 bytes
Experimente online!
Mais legível:
fonte
JavaScript (Node.js) , 94 bytes
Recebe a entrada como 3 números inteiros na sintaxe de currying
(year)(month)(day)
. Retorna uma sequência separada por hífen com um hífen à esquerda.Experimente online!
Quão?
Primeiro convertemos a data para o formato JSON
yyyy-mm-ddT00:00:00.000Z
( ISO 8601 ), dividimos no arquivo'T'
, mantemos apenas a parte esquerda e adicionamos um hífen à esquerda, que fornece-yyyy-mm-dd
.Agora, essa expressão s pode ser
eval()
alterada para obter o n oposto da soma do ano + mês + dia .Usamos a função auxiliar P () para testar se -n é primo (nesse caso, ele retorna 0 ). Se for, retornamos s . Caso contrário, tentamos novamente com o dia anterior.
fonte
Python 2 ,
130127 bytesEntrada é
year, month, day
.-3 bytes graças a Kevin Cruijssen .
Experimente online!
fonte
Java 8,
144128 bytesExperimente online.
java.time.LocalDate
classe foi uma melhoria em comparação com a antigajava.util.Date
, mas por que eles tiveram que prolongar esses nomes (getMonthValue
egetDayOfMonth
nãogetMonth
egetDay
) ..>.>Explicação:
fonte
Ruby , 94 bytes
Experimente online!
Toma uma única entrada de data e retorna uma sequência no formato ISO 8601 (
YYYY-MM-DD
).Ele usa o módulo principal do Ruby. Se isso não for permitido, ou desaprovado, então por mais dois bytes apresento essa abominação:
Ruby , 97 bytes
Experimente online!
Ele usa a verificação de um número sendo primo a partir desta resposta do stackoverflow . Não tenho ideia de como isso funciona, parece um pouco com bruxaria. A mesma entrada acima e a mesma saída.
fonte
d
e do espaço após oif
porém, para poder cortar 3 bytes da sua primeira resposta, removendo-os. TIO link?x*n !~ /^x?$|^(xx+?)\1+$/
= para verificar se n é primo, faça uma sequência de n 'x' s, verifique se não é 0 ou 1 x (que não é primo) e se não corresponde a nenhum 2 ou mais x se repetem (a correspondência^(xxxxx)\1+$
significaria que n é divisível por 5). Abusa do retorno do mecanismo regex para fazer nosso loop por nós - é brilhante, é monstruoso e o sacrifício de animais provavelmente esteve envolvido em sua descoberta.Ruby ,
5753 bytesExperimente online!
Não é minha ideia - roubada da "abominação" do IMP1
Ideia original:
Ruby , 59 bytes
Experimente online!
fonte
8e4
vez disso, usando o trabalho?R , 117 bytes
Experimente online!
fonte
F #,
134133 bytes-1 byte graças a partir de sundar .
Experimente online!
Total do dia, mês e ano e veja se é excelente. Se for, retorne essa data. Caso contrário, diminua a data em 1 dia e tente novamente.
fonte
-1.0
como-1.
, na chamada AddDays.PowerShell ,
10590 bytesExperimente online!
Graças ao sundar por -13 bytes.
Pega a entrada como a
DateTime
2018-06-20
e a salva$a
. Então estamos em umfor
loop. A cada iteração, tomamos$a
-f
ormatted comoyyyy+MM+dd
(ou seja, a data atual em que estamos separados por+
sinais) adicionados juntamente com|iex
(semelhante aeval
), multiplicando por string com1
s para formar um número unário e usando uma regex de verificação primária para determinar se a data atual é primária ou não. Se não for primo, devemos.AddDays(-1)
retroceder um dia e continuar o ciclo. Se for primo, sairemos do loop e colocaremos$a
no pipeline com saída implícita.A saída resultante é dependente da cultura. No TIO, que usa
en-us
, a saída é de formato de data longa, que pareceSaturday, July 1, 1319 12:00:00 AM
.fonte
0001-01-01
cuja soma é 3). Fiz uma rachadura nessas mudanças aqui .Bash ,
114108 bytesExperimente online!
Meu primeiro bash golf. Sinceramente, meu primeiro programa de bash real ... teste de primalidade feito daqui .
Às vezes, isso pode falhar se houver uma alteração de fuso horário, mas o TIO usa o UTC, portanto deve funcionar.
fonte
@$
, fornece código de trabalho em 110 bytes .C (gcc) , 167 bytes
Experimente online!
Atropelar
A função de verificação anti-prime. Como o primeiro ano válido com o qual precisamos lidar é 0001-01-01, o número mais baixo com o qual precisamos nos preocupar é 3, portanto as verificações de casos especiais para n == 2 ou n <2 são eliminadas. r é definido como um valor verdadeiro se n não for primo. r é mantido global, pois, sem precisar retornar, ele salva dois bytes (
i=n;
para retornar vs,r
para verificar o global). i é definido como 1 pelo chamador da função, para salvar outros 2 bytes.Tomamos a data como três números inteiros separados e iniciamos o loop principal, que continua até que y + m + d seja primo. Então chegamos à carne da função:
Pode parecer duvidoso usar m e y tanto na verificação do ano bissexto quanto no índice da sequência, quando a ordem de avaliação não é especificada. Felizmente, só checamos o ano bissexto se m == 2, o que não pode acontecer ao mesmo tempo em que mudamos me, já que isso acontece apenas entre janeiro e dezembro, portanto a verificação do ano bissexto nunca é incomodada pelo ordem de avaliação.
Finalmente, o resultado é impresso em STDOUT:
fonte
C # -
281239232 Carungolfed:
Tornou o código menos eficiente, mas menor. O loop primário agora subirá para o número inteiro, em vez da raiz quadrada. Ele também processará todos os números pares.
fonte
public
. Além disso, uma vez que não parece ser impedido de obter a entrada de data como um parâmetro de chamada, você poderia terMain(string[]a)
e depoisDateTime.Parse(a[0])
MATL , 14 bytes
Experimente online!
Alternativamente:
15 bytes
Experimente online!
fonte