En el excelente y fascinante libro de Vernor Vinge A Deepness in the Sky (que, por cierto, recomiendo encarecidamente 1 ), el Qeng Ho , una cultura que abarca varios sistemas estelares, no tiene noción de "días", "meses" " años ", etc., y por lo tanto tiene un sistema de cronometraje único que mide el tiempo completamente en segundos. Las unidades más utilizadas son Ksec (kilosegundo), Msec ( megasecond ) y Gsec (gigasecond). Aquí hay un gráfico útil de mi propia copia del libro (ya que no puedo encontrarlo en línea):
Actualmente estás volando en el Pham Nuwen , y acabas de recibir un mensaje de un planeta extraño y desconocido llamado " Tierra ". 2 Usan unidades de tiempo diferentes a las suyas, y sus computadoras no reconocen las suyas. Como programador residente-arqueólogo de la nave, su trabajo consiste en parchear el código de manejo del tiempo para que reconozca las unidades de tiempo de la Tierra .
Naturalmente, dado que solo se queda sin resfriado durante unos pocos Ksecs, desea que su código sea lo más breve posible para que pueda escribirse rápidamente. Afortunadamente, como cultura comercial interestelar, el Qeng Ho tiene acceso a todos los lenguajes de programación inventados.
Entrada
La entrada será una sola cadena que contiene uno o más componentes separados por espacios
. Un componente se define como un número entero> 0 y ≤ 255, a continuación, un espacio, y luego uno de second
, minute
, hour
, day
, week
, month
,
year
, decade
, o century
, posiblemente plural (con un añadido s
, o
centuries
para el último caso).
Aquí hay algunas entradas de ejemplo válidas:
10 days 12 hours
1 year
184 centuries 1 second
9 weeks 6 days 2 hours 1 minute 20 seconds
Puede suponer lo siguiente acerca de la entrada:
La pluralización de unidades siempre estará de acuerdo con el número relevante.
Si hay múltiples componentes en la entrada, siempre estarán en orden descendente de longitud.
Esto es lo que significan las distintas unidades de entrada, a los efectos de este desafío:
unit relative absolute
---------------------------------------
second 1 second 1 second
minute 60 seconds 60 seconds
hour 60 minutes 3600 seconds
day 24 hours 86400 seconds
week 7 days 604800 seconds
month 30 days 2592000 seconds
year 365 days 31536000 seconds
decade 10 years 315360000 seconds
century 10 decades 3153600000 seconds
Salida
Estas son las unidades Qeng Ho que su código debe admitir:
unit relative absolute
----------------------------------------
second 1 second 1 second
Ksec 1000 seconds 1000 seconds
Msec 1000 Ksecs 1000000 seconds
Gsec 1000 Msecs 1000000000 seconds
Use el siguiente algoritmo para determinar la salida de su código:
Primero, sume la cantidad total de tiempo que representa la entrada.
Encuentre la unidad Qeng Ho más grande que sea más corta o la misma cantidad de tiempo que la entrada; esencialmente, encuentre la unidad más grande de la que haya al menos una.
Convierta la cantidad total de tiempo dada en la entrada en esta unidad y envíe el resultado, redondeado a tres decimales.
Puede elegir cuál de los siguientes métodos usar: redondear hacia arriba, redondear hacia abajo, redondear desde cero o redondear hacia ∞ o -∞. Si el resultado redondeado termina 0
, puede eliminar los ceros finales o conservar tantos como desee (o hacer ambos, dependiendo de la entrada).
Si el resultado redondeado es exactamente 1.000
, debe usar la forma singular (second
, Ksec
, Msec
, Gsec
); de lo contrario, utiliza el plural ( seconds
,
Ksecs
, Msecs
, Gsecs
).
En ciertos casos extremos, puede estar utilizando la unidad de, por ejemplo, Ksec, pero obtener un resultado redondeado de 1000,000 Ksecs. En este caso, simplemente puede generar en
1000.000 Ksecs
lugar de 1 Msec
.
Siempre puede suponer que la entrada está en orden descendente de unidades (siglo, década, año, etc.); Además, el componente que viene después de cualquier unidad dada siempre será más corto (es decir, 1 decade 20 years
es una entrada no válida).
Casos de prueba
Nota: resultados marcados con un asterisco (*
) pueden variar en una cantidad insignificante debido a las diferencias de redondeo.
input output
-------------------------------------------------------------
1 hour 3.600 Ksecs
1 day 86.400 Ksecs
2 weeks 1.210 Msecs
1 year 31.536 Msecs
32 years 1.009 Gsecs *
1 second 1.000 second
1 century 6 decades 5.046 Gsecs *
255 centuries 804.168 Gsecs
2 weeks 6 days 1 hour 19 minutes 4 seconds 1.733 Msecs
1 week 3 days 3 hours 7 minutes 875.220 Ksecs
1 week 4 days 13 hours 46 minutes 40 seconds 1.000 Msec
2 months 2 hours 5.191 Msecs *
16 minutes 39 seconds 999.000 seconds
Reglas
- Este es el código de golf , por lo que gana el código más corto en bytes.
1: solo si te gusta la ciencia ficción, por supuesto. En cuyo caso recomiendo leer A Fire Upon the Deep primero, que es (en mi opinión) aún más fantástico.
2: bueno, técnicamente "Old Earth" se menciona varias veces en A Deepness in the Sky , pero ...
2 months 2 hours
como "2 meses * 2 horas".Respuestas:
APL (Dyalog APL) ,
157156154151154141142 bytesGracias a ngn por recortar 13 bytes.
Debe tener
⎕IO←0
, que es el valor predeterminado en muchas APL.Pruébalo en línea!
fuente
⌊1E3⍟
→⌊(z←1E3)⍟
y luego ahorrará 2 en cada uno de los siguientes1E3
→z
.JavaScript (ES6) 255
fuente
Python,
366363 bytesfuente
q=eval(i,d);f={};l=1
línea, que rompe el código. Además, puede guardar 2 bytes usando10.
y en73.
lugar de10.0
y73.0
. Además, no hay necesidad de espacio despuésprint
.SpecBAS -
476471 bytesPorque nada dice "acobardarse ante nuestra superioridad tecnológica" mejor que los números de línea y las declaraciones GOTO :-)
fuente
C # (en LinqPad como función), 460 bytes
sin golf:
fuente
Mathematica
296281 bytesh
: Después de dividir la cadena de entrada en una lista de magnitudes y unidades de cantidad,Capitalize
yPluralize
convertir las unidades de entrada en las de MathematicaQuantity
, de las cuales se deriva el número total de segundos.d
convierte segundos a las unidades apropiadas. El finals
se elimina si el tiempo corresponde a 1 unidad (de cualquier tipo).Con pequeños ajustes en el código, este enfoque debería funcionar para la conversión de la entrada del lenguaje natural en cualquier sistema de medición, convencional o no.
Poner en forma de tabla:
fuente
Haskell
565555 bytesEstoy razonablemente seguro de que me estoy perdiendo tantas oportunidades de golf aquí ... El precio de ser un principiante de golf, supongo.
Mi respuesta es una función que toma una cadena que contiene el tiempo de la Tierra como parámetro de entrada y devuelve el tiempo Qeng Ho.
PD: Olvidé estúpidamente la precisión de 3 dígitos ... lo que hace que el byte cuente.
PPS: las expresiones de nivel superior mejor elegidas redujeron 10 bytes ... y ahora debería ser preciso arrancar.
fuente
Matlab 315 bytes
Prueba:
Salida:
fuente