Desafío
Escriba el programa más corto que convierta un intervalo de tiempo legible por humanos en componentes de fecha del formulario:
{±YEARS|±MONTHS|±DAYS|±HOURS|±MINUTES|±SECONDS}
Casos de muestra
Cada caso de prueba tiene dos líneas, entrada seguida de salida:
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}
Reglas
- No puede usar
strtotime
ninguna función incorporada que haga todo el trabajo. - El código más corto gana (bytes)
- Puede imprimir su salida
stdout
o un archivo, el resultado también puede ser devuelto por una función, depende de usted - El token puede estar en forma singular o plural.
- Los componentes pueden estar en un orden aleatorio
- Es posible que no haya espacios en blanco entre el número y el token
- El signo es opcional cuando el intervalo de tiempo es positivo (entrada y salida)
- Si un componente aparece más de una vez, se deben agregar los valores
- Cada componente tiene su propio signo
- Los componentes deben manejarse por separado (por ejemplo,
80 minutes
permanece como 80 en la salida) - Se garantiza que la entrada sea minúscula
¡Feliz golf!
Sign is optional when the time interval is positive
¿Eso significa que la entrada puede contener+
signos?Respuestas:
CJam, 60 bytes
Después de estar atrapado en los años 60 durante mucho tiempo, finalmente logré reducir esto a 60 bytes. ¡Suficientemente bueno! ¡Envíalo!
Pruébalo en línea
Aplastado:
Ampliado y comentado:
Inicialmente comencé a usar un enfoque basado en tokens, pero eso se atascó con bastante firmeza en ... 61 bytes. Suspiro. Así que cambié totalmente de marcha y cambié a este enfoque basado en personajes, que de todos modos es mucho más interesante.
Mi método de análisis funciona agregando todos los caracteres numéricos válidos alcanzados (
0
-9
y-
) a un búfer y analizando el búfer como un entero cuando se alcanza un cierto carácter de uno de los nombres de unidades de tiempo. Esos personajes sony
,t
,d
,h
,i
, yc
, que satisfacen las condiciones en que aparecen en un nombre de unidad de tiempo y no aparecen antes del carácter de reconocimiento en ningún otro nombre de unidad de tiempo. En otras palabras, cuando se alcanza uno de estos caracteres de reconocimiento de unidad de tiempo, el búfer numérico se llenará con el último número visto si esto realmente indica una unidad de tiempo, o el búfer numérico estará vacío si esto simplemente aparece, pero no debería señal t, alguna otra unidad de tiempo. En cualquier caso, el búfer numérico se analiza como un entero, o 0 si estaba vacío, y esto se agrega al valor de la unidad de tiempo correspondiente. Por lo tanto, los caracteres de reconocimiento que aparecen en otras unidades de tiempo después de su carácter de reconocimiento no tienen efecto.Otros hacks locos incluyen:
Para cualquiera que tenga curiosidad acerca de mi solución basada en token que se atascó en 61 bytes, también la publicaré aquí. Sin embargo, nunca llegué a expandirlo o comentarlo.
CJam, 61 bytes
fuente
Perl: 61 caracteres
Gracias a @nutki.
Ejecución de muestra:
Mis pobres esfuerzos:
7877 caracteresfuente
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?(.)
ahorra más 4.Rubí,
119106868584 bytesUn byte guardado gracias a Sp3000.
Esta es una función sin nombre, que toma la entrada como una cadena y devuelve el resultado (también como una cadena). Puede probarlo asignándolo a
f
, digamos, y llamándolo comofuente
Python 2, 99 bytes
Esta es una función lambda que toma una cadena y simplemente usa una expresión regular para extraer los números necesarios.
Gracias a Martin por señalar que
\s*
podría ser así<space>*
. Es fácil olvidar que las expresiones regulares coinciden con espacios literalmente ...fuente
JavaScript 100
105 112Editar Agregar cadenas de plantillas (implementado por primera vez en diciembre de 2014, tan válido para este desafío): en ese momento no estaba al tanto de ellas
Editar Eureka, ¡por fin entendí el significado de
m?
todas las otras respuestas!Prueba
fuente
R, 197 bytes
Me doy cuenta de que esta no es una entrada competitiva en absoluto, en su mayoría solo quería encontrar una solución en R. Cualquier ayuda para acortar esto, por supuesto, es bienvenida.
Al igual que la respuesta de Martin, esta es una función sin nombre. Para llamarlo, asígnelo a
f
y pase una cadena.Esto es bastante horrible, así que echemos un vistazo a una versión sin golf.
Basándonos solo en la estructura, es fácil ver lo que está sucediendo, incluso si no estás muy familiarizado con R. Explicaré algunos de los aspectos más extraños.
paste0()
así es como R combina cadenas sin separador.La
str_extract_all()
función proviene delstringr
paquete de Hadley Wickham . El manejo de R de las expresiones regulares en el paquete base deja mucho que desear, que es dondestringr
entra. Esta función devuelve una lista de coincidencias de expresiones regulares en la cadena de entrada. Observe cómo la expresión regular está rodeada en una función:perl()
esto solo dice que la expresión regular es de estilo Perl, no de estilo R.gsub()
realiza una búsqueda y reemplazo utilizando una expresión regular para cada elemento del vector de entrada. Aquí le estamos diciendo que reemplace todo lo que no sea un número o un signo menos con una cadena vacía.Y ahí lo tienes. Se proporcionará una explicación adicional con gusto a pedido.
fuente
library(stringr)
en tu fuente?Cobra - 165
fuente
C ++ 14,
234229 bytesEditar: reduzca 5 bytes utilizando una declaración de estilo antiguo en lugar de
auto
.Sé que el ganador ya ha sido elegido, y que esta sería la presentación más larga hasta ahora, pero solo tuve que publicar una solución C ++, porque apuesto a que nadie esperaba una en absoluto :)
Para ser honesto, estoy bastante contento con lo corto que resultó ser (por mediciones de C ++, por supuesto), y estoy seguro de que no puede ser más corto que esto (con solo un comentario, ver a continuación) . También es una buena colección de características nuevas para C ++ 11/14.
Aquí no hay bibliotecas de terceros, solo se usa la biblioteca estándar.
La solución está en forma de función lambda:
Sin golf:
Por alguna razón, tuve que escribir
en lugar de solo
porque el iterador solo devolvería una coincidencia si paso un objeto temporal. Esto no me parece correcto, así que me pregunto si hay un problema con la implementación de expresiones regulares de GCC.
Archivo de prueba completo (compilado con GCC 4.9.2 con
-std=c++14
):Salida:
fuente
PHP, 141 bytes
toma la entrada del primer argumento de la línea de comando; utiliza
[,]
para salida en lugar de{|}
. Corre con-r
.Descompostura
fuente