Bir kelime saati yazdır


59

Birincisini birkaç yıl önce gördüğümden beri, her zaman zamanın aslında anlamlı bir cümleye kelimelerle aydınlanıp yakılmamakla hecelendiği bu tür bir söz saati tarafından boyun eğdirildim.

Bir Kelime Saati

O saatte görüntülenen metin aşağıdaki gibidir.

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

Göreviniz böyle bir çalışma saati yazmak. Kelimeler, yalnızca geçerli saati yazdırmakla ilgilenseler halinde yanar. Aksi takdirde, yanarlar. Kelimeler yazdırılarak "aydınlatılır" ve kelimenin yerine geçen boşluklarla değiştirilerek "aydınlatılır".

Örnek: Geçerli saat 17:23 ise, yazdırılan metin tam olarak aşağıdaki olmalıdır:

IT IS 
        TWENTY
FIVE MINUTES
PAST
         FIVE

kurallar

  1. Yazdırılan süre 12 saattir, ancak AM / PM'dir.
  2. Yuvarlama sadece dakika bazında yapılır (saniye tamamen önemsizdir). Yuvarlama 5'in en yakın katına yapılır. Yani, örneğin, 17:52:38 gerçekten 17:55'e yakın olsa da, saniyeler önemsiz olduğundan, 17:52 aslında 17:50'ye yuvarlanır, ve basılan metin "ALTI DAKİKA ÇALIŞIYOR" (ilgili aralıklarla). Yani XXbeşte beş ise, XXHH: (XX-2): 00 ila HH: (XX + 2): 59 arasında kullanılacaktır. Sözcük MINUTESeğer görünmelidir FIVE, TENya TWENTY( "TO" veya "GEÇMİŞ" öncesi) dakikalar bölümünde aydınlatılır.
  3. Tüm alakasız kelimeler, metni yukarıdaki şablonda bulunduğu yerde tutmak için gerektiği kadar boşlukla değiştirilir. Sondaki boşluklar kırpılabilir. Metni beklenen pozisyonda tutmaya ilişkin boşluklar tutulmalıdır.
  4. Sondaki çizgiler de kesilebilir. İlgili boş satırların görünmesi için hala gereklidir. Örnek:

    IT IS      TEN
    
         MINUTES
    PAST TWO
    
  5. Yanar etmeyin TENilk satırda veya FIVEbu değerler saate atıfta zaman üçüncü satırda.

  6. Bir girişi kabul edebilirsiniz. Bir girdiyi kabul ederseniz, girdi istediğiniz herhangi bir formatta (dize, tamsayılar listesi, yerel saat türünüzü destekleyin,…) geçerli bir formatta basma zamanı olacaktır; yazdırmak için. Girişi desteklemiyorsanız, geçerli saati kullanmanız gerekir. Her ikisini de destekliyorsanız, bu daha iyidir, ancak bonus yoktur;)
  7. Kodunuz bir program, bir işlev, bir lambda olabilir, ancak snippet olmayabilir.
  8. Diliniz herhangi bir şekilde yazdırmayı destekliyorsa , sonucu yazdırması gerekir (bir dosyada, standart çıktıda, sorun değil). Diliniz herhangi bir şekilde yazdırmayı desteklemiyorsa, beklenen metni yalnızca "geri döndürmesine" izin verilir. Sonuç, ikisinin karışımı değil, tamamen büyük veya küçük harf olabilir.
  9. Standart boşluklar uygulanır.
  10. Bu kod-golf yani en kısa kod kazanır!
  11. Mümkün olan ölçülerde, lütfen kendi dilinizin çevrimiçi tercümanına bir link verin.

Test durumları

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
Büyük meydan okuma, gerçekten beğendim!
Timtech

Yanıtlar:


14

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

Mükemmel bulguları ile birlikte golf için @Christoph teşekkürler !
Onun hesabında en az 45 bayt var; 16 ya da daha fazla ondan ilham aldı.

Bir Marvel Takımı!

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

veriler arasında dolaşır ve geçerli dizinin aydınlanacak sözcüklerin dizinlerini içeren oluşturulmuş bir dizede olup olmadığını kontrol eder (harflerle eşleştirilir); dizine bağlı olarak satır sonu veya boşluk ekler.

error_reporting(22519) için varsayılan değeri kullanmazsanız bildirimler verebilir.

Çevrimiçi olarak test edin.

Yıkmak

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

