Dans l'excellent et fascinant ouvrage de Vernor Vinge intitulé A Deepness in the Sky (que, d'ailleurs, je recommande vivement 1 ), le Qeng Ho , une culture qui couvre plusieurs systèmes stellaires, n'a aucune notion des "jours", des "mois", " années, "etc., et dispose donc d'un système de chronométrage unique qui mesure le temps entièrement en secondes. Les unités les plus couramment utilisées sont les unités Ksec (kiloseconde), Msec (mégaseconde) et Gsec (gigaseconde). Voici un tableau pratique tiré de ma propre copie du livre (car je ne le trouve pas en ligne):
Vous volez actuellement sur le Pham Nuwen et vous venez de recevoir un message d'une planète inconnue et inconnue appelée " Terre ". 2 Ils utilisent des unités de temps différentes de celles que vous utilisez et vos ordinateurs ne les reconnaissent pas. En tant que programmeur-archéologue résident du navire, votre travail consiste à patcher le code de traitement du temps afin qu'il reconnaisse les unités de temps Terre .
Naturellement, étant donné que vous ne vous reposez plus que sur quelques Ksecs, vous voulez rendre votre code aussi court que possible pour qu'il puisse être écrit rapidement. Heureusement, en tant que culture commerciale interstellaire, le Qeng Ho a accès à tous les langages de programmation inventés.
Contribution
L'entrée sera une chaîne unique contenant un ou plusieurs composants séparés par des espaces
. Un composant est défini comme étant un nombre entier> 0 et ≤ 255, puis un espace, puis l' un des second
, minute
, hour
, day
, week
, month
,
year
, decade
, ou century
, éventuellement pluriel (avec une ajouté s
, ou
centuries
pour le dernier cas).
Voici quelques exemples d'entrées valides:
10 days 12 hours
1 year
184 centuries 1 second
9 weeks 6 days 2 hours 1 minute 20 seconds
Vous pouvez supposer ce qui suit à propos de l'entrée:
La pluralisation des unités sera toujours en accord avec le nombre correspondant.
S'il y a plusieurs composants dans l'entrée, ils seront toujours dans l'ordre décroissant de longueur.
Voici ce que signifient les différentes unités d’entrée pour les besoins de ce défi:
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
Sortie
Voici les unités Qeng Ho que votre code doit prendre en charge:
unit relative absolute
----------------------------------------
second 1 second 1 second
Ksec 1000 seconds 1000 seconds
Msec 1000 Ksecs 1000000 seconds
Gsec 1000 Msecs 1000000000 seconds
Utilisez l'algorithme suivant pour déterminer la sortie de votre code:
Tout d’abord, additionnez la durée totale que représente l’entrée.
Recherchez l'unité Qeng Ho la plus grande qui est plus courte ou la même durée que l'entrée - en gros, recherchez l'unité la plus grande au moins une.
Convertissez la durée totale indiquée dans l'entrée dans cette unité et indiquez le résultat, arrondi à trois décimales.
Vous pouvez choisir l’une des méthodes suivantes: arrondir vers le haut, arrondir vers le bas, arrondir à zéro ou arrondir vers ∞ ou-. Si le résultat arrondi se termine 0
, vous pouvez supprimer les zéros à la fin ou en conserver autant que vous le souhaitez (ou faire les deux, en fonction de l’entrée).
Si le résultat est arrondi exactement 1.000
, vous devez utiliser le singulier ( second
, Ksec
, Msec
, Gsec
); sinon, utiliser la forme plurielle ( seconds
,
Ksecs
, Msecs
, Gsecs
).
Dans certains cas extrêmes, vous pouvez utiliser l'unité de Ksec, par exemple, mais obtenir un résultat arrondi de 1000 000 Ksecs. Dans ce cas, vous pouvez simplement sortir
1000.000 Ksecs
au lieu de 1 Msec
.
Vous pouvez toujours supposer que l'entrée est dans l'ordre décroissant des unités (siècle, décennie, année, etc.); de plus, le composant qui vient après une unité donnée sera toujours plus court (c'est-à-dire, 1 decade 20 years
une entrée invalide).
Cas de test
Remarque: les résultats marqués d'un astérisque ( *
) peuvent varier légèrement en raison des différences d'arrondi.
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
Règles
- C'est le code-golf , donc le code le plus court en octets gagne.
1: seulement si vous aimez la musique dure, bien sûr. Dans ce cas, je vous recommande de lire d'abord Fire On The Deep , qui est (à mon avis) encore plus fantastique.
2: eh bien, techniquement "Old Earth" est mentionné à plusieurs reprises dans A Deepness in the Sky , mais ...
2 months 2 hours
comme «2 mois * 2 heures».Réponses:
APL (Dyalog APL) ,
157156154151154141142 octetsMerci à ngn d'avoir réduit de 13 octets.
Doit avoir
⎕IO←0
, ce qui est le défaut dans beaucoup d'APL.Essayez-le en ligne!
la source
⌊1E3⍟
→⌊(z←1E3)⍟
et économisera 2 sur chacun des suivants1E3
→z
.JavaScript (ES6) 255
la source
Python,
366363 octetsla source
q=eval(i,d);f={};l=1
ligne, ce qui casse le code. En outre, vous pouvez économiser 2 octets en utilisant10.
et73.
au lieu de10.0
et73.0
. En outre, il n'y a pas besoin d'espace aprèsprint
.SpecBAS -
476471 octetsParce que rien ne dit mieux que nos numéros de ligne et nos déclarations GOTO: "Chaud devant notre supériorité technologique" :-)
la source
C # (dans LinqPad en tant que fonction), 460 octets
ungolfed:
la source
Mathematica
296281 octetsh
: Après avoir décomposé la chaîne d'entrée en une liste de grandeurs et d'unités de quantitéCapitalize
etPluralize
converti les unités d'entrée en unités MathematicaQuantity
, à partir desquelles le nombre total de secondes est dérivé.d
convertit les secondes en unités appropriées. La finales
est supprimée si le temps correspond à 1 unité (de tout type).Avec des ajustements mineurs dans le code, cette approche devrait fonctionner pour la conversion de l'entrée en langage naturel dans n'importe quel système de mesure, qu'il soit conventionnel ou non.
Mettre sous forme de tableau:
la source
Haskell,
565555 octetsJe suis assez sûr que je manque de nombreuses occasions de jouer au golf ici… Le prix d'être un débutant au golf, je suppose.
Ma réponse est une fonction prenant une chaîne de caractères contenant l'heure de la Terre comme paramètre d'entrée et renvoyant l'heure de Qeng Ho.
PS: J'ai bêtement oublié la précision à 3 chiffres… qui accélère le décompte d'octets.
PPS: Des expressions de premier niveau mieux choisies ont été supprimées de 10 octets… et le démarrage devrait maintenant être précis.
la source
Matlab 315 octets
Tester:
Sortie:
la source