Este é o meu primeiro código de golfe, então, deixe-me saber se é muito amplo ou se estou perdendo alguma informação para um bom quebra-cabeça!
Desafio
Em Ontário e possivelmente em outras áreas do mundo, a eletricidade é cobrada com base no preço do tempo de uso (TOU) , que varia o custo por quilowatt-hora de acordo com o uso da energia.
Dada a data e a hora, quero saber se estou no período de pico (vermelho), pico médio (amarelo) ou fora do pico (verde).
Entrada
Suponha que a entrada seja fornecida em um formato de data e hora ISO 8601 aceitável, sem fuso horário, com a precisão mínima de horas:YYYY-MM-DDThh[:mm[:ss]]
(o T é literal).
Exemplos
- 2014-09-01T14
- 2014-09-01T17: 30
- 2014-09-01T17: 30: 02
Saída
A saída deve ser uma string On
, Mid
ouOff
.
Regras
- O código mais curto vence
- Para os fins deste desafio, ignore os feriados legais
- Suponha as informações encontradas nesta postagem. As regras reais de preços por tempo de uso podem mudar no futuro pelo Ministério da Energia de Ontário.
Em formação
Dias de semana de verão (1º de maio a 31 de outubro)
- Fora do pico: 19h00 - 07h00
- Pico médio: 07h00 - 11h00 e 17h00 - 19h00
- No pico: 11h00 - 17h00
Dias úteis de inverno (1 de novembro a 30 de abril)
- Fora do pico: 19h00 - 07h00
- Pico médio: 11h00 - 17h00
- No horário de pico: 07h00 - 11h00 e 17h00 - 19h00
Finais de semana
- Fora do pico: o dia todo
YYYY-MM-DDThh[:mm[:ss]]
porque os segundos só podem ser aplicados se os minutos forem aplicados?Respostas:
Ruby -
147 144 143 141 137135Isso representa uma função que pega uma string como parâmetro e retorna uma string.
Aqui está uma demonstração on-line com alguns casos de teste: http://ideone.com/wyIydw
fonte
Python 2-166
Se necessário, abaixo está uma explicação da lógica na linha final:
A linha final imprime uma fatia
'OMOfinfd'
dependendo da avaliação de suas condicionais.Primeiro, avalie a operação
1+((10<t<17)==(4<m<11))
.Se o XNOR entre as condições
10<t<17
e4<m<11
éFalse
, este irá avaliar a1+False => 1+0 => 1
. Caso contrário, a operação será avaliada como1+True => 1+1 => 2
.Por fim, multiplique o resultado da operação acima pelo dia da semana e o horário entre 6h e 19h.
Se for esse o caso
False
, o dia é um fim de semana ou o horário é entre 19h e 6h, e o resultado será(1|2)*0 => 0
. Caso contrário, o resultado será(1|2)*1 => 1|2
.Um resultado
0
será impressoOff
,1
impressoMid
e2
impressoOn
.fonte
C # -
240220 caracteresNada especial. Codificação direta.
Graças a w0lf :)
fonte
s.Length==13?s+":00:00":s.Length==16?s+":00":s
para(s+":00:00").Substring(0,19)
Ruby - 135
Abusa do módulo Time. Entrada por argumento de linha de comando.
Edit: Obrigado w0lf pelo tempo que ajudou a diminuir e resolver um bug.
fonte
2014-09-01T17:30
ele sai corretamente"Mid"
, mas para2014-09-01T17
ele"Off"
.Groovy -
621534524491 caracteresAlgum jogo a mais, mas bastante simples ao aproveitar o Joda-Time
execuções de amostra:
Ungolfed:
fonte
java.time.*
, que é muito semelhante ao Joda Time, mas faz parte do JRE. Talvez isso possa reduzir um pouco o código.'2014-01-05T08:08'
, 5 de janeiro de 2014 é um domingo. Assim, deveria ser'Off'
java.time.*
. falhou miseravelmente. O analisador é muito rígido. UseDateParser
do nashorn (também parte do JRE8) que é branda e com um pouco de hackers abusivos, branda o suficiente para pular minutos e segundos.R,
243204 caracteresRecuado e comentado:
Exemplos:
fonte
Bash, 286
esta é uma resposta simples do bash usando o programa date
fonte
Aqui vai outro!
JavaScript,
175171Desminificado:
Funciona apenas em intérpretes em que uma sequência de datas ISO8601 pode ser passada para o
Date
construtor.CoffeeScript,
192189Surpreendentemente, é mais longo no CoffeeScript porque não há operador ternário nessa linguagem (na qual você pode ver no meu JavaScript, eu confiei bastante).
fonte
ES6 - 146
Isso está em forma de função, usa alguns hacks desagradáveis.
Explicado:
fonte
Python 3-352 caracteres
fonte
s=['high','mid','off']
paras=['on','mid','off']
- não apenas isso salva 2 caracteres, mas a especificação diz para a saída "on".Java -
426309/301? (Ver comentários)Exemplo de saída:
Usei o mesmo truque do EXOR que o envio do Python.
Eu também usei a+
como uma função OR, para quando éweekend OR night
.Meu outro grande truque: máscaras de bits.
Por exemplo, para ver se um número está entre 2 e 6 (segunda a sexta-feira), primeiro crie um padrão de bits em que os valores interessantes sejam 1:
Em seguida, use bit shift para obter o bit interessante no LSB e extraí-lo:
Da mesma forma, fiz padrões de bits por meses e horas:
Infelizmente, acontece simplesmente
x>y&x<z
na maioria dos casos, é mais curto, então não o usei em alguns lugares.E, finalmente, um pouco de hackery (altamente dependente da implementação) com
jdk.nashorn.internal.parser.DateParser
: QuandoparseEcmaDate()
não analisa completamente uma data (como quando lê a hora e atinge o final da string), ela retorna false.Integer[]
(ftw de descompactação automática), com o mês fixado para ser a base 0 (como outras classes Java).-(c?0:1)
.fonte
.parse()
também pode funcionar (reduzindo 8 caracteres), mas não testei completamente com entradas diferentes.parse
chama internamenteparseEcmaDate
e, se falhar, chamaparseLegacyDate
. O último pode estragar a matriz, mas isso não aconteceu com alguns casos que testei.Nada me impede de entrar na minha própria, e há outras mais curtas aqui de qualquer maneira, então ...
PHP 5.4+, 194
Não minificado e comentado:
Observe também que a
date.timezone
diretiva no php.ini deve ser definida, caso contrário, uma exceção será lançada.fonte