Eu realmente gosto de momentos que seguem certos padrões. Em particular, gosto de momentos em que todos os dígitos são iguais ou todos os dígitos aumentam aritmeticamente um da esquerda para a direita. Além disso, eu visceralmente odeio quando as pessoas escrevem cartas nos meus tempos, então todo esse absurdo AM / PM está morto para mim. Assim, meus horários favoritos são:
0000 0123 1111 1234 2222 2345
Para a minha paz de espírito, eu preciso de você para me escrever um único programa que, dado o tempo atual como entrada, tanto: (A) se for não agora um dos meus momentos favoritos, diz-me tanto (i) quantos minutos é desde o meu último horário favorito e (ii) quantos minutos a partir de agora meu próximo horário favorito ocorrerá; e (B) se agora é um dos meus momentos favoritos, fornece um único 'valor de sinal'.
Entrada
Seu programa deve aceitar (por qualquer método: argumento da função, argumento da stdin
linha de comando, etc.) a hora atual, em qualquer um dos seguintes formatos:
Um tempo de quatro dígitos como uma sequência
Um número inteiro que pode ser preenchido com zero à esquerda para criar um tempo de quatro dígitos como uma sequência
Uma sequência de quatro (ou menos) números inteiros, ordenada de modo que o primeiro número inteiro na sequência seja o dígito mais à esquerda (significativo) na entrada de tempo (por exemplo,
0951
poderia ser validamente representado como[0, 9, 5, 1]
ou[9, 5, 1]
)- Representar
0000
como uma sequência de comprimento zero é aceitável
- Representar
No caso de uma entrada de sequência, ela deve conter apenas dígitos, sem dois pontos ou outra pontuação. As entradas podem ser consideradas sempre válidas em 24 horas:, HHMM
onde 0 <= HH <= 23
e 0 <= MM <= 59
. Desconsidere a possibilidade de um segundo de salto.
Resultado
Seu programa deve fornecer (retornos de função stdout
, etc. estão bem) (A) ou (B) , conforme apropriado, para determinar se o valor de entrada é ou não um tempo alvo.
Para):
Forneça dois valores numéricos em qualquer formato sensível, como:
Saída de cadeia única com um delimitador adequado
Saídas inteiras / sequência sequenciais, por exemplo,
bash
imprimir duas linhas parastdout
:49 34
Valores de retorno ordenados com comprimento e dois, como uma lista Python, uma matriz C, etc .:
[49, 34]
Os valores podem vir em qualquer ordem. Por exemplo, os dois itens a seguir seriam saídas válidas para uma entrada de 1200
:
49 34
34 49
A ordem e o separador devem ser iguais para todos os valores de entrada!
Para (B):
Produza qualquer resultado inatingível. O mesmo resultado deve ser produzido para todos os seis tempos previstos, no entanto. Loops infinitos são excluídos.
Amostras de entradas / saídas
YAY!!!
é usado aqui como um exemplo demonstrativo e não é prescritivo.
Input Output
------ --------
0000 YAY!!!
0020 20 63
0105 65 18
0122 82 1
0123 YAY!!!
0124 1 587
0852 449 139
1111 YAY!!!
1113 2 81
1200 49 34
1234 YAY!!!
1357 83 505
1759 325 263
1800 326 262
1801 327 261
2222 YAY!!!
2244 22 61
2345 YAY!!!
2351 6 9
Isso é código-golfe , então o código mais curto em bytes vence. As brechas padrão não são permitidas.
Respostas:
Geléia ,
3433323128 bytes3 bytes graças a Mr. Xcoder
.ị
e³
truques.Experimente online!
Algumas partes são exatamente como na resposta de Jonathan Allan , mas estou publicando como acho que é suficientemente diferente e escrita independentemente com base na minha resposta Pyth (e mais curta: D). Também deve ter espaço para melhorias.
A entrada é um número inteiro, a saída é uma matriz de horários anteriores e seguintes ou a matriz vazia para horários especiais.
Explicação
Usando exemplo de entrada
1200
.d³
converte o tempo para a base 100, em horas e minutos:[12,0]
.ḅ60
convertidos de base 60 para obter o total de minutos:720
.;15
pares com 15:[720, 15]
.83,588
cria a matriz[83, 588]
.ṁ5
torna comprimento 5:[83, 588, 83, 588, 83]
.¤
combina as duas ações acima. Apenas um detalhe técnico.j
junta-se a par com o array:[720, 83, 588, 83, 588, 83, 15]
._\
subtrai cada valor de matriz a partir do primeiro e obtém resultados intermédios:[720, 637, 49, -34, -622, -705, -720]
.ṠÞ
estável classifica estes por signum:[-34, -622, -705, -720, 720, 637, 49]
.A
leva os valores absolutos:[34, 622, 705, 720, 720, 637, 49]
.µ
inicia uma nova cadeia monádica. Mais uma vez, um tecnicismo..ị
leva os últimos e primeiros itens:[49, 34]
.×Ạ
repete que uma vez que se não houver zeros, ou zero vezes de outra forma:[49, 34]
.fonte
,
para;
desde que estava sendo selecionado como literal da lista).³
vez de100
é permitido ) OYAY!!!
valor é[0, 0]
sempre o mesmo.xẠ
como filtro zero, já que prefiro[]
mais do que[0, 0]
porque é mais claramente diferente.JavaScript (ES6),
8783 bytesGuardado 4 bytes graças a @ l4m2
Recebe a entrada como uma sequência. Retorna
0
uma matriz de 2 elementos ou uma.Casos de teste
Mostrar snippet de código
Quão?
Não nos preocupamos com o resultado do
.every()
loop. Desde que a entrada seja válida, sempre será falsa. O que realmente interessa é quando saímos desse loop.Saímos assim que encontramos um horário favorito
i
(expresso em minutos) que é maior ou igual ao tempo de referênciak
(o tempo de entradat
convertido em minutos). Em seguida, retornamos0
sei == k
ou os 2 atrasos de outra forma.fonte
t%100+(t/25>>2)*60
=>t-(t/100|0)*40
Befunge-93,
8885868074 bytesExperimente online!
Gera o número de minutos desde o último horário favorito, seguido pelo número de minutos até o próximo horário favorito (separado pela sequência de dois caracteres: espaço, hífen). Se já é um horário favorito, um único zero é retornado.
fonte
C, 121 bytes
Gera uma nova linha se a hora é a hora favorita.
Experimente online!
fonte
Limpo , 126 bytes
Define a função
?
, recebendoInt
e retornando(Int, Int)
.Quando o argumento é o horário favorito, ele interrompe o programa de chamada com
hd of []
.Experimente online!
fonte
Pitão,
484542 bytesExperimente online. Suíte de teste.
O código pega uma sequência de tempo e gera as horas anteriores e seguintes como uma matriz, ou
0
se a hora é especial.Curiosamente, uma abordagem imperativa também é de 42 bytes:
Explicação
cz2
divide input (z
) em partes de dois caracteres.sM
avalia-os como números inteiros.i
…60
Analisa a matriz de dois itens resultante como base 60.,83 588
representa a matriz[83, 588]
.*3
triplica isso para[83, 588, 83, 588, 83, 588]
.P
remove o último588
.+
...15
adiciona15
até o fim..u-NY
começa a partir do número analisado, subtrai cada número na matriz e retorna os valores intermediários. Estas são as diferenças de cada momento especial.J
atribui essas diferenças aJ
.*F
calcula o produto das diferenças. Será 0 se a hora for especial.&
interrompe a avaliação aqui e retorna 0 se o horário foi especial.._DJ
stable - classifica as diferenças por sinal.K
salva essa matrizK
.e
pega o último item da matriz._hK
pega o primeiro item da matriz e o nega.,
retorna os dois como uma matriz.fonte
cz2 60
parac2z60
(eles são equivalentes para as listas de 4 elementos)Geléia ,
33 3234 bytes+3+2 bytes para corrigir, para que todas as saídas de tempo desejadas sejam iguais.tem que ser um caminho mais curto!
Um link monádico que pega uma lista dos quatro dígitos e retorna uma lista que contém dois números inteiros
- se for um tempo que você gosta, o resultado será que as duas entradas serão zeros.
Experimente online! ou veja a suíte de testes .
Quão?
fonte
Casca , 36 bytes
Experimente online!
Agradeço ao Zgarb por me explicar como os ternários funcionam no chat. Tentando jogar golfe
↑0
, mas não consegui que funcionasse de outra maneira por algum motivo (?). Esta é a minha primeira resposta não trivial de Husk, e deixando o mencionado acima, estou bastante satisfeito com isso. O valor usado em vez deYAY!!!
é[]
(mas espero que isso mude para fins de golfe).Explicação
fonte
Kotlin , 293 bytes
Embelezado
Teste
TIO
TryItOnline
fonte