Golfler :

  • $x/5+.5|0iki bayttan daha kısa round($x/5).
  • İki çağrı date(h), datesonucu bir değişkene atamaktan bir bayt daha kısadır .
  • Tek bir atama kullanılarak, ışıklandırma indekslerinin içinde depolandığı değişken uzak tutuldu.
  • Işıklandırma dizinleri için, yaklaşık 30 bayt kaydedilen bir dizi yerine bir dize .
  • $w<Aüç bayttan daha kısa $w=="\n"- sınırlayıcıdan sonra boşluk olmadığından emin olun!
  • abs dakika sözcüğü 8 bayt kaydetti.
  • Thanks @Christoph: Harita için sayılardan harfe geçiş, ayırıcıları modası geçmiş hale getirdi ve dizi yerine bir dizgiye daha izin verdi; 23 + 8 bayt kaydedildi .
    Alt dizini ilk dizin olarak kullanmak, onu "olduğu gibi" alternatiflerine dahil etmesine izin verdi; ve saatlerce teklifin kullanılmamasına neden oldu.
  • 1Saat haritasındaki değerin çoğaltılması, modulo'nun eski olmasını ve ilave golf oynamaya 10 bayt kazandırılmasını sağlamıştır. @Christoph'dan esinlenilmiştir.
  • Sabit kodlama yerine satır boşluklarını ve boşlukları hesaplayarak bunları 19 baytta tıraş edin .
  • Dizelerdeki bit mantığı 7 baytı kurtarır: str_pad("",strlen($w))-> $w^$w^" ". (Christoph)
  • strtrİkinci parametre dizge değilse , ascii kodu olarak yorumlanacaktır. 5 bayt kaydeder.

Bu çok güzel! Sorunun çözülebilir olduğundan emin olduktan sonra Java'da bu uygulamayı denedim, ancak o kadar karmaşık hale geldi ki, vazgeçtim ve daha uzun ama daha basit bir yaklaşım kullandım! Bu yüzden başarısız olduğum yerde başarılı olduğum için tebrikler;)
Olivier Grégoire

1
Gerisini dayak: $i++%3^($i<3)için $i++%3^$i<3. Resmen tamamen boşa gidiyorum. Birisi bizimle eşleşene kadar ara vereceğim. Gerçekten eğlenceliydi. Takım çalışman için teşekkürler Titus!
Christoph

1
@Christoph Sen ... BÜYÜK bir kelime küçük görünüyor. \ o /
Titus

18

TI-Basic, 335 334 bayt

Oldukça mükemmel, çünkü TI-84 hesap makineleri 8x16 harf ekrana sahip ve bu 8x15. Dahili saatler bulunmayan TI-84'den önceki hesaplamaları desteklemek için tarih girdi olarak alınmıştır. Hiçbir argüman olmadan, Inputvarsayılan olarak Xve Ybenzerlerine giriş yapar Prompt X,Y. Bu yüzden Xsaat olun (her şey >=0düzgün çalışacak) ve Ydakikalar olsun.

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

