Zamanı Dizeye Dönüştür


17

Sorun

Bir gün patronunuz size yürür ve zamanı bilmesi gerektiğini söyler. Hâlâ başının üstündeki saati işaret ettikten sonra ısrar ediyor ve şiddetli bir diskalculi vakası olduğunu itiraf ediyor , bu da bir saatte sayıları görememesine neden oluyor. Hala sayıları göremeyen bir kişinin bir şirketi nasıl işletebileceğini merak etmeye devam ederken, her ne olursa olsun, "bu konuda bir şeyler yapmanı" söyler.

Göreviniz şimdi saat ve dakika (saniye isteğe bağlı) (saat 24 tabanlı) bir giriş süresi verildiğinde, sayılar içermeyen okunabilir bir ingilizce cümle çıktısı veren bir program veya işlev oluşturmaktır.

Saniyelerin çıkışına gerek yoktur.

Örneğin, 08:45:15çıktıquarter to nine o'clock AM

Test senaryoları

00:00:00 > twelve night
12:00:00 > twelve noon
06:00:00 > six o'clock AM
18:00:00 > six o'clock PM
06:15:00 > quarter past six o'clock AM
18:45:00 > quarter to seven o'clock PM
11:30:00 > half past eleven o'clock AM
13:22:00 > twentytwo minutes past one o'clock PM
17:43:00 > seventeen minutes to six o'clock PM
00:09:00 > nine minutes past twelve o'clock AM

kurallar

Çıktı sayıları, hangisini en çok seviyorsanız, hem kırk iki hem de kırk iki formunda olabilir. Standart boşluklara izin verilmez. Sondaki satırsonlarına izin verilir, ancak cümle 1 satırda olmalıdır.

Girdi örneğin, istediğiniz herhangi bir biçimde olabilir HH:MM:SS, HH,MM,SS, HHMMSS, HH/MM/SSsaniye olmadan, ya da herhangi bir varyantı, ancak giriş biçimi cevap temizlemek yapmalıdır. Çıktı almak one minuteyerine çıktıya gerek yokone minutes

0 - 30 (0 ve 30 dahil) arasında değişen dakikalar için kullanmalısınız pastve diğerleri için kullanmalısınızto

Zaman göreceli olduğu için bayt cinsinden en kısa kod kazanır.


1
Bu hoş bir meydan okumaya benziyor, biraz da bonusları kaldırmanızı şiddetle tavsiye ediyorum. Ne yaptığınızı tam olarak bilmediğiniz sürece, zorluklar yazarken bunlardan kaçınmanız gerekir.
Denker

1
İki (küçük) nokta daha: forty-fivetest senaryoları quarter touygun giriş formatı olarak açıkça belirtildiğinde neden yazdığınızın önemi var ? (sadece kırk ikiye değiştirin;)) Ayrıca, kolmogorov karmaşıklığı uygun bir etiket değildir.
Sanchises

@sanchises düzenlendi. Kolmogorov etiketini yanlış anladım ve sadece belirli bir dize yerine herhangi bir dizgenin çıktısıyla ilgili problemlerle ilgili olduğunu düşündüm.
Dennis van Gils

1
@TimmyD -70% bir şakaydı, kimse kod-golf Fransızca çevirmek için çalışacağını düşünmüyordu. Ancak, olumsuz büyüklüğe sahip olmanın mükemmel bir fransızca-ingilizce çevirmen için iyi bir ödül olduğunu hissediyorum
Dennis van Gils

Bu çok daha iyi görünüyor, ancak birkaç biçimlendirme açıklaması gerekiyor. Özellikle "den" "geçmiş" ve arasında bir seçim ile ilgili olarak - bu sadece sayıları kullanmak isteyen konum gibi örneklerden, bu sesler oneiçin twenty-ninebirlikte quarterdeğiştirilmesi fifteenve halftemsil thirty, ama bu belli değil. Ayrıca, bundan sonra sorular için, yürekten tavsiye Sandbox gönderme önce pürüzü gidermenizi.
AdmBorkBork

Yanıtlar:


2

Javascript, 384381 bayt

