Stampa un word clock


59

Da quando ho visto il primo qualche anno fa, sono sempre stato soggiogato da questo tipo di word clock in cui il tempo è effettivamente scandito dalle parole illuminate o meno in una frase significativa.

Un orologio di parole

Il testo visualizzato su quell'orologio è il seguente.

IT IS HALF TEN
QUARTER TWENTY
FIVE MINUTES TO
PAST TWO THREE
ONE FOUR FIVE
SIX SEVEN EIGHT
NINE TEN ELEVEN
TWELVE O'CLOCK

Il tuo compito è scrivere un tale orologio funzionante. Le parole sono illuminate se e solo se sono rilevanti per la stampa dell'ora corrente. Altrimenti, sono illuminati. Le parole vengono "illuminate" per essere stampate e vengono "illuminate" per essere sostituite da un numero di spazi che sono la lunghezza della parola.

Esempio: se l'ora corrente è 17:23, il testo stampato deve essere esattamente il seguente:

IT IS 
        TWENTY
FIVE MINUTES
PAST
         FIVE

Regole

  1. Il tempo stampato è la variante 12h, ma senza AM / PM.
  2. L'arrotondamento viene eseguito solo sulla base dei minuti (i secondi sono totalmente irrilevanti). L'arrotondamento viene eseguito sul multiplo più vicino di 5. Quindi, ad esempio, anche se 17:52:38 è davvero il più vicino alle 17:55, ma poiché i secondi sono irrilevanti, 17:52 viene effettivamente arrotondato per difetto a 17:50, e il testo stampato è "È DIECI MINUTI A SEI" (con relativa spaziatura). Quindi, se XXè un multiplo di cinque, XXverrà utilizzato da HH: (XX-2): 00 fino a HH: (XX + 2): 59. La parola MINUTESdeve apparire se FIVE, TENo TWENTYè illuminata nella sezione dei minuti (prima di "TO" o "PAST").
  3. Tutte le parole non pertinenti vengono sostituite da tutti gli spazi necessari per mantenere il testo nel punto in cui si trova nel modello sopra. Gli spazi finali possono essere tagliati. Gli spazi rilevanti per mantenere il testo nella posizione prevista devono essere mantenuti.
  4. Anche le linee finali possono essere tagliate. Le linee vuote rilevanti devono ancora apparire. Esempio:

    IT IS      TEN
    
         MINUTES
    PAST TWO
    
  5. Non illuminare TENsulla prima riga o FIVEsulla terza riga quando questi valori si riferiscono alle ore.

  6. È possibile accettare un input. Se si accetta un input, l'input sarà il momento di stampare in qualsiasi formato valido desiderato (stringa, elenco di numeri interi, tipo di ora nativo il supporto della propria lingua, ...), ma nessun parametro è consentito se non sono correlati al momento di stampare. Se non si supporta alcun input, è necessario utilizzare l'ora corrente. Se supporti entrambi, è meglio ma non ci sono bonus;)
  7. Il tuo codice può essere un programma, una funzione, un lambda ma non snippet.
  8. Se la tua lingua supporta la stampa in qualche modo, deve stampare il risultato (in un file, sullo standard output, non mi dispiace). Se la tua lingua non supporta in alcun modo la stampa, è consentito semplicemente "restituire" il testo previsto. Il risultato può essere tutto maiuscolo o tutto minuscolo, non un mix di entrambi.
  9. Si applicano scappatoie standard.
  10. Questo è code-golf quindi vince il codice più corto!
  11. Nella misura del possibile, si prega di fornire un collegamento a un interprete online della tua lingua.

Casi 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

8
Grande sfida, mi piace davvero!
Timtech,

Risposte:


14

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

Grazie @Christoph per il golf e le sue eccellenti scoperte!
Almeno 45 byte sono sul suo account; 16 o più ispirati da lui.

A Marvel Team Up!

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];

scorre i dati e verifica se l'indice corrente si trova in una stringa generata che contiene gli indici delle parole da illuminare (mappati su lettere); aggiunge l'interruzione di riga o lo spazio in base all'indice.

