Drucken Sie eine Wordclock

59

Seit ich den ersten vor ein paar Jahren gesehen habe, war ich immer unterworfen von dieser Art von Wortuhr, bei der die Zeit tatsächlich durch Wörter ausgedrückt wird, die in einem aussagekräftigen Satz aufleuchten oder nicht.

Eine Word Clock

Der auf dieser Uhr angezeigte Text ist der folgende.

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

Ihre Aufgabe ist es, eine solche Uhr zu schreiben. Wörter leuchten nur dann auf, wenn sie für das Drucken der aktuellen Uhrzeit relevant sind. Ansonsten sind sie beleuchtet. Wörter werden "beleuchtet", indem sie gedruckt werden, und "beleuchtet", indem sie durch eine Anzahl von Leerzeichen ersetzt werden, die der Länge des Wortes entsprechen.

Beispiel: Wenn die aktuelle Uhrzeit 17:23 Uhr ist, muss der gedruckte Text genau wie folgt lauten:

IT IS 
        TWENTY
FIVE MINUTES
PAST
         FIVE

Regeln

  1. Die gedruckte Zeit ist die 12-Stunden-Variante, jedoch ohne AM / PM.
  2. Die Rundung erfolgt nur auf der Basis von Minuten (Sekunden sind völlig irrelevant). Die Rundung wird auf das nächste Vielfache von 5 durchgeführt. Obwohl also 17:52:38 wirklich am nächsten zu 17:55 liegt, wird 17:52 tatsächlich auf 17:50 abgerundet, da die Sekunden irrelevant sind. und der gedruckte Text ist "ES IST ZEHN MINUTEN ZU SECHS" (mit relevantem Abstand). Wenn XXalso ein Vielfaches von fünf ist, XXwird von HH: (XX-2): 00 bis HH: (XX + 2): 59 verwendet. Das Wort MINUTESmuss erscheinen wenn FIVE, TENoderTWENTY sind im Abschnitt Minute (vor „TO“ oder „PAST“) beleuchtet.
  3. Alle irrelevanten Wörter werden durch so viele Leerzeichen ersetzt, wie erforderlich sind, damit der Text dort bleibt, wo er sich in der obigen Vorlage befindet. Nachgestellte Leerzeichen können abgeschnitten werden. Leerzeichen, die relevant sind, um den Text an der erwarteten Position zu halten, müssen beibehalten werden.
  4. Nachlaufende Linien können ebenfalls abgeschnitten werden. Relevante Leerzeilen müssen noch erscheinen. Beispiel:

    IT IS      TEN
    
         MINUTES
    PAST TWO
    
  5. Leuchten Sie nicht TENin der ersten oder FIVEdritten Zeile, wenn sich diese Werte auf die Stunden beziehen.

  6. Sie können eine Eingabe akzeptieren. Wenn Sie eine Eingabe akzeptieren, ist die Eingabe die Zeit zum Drucken in einem beliebigen gültigen Format (Zeichenfolge, Liste der Ganzzahlen, native Zeit, geben Sie Ihre Sprachunterstützung ein, ...), aber keine Parameter sind zulässig, wenn sie nicht zusammenhängen zu der Zeit zu drucken. Wenn Sie keine Eingabe unterstützen, müssen Sie die aktuelle Uhrzeit verwenden. Wenn Sie beide unterstützen, ist das besser, aber es gibt keinen Bonus;)
  7. Ihr Code kann ein Programm, eine Funktion, ein Lambda, aber kein Snippet sein.
  8. Wenn Ihre Sprache das Drucken in irgendeiner Weise unterstützt, muss sie das Ergebnis drucken (in einer Datei, auf der Standardausgabe, macht es mir nichts aus). Wenn Ihre Sprache das Drucken in keiner Weise unterstützt, kann der erwartete Text einfach "zurückgegeben" werden. Das Ergebnis kann entweder nur Groß- oder Kleinschreibung sein, nicht eine Mischung aus beiden.
  9. Es gelten Standardlücken.
  10. Das ist Code-Golf, also gewinnt der kürzeste Code!
  11. Bitte geben Sie, soweit möglich, einen Link zu einem Online-Dolmetscher Ihrer Sprache an.

