Nell'eccellente e affascinante libro di Vernor Vinge A Deepness in the Sky (che, a proposito, consiglio vivamente 1 ), il Qeng Ho , una cultura che abbraccia vari sistemi stellari, non ha idea di "giorni", "mesi" " anni ", ecc., e quindi ha un sistema di cronometraggio unico che misura il tempo interamente in secondi. Le unità più comunemente usate sono Ksec (chilosecondi), Msec (megasecondi) e Gsec (gigasecondi). Ecco un utile diagramma dalla mia copia del libro (poiché non riesco a trovarlo online):

Attualmente stai volando sul Pham Nuwen e hai appena ricevuto un messaggio da uno strano pianeta sconosciuto chiamato " Terra ". 2 Usano unità di tempo diverse da te e i tuoi computer non riconoscono le loro. In qualità di programmatore-archeologo residente della nave, il tuo compito è correggere il codice di gestione del tempo in modo che riconosca le unità di tempo terrestri .
Naturalmente, dato che hai dormito solo per qualche altro Ksec, vuoi rendere il tuo codice il più breve possibile in modo che possa essere scritto rapidamente. Fortunatamente, come cultura commerciale interstellare, il Qeng Ho ha accesso a tutti i linguaggi di programmazione inventati.
Ingresso
L'input sarà una singola stringa contenente uno o più componenti separati da spazio
. Un componente è definito come un numero intero> 0 e ≤ 255, poi uno spazio, e quindi una delle second, minute, hour, day, week, month,
year,decade , o century, eventualmente plurale (con aggiunta so
centuriesper l'ultimo caso).
Ecco alcuni input di esempio validi:
10 days 12 hours
1 year
184 centuries 1 second
9 weeks 6 days 2 hours 1 minute 20 seconds
Si può presumere quanto segue sull'input:
La pluralizzazione delle unità concorderà sempre con il numero pertinente.
Se ci sono più componenti nell'input, saranno sempre in ordine decrescente di lunghezza.
Ecco cosa significano le varie unità di input, ai fini di questa sfida:
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
Produzione
Ecco le unità Qeng Ho che il tuo codice deve supportare:
unit relative absolute
----------------------------------------
second 1 second 1 second
Ksec 1000 seconds 1000 seconds
Msec 1000 Ksecs 1000000 seconds
Gsec 1000 Msecs 1000000000 seconds
Utilizzare il seguente algoritmo per determinare l'output del codice:
Innanzitutto, sommare il tempo totale rappresentato dall'input.
Trova l'unità Qeng Ho più grande che è più breve o la stessa quantità di tempo dell'input; in sostanza, trova l'unità più grande di cui esiste almeno una.
Converti la quantità totale di tempo indicata nell'input in questa unità e genera il risultato, arrotondato al terzo decimale.
È possibile scegliere quale dei seguenti metodi utilizzare: arrotondamento per eccesso, arrotondamento per difetto, arrotondamento per difetto da zero o arrotondamento per ∞ o -∞. Se il risultato arrotondato termina 0, puoi rimuovere gli zero finali o mantenerne quanti ne vuoi (o fare entrambi, a seconda dell'input).
Se il risultato arrotondato è esattamente 1.000, è necessario utilizzare la forma singolare ( second, Ksec, Msec, Gsec); altrimenti, utilizzare il plurale ( seconds,
Ksecs, Msecs,Gsecs ).
In alcuni casi limite, potresti usare l'unità di, ad esempio, Ksec, ma ottenere un risultato arrotondato di 1000.000 Ksec. In questo caso, puoi semplicemente produrre
1000.000 Ksecsinvece di 1 Msec.
Puoi sempre presumere che l'input sia in ordine decrescente di unità (secolo, decennio, anno, ecc.); inoltre, il componente che viene dopo una data unità sarà sempre più corto (ovvero1 decade 20 years input non valido).
Casi test
Nota: i risultati contrassegnati con un asterisco ( *) possono variare di un importo trascurabile a causa delle differenze di arrotondamento.
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
Regole
- Questo è code-golf , quindi vince il codice più breve in byte.
1: solo se ti piace hard scifi, ovviamente. Nel qual caso consiglio di leggere prima A Fire Upon the Deep , che è (secondo me) ancora più fantastico.
2: beh, tecnicamente la "Vecchia Terra" è menzionata più volte in Una profondità nel cielo , ma ...
2 months 2 hourscome "2 mesi * 2 ore".
