Originalmente publicado (e excluído) pelo @Tlink , que provavelmente foi inspirado nesta pergunta do StackOverflow .
Como foi uma pena que tenha sido excluído, porque parecia um bom desafio em geral, achei que o republicaria com formatação e regras adequadas. (Tentei entrar em contato com o @Tlink e obter sua permissão para publicá-lo, mas ele não responde mais, e foi por isso que decidi publicá-lo agora.
Entrada: seis dígitos.
Saída: a primeira ou a última hora válida no formato de 24 horas ( 00:00:00
até 23:59:59
). (Você pode escolher se quer imprimir a primeira ou a última hora válida.)
Exemplo:
Quando as entradas são 1,8,3,2,6,4
, os seguintes horários podem ser criados:
12:36:48 12:38:46 12:46:38 12:48:36
13:26:48 13:28:46 13:46:28 13:48:26
14:26:38 14:28:36 14:36:28 14:38:26
16:23:48 16:24:38 16:28:34 16:28:43
16:32:48 16:34:28 16:38:24 16:38:42
16:42:38 16:43:28 16:48:23 16:48:32
18:23:46 18:24:36 18:26:34 18:26:43
18:32:46 18:34:26 18:36:24 18:36:42
18:42:36 18:43:26 18:46:23 18:46:32
21:36:48 21:38:46 21:46:38 21:48:36
23:16:48 23:48:16
Portanto, produziremos um 12:36:48
ou 23:48:16
neste caso, sendo o primeiro / o último, respectivamente.
Regras do desafio:
- Indique se você deu a primeira ou a última hora válida na sua resposta.
- A E / S é flexível. A entrada pode ser seis números inteiros separados; uma string contendo os seis dígitos; uma lista / matriz inteira; um único número (possivelmente octal); etc. A saída pode ser uma lista / matriz de dígitos ordenada corretamente; uma String no formato
HH:mm:ss
/HHmmss
/HH mm ss
; todos os dígitos impressos com delimitador de nova linha; etc. Sua ligação. - Você pode pegar os dígitos na ordem que desejar, para que eles já possam ser classificados do menor para o maior ou vice-versa.
- Se não for possível criar um tempo válido com os dígitos fornecidos (ou seja
2,5,5,5,5,5
), deixe-o claro da maneira que desejar. Pode retornarnull
/false
;"Not possible"
; falha com um erro; etc. (Você não pode gerar um horário inválido como55:55:52
, ou outro válido como00:00:00
.) Indique como ele lida com entradas para as quais não é possível criar uma hora válida. - Você não tem permissão para gerar todos os tempos válidos possíveis. Somente os primeiros / os mais recentes devem ser enviados / retornados.
24
por horas (ou seja24:00:00
) ou60
por minutos / segundos (ou seja00:60:60
) não são válidos. Os intervalos são[00-23]
para horas,[00-59]
minutos e segundos.
Regras gerais:
- Isso é código-golfe , então a resposta mais curta em bytes vence.
Não permita que idiomas com código de golfe o desencorajem a postar respostas com idiomas que não sejam codegolf. Tente encontrar uma resposta o mais curta possível para 'qualquer' linguagem de programação. - As regras padrão se aplicam à sua resposta, para que você possa usar STDIN / STDOUT, funções / método com os parâmetros adequados e programas completos do tipo retorno. Sua chamada.
- As brechas padrão são proibidas.
- Se possível, adicione um link com um teste para o seu código.
- Além disso, adicione uma explicação, se necessário.
Casos de teste:
Input: Earliest output: Latest output:
1,2,3,4,6,8 12:36:48 23:48:16
2,5,5,5,5,5 None possible None possible
0,0,0,1,1,1 00:01:11 11:10:00
1,1,2,2,3,3 11:22:33 23:32:11
9,9,9,9,9,9 None possible None possible
2,3,5,5,9,9 23:59:59 23:59:59
1,2,3,4,5,6 12:34:56 23:56:41
0,0,0,0,0,0 00:00:00 00:00:00
1,5,5,8,8,8 18:58:58 18:58:58
1,5,5,5,8,8 15:58:58 18:58:55
1,1,1,8,8,8 18:18:18 18:18:18
23:48:16
uma saída válida para o exemplo?06:08:60
válido, dado que houve um segundo de salto durante esse minuto?60
por minutos e segundos não é válido. Intervalos são[00-23]
,[00-59]
e[00-59]
. Esclarecerá isso no desafio.Respostas:
C (gcc) ,
186174 bytesExperimente online!
-12 bytes graças a Kevin Cruijssen
Provavelmente não é o ideal, mas funciona. Curiosamente, por algum motivo, com 7 argumentos, a implementação do gcc no TIO exige que você realmente os forneça ou segfaults. Na minha máquina, isso é desnecessário.
Formato: G (X, 0,6) -> Y, onde X é o número de 6 dígitos cujos dígitos devem ser utilizados e Y é o número de 6 dígitos que, quando considerado como um tempo (inserindo: apropriadamente), é mínimo.
fonte
{0,1,10,100,1000,10000,100000}
para{0,1,10,100,1e3,1e4,1e5}
. Além disso, você pode golfefor(I=0;I<F;++I){E=O%10;M=G(O/10,L*10+E,F-1);T=T>M?M:T;O=(O/10)+E*D[F];}
parafor(I=0;I++<F;M=G(O/10,L*10+E,F-1),T=T>M?M:T,O=(O/10)+E*D[F])E=O%10;
, e retirar os suportes em torno daif
. Experimente online 174 bytes . Além disso, eu gosto doG(O,L,F,T,I,M,E)
. :)...1e3,1e4,1e5}
não funcionou. Obrigado pela sugestão.Haskell ,
1149686 bytesAgora com saída menos rigorosa. Recebe a entrada como uma sequência de dígitos e compara permutações contra limites com a comparação de lista. Com minutos e segundos, apenas o primeiro dígito é verificado. Falha e queima se nenhuma permutação é um tempo válido.
Experimente online!
fonte
Python 2 ,
13111511210910588 bytesExperimente online!
E / S são listas de números inteiros
Lança um erro se não houver tempos possíveis
Alternativo:
Python 2 , 88 bytes
Experimente online!
Retorna a última hora
Retorna uma tupla vazia por horários inválidos
Salvou
fonte
05AB1E ,
2015 bytesEntrada como sequência classificada.
A saída é o menor tempo como uma string.
No caso de não haver solução, uma lista vazia é a saída.
Experimente online!
fonte
JavaScript (ES6),
938988 bytesEspera uma matriz de 6 dígitos, classificados do menor para o maior. Retorna a sequência de 6 dígitos da primeira hora válida ou
false
se não houver solução.Experimente online!
Comentado
Tentamos recursivamente todas as permutações da entrada até encontrarmos uma que seja aprovada em um teste híbrido usando expressões aritméticas e regulares.
fonte
Japonês , 17 bytes
Recebe a entrada como uma sequência de dígitos e gera a primeira hora válida; faz loop infinitamente se não houver tempo válido.
Tente
Explicação
fonte
Retina ,
7774696562 bytesExperimente online! Produz o horário mais cedo ou a sequência vazia, se não for possível encontrar tempo. Editar: salvou
58 bytes graças a @TwiNight. Explicação:Gere todas as permutações. Ele
:
funciona da mesma maneira que a string à medida que as permutações são geradas, terminando no início.Classifique os horários em ordem.
Saída a primeira hora válida.
fonte
L0
0G
na verdade.Vermelho ,
157124 bytesAgradeço a Kevin Cruijssen por me lembrar de ler as descrições com mais cuidado!
Experimente online!
Toma uma sequência classificada como entrada. Retorna
none
se não for possível ganhar tempo.Explicação:
fonte
sort
início é necessário? No desafio, declaro: " Você pode pegar os dígitos na ordem que desejar, para que eles já possam ser classificados do menor para o maior ou vice-versa. "Python 2 , 78 bytes
Experimente online!
Arnauld salvou um byte. Obrigado!
Espera uma lista como
['1','2','3','4','6','8']
na ordem classificada:Emite um número inteiro como
123648
12:36:48. Espero que seja aceitável.fonte
62**3
vez de240000
?Gelatina , 15 bytes
Experimente online!
Publicado após uma solicitação. A abordagem é a mesma da outra resposta, porém essa resposta foi desenvolvida de forma independente.
fonte
Japt ,
3923 bytesTenho certeza de que há uma maneira mais curta de fazer isso, mas eu queria tentar usar objetos Date em Japt.
Recebe a entrada como uma matriz classificada de números, retorna o tempo válido mais recente ou a saída vazia, se não houver nenhuma.
Perdeu 10
librasbytes graças a Shaggy .Experimente aqui .
fonte
Ruby ,
68 67 62 5655 bytesExperimente online!
Entrada: Ordenado matriz de dígitos (como números inteiros).
Saída: matriz de dígitos ou
nil
se nenhuma solução encontradafonte
eval "
eu acho.a*9+b<22
por um byte.Geléia , 17 bytes
Estou quase certo de que essa não é a abordagem mais curta ... analisarei isso novamente mais tarde :)
Experimente online!
fonte
Wolfram Language (Mathematica) , 63 bytes
Experimente online!
Leva uma lista classificada de dígitos como entrada. Retorna
Missing[NotFound]
para entradas inválidas.Explicação
Encontre todas as permutações da entrada. Como a entrada é classificada, é garantido que todos os tempos válidos estejam em ordem crescente.
Encontre a primeira lista que corresponde ...
O primeiro elemento, rotulado
a
, é 0, 1 ou 2 e rotula o segundo, terceiro e quinto elementosb
,c
ed
respectivamente ......
a*b
seja inferior a 10, ed
ec
seja menor que 6, comd >= c
.O truque é que, para todos os números
00
até24
, o produto dos dois dígitos é no máximo 9 e os possíveis números inválidos25
para29
(já que forçamos o primeiro dígito a ser 0, 1 ou 2) têm o produto de pelo menos 10.fonte
Pitão , 37 bytes
Suíte de teste
Explicação:fonte
Perl 5 com
-palF
, 73 bytesExperimente online!
Produz como
HHmmss
e gera uma linha em branco para entradas inválidas.Todas as respostas que eu fiz recentemente foram usadas
glob
para permutações ... Estranho!fonte
Bash + GNU sed,
83,72, 69 bytesseq 0 86399|sed "s/^/date +%T -ud@/e;h;`printf s/%d//\; $@`/\w/d;x;q"
Como funciona
Gere previamente todas as seqüências de tempo possíveis, para os carimbos de data e hora no intervalo de 0 a 86399, usando o comando GNU-sed e (xecute) +
date
.%seq 0 86399|sed "s/^/date +%T -ud@/e;h;"
Gere
sed
script com 6 comandos de substituição seqüencial, para cada dígito de entrada.%echo sed `printf s/%d//\; $@`
Em seguida, aplique substituições, remova quaisquer linhas de entrada que tenham pelo menos um dígito restante, imprima a primeira linha correspondente (a seqüência de tempo original é extraída do espaço de espera com
x
).Teste
Experimente Online!
fonte
Kotlin ,
396391389 bytesNenhuma pista de como fazer isso menor. Estou pensando que é o dobro do que é possível. Produz o primeiro tempo. Graças a Kevin por 7 bytes!
Experimente online!
fonte
var l=0>1
evar e=1>0
? Além disso, por que sãol=l
ee=e
necessários? Duas coisas que parecem trabalho para golfe sãovar e=1>0
avar e=!l
e removendo o espaço antes"None"
. Além disso, qualquer saída falsey é boa, então"None"
também pode ser justa0
."0"
pode ser apenas0
0
erros sem erros. E sua função atual não especifica um tipo de retorno, tanto quanto eu poderia dizer, portanto, de qualquer forma, ele não retornará implicitamente como um objeto? PS: Eu não conheço Kotlin, apenas tentei sem as aspas e os resultados foram os mesmos. ;) Talvez algo mais não esteja funcionando por causa disso, do qual não estou ciente.MATL ,
3130 bytesExperimente online!
A entrada é 6 números inteiros, a saída é a hora, minutos e segundos mínimos em uma matriz. Falha nas entradas onde esse tempo não é possível.
(-1 byte graças a @Luis Mendo.)
fonte
2&A
por!A
, porque a matriz binária nunca será um vetor linhaPerl 6 , 43 bytes
Experimente online!
Espera uma matriz de entrada classificada. Retorna
Nil
para entrada inválida.fonte
Stax , 15 bytes
Execute e depure
É necessária uma sequência de dígitos classificados para entrada. Retorna a primeira permutação que satisfaz alguns critérios.
fonte
Retina ,
5847 bytesExperimente online!
A entrada tem 6 dígitos na ordem classificada. A saída é de 6 dígitos que representam o tempo válido mais antigo ou a sequência vazia, se não houver tempo válido.
EDIT: eu era um idiota, -9 bytes
Explicação
Algoritmo
Para resumir, vamos definir um dígito baixo como 0-5 e um dígito alto como 6-9.
Primeiro, reorganize os dígitos para que "baixo nível" ou "alto nível" de cada posição esteja correto. A organização correta, para cada número de dígitos altos na entrada:
Como qualquer rearranjo falharia, a verificação final na entrada tem mais de 4 dígitos altos, podemos ignorar completamente esse caso.
Em seguida, classifique os pontos baixos e máximos individualmente. Combinado com o rearranjo, obtém o valor mais baixo que satisfaz as restrições de minuto e segundo. Portanto, isso fornece o tempo válido mais cedo, se houver.
Por fim, verifique se temos tempo válido. Caso contrário, descarte a string.
Programa
Corresponde
LHH
e troca os dois primeiros dígitos em que (se tornaHLH
) e repita isso até que nãoLHH
exista mais . Isso fornece o arranjo correto.Na verdade, eu menti. Nenhuma classificação é necessária porque 1) a troca ocorre apenas entre dígitos adjacentes e apenas entre um baixo e um alto; e 2) a entrada é classificada. Portanto, os mínimos e máximos individualmente já estão em ordem ordenada.
Mantém a string apenas se for um tempo válido
fonte