Testfälle

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
quelle
8
Große Herausforderung, ich mag es wirklich!
Timtech

Antworten:

14

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

Vielen Dank an @Christoph für das Golfen und seine hervorragenden Ergebnisse!
Mindestens 45 Bytes sind auf seinem Konto; 16 oder mehr von ihm inspiriert.

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

durchläuft die Daten und prüft, ob sich der aktuelle Index in einer generierten Zeichenfolge befindet, die die Indizes der Wörter enthält, die aufleuchten sollen (Buchstaben zugeordnet); hängt Zeilenumbruch oder Leerzeichen an, je nach Index.

Gibt möglicherweise Hinweise, wenn Sie den Standardwert für error_reporting(22519) nicht verwenden.

Testen Sie es online.

Nervenzusammenbruch

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

Golfplätze :

  • $x/5+.5|0 ist zwei Bytes kürzer als round($x/5) .
  • Zwei Aufrufe von date(h)sind ein Byte kürzer als die Zuweisung vondate Ergebnisses zu einer Variablen.
  • Durch die Verwendung einer einzelnen Zuordnung wurde die Variable entfernt, in der die Leuchtindizes gespeichert waren.
  • Ein String für die Leuchtindizes anstelle eines Arrays, das ungefähr 30 Bytes lang ist .
  • $w<Aist drei Bytes kürzer als $w=="\n"- stellen Sie sicher, dass hinter einem Begrenzer kein Leerzeichen steht!
  • abs 8 Bytes im Minutenwort gespeichert.
  • Thanks @Christoph: Beim Übergang von Zahlen zu Buchstaben für die Karte wurden die Trennzeichen hinfällig und es wurde eine weitere Zeichenfolge anstelle des Arrays zugelassen. 23 + 8 Bytes gespeichert .
    Verwenden des Unterstrichs als ersten Index, der in die "es ist" -Alternativen aufgenommen werden darf; und es machte das Stundenangebot hinfällig.
  • Durch das Duplizieren des 1Wertes in der Stundenkarte wurde das Modulo überflüssig und durch zusätzliches Golfen wurden 10 Bytes eingespart. Inspiriert von @Christoph.
  • Das Berechnen der Zeilenumbrüche und Leerzeichen, anstatt sie fest zu codieren, hat 19 Bytes gekürzt .
  • Bitlogik in Strings spart 7 Bytes: str_pad("",strlen($w))-> $w^$w^" ". (Christoph)
  • Wenn strtrder zweite Parameter keine Zeichenfolge ist, wird er als ASCII-Code interpretiert. spart 5 Bytes.
Titus
quelle
Das ist sehr nett! Ich habe diese Implementierung in Java ausprobiert, um sicherzugehen, dass die Frage lösbar ist, aber sie war so kompliziert, dass ich aufgegeben und einen längeren, aber einfacheren Ansatz gewählt habe! Also herzlichen Glückwunsch zum Erfolg, wo ich versagt habe;)
Olivier Grégoire
1
Schlagen des Restes: $i++%3^($i<3)zu $i++%3^$i<3. Ich bin jetzt offiziell völlig verschwendet. Ich mache eine Pause, bis jemand zu uns passt. Das hat wirklich Spaß gemacht. Vielen Dank, Titus, für deine Teamarbeit!
Christoph
1
@Christoph Du bist ... GROSSES scheint ein kleines Wort. \ o /
Titus
18

TI-Basic, 335 334 Bytes

Ziemlich perfekt, da die TI-84-Rechner 8x16-Buchstaben-Displays haben und dies 8x15 sind. Das Datum wird als Eingabe verwendet, um Berechnungen vor TI-84 zu unterstützen, die keine internen Uhren haben. Wird ohne Argumente Inputstandardmäßig in Xund eingegeben Y, ähnlich wie in Prompt X,Y. Machen Sie Xalso Stunden (alles >=0wird korrekt funktionieren) und YMinuten.

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