(h,m)=>(o='one,two,three,four,five,six,seven,eight,nine,ten,eleven,twelve,thir,,fif,,,eigh,'.split`,`,o=o.map((x,i)=>i>11?(x||o[i-10])+'teen':x),(a=m>30,t=12,m?(m-30?m%15?((m=a?59-m:m)>=(b=a?19:20)?'twenty'+((m%=b)?o[a?m:m-1]:''):o[a?m:m-1])+' minutes':'quarter':'half')+(a?' to ':' past '):'')+(h%t|m?o[(a?h:(h?h-1:11))%t]+` o'clock ${h>t?'P':'A'}M`:o[11]+(h-t?' night':' noon')))


1
İyi çalışıyor ve hatta Perl bir 4 bayt yendi! Beş, sekiz vb btw güzel hile.
Dennis van Gils

4

LaTeX, 466 bayt

\usepackage{fmtcount,etoolbox}\def\x{\the\numexpr}\def\n[#1]{\numberstringnum{#1}}\def\h[#1]{\ifnumequal{#1}{0}{twelve night}{\ifnumequal{#1}{12}{twelve noon}{\ifnumless{#1}{13}{\n[#1] o'clock AM}{\n[\x#1-12\relax] o'clock PM}}}}\def\m[#1]{\ifnumequal{#1}{15}{quarter}{\ifnumequal{#1}{30}{half}{\n[#1] minutes}}}\newcounter{c}\def\f[#1]#2{\ifnumequal{#2}{0}{\h[#1]}{\ifnumless{#2}{31}{\m[#2] past \h[#1]}{\setcounter{c}{\x60-#2\relax}\m[\thec] to \h[\x#1+1\relax]}}}

Makroyu \fşöyle çağırmanız yeterlidir \f[hour]{minutes}, burada bazı testler:

\begin{document}

\noindent
\textbf{Test cases:} \\ \\
00:00 = \f[00]{00} \\
12:00 = \f[12]{00} \\
06:00 = \f[6]{00} \\
18:00 = \f[18]{00} \\
06:15 = \f[6]{15} \\
18:45 = \f[18]{45} \\
11:30 = \f[11]{30} \\
13:22 = \f[13]{22} \\
17:43 = \f[17]{43} \\

\noindent
\textbf{More test cases:} \\ \\
00:13 = \f[00]{13} \\
12:12 = \f[12]{12} \\
12:15 = \f[12]{15} \\
11:45 = \f[11]{45} \\
11:41 = \f[11]{41} \\

\end{document}

Bunu nasıl ve nerede deneyebileceğimi biliyor musun? Araknoid ve papeeria'yı denedim ama işe yaramadı.
Dennis van Gils

@DennisvanGils Bu pastebin.com/kdpSQHSb'yi papeeria'da denedim ve işe yaradı.
Bob

Ben macun kodu ile çalıştı ve işe yaradı, ben yoktu çünkü işe yaramadı tahmin\documentclass[a4paper,12pt]{article}
Dennis van Gils

3

Python 2, 498 bayt

Girdi, işlev bağımsız değişkeni olarak gelir. Her ikisi de tamsayı olarak ilk saat sonra dakika. Sonuç ekrana yazdırılır.

def g(h,m):
 a=lambda x:"twelve one two three four five six seven eigth nine ten eleven".split()[x%12];b=lambda x:a(x)+" o'clock "+["AM","PM"][x>=12]
 if m:
    z=m if m<30else 60-m;print(a(z)if z<13else("twenty"+(a(z-20)if z-20else"")if z>19else"thirteen fourteen fifteen sixteen seventeen eighteen nineteen".split()[z-13])if m%15else"quarter"if m-30else"half")+(" minutes"if m-30and m%15else"")+[" past "+b(h)," to "+b(h+1)][m>30]
 else:print"twelve "+("noon"if h else "night")if h in[0,12]else b(h)

Çevrimiçi deneyin! (hafifçe uzatılmış test kılıfları ile)

Çok eğlenceli bir golftü. Tüm bu yuvalanmış üçlüler beni biraz deli etmesine rağmen ^^
Bunu bundan sonra Pyth'de yapmayı planlıyordum, ancak şu anda (veya hiç) zihinsel olarak yapabileceğimi sanmıyorum.

Ungolfed:

def ungolfed(h,m):
    toStr=lambda x:"twelve one two three four five six seven eigth nine ten eleven".split()[x%12]
    hour=lambda x:toStr(x)+" o'clock "+["AM","PM"][x>=12]
    minute=lambda x:"twenty"+(toStr(x-20)if x-20else"")if x>19else"thirteen fourteen fifteen sixteen seventeen eighteen nineteen".split()[x-13]

    if m:
        s=""
        if m==30:
            s+="half"
        else:
            if m%15==0:
                s+="quarter"
            else:
                z=m if m<30 else 60-m
                if z<13:
                    s+=toStr(z)
                else:
                    s+=minute(z)
        print s+(" minutes"if m-30and m%15else "")+[" past "+hour(h)," to "+hour(h+1)][m>30]
    else:
        if h in[0,12]:
            print"twelve "+("noon"if h else "night")
        else:
            print hour(h)

Sizin [x>12]olmalı [x>=12], 12:01, değil AM
Dennis Van Gils

1
@DennisvanGils İyi yakaladın, teşekkürler! Onu düzeltti. :) Biz Almanlar bu AM / PM-şey ile o kadar rahat değil sanırım: P
Denker

