Wydrukuj zegar słów


59

Odkąd widziałem ten pierwszy kilka lat temu, zawsze byłem podporządkowany tego rodzaju zegarowi słownemu, w którym czas jest tak naprawdę wyrażony przez rozjaśnienie słów, czy nie w sensowne zdanie.

Zegar słowny

Tekst wyświetlany na tym zegarze jest następujący.

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

Twoim zadaniem jest napisanie takiego działającego zegara. Słowa są podświetlane tylko wtedy, gdy dotyczą drukowania bieżącego czasu. W przeciwnym razie są zapalone. Słowa są „podświetlane” przez wydrukowanie i są „podświetlane” przez zastąpienie ich spacjami o długości słowa.

Przykład: jeśli aktualny czas to 17:23, wydrukowany tekst musi wyglądać dokładnie tak:

IT IS 
        TWENTY
FIVE MINUTES
PAST
         FIVE

Zasady

  1. Drukowany czas to wariant 12h, ale bez AM / PM.
  2. Zaokrąglanie odbywa się tylko na podstawie minut (sekundy nie mają żadnego znaczenia). Zaokrąglanie jest wykonywane do najbliższej wielokrotności 5. Więc, na przykład, chociaż 17:52:38 naprawdę jest najbliżej 17:55, ale ponieważ sekundy nie mają znaczenia, 17:52 jest w rzeczywistości zaokrąglane w dół do 17:50, a wydrukowany tekst to „TO DZIESIĘĆ MINUT DO SZEŚCIU” (z odpowiednim odstępem). Więc jeśli XXjest wielokrotnością pięciu, XXbędą używane od GG: (XX-2): 00 do GG: (XX + 2): 59. Słowo MINUTESmusi się pojawić, jeśli FIVE, TENlub TWENTYsą oświetlone w sekcji minut (przed „do” lub „Past”).
  3. Wszystkie nieistotne słowa są zastępowane tyloma spacjami, ile potrzeba, aby tekst był umieszczony w powyższym szablonie. Końcowe spacje mogą zostać przycięte. Należy zachować spacje istotne dla utrzymania tekstu na oczekiwanej pozycji.
  4. Linie końcowe mogą być również przycięte. Odpowiednie puste wiersze są nadal wymagane. Przykład:

    IT IS      TEN
    
         MINUTES
    PAST TWO
    
  5. Nie zapalaj się TENw pierwszym wierszu lub FIVEw trzecim wierszu, gdy te wartości odnoszą się do godzin.

  6. Możesz zaakceptować dane wejściowe. Jeśli zaakceptujesz dane wejściowe, będzie to czas wydruku w dowolnym poprawnym formacie (ciąg, lista liczb całkowitych, czas natywny wpisz obsługę języka, ...), ale żadne parametry nie są dozwolone, jeśli nie są powiązane do czasu wydrukowania. Jeśli nie obsługuje danych wejściowych, musisz użyć bieżącej godziny. Jeśli popierasz oba, to lepiej, ale nie ma bonusu;)
  7. Twój kod może być programem, funkcją, lambda, ale nie fragmentem kodu.
  8. Jeśli twój język w jakikolwiek sposób obsługuje drukowanie, musi wydrukować wynik (nie mam nic przeciwko w pliku, na standardowym wyjściu). Jeśli twój język w żaden sposób nie obsługuje drukowania, możesz po prostu „zwrócić” oczekiwany tekst. Wynikiem może być cała wielka lub mała litera, a nie połączenie obu.
  9. Obowiązują standardowe luki.
  10. To jest golf golfowy, więc wygrywa najkrótszy kod!
  11. W miarę możliwości proszę podać link do tłumacza online w Twoim języku.

Przypadki testowe

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
Świetne wyzwanie, naprawdę mi się podoba!
Timtech,

Odpowiedzi:


14

PHP, 387 384 353 352 342 323 310 306 298 293 291 bajtów

Dzięki @Christoph za grę w golfa wraz z jego doskonałymi odkryciami!
Na jego koncie jest co najmniej 45 bajtów; 16 lub więcej inspirowanych przez niego.

Zespół Marvela!

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

zapętla dane i sprawdza, czy bieżący indeks znajduje się w wygenerowanym ciągu, który zawiera indeksy słów do podświetlenia (mapowane na litery); dodaje podział wiersza lub spację w zależności od indeksu.

Może dawać powiadomienia, jeśli nie użyjesz wartości domyślnej dla error_reporting(22519).

Przetestuj online.

awaria

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