Può generare avvisi se non si utilizza il valore predefinito per error_reporting(22519).

Provalo online.

abbattersi

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

Golf :

  • $x/5+.5|0è due byte più breve di round($x/5).
  • Due chiamate di date(h)sono un byte più brevi rispetto all'assegnazione del daterisultato a una variabile.
  • Usando un singolo incarico, è stata eliminata la variabile in cui erano memorizzati gli indici di illuminazione.
  • Una stringa per gli indici di illuminazione anziché una matrice salvata di circa 30 byte .
  • $w<Aè tre byte più breve di $w=="\n"- assicurati che non ci sia spazio dopo un delimitatore!
  • abs salvato 8 byte sulla parola minuti.
  • Grazie @Christoph: il passaggio dai numeri alle lettere per la mappa ha reso obsoleti i separatori e ha consentito una stringa in più anziché un array; salvato 23 + 8 byte .
    L'uso del trattino basso come primo indice ha permesso di includerlo nelle alternative "è"; e ha reso obsoleta la citazione per le ore.
  • La duplicazione del 1valore nella mappa delle ore ha reso obsoleto il modulo e quello con il golf aggiuntivo ha consentito di risparmiare 10 byte. Ispirato da @Christoph.
  • Il calcolo delle interruzioni di riga e degli spazi invece di codificarli a codice fisso è stato eliminato di 19 byte .
  • La logica dei bit sulle stringhe consente di risparmiare 7 byte: str_pad("",strlen($w))-> $w^$w^" ". (Christoph)
  • Se strtril secondo parametro non è una stringa, verrà interpretato come un codice ASCII. salva 5 byte.

Questo è molto carino! Ho provato questa implementazione in Java assicurandomi che la domanda fosse risolvibile, ma alla fine è stata così complicata che ho rinunciato e ho usato un approccio più lungo, ma più semplice! Quindi complimenti per il successo dove ho fallito;)
Olivier Grégoire il

1
Battito del resto: $i++%3^($i<3)a $i++%3^$i<3. Sono ufficialmente completamente sprecato ora. Mi prenderò una pausa fino a quando qualcuno ci abbinerà. È stato davvero divertente. Grazie Titus per il tuo lavoro di squadra!
Christoph,

1
@Christoph Sei ... GRANDE sembra una piccola parola. \ o /
Tito

18

TI-Basic, 335 334 byte

Praticamente perfetto, dal momento che i calc TI-84 hanno display 8x16 lettere, e questo è 8x15. La data viene considerata come input per supportare calcoli precedenti alla TI-84, che non dispongono di orologi interni. Senza argomenti, Inputviene inserito per impostazione predefinita in Xe Y, in modo simile a Prompt X,Y. Quindi fai Xore (tutto >=0funzionerà correttamente) e avrai Yminuti.

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