Not 1: TI-84 + için, bunun Inputgibi bir şeyle değiştirebilirsiniz getTime:Ans(1->X:getTime:Ans(2->Y. Ayrıca, int(Y/5-5.6eşdeğerdir round(Y/5,0)-6. Ve hayır, bu durumda int(değiştirilemedi iPart(.

Not 2: Bu girdiyi gayet iyi basar ancak asetik nedenlerden dolayı , programın sonlandırılmasından Pausesonra Donemesajdan kaçınmak için muhtemelen programın sonunda olmasını istersiniz .

Düzenleme: Bayt sayısı azaltıldı, çünkü (önceki revizyondaki nota bakınız), ayrıca @Neil sayesinde bir hata düzeltildi. Üçüncüsü, kendimi 2 bayta mal olacak bir hata buldum ama optimizasyon genel olarak 1 baytı kurtardı ve ayrıca giriş aldığımı da fark ettim, bu yüzden aramam gerekmiyor getTime(duh?). Son olarak, bu bayt sayısını doğrulamak isteyen herkes için, yalnızca iki bayt belirtecidir sub(.


Bana öyle geliyor ki O'CLOCKkodun çıktısını verdikten sonra da çıktısını alacak PAST...
Neil

2
545 bayt sayıyorum, lütfen beni aydınlatır mısın?
Christoph


1
@ OlivierGrégoire Aslına bakarsanız, bir önceki satırla ilgili değil. Yaptığı şey 24 saat ile 12 saat arasında ve aynı zamanda en yakın saate dönüştürmektir (örneğin, hesaplanan dakikalarla yuvarlama). Temel olarak, normal bir dilde x+(y>32) mod 12, karşılaştırma TI-Basic'te olduğu gibi 1 veya 0 verirse bir şey görünür .
Timtech

1
Yani @ Christoph, bu bağlantıyla kendi sorunuzu cevaplamışsınız gibi görünüyor, hala açıklamamı istiyor musunuz? ASCII puanlamasından belirtilmiş göstergeye geçişi nerede yaptığımı görmek istiyorsanız 4. revizyonu kontrol edin.
Timtech

11

JavaScript (ES6), 291 303 295 bayt

Körme sözdizimi ile girişi iki tam sayı olarak alır (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)))

Nasıl çalışır

Bütün saat AÇIK veya KAPALI olan 23 LED olarak görülebilir. Yani, saat durumu 23-bit bir tamsayıdır.

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             

Dakika bir ilk bakışta sanıldığı biz doğru kelimeleri etkinleştirmek için uygulanması gereken mantık olarak basit değildir. Bir sihirli golf formülü olabilir, ancak kolay yoldan gittim ve mümkün olan her konfigürasyonu zorlamaya karar verdim:

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

Test durumları


2
Çok zeki. Benimkinden biraz daha bayt kesmeye çalışıyordum, sonra bunu gördüm ve rekabet etmek için hiçbir ümit yok.
edc65

Görev (kural 8), yalnızca iade edilmek üzere basılması gerektiğini söylüyor
saat

@smls Oh, haklısın. Bu sabit.
Arnauld

Çok havalı. Zaman dışında :-( Ekran: h = 13 m = 15 Gerçek zaman: 14:43
Strawberry

@Strawberry Lütfen kural # 6'ya bakınız. Bu uygulama, yerel saati değil sadece girdi kullanıyor.
Arnauld

6

Toplu, 789 bayt

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

Not: İzleyen boşluk PASTve sonraki iki satırın her birinde 5 izleyen boşluk.


Koştum ve sadece iyi (bar saat 3 için eksik bir boşluk)! Sadece neler olduğunu anlamıyorum ( call:cörneğin)! Muhtemelen biraz parti öğrenmeliyim :)
Olivier Grégoire

@ OlivierGrégoire Ne yazık ki bir boşluk kaybolmuştu, ancak bu düzeltildi.
Neil

4

JavaScript, 567 564 551 542 529 527 519 bayt

Argüman olarak saatlerce ve dakikalarca zaman ayırmanın uygun olup olmadığını bilmiyorum. "Tam sayı listesi" dedin. Hala sayılıyor mu?

Bu arada, ilk defa golf oynuyorum. Ne düşünüyorsun?


Düzenleme: Dakikaları bölerek birkaç bayt kaydedildi. Sağol Olivier!


Evet, bu kuralın ardındaki fikir argümanları alabilmenizdir, ancak yalnızca girdi zamanıdır, yani baskı zamanı.
Olivier Grégoire

1
Golf ile ilgili olarak, dakikalarınızı 5'e bölmeyi düşünüyorsanız, muhtemelen bazı byte'larla golf oynayabilirsiniz. Ayrıca, cişlevin içinde hareket etmek isteyebilirsiniz . Bunu yaparak herhangi bir baytı kaybetmemelisiniz, sanırım, ama bu bir fonksiyondan çok bir pasaj gibi görünüyor (bana göre, en azından belki JS gurusu aksi söyleyecek).
Olivier Grégoire

4

JavaScript (ES6) 360

Giriş parametreleri saat (0..23) ve dakika (0..59) olan bir işlev. Çıktı için
kullanılması alert, uygun olmasa bile, javascript'teki standart çıktı işlevidir. (Ve kısa)

(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 Notu: İçiniz rahat olsun, test snippet'inde alarm çıkışı sayfa metnine yönlendirilir

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>


Cevabını seviyorum! Ondan bir sürü şey öğrendim! Ancak, köşeli parantez içeren ok işlevine ne oluyor? Ayrıca, rolü inedir? Tüm boşluk olmayan grupları ("LED'ler") aldığınızı ve bunların her biri için yazdığınız koşullara göre onları boşluklarla değiştirdiğinizi görebiliyorum. Mesela, h-2bu sadece zaman zaman yanlıştır h == 2, bu yüzden onu bir yerlere çevirdiğinizi farz ediyorum? Bunun nasıl çalıştığını biraz açıklayabilir misiniz? Belki de cevabınızı bir düzenleme olarak? Gerçekten minnettar olurum!
Hristiyan Dodov

Güncelleme - Neredeyse ne yaptığını anladım. Sıfır ve sıfır olmayan öğeler dizisine sahipsiniz ve iher bir regex eşleşmesinden sonra onu artırarak doğru olana başvurmak için kullanın . Doğruysa, eşleşen dizeyi boş alanlarla değiştirirsiniz, yoksa olduğu gibi bırakın. Yine de bir şey anlamıyorum. belirtilen işlevin dönüş değerinireplace() kullanır (bu durumda ok işlevi). Bir değeri nereye geri veriyorsun? Sadece bir üçlü operatör görüyorum.
Hristiyan Dodov

3
@HristiyanDodov, yalnızca bir ifadeden oluşan bir ok işlevi, yalnızca bu ifadenin değerini döndürür. Örnek (a,b)=>{ return a+b }aynı(a,b)=>a+b
edc65

4

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

H ve m'yi tamsayı olarak kabul eden bir fonksiyon olmasına izin verildiğinden birkaç byte tasarruf sağlayabiliriz. Çevrimiçi deneyin .

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

Mantık ile TO/ PASTvs için birkaç hata (şimdi düzeltildi) vardı O'CLOCK. Ayrıca enumerate, değiştirerek importve 19<m<26yerine birkaç bayt kaydedildi m in [20,25]. 5 dakikalık parçalayıcılarda çalışmak için dakikalardan daha fazla 8 tane kurtardı. Rod, bana biraz pahalıya mal olan daha fazla hataya dikkat çekti, ancak daha verimli görevler ve benim lehime çalışan bir hata düzeltmesi ile biraz iyileşdim.


@Titus'un PHP cevabından bir numara alır. ==Karşılaştırma yapmak için python's'u kaybediyorum ve bazı htestleri geliştirebileceğimi sanıyorum
Chris H

Sadece print cson hatta yapabilirsiniz, czaten a[i]nedeniyle tutarenumerate
Rod

1
Çıkış biçimi bozuldu, printher baskı sonrası bir yeni satır eklemek, bunu bir ekleme baskılayabilir ,sonra c. Ayrıca, bir kelime basılmadığında boş alanlar else:print' '*len(c),
Rod

1
Bayt sırası azalan ise daha iyidir.
Gurupad Mamadapur

@Rod, böcek lekeleri için teşekkürler, çok daha uzun sürmesine rağmen
Chris H

2

Perl 6 , 308 296 293 bayt

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

Çevrimiçi deneyin!

açıklama

Temel yapı aşağıdaki gibidir:

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

Olarak elided sentezleme ...|...|...|..., yukarıda, a, Bağlantı 1 tabanlı bir kelime endeksleri temsil eden bir tamsayı, ve aşağıdaki şekilde yapılır:

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

Bu cevap hh mm (boşlukla ayrılmış tamsayılar) biçiminde zaman gerektirir . Chris'in yönteminden esinlenerek '\ n' yazdırmayı başardım . Herhangi bir yardım kodu azaltma takdir edilmektedir.

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

Çevrimiçi Deneyin


W'yi tek bir dizgede birleştirip sonra kullanabilir .split(',')misiniz? Bir kaçını kurtarmalı.
ElPedro

Ayrıca girişinizi H,M=input()girişin H, M olduğu şekilde alın. Kurallara göre iki tamsayı dizisine izin verilir, Python 3'te belirtilen şekilde çalışıp çalışmadığından emin değilim. Hala 2
kişiyim

Teşekkürler @ElPedro. Tasarruf 57 bayt. H,M=input()şüphelendiğin gibi çalışmadı.
EffyCoder

1

Python 2 , 443 440 bayt

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

Çevrimiçi deneyin!

Muhtemelen hala biraz daha golf oynamaktan yararlanabilir. Giriş, tam sayıların bir listesidir; örneğin, 7,23 = 7:23


1

SimpleTemplate , 737 708 bayt

Evet, ayrıntılara aykırılık ve "gerçek" matematik eksikliği, bayt sayısına çok zarar verdi.

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

Bu, saat ve dakikayı sınıfta 1. ve 2. parametre olarak bekler.


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}

Nasıl çalıştırılır:

  1. Kodu https://github.com/ismael-miguel/SimpleTemplate adresinden alın
  2. Aşağıdaki kodu çalıştırın:

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


1

Java (OpenJDK 9) , 437 bayt

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

Çevrimiçi deneyin!

Sonunda meydan okumama bir şans vereceğimi düşündüm;)


1

Perl 5 , 487 449 bayt

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

Çevrimiçi deneyin!

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.