Depuis que j'ai vu le premier il y a quelques années, j'ai toujours été soumis à ce genre d'horloge de mots où le temps est en fait précisé par des mots éclairés ou non en une phrase significative.
Le texte affiché sur cette horloge est le suivant.
IT IS HALF TEN
QUARTER TWENTY
FIVE MINUTES TO
PAST TWO THREE
ONE FOUR FIVE
SIX SEVEN EIGHT
NINE TEN ELEVEN
TWELVE O'CLOCK
Votre tâche consiste à écrire une telle horloge de travail. Les mots sont allumés si et seulement s'ils sont pertinents pour imprimer l'heure actuelle. Sinon, ils sont allumés. Les mots sont "éclairés" en étant imprimés et "éclairés" en étant remplacés par un nombre d'espaces correspondant à la longueur du mot.
Exemple: si l'heure actuelle est 17h23, le texte imprimé doit être exactement le suivant:
IT IS
TWENTY
FIVE MINUTES
PAST
FIVE
Règles
- L'heure imprimée correspond à la variante 12h, mais sans AM / PM.
- L'arrondi est effectué sur la base de minutes seulement (les secondes sont totalement sans importance). L'arrondi est fait au plus proche multiple de 5. Ainsi, par exemple, même si 17:52:38 est vraiment proche de 17:55, mais comme les secondes ne sont pas pertinentes, 17:52 est en fait arrondi à 17:50, et le texte imprimé est "C'EST DIX MINUTES À SIX" (avec l'espacement approprié). Donc, si
XX
est un multiple de cinq,XX
sera utilisé de HH: (XX-2): 00 jusqu'à HH: (XX + 2): 59. Le motMINUTES
doit apparaître siFIVE
,TEN
ouTWENTY
est allumé dans la section des minutes (avant "TO" ou "PAST"). - Tous les mots non pertinents sont remplacés par autant d'espaces que nécessaire pour conserver le texte là où il se trouve dans le modèle ci-dessus. Les espaces de fuite peuvent être coupés. Les espaces permettant de conserver le texte à la position attendue doivent être conservés.
Les lignes de fuite peuvent également être coupées. Les lignes vides pertinentes doivent encore apparaître. Exemple:
IT IS TEN MINUTES PAST TWO
Ne pas allumer
TEN
sur la première ligne ouFIVE
sur la troisième ligne lorsque ces valeurs se rapportent aux heures.- Vous pouvez accepter une entrée. Si vous acceptez une entrée, elle sera l'heure d'impression dans n'importe quel format valide (chaîne, liste d'entiers, type d'heure native prise en charge de la langue, ...), mais aucun paramètre n'est autorisé s'ils ne sont pas liés. au moment d'imprimer. Si vous ne supportez aucune entrée, vous devez utiliser l'heure actuelle. Si vous soutenez les deux, c'est mieux mais il n'y a pas de bonus;)
- Votre code peut être un programme, une fonction, un lambda mais pas un extrait.
- Si votre langue prend en charge l'impression de quelque manière que ce soit, elle doit imprimer le résultat (dans un fichier, sur la sortie standard, cela ne me dérange pas). Si votre langue ne prend pas en charge l'impression, il est autorisé à simplement "renvoyer" le texte attendu. Le résultat peut être soit tout en majuscule, soit tout en minuscule, et non un mélange des deux.
- Les failles standard s'appliquent.
- C'est du code-golf donc le code le plus court gagne!
- Dans la mesure du possible, veuillez fournir un lien vers un interprète en ligne de votre langue.
Cas de test
Input: <no input> (the current local time is 19:20)
Output:
IT IS
TWENTY
MINUTES
PAST
SEVEN
Input: 13:15
Output: (empty line is being printed)
IT IS
QUARTER
PAST
ONE
Input: 13:58
Output: (rounding)
IT IS
TWO
O'CLOCK
Input: 14:30
Output: (half is always a edge-case)
IT IS HALF
PAST TWO
Input: 15:35
Output: (light up "TO")
IT IS
TWENTY
FIVE MINUTES TO
FOUR
Input: 10:00
Output: (do not use the TEN or FIVE on the first line when referring to the hours)
IT IS
TEN
O'CLOCK
Input: 12:00
Output: (O'CLOCK and a lot of empty lines)
IT IS
TWELVE O'CLOCK
Réponses:
PHP,
387384353352342323310306298293291 octetsMerci @Christoph d' avoir joué au golf avec ses excellentes découvertes!
Au moins 45 octets sont sur son compte; 16 ou plus inspiré par lui.
Une équipe Marvel!
parcourt les données et vérifie si l'index actuel est dans une chaîne générée contenant les index des mots à allumer (mappés sur des lettres); ajoute un saut de ligne ou un espace en fonction de l'index.
Peut donner des avis si vous n’utilisez pas la valeur par défaut pour
error_reporting
(22519).Testez-le en ligne.
panne
Golfs :
$x/5+.5|0
est deux octets plus court queround($x/5)
.date(h)
sont un octet plus court que l'attribution dudate
résultat à une variable.$w<A
est trois octets plus court que$w=="\n"
- assurez-vous qu'il n'y a pas d'espace après un délimiteur!abs
sauvé 8 octets sur le mot minutes.L'utilisation du soulignement comme premier index a permis de l'inclure dans les alternatives "il est"; et il a rendu la citation pour les heures obsolète.
1
valeur dans la carte des heures rendait le modulo obsolète et le gain de golf supplémentaire de 10 octets. Inspiré par @Christoph.str_pad("",strlen($w))
->$w^$w^" "
. (Christoph)strtr
le second paramètre n’est pas une chaîne, il sera interprété comme un code ASCII. enregistre 5 octets.la source
$i++%3^($i<3)
à$i++%3^$i<3
. Je suis officiellement complètement perdu maintenant. Je vais faire une pause jusqu'à ce que quelqu'un nous corresponde. C'était vraiment amusant. Merci Titus pour ton travail d'équipe!TI-Basic,
335334 octetsPlutôt parfait, puisque les calculateurs TI-84 ont des affichages de 8x16 lettres, et cela est 8x15. La date est prise comme entrée afin de prendre en charge les calculs antérieurs à la TI-84, qui ne possède pas d'horloge interne. Sans argument,
Input
obtient une entrée par défaut dansX
etY
similaire àPrompt X,Y
. Alors, faites desX
heures (tout>=0
fonctionnera correctement) et prenez desY
minutes.Remarque 1: pour la TI-84 +, vous pouvez remplacer
Input
par quelque chose commegetTime:Ans(1->X:getTime:Ans(2->Y
. Aussi,int(Y/5-5.6
est équivalent àround(Y/5,0)-6
. Et non, dans ce cas,int(
ne pouvait pas être échangé aveciPart(
.Remarque 2: Ceci permet d’imprimer parfaitement l’entrée, mais pour des raisons d’asthétisme, vous souhaiterez probablement,
Pause
à la fin du programme, éviter leDone
message à la fin du programme.Edit: Le nombre d'octets a été réduit parce que tokenisé (voir note sur la révision précédente), un bogue est également corrigé grâce à @Neil. Troisièmement, j'ai corrigé un bug qui aurait coûté 2 octets, mais l'optimisation a réellement permis d'économiser 1 octet au total
getTime
. Enfin, pour ceux qui souhaitent confirmer ce nombre d'octets, le seul jeton à deux octets estsub(
.la source
O'CLOCK
du code, le code continuera à sortirPAST
également ...x+(y>32) mod 12
si la comparaison donnait 1 ou 0 comme dans TI-Basic.JavaScript (ES6),
291303295 octetsAccepte deux nombres entiers avec une syntaxe de curry
(h)(m)
Comment ça fonctionne
Toute l’horloge peut être vue sous forme de 23 LED allumées ou éteintes. Ainsi, l'état de l'horloge est un entier de 23 bits.
La logique des procès-verbaux que nous devons mettre en œuvre pour permettre les mots justes n’est pas aussi simple qu’on pourrait le penser à première vue. Une formule magique de golf existe peut-être, mais j'ai choisi la méthode la plus simple et décidé de coder en dur chaque configuration possible:
Cas de test
Afficher l'extrait de code
la source
Lot, 789 octets
Remarque: Les espaces de fin
PAST
et 5 espaces de fin sur chacune des deux lignes suivantes.la source
call:c
par exemple)! Je devrais probablement apprendre un lot :)JavaScript,
567 564 551 542 529 527519 octetsAfficher l'extrait de code
Je ne sais pas s'il est acceptable de prendre des heures et des minutes comme arguments. Vous avez dit "liste d'entiers". Est-ce que ça compte toujours?
Au fait, c'est ma première fois au golf. Qu'est-ce que tu penses?
Edit: Sauvegardé quelques octets en divisant les minutes. Merci Olivier!
la source
c
dans votre fonction. Je suppose que vous ne devriez perdre aucun octet en le faisant, mais cela ressemble plus à un extrait de code qu'à une fonction (pour moi, au moins, peut-être que les gourous de JS diront le contraire).JavaScript (ES6) 360
Une fonction avec les paramètres d'entrée heure (0..23) et minute (0..59).
Utiliser
alert
pour la sortie, car c'est la fonction de sortie standard en javascript, même si c'est gênant. (Et c'est court)Note de test : pour votre tranquillité d'esprit, dans l'extrait de test, la sortie de l'alerte est redirigée vers le texte de la page.
la source
i
? Je peux voir que vous obtenez tous les groupes d’espaces non blancs (les "voyants") et que vous les remplacez par des espaces blancs en fonction des conditions que vous avez définies pour chacun d’eux. Par exemple,h-2
c'est faux seulement quandh == 2
, alors je suppose que vous l'inversez quelque part? Pouvez-vous expliquer un peu comment cela fonctionne? Peut-être comme une édition de votre réponse? Je serais vraiment reconnaissant!i
référez au bon en l'incrémentant après chaque correspondance de regex. Si c'est la vérité, vous remplacez la chaîne correspondante par des espaces, sinon vous la laissez telle quelle. Je ne comprends pas une chose, cependant.replace()
utilise la valeur de retour de la fonction spécifiée (fonction flèche dans ce cas). Où restituez-vous une valeur? Je viens de voir un opérateur ternaire.(a,b)=>{ return a+b }
est le même que(a,b)=>a+b
Python 2,
466,460,449,452,459449 octetsComme il est permis d’être une fonction acceptant h et m en tant qu’entiers, nous pouvons économiser quelques octets. Essayez-le en ligne .
J'ai eu quelques bugs (maintenant fixe) avec la logique pour
TO
/PAST
contreO'CLOCK
. Également enregistré quelques octets pourenumerate
, changer leimport
et19<m<26
au lieu dem in [20,25]
. Épargné 8 autres pour travailler en morceaux de 5 minutes au lieu de minutes. Rod a signalé quelques bugs qui me coûtaient un peu, mais j'ai un peu récupéré avec des assignations plus efficaces et un correctif qui a fonctionné en ma faveur.la source
==
titre de comparaison, jeh
print c
sur la dernière ligne,c
tient déjàa[i]
dueenumerate
print
ajoutez une nouvelle ligne après chaque impression, vous pouvez la supprimer en ajoutant un,
aprèsc
. En outre, il devrait imprimer des espaces vides quand un mot n'est pas imprimé, vous pouvez corriger avec un autre dans le dernier sielse:print' '*len(c),
Perl 6 ,
308296293 octetsEssayez-le en ligne!
Explication
La structure de base est la suivante:
L’expression indiquée
...|...|...|...
ci-dessus est une jonction d’entiers représentant des indices de mots basés sur 1 et composée comme suit:la source
Python3, (569 octets)
Cette réponse nécessite du temps au format hh mm (entiers séparés par des espaces). J'ai réussi à faire imprimer '\ n', ce qui est inspiré par la méthode de Chris.Merci, Chris! Toute aide réduisant le code est appréciée.
Essayez-le en ligne
la source
.split(',')
? Devrait sauver quelques-uns.H,M=input()
où l'entrée est H, M.H,M=input()
n'a pas fonctionné comme vous en avez douté.Python 2 ,
443440 octetsEssayez-le en ligne!
Il pourrait probablement encore tirer parti de la pratique du golf. L'entrée est une liste d'entiers, par exemple 7,23 = 7:23
la source
SimpleTemplate ,
737708 octetsOui, la verbosité et le manque de "vraies" mathématiques ont nui au décompte.
Ceci attend l’heure et les minutes comme premier et deuxième paramètre de la classe.
Ungolfed:
Comment courir:
Exécutez le code suivant:
Terminé!
la source
Java (OpenJDK 9) , 437 octets
Essayez-le en ligne!
Je pensais enfin tenter le coup;)
la source
Perl 5 ,
487449 octetsEssayez-le en ligne!
la source