Hinweis 1: Für TI-84 + können Sie Inputmit etwas wie ersetzen getTime:Ans(1->X:getTime:Ans(2->Y. Auch int(Y/5-5.6ist gleichbedeutend mit round(Y/5,0)-6. Und nein, in diesem Fall int(konnte nicht mit ausgetauscht werden iPart(.

Hinweis 2: Hiermit wird die Eingabe einwandfrei gedruckt, aber aus asethischen Gründen möchten Sie wahrscheinlich Pauseam Ende des Programms die DoneMeldung beim Programmende vermeiden .

Bearbeiten: Die Anzahl der Bytes wurde gesenkt, weil sie tokenisiert waren (siehe Hinweis zur vorherigen Version). Dank @Neil wurde auch ein Fehler behoben. Drittens habe ich einen Fehler behoben, der 2 Byte gekostet hätte, aber durch die Optimierung wurde insgesamt 1 Byte gespart. Außerdem wurde mir klar, dass ich Eingaben getTimeerhalte , sodass ich nicht anrufen muss (duh?). Für jeden, der diese Byteanzahl bestätigen möchte, ist das einzige Zwei-Byte-Token sub(.

Timtech
quelle
Mir scheint, dass O'CLOCKder Code nach der Ausgabe auch weiterhin ausgegeben PASTwird ...
Neil,
2
Ich zähle 545 Bytes. Könnten Sie mich bitte aufklären?
Christoph
2
@Christoph Hat den zugehörigen Meta-Post gefunden: meta.codegolf.stackexchange.com/a/4764/29637
Christoph
1
@ OlivierGrégoire Eigentlich hat es überhaupt nichts mit der vorherigen Zeile zu tun. Was es tut, ist die Umrechnung von 24-Stunden- in 12-Stunden-Zeit und auch in die nächste Stunde (z. B. Rundung mit Minuten). Grundsätzlich würde es in einer normalen Sprache ungefähr so ​​aussehen, x+(y>32) mod 12wenn der Vergleich 1 oder 0 ergibt, wie in TI-Basic.
Timtech
1
Also @Christoph, es scheint, als hättest du deine eigene Frage mit diesem Link beantwortet. Möchtest du immer noch, dass ich das erkläre? Wenn Sie sehen möchten, wo ich von ASCII-Scoring zu Tokenized gewechselt habe, überprüfen Sie Revision 4.
Timtech
11

JavaScript (ES6), 291 303 295 Bytes

Nimmt Eingaben als zwei Ganzzahlen mit aktueller Syntax an (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)))

Wie es funktioniert

Die gesamte Uhr kann als 23 LEDs gesehen werden, die entweder EIN oder AUS sind. Der Taktstatus ist also eine 23-Bit-Ganzzahl.

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             

Die Minuten Logik , die wir die richtigen Worte implementieren müssen , damit ist nicht so einfach , wie man auf den ersten Blick denken könnte. Möglicherweise gibt es eine Magic-Golfing-Formel, aber ich habe mich auf die einfache Art und Weise entschieden, jede mögliche Konfiguration nur hart zu codieren:

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

Testfälle

Arnauld
quelle
2
Sehr schlau. Ich habe versucht, ein weiteres Byte von meinem zu entfernen, dann habe ich das gesehen und es gibt keine Hoffnung, dass ich mithalten kann.
EDC65
Die Aufgabe (Regel 8) besagt, dass sie gedruckt und nicht nur zurückgegeben werden muss
smls
@smls Oh, du hast recht. Das ist behoben.
Arnauld
Sehr cool. Außer die Zeit ist falsch :-( Anzeige: h = 13 m = 15 Aktuelle Zeit: 14:43
Strawberry
@ Erdbeere Bitte beachten Sie Regel # 6. Diese Implementierung verwendet ausschließlich Eingaben, nicht die Ortszeit.
Arnauld
6

Batch, 789 Bytes

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

Hinweis: Nachgestellte Leerzeichen nach PASTund 5 nachgestellte Leerzeichen in jeder der folgenden beiden Zeilen.

Neil
quelle
Ich habe es laufen lassen und es funktioniert einwandfrei (abgesehen von einem fehlenden Platz für die dritte Stunde)! Ich verstehe nur nicht, was los ist (mit call:czum Beispiel)! Ich sollte wahrscheinlich etwas lernen :)
Olivier Grégoire
@ OlivierGrégoire Leider war ein Leerzeichen verschwunden, aber das ist jetzt behoben.
Neil
4

JavaScript, 567 564 551 542 529 527 519 Bytes

Ich weiß nicht, ob es in Ordnung ist, Stunden und Minuten als Argumente zu nehmen. Sie sagten "Liste der ganzen Zahlen". Zählt es noch?

Ich spiele übrigens zum ersten Mal Golf. Was denkst du?


Bearbeiten: Einige Bytes durch Teilen von Minuten gespeichert. Danke, Olivier!

Hristiyan Dodov
quelle
Ja, die Idee hinter dieser Regel ist, dass Sie Argumente verwenden können, aber nur, wenn sie sich auf die Eingabe beziehen. Dies ist die Zeit zum Drucken.
Olivier Grégoire
1
In Bezug auf das Golfen können Sie wahrscheinlich einige Bytes golfen, wenn Sie erwägen, Ihre Minuten durch 5 zu teilen. Außerdem möchten Sie sich möglicherweise cinnerhalb Ihrer Funktion bewegen . Sie sollten kein Byte verlieren, wenn Sie das tun, denke ich, aber das macht es eher zu einem Snippet als zu einer Funktion (zumindest für mich werden JS-Gurus vielleicht etwas anderes sagen).
Olivier Grégoire
4

JavaScript (ES6) 360

Eine Funktion mit den Eingabeparametern Stunde (0..23) und Minute (0..59).
Verwendung alertfür die Ausgabe, da dies die Standardausgabefunktion in Javascript ist, auch wenn dies unpraktisch ist. (Und es ist kurz)

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

Test Hinweis: Aus Sicherheitsgründen wird die Warnmeldung im Test-Snippet auf den Seitentext umgeleitet

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
quelle
Ich liebe deine Antwort! Ich habe ein paar Sachen daraus gelernt! Was ist jedoch mit der Pfeilfunktion los, die eckige Klammern hat? Was ist auch die Rolle von i? Ich kann sehen, dass Sie alle Nicht-Whitespace-Gruppen (die "LEDs") erhalten und sie durch Whitespace ersetzen, basierend auf den Bedingungen, die Sie für jede dieser Gruppen geschrieben haben. Zum Beispiel ist h-2es nur wann falsch h == 2, also nehme ich an, dass Sie es irgendwo invertieren? Können Sie ein bisschen erklären, wie das funktioniert? Vielleicht als Bearbeitung Ihrer Antwort? Ich wäre sehr dankbar!
Hristiyan Dodov
Update - Ich habe fast gemerkt, was Sie tun. Sie haben ein Array von Null- und Nicht-Null-Elementen und verwenden dieses Array i, um nach jeder Regex-Übereinstimmung auf das richtige zu verweisen, indem Sie es inkrementieren. Wenn es wahr ist, ersetzen Sie die übereinstimmende Zeichenfolge durch Leerzeichen, andernfalls belassen Sie es so, wie es ist. Eines verstehe ich allerdings nicht. replace()Verwendet den Rückgabewert der angegebenen Funktion (in diesem Fall die Pfeilfunktion). Wo geben Sie einen Wert zurück? Ich sehe nur einen ternären Operator.
Hristiyan Dodov
3
@HristiyanDodov Eine Pfeilfunktion, die nur aus einem Ausdruck besteht, gibt nur den Wert dieses Ausdrucks zurück. Beispiel (a,b)=>{ return a+b }ist das gleiche wie(a,b)=>a+b
edc65 18.01.17
4

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

Da es eine Funktion sein darf, die h und m als Ganzzahlen akzeptiert, können wir ein paar Bytes sparen. Probieren Sie es online aus .

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

Ich hatte ein paar Bugs (jetzt fest) mit der Logik für TO/ PASTvs O'CLOCK. Außerdem wurden ein paar Bytes für das enumerateÄndern von importund 19<m<26anstelle von gespeichert m in [20,25]. Sparte weitere 8 für die Arbeit in 5-Minuten-Stücken, die länger als Minuten dauern. Rod wies auf einige weitere Fehler hin, die mich einiges gekostet haben, aber ich habe mich ein wenig erholt, mit effizienteren Aufgaben und einem Bugfix, der zu meinen Gunsten wirkte.

Chris H
quelle
Übernimmt einen Trick aus der PHP-Antwort von @Titus. Ich verliere ==als Vergleich gegen Python und ich gehe davon aus, dass ich einige der hTests verbessern kann
Chris H
Sie können nur print cin der letzten Zeile, chält bereits a[i]fälligenumerate
Rod
1
Das Ausgabeformat ist gebrochen, printeine neue Zeile nach jedem Druck hinzufügen, können Sie unterdrücken es eine Zugabe ,nach c. Auch sollte es Leerzeichen drucken, wenn ein Wort nicht gedruckt wird, können Sie mit einem anderen in der letzten ifelse:print' '*len(c),
Rod
1
Die Reihenfolge der Bytes ist bei absteigender Reihenfolge besser.
Gurupad Mamadapur
@ Rod, danke für die Bug-Spots, auch wenn es viel länger dauert
Chris H
2

Perl 6 , 308 296 293 Bytes

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

Probieren Sie es online!

Erläuterung

Die Grundstruktur ist wie folgt:

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

Der wie ...|...|...|...oben beschriebene Ausdruck ist eine Kreuzung von Ganzzahlen, die auf 1 basierende Wortindizes darstellen , und setzt sich wie folgt zusammen:

  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
quelle
2

Python3 (569 Byte)

Diese Antwort benötigt Zeit im Format hh mm (durch Leerzeichen getrennte Ganzzahlen). Ich habe es geschafft, '\ n' zu drucken, was von Chris ' Methode inspiriert ist. Danke, Chris! Jede Hilfe, die den Code reduziert, ist willkommen.

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

Probieren Sie es online

EffyCoder
quelle
Können Sie w zu einer einzigen Zeichenfolge kombinieren und dann verwenden .split(',')? Sollte ein paar retten.
ElPedro
Nehmen Sie Ihre Eingabe auch als H,M=input()wo die Eingabe H, M ist. Zwei Integer-Sequenzen sind nach den Regeln zulässig. Ich bin mir nicht sicher, ob dies unter Python 3 wie beabsichtigt funktioniert. Ich bin immer noch ein
Zwei-
Danke @ElPedro. 57 Bytes gespeichert. H,M=input()hat nicht funktioniert, wie Sie bezweifelt haben.
EffyCoder
1

Python 2 , 443.440 Bytes

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

Probieren Sie es online!

Es könnte wahrscheinlich immer noch von etwas mehr Golf profitieren. Die Eingabe ist eine Liste von ganzen Zahlen, zB 7,23 = 7:23

ElPedro
quelle
1

SimpleTemplate , 737 708 Bytes

Ja, Ausführlichkeit und das Fehlen "echter" Mathematik haben dem Bytecount sehr geschadet.

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

Dies erwartet die Stunden und Minuten als 1. und 2. Parameter für die Klasse.


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}

Wie läuft man:

  1. Den Code erhalten Sie unter https://github.com/ismael-miguel/SimpleTemplate
  2. Führen Sie den folgenden Code aus:

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

Ismael Miguel
quelle
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);}

Probieren Sie es online!

Ich dachte, ich würde endlich eine Chance auf meine Herausforderung geben;)

Olivier Grégoire
quelle
1

Perl 5 , 487 449 Bytes

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

Probieren Sie es online!

Xcali
quelle