Nota 1: per TI-84 + è possibile sostituire Inputcon qualcosa di simile getTime:Ans(1->X:getTime:Ans(2->Y. Inoltre, int(Y/5-5.6equivale a round(Y/5,0)-6. E no, in questo caso int(non è stato possibile scambiarlo iPart(.

Nota 2: Questo stampa l'input bene, ma per motivi etetici probabilmente Pausealla fine del programma si eviterà il Donemessaggio al termine del programma.

Modifica: numero di byte ridotto perché tokenizzato (vedere la nota sulla revisione precedente), inoltre un bug è stato corretto grazie a @Neil. In terzo luogo, ho risolto un bug che mi sarebbe costato 2 byte, ma l'ottimizzazione in realtà ha salvato 1 byte in generale, e ho anche capito che sto ricevendo input, quindi non ho bisogno di chiamare getTime(duh?). Infine, per chiunque desideri confermare questo conteggio byte, l'unico token a due byte è sub(.


Mi sembra che dopo aver emesso O'CLOCKil codice andrà anche in output PAST...
Neil

2
Conto 545 byte potresti per favore illuminarmi?
Christoph,

2
@Christoph Trovato il meta post correlato: meta.codegolf.stackexchange.com/a/4764/29637
Christoph

1
@ OlivierGrégoire In realtà non è affatto correlato a quella riga precedente. Quello che sta facendo è la conversione da 24 ore a 12 ore e anche l'ora più vicina (ad es. Arrotondamento con minuti contabilizzati). Fondamentalmente, in un linguaggio normale sembrerebbe qualcosa di simile x+(y>32) mod 12se il confronto produce 1 o 0 come in TI-Basic.
Timtech,

1
Quindi @Christoph sembra che tu abbia risposto alla tua stessa domanda con quel link, vuoi ancora che ti spieghi? Se vuoi vedere dove ho fatto il passaggio dal punteggio ASCII al tokenizzato, controlla la revisione n. 4.
Timtech,

11

JavaScript (ES6), 291 303 295 byte

Accetta input come due numeri interi con sintassi di 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)))

Come funziona

L'intero orologio può essere visto come 23 LED che sono ON o OFF. Quindi, lo stato dell'orologio è un numero intero a 23 bit.

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 logica dei minuti che dobbiamo implementare per abilitare le parole giuste non è così semplice come si potrebbe pensare a prima vista. Potrebbe esistere una formula di golf magico, ma sono andato nel modo più semplice e ho deciso di codificare ogni possibile configurazione:

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

Casi test


2
Molto intelligente. Stavo cercando di tagliare un po 'più di byte dal mio, poi ho visto questo e non c'è speranza di competere.
edc65,

Il compito (regola 8) dice che deve essere stampato, non solo restituito
smls

@smls Oh, hai ragione. Questo è stato risolto.
Arnauld,

Molto bello. Tranne che l'ora è sbagliata :-( Display: h = 13 m = 15 Tempo effettivo: 14:43
Strawberry

@Strawberry Si prega di consultare la regola # 6. Questa implementazione utilizza esclusivamente input, non l'ora locale.
Arnauld,

6

Lotto, 789 byte

@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%

Nota: spazio finale dopo PASTe 5 spazi finali su ciascuna delle due righe seguenti.


L'ho eseguito e funziona bene (esclude uno spazio mancante per l'ora 3)! Non capisco cosa stia succedendo ( call:cad esempio)! Probabilmente dovrei imparare alcuni lotti :)
Olivier Grégoire il

@ OlivierGrégoire Purtroppo era scomparso uno spazio ma ora è stato risolto.
Neil,

4

JavaScript, 567 564 551 542 529 527 519 byte

Non so se sia giusto prendere ore e minuti come argomenti. Hai detto "elenco di numeri interi". Conta ancora?

A proposito, è la prima volta che gioco a golf. Cosa ne pensi?


Modifica: salvato alcuni byte dividendo i minuti. Grazie Olivier!


Sì, l'idea alla base di quella regola è che puoi prendere argomenti, ma solo se si riferiscono all'input, che è il momento di stampare.
Olivier Grégoire,

1
Per quanto riguarda il golf, probabilmente puoi golfare alcuni byte se pensi di dividere i tuoi minuti per 5. Inoltre, potresti voler muoverti call'interno della tua funzione. Non dovresti perdere alcun byte nel farlo, immagino, ma questo lo rende più simile a uno snippet che a una funzione (per me, almeno, forse i guru di JS diranno diversamente).
Olivier Grégoire,

4

JavaScript (ES6) 360

Una funzione con parametri di input ora (0..23) e minuti (0..59).
Usando alertper l'output, in quanto è la funzione di output standard in JavaScript anche se è scomodo. (Ed è breve)

(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))

Nota di prova : per la tua tranquillità, nello snippet di prova l'output di avviso viene reindirizzato al testo della pagina

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>


Adoro la tua risposta! Ho imparato un sacco di cose da esso! Tuttavia, cosa sta succedendo con la funzione freccia con parentesi quadre? Inoltre, qual è il ruolo i? Vedo che ottieni tutti i gruppi di spazi non bianchi (i "LED") e li sostituisci con spazi bianchi in base alle condizioni che hai scritto per ognuno di essi. Ad esempio, h-2è falso solo quando h == 2, quindi presumo che tu lo invertisca da qualche parte? Puoi spiegarci un po 'come funziona? Forse come modifica alla tua risposta? Sarei davvero grato!
Hristiyan Dodov, il

