Imprimer une horloge de mots

59

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.

Une horloge de mots

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

  1. L'heure imprimée correspond à la variante 12h, mais sans AM / PM.
  2. 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 XXest un multiple de cinq, XXsera utilisé de HH: (XX-2): 00 jusqu'à HH: (XX + 2): 59. Le mot MINUTESdoit apparaître si FIVE, TENou TWENTYest allumé dans la section des minutes (avant "TO" ou "PAST").
  3. 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.
  4. Les lignes de fuite peuvent également être coupées. Les lignes vides pertinentes doivent encore apparaître. Exemple:

    IT IS      TEN
    
         MINUTES
    PAST TWO
    
  5. Ne pas allumer TENsur la première ligne ou FIVEsur la troisième ligne lorsque ces valeurs se rapportent aux heures.

  6. 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;)
  7. Votre code peut être un programme, une fonction, un lambda mais pas un extrait.
  8. 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.
  9. Les failles standard s'appliquent.
  10. C'est du code-golf donc le code le plus court gagne!
  11. 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
Olivier Grégoire
la source
8
Grand défi, j'aime vraiment ça!
Timtech

Réponses:

14

PHP, 387 384 353 352 342 323 310 306 298 293 291 octets

Merci @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!

IT IS <?foreach([HALF,TEN,QUARTER,TWENTY,FIVE,MINUTES,TO,PAST,TWO,THREE,ONE,FOUR,FIVE,SIX,SEVEN,EIGHT,NINE,TEN,ELEVEN,TWELVE,"O'CLOCK"]as$w)echo strstr([w,ghj,dhj,ej,fhj,fghj,cj,fghi,fhi,ei,dhi,ghi][$m=date(i)/5+.5].mklnopqrstuvm[date(h)-($m<7)],99+$i)?$w:$w^$w^"       ","
  "[$i++%3^$i<3];

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

IT IS <?
foreach([HALF,TEN,QUARTER,TWENTY,FIVE,MINUTES,TO,PAST,  // loop through words
TWO,THREE,ONE,FOUR,FIVE,SIX,SEVEN,EIGHT,NINE,TEN,ELEVEN,TWELVE,"O'CLOCK"]as$w)
    echo strstr(                    // search word index in ...
        [w,ghj,dhj,ej,fhj,fghj,cj,fghi,fhi,ei,dhi,ghi][$m=date(i)/5+.5] // minutes & co
        .mklnopqrstuvm[date(h)-($m<7)]                          // hours (-1 if minutes<33)
    ,99+$i                          // (map 0..20 to c..w)
    )?$w:$w^$w^"       ",           // if found, print string, else print spaces
    "\n  "[$i++%3^$i<3];            // if $i in [3,5,8,...], print newline, else space

Golfs :

  • $x/5+.5|0est deux octets plus court que round($x/5).
  • Deux appels de date(h)sont un octet plus court que l'attribution du daterésultat à une variable.
  • À l’aide d’une seule affectation, la variable dans laquelle les index d’éclairages étaient stockés a été golfée.
  • Une chaîne pour les index lumineux au lieu d'un tableau sauvegardé autour de 30 octets .
  • $w<Aest 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.
  • Merci @Christoph: passer de chiffres en lettres pour que la carte rende les séparateurs obsolètes et autorise une chaîne supplémentaire au lieu d'un tableau; sauvé 23 + 8 octets .
    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.
  • La duplication de la 1valeur dans la carte des heures rendait le modulo obsolète et le gain de golf supplémentaire de 10 octets. Inspiré par @Christoph.
  • Le calcul des sauts de ligne et des espaces au lieu de les coder en dur a supprimé 19 octets .
  • La logique des bits sur les chaînes économise 7 octets: str_pad("",strlen($w))-> $w^$w^" ". (Christoph)
  • Si strtrle second paramètre n’est pas une chaîne, il sera interprété comme un code ASCII. enregistre 5 octets.
Titus
la source
C'est très gentil! J'ai essayé cette implémentation en Java en m'assurant que la question pouvait être résolue, mais elle s'est avérée tellement compliquée que j'ai abandonné et utilisé une approche plus longue, mais plus simple! Bravo donc d'avoir réussi là où j'ai échoué;
Olivier Grégoire
1
Battement du reste: $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!
Christoph
1
@Christoph Vous êtes ... GRAND semble trop petit. \ o /
Titus le
18

TI-Basic, 335 334 octets