Golfy :

  • $x/5+.5|0jest dwa bajty krótszy niż round($x/5).
  • Dwa wywołania date(h)są o jeden bajt krótsze niż przypisanie datewyniku do zmiennej.
  • Za pomocą pojedynczego przydziału odegrał zmienną, w której były przechowywane indeksy podświetlenia.
  • Ciąg indeksów podświetlenia zamiast tablicy zapisanej około 30 bajtów .
  • $w<Ajest trzy bajty krótszy niż $w=="\n"- upewnij się, że po separatorze nie ma spacji!
  • abs zapisano 8 bajtów na słowie minut.
  • Dzięki @Christoph: Przejście od cyfr do liter dla mapy sprawiło, że separatory stały się przestarzałe i pozwoliły na jeszcze jeden ciąg zamiast tablicy; zapisane 23 + 8 bajtów .
    Użycie podkreślenia jako pierwszego indeksu pozwoliło na włączenie go do alternatyw „to jest”; i spowodowało, że cytat za godziny stał się nieaktualny.
  • Powielenie 1wartości na mapie godzin sprawiło, że modulo stało się przestarzałe, a przy dodatkowym golfie zaoszczędzono 10 bajtów. Zainspirowany @Christoph.
  • Obliczanie podziałów linii i spacji zamiast ich kodowania na stałe ogoliło 19 bajtów .
  • Logika bitowa na ciągach oszczędza 7 bajtów: str_pad("",strlen($w))-> $w^$w^" ". (Christoph)
  • Jeśli strtrdrugim parametrem nie jest ciąg znaków, zostanie on zinterpretowany jako kod ascii. oszczędza 5 bajtów.

To jest bardzo miłe! Wypróbowałem tę implementację w Javie, upewniając się, że pytanie jest możliwe do rozwiązania, ale okazało się, że było to tak skomplikowane, że poddałem się i zastosowałem dłuższe, ale prostsze podejście! Gratuluję więc sukcesu tam, gdzie mi się nie udało;)
Olivier Grégoire

1
Bicie reszty: $i++%3^($i<3)do $i++%3^$i<3. Jestem teraz oficjalnie całkowicie zmarnowany. Zrobię sobie przerwę, aż ktoś nas dopasuje. Było naprawdę zabawnie. Dziękuję Tytusowi za pracę zespołową!
Christoph

1
@Christoph You are ... WIELKIE wydaje się małe słowo. \ o /
Tytus

18

TI-Basic, 335 334 bajty

Prawie idealnie, ponieważ cielęta TI-84 mają wyświetlacze 8 x 16 liter, a to jest 8 x 15. Jako dane wejściowe przyjmuje się datę w celu obsługi cieląt wcześniejszych niż TI-84, które nie mają wewnętrznych zegarów. Bez argumentów Inputdomyślnie pobiera dane wejściowe do Xi Y, podobnie jak Prompt X,Y. Więc Xbądź godzinami (wszystko >=0będzie działać poprawnie) i mieć Yminuty.

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