Aggiornamento: ho quasi capito cosa stai facendo. Hai una matrice di elementi zero e diversi da zero e usi iper fare riferimento a quello giusto incrementandolo dopo ogni corrispondenza regex. Se è vero, sostituisci la stringa corrispondente con spazi vuoti, altrimenti la lasci così com'è. Non capisco una cosa, però. replace()utilizza il valore restituito della funzione specificata (funzione freccia in questo caso). Dove restituisci un valore? Vedo solo un operatore ternario.
Hristiyan Dodov,

3
@HristiyanDodov una funzione freccia fatta solo di un'espressione restituisce semplicemente il valore di quell'espressione. L'esempio (a,b)=>{ return a+b }è lo stesso di(a,b)=>a+b
edc65, il

4

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

Dato che può essere una funzione che accetta h e m come numeri interi, possiamo salvare qualche byte. Provalo online .

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),

Ho avuto un paio di bug (ora risolto) con la logica per TO/ PASTvs O'CLOCK. Anche salvato alcuni byte per enumerate, cambiando il import, e 19<m<26invece di m in [20,25]. Ne ho salvati altri 8 per aver lavorato in blocchi di 5 minuti dopo pochi minuti. Rod ha sottolineato alcuni altri bug che mi sono costati un bel po ', ma mi sono ripreso un po' con incarichi più efficienti e un bugfix che ha funzionato a mio favore.


Prende un trucco dalla risposta PHP di @Titus. Sto perdendo il confronto con Python ==e credo di poter migliorare alcuni dei htest
Chris H,

si può solo print csull'ultima riga, cgià titolare a[i]a causaenumerate
Rod

1
Il formato di output è interrotto, printaggiungi una nuova riga dopo ogni stampa, puoi sopprimerlo aggiungendo un ,dopo c. Inoltre dovrebbe stampare spazi vuoti quando una parola non viene stampata, è possibile correggere con un altro nell'ultimo ifelse:print' '*len(c),
Rod

1
L'ordine dei byte è migliore se decrescente.
Gurupad Mamadapur,

@Rod, grazie per i bug-spot, anche se lo rende molto più lungo
Chris H

2

Perl 6 , 308 296 293 byte

->\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}

Provalo online!

Spiegazione

La struttura di base è la seguente:

-> \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'espressione elisa come ...|...|...|...sopra, è una giunzione di numeri interi che rappresentano indici di parole basati su 1 ed è composta come segue:

  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 / ...

2

Python3, (569 byte)

Questa risposta richiede tempo nel formato hh mm (numeri interi separati da spazio). Sono riuscito a stampare "\ n", che si ispira al metodo di Chris. Grazie, Chris! Qualsiasi aiuto per ridurre il codice è apprezzato.

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())

Provalo online


Puoi combinare w in una singola stringa e quindi usare .split(',')? Dovrebbe salvare alcuni.
ElPedro,

Prendi anche il tuo input come H,M=input()dove input è H, M.
Secondo

Grazie @ElPedro. Salvati 57 byte. H,M=input()non ha funzionato come dubitavi.
EffyCoder,

1

Python 2 , 443 440 byte

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

Provalo online!

Probabilmente potrebbe ancora beneficiare di un po 'più di golf. L'input è un elenco di numeri interi, ad esempio 7,23 = 7:23


1

SimpleTemplate , 737 708 byte

Sì, la verbosità e la mancanza di matematica "reale" hanno danneggiato gravemente il personale.

{@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}

Ciò prevede l'ora e i minuti come primo e secondo parametro sulla 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}

Come eseguire:

  1. Ottieni il codice da https://github.com/ismael-miguel/SimpleTemplate
  2. Esegui il seguente codice:

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


1

Java (OpenJDK 9) , 437 byte

(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);}

Provalo online!

Ho pensato di dare finalmente un colpo alla mia sfida;)


1

Perl 5 , 487 449 byte

($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

Provalo online!

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.