Plutô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, Inputobtient une entrée par défaut dans Xet Ysimilaire à Prompt X,Y. Alors, faites des Xheures (tout >=0fonctionnera correctement) et prenez des Yminutes.

Input 
ClrHome
int(Y/5-5.6
Output(1,1,"IT IS
If Ans=~6
Output(8,8,"O'CLOCK
If 2=abs(3-abs(Ans
Output(3,1,"FIVE
If 4=abs(Ans
Output(1,12,"TEN
If 3=abs(Ans
Output(2,1,"QUARTER
If 2=abs(Ans
Output(2,8,"TWENTY
If sum(abs(Ans)={1,2,4,5
Output(3,5,"MINUTES
If not(Ans
Output(1,7,"HALF
If Ans<1 and Ans+6
Output(4,1,"PAST
If Ans>0
Output(3,14,"TO
12fPart(12(^~1)(X+(Y>32->A
If not(Ans
12->A
{21,6,10,25,30,41,45,51,61,66,70,81
.05Ans(A
Output(int(4+Ans),20fPart(Ans),sub("ONE   TWO   THREE FOUR  FIVE  SIX   SEVEN EIGHT NINE  TEN   ELEVENTWELVE",6A-5,6

Remarque 1: pour la TI-84 +, vous pouvez remplacer Inputpar quelque chose comme getTime:Ans(1->X:getTime:Ans(2->Y. Aussi, int(Y/5-5.6est équivalent à round(Y/5,0)-6. Et non, dans ce cas, int(ne pouvait pas être échangé avec iPart(.

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 le Donemessage à 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 est sub(.

Timtech
la source
Il me semble qu'après la sortie O'CLOCKdu code, le code continuera à sortir PASTégalement ...
Neil
2
Je compte 545 octets pourriez-vous s'il vous plaît m'éclairer?
Christoph
2
@Christoph Trouvé la méta-poste associée
Christoph
1
@ OlivierGrégoire En fait, cela n'a aucun lien avec cette ligne précédente. Ce que vous faites est la conversion de 24 heures à 12 heures et aussi à l'heure la plus proche (par exemple, arrondi avec les minutes comptées). En principe, dans un langage normal, cela ressemblerait à quelque chose comme x+(y>32) mod 12si la comparaison donnait 1 ou 0 comme dans TI-Basic.
Timtech
1
Alors, @Christoph, il semble que vous ayez répondu à votre propre question avec ce lien, voulez-vous toujours que je vous explique? Si vous voulez voir où j’ai fait le passage de la notation ASCII à la numérisation, vérifiez la révision n ° 4.
Timtech
11

JavaScript (ES6), 291 303 295 octets

Accepte deux nombres entiers avec une syntaxe de curry (h)(m)

h=>m=>console.log(`IT IS HALF TEN
QUARTER TWENTY
FIVE MINUTES TO
PAST TWO THREE
ONE FOUR FIVE
SIX SEVEN EIGHT
NINE TEN ELEVEN
TWELVE O'CLOCK`.replace(/\S+/g,w=>(k/=2)&1?w:w.replace(/./g,' '),k=[x=1<<19,88,81,66,84,92,64.5,60,52,34,49,56,x,h=(m<33?h+11:h)%12][m/5+.4|0]*16|6|2048<<(h?h-(h<3):2)))

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.

Bit | Word        Bit | Word
----+--------     ----+--------
00  | IT          12  | ONE
01  | IS          13  | FOUR
02  | HALF        14  | FIVE
03  | TEN         15  | SIX
04  | QUARTER     16  | SEVEN
05  | TWENTY      17  | EIGHT
06  | FIVE        18  | NINE
07  | MINUTES     19  | TEN
08  | TO          20  | ELEVEN
09  | PAST        21  | TWELVE
10  | TWO         22  | O'CLOCK
11  | THREE             

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:

Minutes | Words                    | Enabled bits | Value   | Value / 8
--------+--------------------------+--------------+---------+----------
  00    | O'CLOCK                  | 22           | 4194304 | 524288
  05    | FIVE MINUTES PAST        | 6, 7, 9      | 704     | 88
  10    | TEN MINUTES PAST         | 3, 7, 9      | 648     | 81
  15    | QUARTER PAST             | 4, 9         | 528     | 66
  20    | TWENTY MINUTES PAST      | 5, 7, 9      | 672     | 84
  25    | TWENTY FIVE MINUTES PAST | 5, 6, 7, 9   | 736     | 92
  30    | HALF PAST                | 2, 9         | 516     | 64.5
  35    | TWENTY FIVE MINUTES TO   | 5, 6, 7, 8   | 480     | 60
  40    | TWENTY MINUTES TO        | 5, 7, 8      | 416     | 52
  45    | QUARTER TO               | 4, 8         | 272     | 34
  50    | TEN MINUTES TO           | 3, 7, 8      | 392     | 49
  55    | FIVE MINUTES TO          | 6, 7, 8      | 448     | 56

Cas de test

Arnauld
la source
2
Très intelligent. J'essayais de couper un peu plus d'octet dans le mien, puis j'ai vu cela et il n'y avait aucun espoir de concurrence.
Edc65
La tâche (règle 8) indique qu'elle doit être imprimée et non pas simplement renvoyée
smls le
@smls Oh, tu as raison. C'est fixé.
Arnauld
Très cool. Sauf que l'heure est incorrecte :-( Affichage: h = 13 m = 15 Heure actuelle: 14:43
Strawberry
@ Fraise S'il vous plaît voir la règle # 6. Cette implémentation utilise les entrées exclusivement, pas l'heure locale.
Arnauld
6

Lot, 789 octets

@echo off
if not "%1"=="" setlocal&set time=%1
set/a"h=%time:~0,2%,m=6%time:~3,2%%%60+2,h+=m/35,h%%=12,m=6-m/5%%12,n=m%%3,o=m%%2
set p=
set s=
call:c %m:-=% "IT IS HALF" 0 "IT IS      TEN" 4 "IT IS"
call:c %m:-=% QUARTER 3 "        TWENTY" 2 "        TWENTY" 1
if %m% lss 0 set s= TO
call:c 0 "            " %n% "     MINUTES" %o% "FIVE MINUTES"
set s=
set p=PAST 
if %m%==6 set p=     
if %m% lss 0 set p=     
call:c %h% TWO 2 "    THREE" 3
set p=
call:c %h% ONE 1 "    FOUR" 4 "          FIVE" 5
call:c %h% SIX 6 "    SEVEN" 7 "          EIGHT" 8
call:c %h% NINE 9 "     TEN" 10 "         ELEVEN" 11
if %m%==6 set s= O'CLOCK
call:c %h% TWELVE 0 "      "
exit/b
:c
set t=%1
:l
if %t%==%3 echo(%p%%~2%s%&exit/b
shift
shift
if not "%3"=="" goto l
echo(%p%%~2%s%

Remarque: Les espaces de fin PASTet 5 espaces de fin sur chacune des deux lignes suivantes.

Neil
la source
Je l'ai couru et tout se passe bien (sauf un espace manquant pour l'heure 3)! Je ne comprends tout simplement pas ce qui se passe (avec call:cpar exemple)! Je devrais probablement apprendre un lot :)
Olivier Grégoire
@ OlivierGrégoire Malheureusement, un espace avait disparu, mais c'est maintenant réglé.
Neil
4

JavaScript, 567 564 551 542 529 527 519 octets

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!

Hristiyan Dodov
la source
Oui, l'idée derrière cette règle est que vous pouvez prendre des arguments, mais seulement s'ils se rapportent à l'entrée, qui est le temps pour imprimer.
Olivier Grégoire
1
En ce qui concerne le golf, vous pouvez probablement jouer au golf sur quelques octets si vous envisagez de diviser vos minutes par 5. De plus, vous voudrez peut-être vous déplacer cdans 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).
Olivier Grégoire
4

JavaScript (ES6) 360

Une fonction avec les paramètres d'entrée heure (0..23) et minute (0..59).
Utiliser alertpour la sortie, car c'est la fonction de sortie standard en javascript, même si c'est gênant. (Et c'est court)

(k,n,m=(n+2)/5|0,h=(k+(m>6))%12,i=0)=>alert(`IT IS HALF TEN
QUARTER TWENTY
FIVE MINUTES TO
PAST TWO THREE
ONE FOUR FIVE
SIX SEVEN EIGHT
NINE TEN ELEVEN
TWELVE O'CLOCK`.replace(/\S+/g,w=>[,,m-6,m-2&&m-10,m-3&&m-9,m-4&&m-8&&m-5&&m-7,m-1&&m-11&&m-5&&m-7,!(m%3),m<7|m==12,!m|m>6,h-2,h-3,h-1,h-4,h-5,h-6,h-7,h-8,h-9,h-10,h-11,h%12,m%12][i++]?w.replace(/./g,' '):w))

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.

F=
(k,n,m=(n+2)/5|0,h=(k+(m>6))%12,i=0)=>alert(`IT IS HALF TEN
QUARTER TWENTY
FIVE MINUTES TO
PAST TWO THREE
ONE FOUR FIVE
SIX SEVEN EIGHT
NINE TEN ELEVEN
TWELVE O'CLOCK`.replace(/\S+/g,w=>[,,m-6,m-2&&m-10,m-3&&m-9,m-4&&m-8&&m-5&&m-7,m-1&&m-11&&m-5&&m-7,!(m%3),m<7|m==12,!m|m>6,h-2,h-3,h-1,h-4,h-5,h-6,h-7,h-8,h-9,h-10,h-11,h%12,m%12][i++]?w.replace(/./g,' '):w))

function alert(x) { O.textContent=x }
function update() { F(+H.value,+M.value) }

update()
input { width:3em }
Hours<input id=H type=number min=0 max=23 value=17 oninput='update()'>
Minutes<input id=M type=number min=0 max=59 value=37 oninput='update()'>
<pre id=O></pre>

edc65
la source
J'adore ta réponse! J'ai appris beaucoup de choses avec ça! Cependant, que se passe-t-il avec la fonction de flèche qui a des crochets? Aussi, quel est le rôle de 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-2c'est faux seulement quand h == 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!
Hristiyan Dodov
Mise à jour - j'ai presque réalisé ce que vous faites. Vous avez un tableau d'éléments nuls et non nuls et vous vous iré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.
Hristiyan Dodov
3
@HristiyanDodov une fonction de flèche constituée d'une simple expression ne renvoie que la valeur de cette expression. Exemple (a,b)=>{ return a+b }est le même que(a,b)=>a+b
edc65
4

Python 2, 466 , 460 , 449 , 452 , 459 449 octets

Comme il est permis d’être une fonction acceptant h et m en tant qu’entiers, nous pouvons économiser quelques octets. Essayez-le en ligne .

def t(h,m):


m=(2+m)//5
 h=h%12
 n=0
 if m>6:n,m=1,12-m;h+=1
 a="""IT IS _HALF _TEN_
 _QUARTER _TWENTY_
 _FIVE _MINUTES _TO_
 _PAST _TWO _THREE_
 _ONE _FOUR _FIVE_
 _SIX _SEVEN _EIGHT_
 _NINE _TEN _ELEVEN_
 _TWELVE _O'CLOCK""".split("_")
 b=[1,m==6,m==2,1,m==3,3<m<6,1,m in[1,5],m in[1,2,4],n*m,1,(1-n)*m,h==2,h==3,1,h==1,h==4,h==5,1,h==6,h==7,h==8,1,h==9,h==10,h==11,1,h==0,m==0]
 for i,c in enumerate(a):
  if b[i]:print c,
  else:print' '*len(c),

J'ai eu quelques bugs (maintenant fixe) avec la logique pour TO/ PASTcontre O'CLOCK. Également enregistré quelques octets pour enumerate, changer le importet 19<m<26au lieu de m 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.

Chris H
la source
Prend une astuce de la réponse PHP de @Titus. À ==titre de comparaison, je h
Chris H
vous pouvez juste print csur la dernière ligne, ctient déjà a[i]dueenumerate
Rod
1
Le format de sortie est cassé, printajoutez une nouvelle ligne après chaque impression, vous pouvez la supprimer en ajoutant un ,après c. 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),
Rod
1
L'ordre des octets est meilleur si décroissant.
Gurupad Mamadapur
@Rod, merci pour les taches de bugs, même si cela le rend beaucoup plus long
Chris H
2

Perl 6 , 308 296 293 octets

->\h,\m{my \n=round(m/5)%12;say "IT IS HALF TEN
QUARTER TWENTY
FIVE MINUTES TO
PAST TWO THREE
ONE FOUR FIVE
SIX SEVEN EIGHT
NINE TEN ELEVEN
TWELVE O'CLOCK".subst: /\S+/,{++$==1|2|(0,7,4,5,6,(6|7),3)[min n,12-n]|8*?(n%3)|(23,10,9)[(n+5)/6]|(13,11,12,|(14..*))[(h+m/33-1)%12]??$_!!" "x.comb},:g}

Essayez-le en ligne!

Explication

La structure de base est la suivante:

-> \h, \m {                             # A lambda taking two args (hour and minute).
    my \n = round(m / 5) % 12;          # Index from 0 to 11, representing the minutes.
    say "...".subst: /\S+/, {           # Print the template with each word replaced:
        ++$ == ...|...|...|...          # If counter equals one of expected indices,
            ?? $_                       # then replace the word with itself,
            !! " " x .comb              # else replace it with spaces.
    }, :g                               # (Use global matching.)
}

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:

  1|2                                   # IT IS
| (0,7,4,5,6,(6|7),3)[min n,12-n]       # FIVE / TEN / QUARTER / TWENTY / TWENTY FIVE / HALF
| 8*?(n%3)                              # MINUTES
| (23,10,9)[(n+5)/6]                    # O'CLOCK / PAST / TO
| (13,11,12,|(14..*))[(h+m/33-1)%12]    # ONE / TWO / THREE / FOUR / FIVE / SIX / SEVEN / ...
smls
la source
2

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.

H,M=input().split()
w="""HALF _TEN_
_QUARTER _TWENTY_
_FIVE _MINUTES _TO_
_PAST _TWO _THREE_
_ONE _FOUR _FIVE_
_SIX _SEVEN _EIGHT_
_NINE _TEN _ELEVEN_
_TWELVE _O'CLOCK""".split("_")
h,m=int(H),int(M)
if h>12:h-=12
m=(m//5+1)*5 if m%5>2.5 else m//5*5
if m>30:
    m=60-m
    h=(h+1)%12
X=[m==30,m==10,1,m==15,m in[20,25],1,m in[5,25],m not in[0,15,30],int(M)>30 and m!=0,1,m!=0 and int(M)<31,h==2,h==3,1,h==1,h==4,h==5,1,h==6,h==7,h==8,1,h==9,h==10,h==11,1,h in[0,12],m==0]
t="IT IS "
for i in range(0,28):
    if(X[i]):t+=w[i]
    else:t+=" "*len(w[i])
print(t.strip())

Essayez-le en ligne

EffyCoder
la source
Pouvez-vous combiner w en une seule chaîne puis utiliser .split(',')? Devrait sauver quelques-uns.
ElPedro
Prenez également votre entrée comme H,M=input()où l'entrée est H, M.
Selon
Merci @ElPedro .Saved 57 octets. H,M=input()n'a pas fonctionné comme vous en avez douté.
EffyCoder
1

Python 2 , 443 440 octets

R=range
w="HALF TEN QUARTER TWENTY FIVE MINUTES TO PAST TWO THREE ONE FOUR FIVE SIX SEVEN EIGHT NINE TEN ELEVEN TWELVE O'CLOCK".split(' ')
h=[10,8,9]+R(11,20)
c=['IT','IS']+[' '*len(x)for x in w]
i,j=input()
i=(i,i+1)[j>30]%13-1
j=int(round(j/5.0)*5.0)%60
for z in[[20],[4,5,7],[1,5,7],[2,7],[3,5,7],[3,4,5,7],[0,7],R(3,7),[3,5,6],[2,6],[1,5,6],R(4,7)][j/5]:c[z]=w[z]
c[h[i]]=w[h[i]]
x=0
for y in[4]+R(6,22,3)+[23]:print' '.join(c[x:y]);x=y

Essayez-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

ElPedro
la source
1

SimpleTemplate , 737 708 octets

Oui, la verbosité et le manque de "vraies" mathématiques ont nui au décompte.

{@seth argv.0}{@php$DATA[m]=ceil($DATA[argv][1]/5)*5%60|0}{@ifm}{@ifm is30}{@setA"HALF"}{@/}{@if"@[15]0$@"is matchesm}{@setB"TEN"}{@/}{@if"@[14]5$@"is matchesm}{@setC"QUARTER"}{@/}{@if"@[24]0$@"is matchesm}{@setD"TWENTY"}{@/}{@if"@^[25]?5$@"is matchesm}{@setE"FIVE"}{@/}{@if"@^([235]?5|[1245]0)$@" is matchesm}{@setF"MINUTES"}{@/}{@ifm is greater30}{@setG"TO"}{@else}{@setH"PAST"}{@/}{@else}{@setU"O\'CLOCK"}{@/}{@setZ"","ONE","TWO","THREE","FOUR","FIVE","SIX","SEVEN","EIGHT","NINE","TEN","ELEVEN","TWELVE"}{@setY"J"}{@incbyh Y}{@php$DATA[$DATA[Y]]=$DATA[Z][$DATA[h]]}{@print"IT IS%-6s%s\n%8s%s\n%-5s%-7s %s\n%4s %3s %s\n%3s %4s %s\n%3s %5s %s\n%4s %3s %s\n%6s %s",A,B,C,D,E,F,G,H,J,K,I,L,M,N,O,P,Q,R,S,T,U}

Ceci attend l’heure et les minutes comme premier et deuxième paramètre de la classe.


Ungolfed:

{@set hour argv.0}

{@//The bitwise is required for the `@if minutes is 30`}
{@//Otherwise, I would be forced to write `@if minutes is equal to 30`}
{@php $DATA['minutes'] = ((ceil($DATA['argv'][1] / 5) * 5) % 60) | 0}

{@if minutes}
    {@if minutes is 30}
        {@set A "HALF"}
    {@/}
    {@if "@[15]0$@" is matches minutes}
        {@set B "TEN"}
    {@/}
    {@if "@[14]5$@" is matches minutes}
        {@set C "QUARTER"}
    {@/}
    {@if "@[24]0$@" is matches minutes}
        {@set D "TWENTY"}
    {@/}
    {@if "@^[25]?5$@" is matches minutes}
        {@set E "FIVE"}
    {@/}
    {@if "@^([235]?5|[1245]0)$@" is matches minutes}
        {@set F "MINUTES"}
    {@/}
    {@if m is greater than 30}
        {@set G "TO"}
    {@else}
        {@set H "PAST"}
    {@/}
{@else}
    {@set U "O\'CLOCK"}
{@/}


{@set numbers "", "ONE", "TWO", "THREE", "FOUR", "FIVE", "SIX", "SEVEN", "EIGHT", "NINE", "TEN", "ELEVEN", "TWELVE"}
{@set key "J"}
{@inc by hour key}
{@php $DATA[$DATA['key']] = $DATA['numbers'][$DATA['hour']]}

{@print "IT IS%-6s%s\n%8s%s\n%-5s%-7s %s\n%4s %3s %s\n%3s %4s %s\n%3s %5s %s\n%4s %3s %s\n%6s %s", A, B, C, D, E, F, G, H, J, K, I, L, M, N, O, P, Q, R, S, T, U}

Comment courir:

  1. Obtenez le code sur https://github.com/ismael-miguel/SimpleTemplate
  2. Exécutez le code suivant:

    <?php
        include 'SimpleTemplate.php';
    
        $template = new SimpleTemplate('<code>');
    
        $template->render($hour, $minutes);
    
        //system-time: $template->render(date('g'), date('i'));
    
  3. Terminé!

Ismael Miguel
la source
1

Java (OpenJDK 9) , 437 octets

(h,m)->{h=(h+m/35+11)%12+1;Object[]s="HALF TEN QUARTER TWENTY FIVE MINUTES TO PAST TWO THREE ONE FOUR FIVE SIX SEVEN EIGHT NINE TEN ELEVEN TWELVE O'CLOCK".split(" ");for(int i=s.length,M[]={1<<20,176,162,132,168,184,129,120,104,68,98,112};i-->0;)s[i]=(7<i&i<20?h==i-(h>3?7:h>1?6:9):(M[(m+2)/5%12]&(1<<i))>0)?s[i]:"";System.out.printf("IT IS %4s %3s%n%7s %6s%n%4s %7s %2s%n%4s %3s %5s%n%3s %4s %4s%n%3s %5s %5s%n%4s %3s %6s%n%6s %7s",s);}

Essayez-le en ligne!

Je pensais enfin tenter le coup;)

Olivier Grégoire
la source
1

Perl 5 , 487 449 octets

($a,$_,$h)=localtime;s/[3-7]$/5/;s/[12]$/0/;$m=s/(.?)[89]$/($1+1)*10/er;$_="IT IS half ten
quarter tw
five minutes to
past 2two 3three
1one 4four 5five
6six 7seven 8eight
9nine 10ten 11eleven
12twelve oc";if($m>30){s/to/TO/;$h++;$m=60-$m}elsif($m){s/past/PAST/}$h=$h%12||12;$m!=30?$m%15?s/m\w+/uc$&/e:$m?s/q\w+/uc$&/e:s/oc/O'CLOCK/:s/half/HALF/;$m%10&&!/Q/&&s/five/FIVE/;$m>15&&$m<30?s/tw/TWENTY/:$m==10&&s/ten/TEN/;s/\b$h\w+/uc$&/es;y/a-z0-9/ /;say

Essayez-le en ligne!

Xcali
la source