Ben Hollandalıyım, bu yüzden emin olmak için kendime bakmalıydım.
Dennis van Gils

1

Perl 5, 367361385 Bayt

bozuk

use integer;$_=<>;~/(\d+):(\d+)/;@b=(one,two,three,four,five,six,seven,eight,nine,ten,eleven,twelve); @x=(@b,thirteen,(map{/fi/?quarter:$_.teen}@b[3..8]),(map{twenty.$_}'',@b[0..8]),half);@y=map{/^q|h/?$_:$_.' minutes'}@x;$s=1-$2/31;$y=abs((-29,0)[$s]+$2%31)-1;$h=$1-$s;print((+-$2?@y[$y].' '.(to,past)[$s].' ':'').@b[$h++%12]." o' clock ".($h%12?(AM,PM)[$h/12]:(night,noon)[$h/12%2]))

Biçimlendirilmiş ve test senaryoları:

use integer;
map{
    # capture (implicit $_)
    ~/(\d+):(\d+)/;
    # bare words
    @b=(one,two,three,four,five,six,seven,eight,nine,ten,eleven,twelve);
    # construct up to 30
    @x=(@b,thirteen,
       (map{/fi/?quarter:$_.teen}@b[3..8]),
       (map{twenty.$_}'',@b[0..8]),half);
    # quarter/half business
    @y=map{/^q|h/?$_:$_.' minutes'}@x;
    # whether we are to/past
    $s=1-$2/31;
    # num minutes wrapped around
    $y=abs((-29,0)[$s]+$2%31)-1;
    # num hours
    $h=$1-$s;
    #print('$s='.$s."\th=".$h."\th%12=".($h%12)."\n");
    print($_.' > ');
    #minute component
    print((+-$2
          ?@y[$y].' '.(to,past)[$s].' '
          :'')
        # hours
        .@b[$h++%12]
        ." o' clock "
        # Night/Noon
        .($h%12
          ?(AM,PM)[$h/12]
          :(night,noon)[$h/12%2]));
    print "\n"
}
('00:00:00',
 '00:01:00',
 '11:59:00',
 '12:00:00',
 '12:01:00',
 '06:00:00', 
 '18:00:00', 
 '06:15:00', 
 '18:45:00', 
 '11:30:00', 
 '13:22:00', 
 '17:43:00',
 '23:59:59')

Bu veya one minutes to one o' clock night00:00 yerine çıktı olarak görünüyorone minutes past twelve o'clock AMone minutes past twelve night
Dennis van Gils

Haklısın. 12 kez test senaryoları ekledim.
Walpen

1

C, 478 bayt

*w(i){char*p,*n[]={"","one","two","three","four","five","six","seven","eight","nine","ten","eleven","twelve","thirteen","fourteen","fifteen","sixteen","seventeen","eighteen","nineteen"};return i>19?asprintf(&p,"twenty%s",n[i%20]),p:n[i];}main(m,h){scanf("%d%d",&h,&m);m>30?h++:0;printf("%s%s%s%s%s %s\n",m%15?m>30?w(60-m):w(m):m^30?m?"quarter":"":"half",m%15?" minutes":"",m?m>30?" to ":" past ":"",w((h+11)%12+1),h%12||m?" o'clock":"",h%12||m?h>11?"PM":"AM":h?"noon":"night");}

Test Durumları

