Desafio
Escreva o programa mais curto que converte um intervalo de tempo legível por humanos em componentes de data do formulário:
{±YEARS|±MONTHS|±DAYS|±HOURS|±MINUTES|±SECONDS}
Casos de amostra
Cada caso de teste é de duas linhas, entrada seguida por saída:
1 year 2 months 3 seconds
{1|2|0|0|0|3}
-2 day 5 year 8months
{5|8|-2|0|0|0}
3day 9 years 4 seconds -5 minute 4 years 4 years -3seconds
{17|0|3|0|-5|1}
Regras
- Você não pode usar
strtotime
ou qualquer função interna que faça todo o trabalho. - Vitórias com códigos mais curtos (bytes)
- Você pode imprimir sua saída
stdout
ou um arquivo, o resultado também pode ser retornado por uma função, cabe a você - O token pode estar na forma singular ou plural.
- Os componentes podem estar em uma ordem aleatória
- Pode não haver espaço em branco entre o número e o token
- O sinal é opcional quando o intervalo de tempo é positivo (entrada e saída)
- Se um componente aparecer mais de uma vez, os valores devem ser adicionados
- Cada componente tem seu próprio sinal
- Os componentes devem ser manuseados separadamente (por exemplo,
80 minutes
permanecem 80 na saída) - A entrada é garantida em minúsculas
Golfe feliz!
Sign is optional when the time interval is positive
Isso significa que a entrada pode conter+
sinais?Respostas:
CJam, 60 bytes
Depois de ficar preso nos anos 60 por um longo tempo, finalmente consegui compactar isso para 60 bytes. Bom o bastante! Enviá-lo!
Experimente online
Squished:
Expandido e comentado:
Inicialmente, comecei a usar uma abordagem baseada em token, mas isso ficou muito firme em ... 61 bytes. Suspiro. Então mudei totalmente de ideia e mudei para essa abordagem baseada em caracteres, que é muito mais interessante de qualquer maneira.
Meu método de análise funciona adicionando caracteres numéricos válidos alcançados (
0
-9
e-
) a um buffer e analisando o buffer como um número inteiro quando um determinado caractere de um dos nomes de unidades de tempo é atingido. Esses personagens sãoy
,t
,d
,h
,i
, ec
, que satisfazem as condições em que aparecem em um nome de unidade de tempo e não aparecem antes do caractere de reconhecimento em nenhum outro nome de unidade de tempo. Em outras palavras, quando um desses caracteres de reconhecimento da unidade de tempo é atingido, o buffer numérico será preenchido com o último número visto se isso realmente sinalizar uma unidade de tempo, ou o buffer numérico ficará vazio se isso aparecer, mas não deve ' sinal t, alguma outra unidade de tempo. Nos dois casos, o buffer numérico é analisado como um número inteiro, ou 0, se estiver vazio, e isso é adicionado ao valor da unidade de tempo correspondente. Assim, os caracteres de reconhecimento que aparecem em outras unidades de tempo após o caractere de reconhecimento não têm efeito.Outros hacks malucos incluem:
Para qualquer pessoa curiosa sobre a minha solução baseada em token que ficou paralisada em 61 bytes, também a publicarei aqui. Eu nunca cheguei a expandir ou comentar, no entanto.
CJam, 61 bytes
fonte
Perl: 61 caracteres
Graças a @nutki.
Exemplo de execução:
Meus fracos esforços:
7877 caracteresfonte
s/(-?\d+) *(..)/$$2+=$1/ge;$_="{ye|mo|da|ho|mi|se}";s/\w./${$&}+0/ge
s/-?\d+ *(m.|.)/$$1+=$&/ge;$_="{y|mo|d|h|mi|s}";s/\w+/${$&}+0/ge
(m.|.)
->m?(.)
salva adicional 4.Ruby,
119106868584 bytesUm byte economizado graças ao Sp3000.
Esta é uma função sem nome, que recebe a entrada como uma sequência e retorna o resultado (também como uma sequência). Você pode testá-lo atribuindo-o a
f
, digamos, e chamando-o comofonte
Python 2, 99 bytes
Esta é uma função lambda que pega uma string e simplesmente usa um regex para extrair os números necessários.
Obrigado a Martin por apontar que
\s*
poderia ser<space>*
. É fácil esquecer que as expressões regulares combinam espaços literalmente ...fonte
JavaScript 100
105 112Editar Adicionando strings de modelo (implementado pela primeira vez em dezembro de 2014, tão válido para este desafio) - no momento eu não os conhecia
Editar Eureka, finalmente entendi o significado de
m?
todas as outras respostas!Teste
fonte
R, 197 bytes
Sei que essa não é uma entrada competitiva, eu só queria encontrar uma solução em R. Qualquer ajuda para encurtar isso é bem-vinda.
Como a resposta de Martin, essa é uma função sem nome. Para chamá-lo, atribua-o
f
e passe uma string.Isso é bastante hediondo, então vamos dar uma olhada em uma versão sem golfe.
Com base apenas na estrutura, é fácil ver o que está acontecendo, mesmo se você não estiver muito familiarizado com R., vou detalhar alguns dos aspectos de aparência mais estranha.
paste0()
é assim que R combina strings sem separador.A
str_extract_all()
função vem dostringr
pacote de Hadley Wickham . O tratamento de R de expressões regulares no pacote base deixa muito a desejar, e é aí questringr
entra. Essa função retorna uma lista de correspondências de expressões regulares na string de entrada. Observe como o regex é cercado por uma funçãoperl()
- isso significa apenas que o regex é no estilo Perl, não no estilo R.gsub()
faz uma busca e substituição usando uma regex para cada elemento do vetor de entrada. Aqui, dizemos para substituir tudo que não é um número ou sinal de menos por uma string vazia.E aí está. Mais explicações serão fornecidas com prazer, mediante solicitação.
fonte
library(stringr)
na sua fonte?Cobra - 165
fonte
C ++ 14,
234229 bytesEditar: reduza 5 bytes usando a declaração de estilo antigo em vez de
auto
.Sei que o vencedor já foi escolhido e que essa seria a inscrição mais longa até agora, mas eu apenas tive que postar uma solução em C ++, porque aposto que ninguém esperava uma :)
Para ser honesto, estou muito feliz com o quão curto acabou por ser (por meio de medições em C ++, é claro), e tenho certeza de que não pode ficar mais curto que isso (com apenas uma observação, veja abaixo) . Também é uma ótima coleção de recursos novos para o C ++ 11/14.
Não há bibliotecas de terceiros aqui, apenas a biblioteca padrão é usada.
A solução está na forma de função lambda:
Ungolfed:
Por alguma razão, eu tive que escrever
em vez de apenas
porque o iterador retornaria apenas uma correspondência se eu passasse um objeto temporário. Isso não parece certo para mim, então me pergunto se há algum problema com a implementação de regex do GCC.
Arquivo de teste completo (compilado com o GCC 4.9.2 com
-std=c++14
):Resultado:
fonte
PHP, 141 bytes
recebe entrada do primeiro argumento da linha de comando; usa
[,]
para saída em vez de{|}
. Corra com-r
.demolir
fonte