Desde que eu vi o primeiro, há alguns anos, eu sempre fui subjugado por esse tipo de relógio de palavras, onde o tempo é realmente determinado por palavras sendo iluminadas ou não em uma frase significativa.
O texto exibido nesse relógio é o seguinte.
IT IS HALF TEN
QUARTER TWENTY
FIVE MINUTES TO
PAST TWO THREE
ONE FOUR FIVE
SIX SEVEN EIGHT
NINE TEN ELEVEN
TWELVE O'CLOCK
Sua tarefa é escrever um relógio que funcione. As palavras são acesas se e somente se forem relevantes para a impressão da hora atual. Caso contrário, eles estão iluminados. As palavras são "iluminadas" ao serem impressas e "iluminadas" ao serem substituídas por vários espaços, sendo o comprimento da palavra.
Exemplo: se o horário atual for 17:23, o texto impresso deverá ser exatamente o seguinte:
IT IS
TWENTY
FIVE MINUTES
PAST
FIVE
Regras
- A hora impressa é a variante de 12 horas, mas sem AM / PM.
- O arredondamento é feito apenas com base em minutos (os segundos são totalmente irrelevantes). O arredondamento é feito para o múltiplo mais próximo de 5. Portanto, por exemplo, embora 17:52:38 seja realmente o mais próximo de 17:55, mas como os segundos são irrelevantes, 17:52 é na verdade arredondado para 17:50, e o texto impresso é "SÃO DEZ MINUTOS A SEIS" (com espaçamento relevante). Portanto, se
XX
for múltiplo de cinco,XX
será usado de HH: (XX-2): 00 até HH: (XX + 2): 59. A palavraMINUTES
deve aparecer seFIVE
,TEN
ouTWENTY
estiver acesa na seção de minutos (antes de "TO" ou "PASSADO"). - Todas as palavras irrelevantes são substituídas por quantos espaços forem necessários para manter o texto onde ele está localizado no modelo acima. Os espaços à direita podem ser aparados. Os espaços relevantes para manter o texto na posição esperada devem ser mantidos.
As linhas à direita também podem ser cortadas. Linhas vazias relevantes ainda precisam aparecer. Exemplo:
IT IS TEN MINUTES PAST TWO
Não acenda
TEN
na primeira linha ouFIVE
na terceira linha quando esses valores se referirem às horas.- Você pode aceitar uma entrada. Se você aceitar uma entrada, a entrada será a hora de imprimir em qualquer formato válido desejado (sequência, lista de números inteiros, horário nativo, digite o seu suporte ao idioma, ...), mas nenhum parâmetro será permitido se não estiver relacionado até a hora de imprimir. Se você não suportar nenhuma entrada, deverá usar a hora atual. Se você apoia os dois, é melhor, mas não há bônus;)
- Seu código pode ser um programa, uma função, um lambda, mas não um trecho.
- Se seu idioma suportar impressão de qualquer forma, ele deverá imprimir o resultado (em um arquivo, na saída padrão, não me importo). Se o seu idioma não suportar a impressão de forma alguma, é permitido simplesmente "retornar" o texto esperado. O resultado pode ser todo em maiúsculas ou minúsculas, não uma mistura de ambos.
- Aplicam-se brechas padrão.
- Isso é código-golfe, então o código mais curto vence!
- Na medida do possível, forneça um link para um intérprete on-line do seu idioma.
Casos de teste
Input: <no input> (the current local time is 19:20)
Output:
IT IS
TWENTY
MINUTES
PAST
SEVEN
Input: 13:15
Output: (empty line is being printed)
IT IS
QUARTER
PAST
ONE
Input: 13:58
Output: (rounding)
IT IS
TWO
O'CLOCK
Input: 14:30
Output: (half is always a edge-case)
IT IS HALF
PAST TWO
Input: 15:35
Output: (light up "TO")
IT IS
TWENTY
FIVE MINUTES TO
FOUR
Input: 10:00
Output: (do not use the TEN or FIVE on the first line when referring to the hours)
IT IS
TEN
O'CLOCK
Input: 12:00
Output: (O'CLOCK and a lot of empty lines)
IT IS
TWELVE O'CLOCK
Respostas:
PHP,
387384353352342323310306298293291 bytesObrigado @Christoph por jogar golfe junto com suas excelentes descobertas!
Pelo menos 45 bytes estão em sua conta; 16 ou mais inspirado por ele.
Uma Marvel Team Up!
percorre os dados e verifica se o índice atual está em uma sequência gerada que contém os índices das palavras a serem acesas (mapeadas para letras); acrescenta quebra de linha ou espaço, dependendo do índice.
Pode gerar avisos se você não usar o valor padrão para
error_reporting
(22519).Teste online.
demolir
Golfe :
$x/5+.5|0
é dois bytes menor queround($x/5)
.date(h)
são um byte mais curto do que atribuir odate
resultado a uma variável.$w<A
é três bytes menor que$w=="\n"
- verifique se não há espaço após um delimitador!abs
salvou 8 bytes na palavra minutos.Usar o sublinhado como o primeiro índice permitiu incluí-lo nas alternativas "é"; e tornou obsoleta a cotação das horas.
1
valor no mapa de horas tornava o módulo obsoleto e, com o golfe adicional, economizava 10 bytes. Inspirado por @Christoph.str_pad("",strlen($w))
->$w^$w^" "
. (Christoph)strtr
o segundo parâmetro não for uma string, ele será interpretado como um código ascii. salva 5 bytes.fonte
$i++%3^($i<3)
para$i++%3^$i<3
. Estou oficialmente completamente perdido agora. Farei uma pausa até que alguém combine conosco. Foi muito divertido. Obrigado Titus pelo seu trabalho em equipe!TI-Básico,
335334 bytesPraticamente perfeito, já que os TI-84 calcs têm displays de letras 8x16, e isso é 8x15. A data é tomada como entrada para suportar cálculos anteriores à TI-84, que não possuem relógios internos. Sem argumentos,
Input
obtém entrada por padrão emX
eY
, semelhante aPrompt X,Y
. Portanto, façaX
horas (tudo>=0
funcionará corretamente) e teráY
minutos.Nota 1: Para a TI-84 +, você pode substituir
Input
por algo comogetTime:Ans(1->X:getTime:Ans(2->Y
. Além disso,int(Y/5-5.6
é equivalente around(Y/5,0)-6
. E não, neste casoint(
não foi possível trocariPart(
.Nota 2: Isso imprime a entrada muito bem, mas por razões estéticas você provavelmente deseja que,
Pause
no final do programa, evite aDone
mensagem ao finalizar o programa.Edit: Contagem de bytes reduzida por token (veja a nota na revisão anterior); também é corrigido um erro graças ao @Neil. Terceiro, corrigi um bug que me custou 2 bytes, mas a otimização economizou 1 byte no geral, e também percebi que estou recebendo informações para não precisar ligar
getTime
(duh?). Por fim, para quem deseja confirmar essa contagem de bytes, o único token de dois bytes ésub(
.fonte
O'CLOCK
do código, a saídaPAST
também será ...x+(y>32) mod 12
se a comparação produz 1 ou 0 como no TI-Basic.JavaScript (ES6),
291303295 bytesRecebe entrada como dois números inteiros com sintaxe de currying
(h)(m)
Como funciona
O relógio inteiro pode ser visto como 23 LEDs que estão LIGADOS ou DESLIGADOS. Portanto, o estado do relógio é um número inteiro de 23 bits.
A lógica dos minutos que precisamos implementar para permitir as palavras certas não é tão simples quanto se pensa à primeira vista. Pode existir uma fórmula de golfe mágico, mas eu fui do jeito mais fácil e decidi apenas codificar cada configuração possível:
Casos de teste
Mostrar snippet de código
fonte
Lote, 789 bytes
Nota: Espaço à direita após
PAST
e 5 espaços à direita em cada uma das duas linhas a seguir.fonte
call:c
por exemplo)! Eu provavelmente deveria aprender algumas lote :)JavaScript,
567 564 551 542 529 527519 bytesMostrar snippet de código
Não sei se tudo bem levar horas e minutos como argumentos. Você disse "lista de números inteiros". Ainda conta?
É a minha primeira vez jogando golfe, a propósito. O que você acha?
Editar: salvou alguns bytes dividindo minutos. Obrigado, Olivier!
fonte
c
sua função. Você não deve perder nenhum byte ao fazê-lo, eu acho, mas isso o torna mais um trecho de uma função (para mim, pelo menos, talvez os gurus do JS digam o contrário).JavaScript (ES6) 360
Uma função com parâmetros de entrada hora (0..23) e minuto (0..59).
Usando
alert
para saída, pois é a função de saída padrão em javascript, mesmo que seja inconveniente. (E é curto)Nota do teste : para sua tranquilidade, no trecho de teste, a saída do alerta é redirecionada para o texto da página
fonte
i
? Vejo que você obtém todos os grupos que não são de espaço em branco (os "LEDs") e os substitui por um espaço em branco com base nas condições que você escreveu para cada um deles. Por exemplo,h-2
é falso apenas quandoh == 2
, então presumo que você o inverta em algum lugar? Você pode explicar um pouco como isso funciona? Talvez como uma edição da sua resposta? Eu ficaria muito grato!i
para se referir à correta, incrementando-a após cada correspondência de expressão regular. Se for verdade, você substitui a sequência correspondente por espaços em branco, caso contrário, você a deixa como está. Eu não entendo uma coisa, no entanto.replace()
usa o valor de retorno da função especificada (função de seta neste caso). Onde você retorna um valor? Acabei de ver um operador ternário.(a,b)=>{ return a+b }
é o mesmo que(a,b)=>a+b
Python 2,
466,460,449,452,459449 bytesComo é permitido que seja uma função que aceita he em números inteiros, podemos economizar alguns bytes. Experimente online .
Eu tinha um par de erros (agora corrigido) com a lógica para
TO
/PAST
vsO'CLOCK
. Também salvou alguns bytes paraenumerate
, alterandoimport
e em19<m<26
vez dem in [20,25]
. Economizou outros 8 por trabalhar em blocos de 5 minutos em minutos. Rod apontou mais alguns erros que me custaram um pouco, mas eu me recuperei um pouco com atribuições mais eficientes e uma correção de bug que funcionava a meu favor.fonte
==
como comparação e acho que posso melhorar alguns dosh
testesprint c
na última linha,c
já detéma[i]
devidoenumerate
print
adicione uma nova linha após cada impressão, você pode suprimi-lo adicionando um,
depoisc
. Além disso, ele deve imprimir espaços em branco quando uma palavra não é impressa. Você pode corrigir com outra pessoa no último caso.else:print' '*len(c),
Perl 6 ,
308296293 bytesExperimente online!
Explicação
A estrutura básica é a seguinte:
A expressão elidida como
...|...|...|...
acima é um junção de números inteiros que representam índices de palavras com base em 1 e é composta da seguinte maneira:fonte
Python3, (569 bytes)
Esta resposta requer tempo no formato hh mm (números inteiros separados por espaço). Consegui imprimir '\ n', o que é inspirado no método de Chris.Obrigado, Chris! Qualquer ajuda para reduzir o código é apreciada.
Experimente Online
fonte
.split(',')
? Deve economizar alguns.H,M=input()
onde está H, M. Dois sequência de inteiros é permitido sob as regras, não tenho certeza se isso funciona como pretendido em Python 3. Eu ainda sou um cara 2 :-)H,M=input()
não funcionou como você duvidou.Python 2 ,
443440 bytesExperimente online!
Provavelmente ainda poderia se beneficiar de mais golfe. Entrada é uma lista de números inteiros, por exemplo, 7,23 = 7:23
fonte
SimpleTemplate ,
737708 bytesSim, a verbosidade e a falta de matemática "real" prejudicam muito o número de bytes.
Isso espera a hora e os minutos como o primeiro e o segundo parâmetros da classe.
Ungolfed:
Como executar:
Execute o seguinte código:
Feito!
fonte
Java (OpenJDK 9) , 437 bytes
Experimente online!
Eu pensei que finalmente daria uma chance no meu desafio;)
fonte
Perl 5 ,
487449 bytesExperimente online!
fonte