$ echo "0 0" | ./a.out
twelve night
$ echo "12 0" | ./a.out
twelve noon
$ echo "6 0" | ./a.out
six o'clock AM
$ echo "18 0" | ./a.out
six o'clock PM
$ echo "6 15" | ./a.out
quarter past six o'clock AM
$ echo "18 45" | ./a.out
quarter to seven o'clock PM
$ echo "11 30" | ./a.out
half past eleven o'clock AM
$ echo "13 22" | ./a.out
twentytwo minutes past one o'clock PM
$ echo "17 43" | ./a.out
seventeen minutes to six o'clock PM
$ echo "0 9" | ./a.out
nine minutes past twelve o'clock AM

Burada deneyin .


İyi görünüyor. Ayrıca ilginç nasıl 00 00doğru çıkış 00:00verir one minutes past twelve o'clock AM, verir , ancak ben giriş ayrıştırma ile ilgili bir şey var eminim.
Dennis van Gils

Evet, iki tamsayı (saat ve dakika) bekler. scanfmuhtemelen '00: 00' 'ı umduğu gibi ayrıştırmaz :)
Cole Cameron

0

Toplu, 779 774 752 749 bayt

@echo off
set t=%1
set/ah=%t:~0,2%,m=%t:~3,2%
set p=past
if %m% gtr 30 set p=to&set/am=60-m,h+=1
for %%a in ("one minute.1" quarter.15 half.30)do if %%~xa==.%m% set o=%%~na&goto g
set o=
if %m% gtr 20 set o=twenty-&set/am-=20
for %%a in (one.1 two.2 three.3 four.4 five.5 six.6 seven.7 eight.8 nine.9 ten.10 eleven.11 twelve.12 thirten.13 fourteen.14 sixteen.16 seventeen.17 eighteen.18 nineteen.19 twenty.20)do if %%~xa==.%m% set o=%o%%%~na minutes
:g
if not %m%==0 set o=%o% %p% 
set a= AM
if %h% gtr 12 set a= PM&set/ah%%=12
if %h%==0 (echo %o%twelve night)else if %h%==12 (echo %o%twelve noon)else for %%a in (one.1 two.2 three.3 four.4 five.5 six.6 seven.7 eight.8 nine.9 ten.10 eleven.11)do if %%~xa==.%h% echo %o%%%~na o'clock%a%

İkinci satırı şu şekilde değiştirin: set t=%1%time%Zaman yoksa geçerli saati söyleyerek varsayılan olarak değiştirin.

Düzenleme: Kaydedilmiş 22 bayt set/a Açıklamalarımı . @ EʀɪᴋᴛʜᴇGᴏʟғᴇʀ sayesinde 3 bayt tasarruf edildi.

Orijinal versiyonumu yazdığımda, zamanı gerçekten söylediğim gibi söyleme hatasını yaptım, yani saat sadece on iki gece ve on iki öğleden sonra sadece tam saatlerde ve gece yarısı ve gece yarısı:

@echo off
set t=%1
set/a h=%t:~0,2%
set/a m=%t:~3,2%
set p=past
if %m% gtr 30 set p=to&set/a m=60-m&set/a h=h+1
for %%a in ("one minute.1" quarter.15 half.30) do if %%~xa==.%m% set o=%%~na&goto g
set o=
if %m% gtr 20 set o=twenty-&set/a m=%m%-20
for %%a in (one.1 two.2 three.3 four.4 five.5 six.6 seven.7 eight.8 nine.9 ten.10 eleven.11 twelve.12 thirten.13 fourteen.14 sixteen.16 seventeen.17 eighteen.18 nineteen.19 twenty.20) do if %%~xa==.%m% set o=%o%%%~na minutes
:g
set o=%o% %p% 
set a= AM
if %h% gtr 12 set a= PM&set/a h=h%%12
if %m%==0 set a= o'clock%a%&set o=
if %h%==0 (echo %o%midnight)else if %h%==12 (echo %o%midday)else for %%a in (one.1 two.2 three.3 four.4 five.5 six.6 seven.7 eight.8 nine.9 ten.10 eleven.11) do if %%~xa==.%h% echo %o%%%~na%a%

Kişisel 00:00 ve 00:00 testler sadece yankı, çalışmayan midnightve middayyerine twelve nightve twelve noon. Ben döngü btw için sahte uzantıları ve adları nasıl kullandığınız gerçekten seviyorum.
Dennis van Gils

2
@DennisvanGils Muhtemelen başarısız olduğu başka testler de vardır; Daha sonra tamir edeceğim.
Neil

@DennisvanGils Sanırım şimdi çalışıyor ve rahatça da daha kısa!
Neil
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.