Uwaga 1: W przypadku TI-84 + można zastąpić Inputczegoś podobnego getTime:Ans(1->X:getTime:Ans(2->Y. Również int(Y/5-5.6jest równoważne z round(Y/5,0)-6. I nie, w tym przypadku int(nie można było zamienić z nim iPart(.

Uwaga 2: To wypisuje dobrze wejście, ale z powodów estetycznych prawdopodobnie Pausena końcu programu chcesz uniknąć Donekomunikatu po zakończeniu programu.

Edycja: Zmniejszono liczbę bajtów, ponieważ tokenizowano (patrz uwaga na poprzedniej wersji), a także błąd został naprawiony dzięki @Neil. Po trzecie, naprawiłem błąd, który sam znalazłem, który kosztowałby 2 bajty, ale optymalizacja faktycznie zaoszczędziła 1 bajt ogółem, a także zdałem sobie sprawę, że otrzymuję dane wejściowe, więc nie muszę dzwonić getTime(duh?). Na koniec, dla każdego, kto chce potwierdzić tę liczbę bajtów, jedyny dwubajtowy token to sub(.


Wydaje mi się, że po wypisaniu O'CLOCKkod również przejdzie do wypisywania PAST...
Neil

2
Liczę 545 bajtów. Czy mógłbyś mnie oświecić?
Christoph

2
@Christoph Znaleziono powiązany post z meta: meta.codegolf.stackexchange.com/a/4764/29637
Christoph

1
@ OlivierGrégoire Właściwie to wcale nie jest związane z poprzednią linią. Konwertuje czas 24-godzinny na 12-godzinny, a także na najbliższą godzinę (np. Zaokrąglanie z uwzględnieniem minut). Zasadniczo w normalnym języku wyglądałoby to tak, x+(y>32) mod 12jakby porównanie dało 1 lub 0, jak w TI-Basic.
Timtech

1
Więc @Christoph wygląda na to, że odpowiedziałeś na swoje pytanie tym linkiem, czy nadal chcesz, żebym ci to wyjaśnił? Jeśli chcesz zobaczyć, gdzie zrobiłem przejście z punktacji ASCII na tokeny, sprawdź wersję 4.
Timtech

11

JavaScript (ES6), 291 303 295 bajtów

Pobiera dane wejściowe jako dwie liczby całkowite ze składnią 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)))

Jak to działa

Cały zegar można postrzegać jako 23 diody LED, które są WŁĄCZONE lub WYŁĄCZONE. Tak więc stan zegara to 23-bitowa liczba całkowita.

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             

Minut logika, że musimy wdrożyć, aby umożliwić właściwe słowa nie jest tak proste, jak mogłoby się wydawać na pierwszy rzut oka. Formuła do gry w golfa może istnieć, ale poszedłem w prosty sposób i postanowiłem po prostu na stałe zakodować każdą możliwą konfigurację:

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

Przypadki testowe


2
Bardzo mądry. Próbowałem wyciąć z mojego bajtu więcej, ale zobaczyłem to i nie mam nadziei na rywalizację.
edc65

Zadanie (reguła 8) mówi, że musi być wydrukowane, a nie tylko zwrócone
sml

@smls Oh, masz rację. To naprawione.
Arnauld

Bardzo fajny. Tyle że czas jest nieprawidłowy :-( Wyświetlacz: h = 13 m = 15 Rzeczywisty czas: 14:43
Strawberry

@Strawberry Patrz zasada nr 6. Ta implementacja wykorzystuje wyłącznie dane wejściowe, a nie czas lokalny.
Arnauld,

6

Partia, 789 bajtów

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

Uwaga: Końcowe spacje za PASTi 5 końcowych spacji w każdym z następujących dwóch wierszy.


Uruchomiłem go i robi to dobrze (wykreśl jedno brakujące miejsce na godzinę 3)! Po prostu nie rozumiem, co się dzieje ( call:cna przykład)! Powinienem chyba się trochę nauczyć :)
Olivier Grégoire,

@ OlivierGrégoire Niestety brakuje miejsca, ale teraz jest to naprawione.
Neil

4

JavaScript, 567 564 551 542 529 527 519 bajtów

Nie wiem, czy można godzić się na godziny i minuty jako argumenty. Powiedziałeś „lista liczb całkowitych”. Czy to wciąż się liczy?

Nawiasem mówiąc, to mój pierwszy raz w golfa. Co myślisz?


Edycja: Zapisano kilka bajtów, dzieląc minuty. Dzięki, Olivier!


Tak, ideą tej reguły jest to, że możesz przyjmować argumenty, ale tylko wtedy, gdy dotyczą one danych wejściowych, czyli czasu na wydruk.
Olivier Grégoire,

1
Jeśli chodzi o grę w golfa, prawdopodobnie możesz rozegrać kilka bajtów, jeśli rozważysz podzielenie minut przez 5. Ponadto możesz chcieć przejść cdo swojej funkcji. Myślę, że nie powinieneś tracić bajtu, ale to sprawia, że ​​jest to bardziej fragment kodu niż funkcja (przynajmniej dla mnie, być może, guru JS powie inaczej).
Olivier Grégoire,

4

JavaScript (ES6) 360

Funkcja z parametrami wejściowymi godzina (0..23) i minuta (0..59).
Używanie alertwyjścia, ponieważ jest to standardowa funkcja wyjścia w javascript, nawet jeśli jest to niewygodne. (I jest krótki)

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

Uwaga testowa : dla spokoju ducha fragment testowy jest przekierowywany do tekstu strony

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>


Kocham twoją odpowiedź! Nauczyłem się z tego wielu rzeczy! Co jednak dzieje się z funkcją strzałki z nawiasami kwadratowymi? Jaka jest rola i? Widzę, że otrzymujesz wszystkie grupy niebiałe („diody LED”) i zastępujesz je białymi spacjami w oparciu o warunki, które napisałeś dla każdej z nich. Na przykład h-2jest to fałsz tylko wtedy h == 2, gdy zakładam, że gdzieś to odwróciłeś? Czy możesz wyjaśnić trochę, jak to działa? Być może jako edycja twojej odpowiedzi? Byłbym naprawdę wdzięczny!
Hristiyan Dodov

Aktualizacja - prawie zrozumiałem, co robisz. Masz tablicę elementów zerowych i niezerowych i używasz iodniesienia do właściwego, zwiększając go po każdym dopasowaniu wyrażenia regularnego. Jeśli to prawda, zastępujesz pasujący ciąg pustymi spacjami, w przeciwnym razie pozostawisz go takim, jakim jest. Nie rozumiem jednak jednej rzeczy. replace()używa wartości zwracanej określonej funkcji (w tym przypadku funkcja strzałki). Gdzie zwracasz wartość? Właśnie widzę trójskładnikowego operatora.
Hristiyan Dodov

3
@HristiyanDodov funkcja strzałki utworzona z jednego wyrażenia zwraca tylko wartość tego wyrażenia. Przykład (a,b)=>{ return a+b }jest taki sam jak(a,b)=>a+b
edc65

4

Python 2, 466 , 460 , 449 , 452 , 459 449 bajtów

Ponieważ może to być funkcja przyjmująca hi jako liczby całkowite, możemy zapisać kilka bajtów. Wypróbuj 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),

Miałem parę błędów (obecnie stały) z logiką do TO/ PASTvs O'CLOCK. Zapisałem również kilka bajtów dla enumerate, zmieniając importi 19<m<26zamiast m in [20,25]. Zaoszczędziłem kolejne 8 za pracę w 5-minutowych kawałkach, a nie minutach. Rod zwrócił uwagę na kilka błędów, które mnie trochę kosztują, ale odrobiłem trochę więcej, dzięki wydajniejszym zadaniom i poprawce błędów, która działała na moją korzyść.


Wyciąga sztuczkę z odpowiedzi PHP @Titus. W porównaniu przegrywam z pythonem ==i myślę, że mogę poprawić niektóre htesty
Chris H

można tylko print cw ostatnim wierszu, cposiada już a[i]powoduenumerate
Rod

1
Format wyjściowy jest uszkodzony, printdodaj nowy wiersz po każdym wydruku, możesz go pominąć, dodając ,po nim c. Powinien także wypisywać puste miejsca, gdy słowo nie jest drukowane, można to naprawić za pomocą innego w ostatnim, jeślielse:print' '*len(c),
Rod

1
Kolejność bajtów jest lepsza, jeśli malejąco.
Gurupad Mamadapur,

@Rod, dzięki za punkty błędów, mimo że znacznie się to wydłuża
Chris H

2

Perl 6 , 308 296 293 bajtów

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

Wypróbuj online!

Wyjaśnienie

Podstawowa struktura jest następująca:

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

Wyrażenie elided jak ...|...|...|...powyżej, jest połączeniem liczb całkowitych reprezentujących indeksy słów oparte na 1, i składa się z następujących elementów:

  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 bajtów)

Ta odpowiedź wymaga czasu w formacie gg mm (liczby całkowite oddzielone spacją). Udało mi się wydrukować „\ n”, co jest inspirowane metodą Chrisa. Dzięki, Chris! Doceniamy wszelką pomoc dotyczącą ograniczenia kodu.

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

Wypróbuj online


Czy możesz połączyć w w jeden ciąg, a następnie użyć .split(',')? Powinny zaoszczędzić kilka.
ElPedro

Weź również swoje dane wejściowe jako H,M=input()tam, gdzie jest to H, M. Zgodnie z regułami dozwolona jest sekwencja dwóch liczb całkowitych. Nie jestem pewien, czy to działa zgodnie z przeznaczeniem w Pythonie 3. Nadal jestem facetem 2 :-)
ElPedro

Dzięki @ElPedro .Zapisane 57 bajtów. H,M=input()nie działało, jak wątpiłeś.
EffyCoder

1

Python 2 , 443 440 bajtów

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

Wypróbuj online!

Prawdopodobnie przydałoby się jeszcze trochę golfa. Dane wejściowe to lista liczb całkowitych, np. 7,23 = 7:23


1

SimpleTemplate , 737 708 bajtów

Tak, gadatliwość i brak „prawdziwej” matematyki poważnie zaszkodziły bajtowi.

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

Oczekuje, że godzina i minuty będą pierwszym i drugim parametrem w klasie.


Nie golfowany:

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

Jak uruchomić:

  1. Pobierz kod z https://github.com/ismael-miguel/SimpleTemplate
  2. Uruchom następujący kod:

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


1

Java (OpenJDK 9) , 437 bajtów

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

Wypróbuj online!

Myślałem, że w końcu spróbuję rzucić wyzwanie;)


1

Perl 5 , 487 449 bajtów

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

Wypróbuj online!

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.