Chuyển đổi thời gian thành chuỗi


17

Vấn đề

Một ngày nọ, ông chủ của bạn đi đến gần bạn và nói với bạn rằng anh ta cần biết thời gian. Anh ta vẫn khăng khăng sau khi bạn chỉ vào đồng hồ ngay trên đầu bạn, và thú nhận rằng anh ta bị chứng loạn sắc nghiêm trọng , khiến anh ta thậm chí không thể nhìn thấy số trên đồng hồ. Trong khi bạn vẫn còn băn khoăn làm thế nào một người không thể nhìn thấy những con số có thể điều hành một công ty, anh ta bảo bạn "làm gì đó với nó", bất kể đó là gì.

Nhiệm vụ của bạn bây giờ là tạo một chương trình hoặc chức năng, với thời gian đầu vào là giờ và phút (giây là tùy chọn) (giờ là 24 giờ), tạo ra một câu tiếng Anh có thể đọc được, không chứa số.

Không cần thiết phải thông qua các giây.

Ví dụ, 08:45:15nên xuấtquarter to nine o'clock AM

Các trường hợp thử nghiệm

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

Quy tắc

Các đầu ra có thể là cả hai dạng bốn mươi hoặc bốn mươi hai, tùy theo bạn thích nhất. Sơ hở tiêu chuẩn không được phép. Trailing newlines được cho phép, nhưng câu nên ở trên 1 dòng.

Đầu vào có thể ở bất kỳ định dạng mà bạn muốn, ví dụ HH:MM:SS, HH,MM,SS, HHMMSS, HH/MM/SS, hoặc bất kỳ biến thể mà không giây, nhưng bạn nên thực hiện định dạng đầu vào rõ ràng trong câu trả lời của bạn. Không cần đầu ra one minutethay vìone minutes

trong vài phút từ 0 máng 30 (bao gồm 0 và 30) bạn nên sử dụng pastvà đối với những người khác bạn nên sử dụngto

Bởi vì thời gian là tương đối, mã ngắn nhất tính bằng byte sẽ thắng.


1
Đây có vẻ là một thử thách thú vị, tôi thực sự khuyên bạn nên loại bỏ các phần thưởng. Trừ khi bạn biết chính xác những gì bạn đang làm, đó là những điều cần tránh khi viết thử thách.
Denker

1
Hai điểm (phụ) nữa: tại sao bạn viết như thế nào forty-fivekhi các trường hợp kiểm tra nêu rõ quarter tođịnh dạng đầu vào thích hợp? (chỉ thay đổi nó thành bốn mươi hai;)) Ngoài ra, độ phức tạp kolmogorov không phải là một thẻ thích hợp.
Chiếm 5/2/2016

@sanchise chỉnh sửa. Tôi đã hiểu nhầm thẻ kolmogorov và nghĩ rằng nó có liên quan đến các vấn đề trong việc xuất ra bất kỳ chuỗi nào, thay vì chỉ một chuỗi nhất định.
Dennis van Gils

1
@TimmyD Một -70% là một trò đùa, tôi không tưởng tượng được ai sẽ cố dịch tiếng Pháp trong môn đánh gôn. Tuy nhiên, tôi cảm thấy rằng có kích thước tiêu cực là một phần thưởng xứng đáng cho một dịch giả tiếng Anh hoàn hảo
Dennis van Gils

Điều đó có vẻ tốt hơn nhiều, nhưng cần thêm một vài định dạng làm rõ. Cụ thể về lựa chọn giữa "quá khứ" và "sang" - từ các ví dụ, có vẻ như bạn đang muốn chỉ sử dụng những con số oneđể twenty-nine, với quarterviệc thay thế fifteenhalfđại diện thirty, nhưng đó là không rõ ràng. Ngoài ra, đối với các câu hỏi trong tương lai, tôi chân thành khuyên Sandbox xử lý các nút thắt trước khi đăng.
admBorkBork

Câu trả lời:


2

Javascript, 384 381 byte

(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
Hoạt động tốt, và thậm chí có một nhịp Perl 4 byte! Thủ thuật hay với năm, eigh vv btw.
Dennis van Gils

4

LaTeX, 466 byte

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

Chỉ cần gọi macro \fnhư \f[hour]{minutes}, ở đây một số thử nghiệm:

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

Bạn có biết làm thế nào và nơi tôi có thể thử điều này? Tôi đã thử dùng arachnoidpapeeria nhưng chúng không hoạt động.
Dennis van Gils

@DennisvanGils Tôi đã thử pastebin.com/kdpSQHSb trong papeeria và nó đã hoạt động.
Bob

Đã thử nó với mã pastebin và nó đã hoạt động, đoán nó không hoạt động vì tôi không có\documentclass[a4paper,12pt]{article}
Dennis van Gils

3

Python 2, 498 byte

Đầu vào là đối số chức năng. Giờ đầu tiên và sau đó phút, cả hai như số nguyên. Kết quả được in ra màn hình.

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)

Hãy thử trực tuyến! (với các testcase hơi mở rộng)

Đó là một sân golf khá thú vị. Mặc dù tất cả những con chim nhạn lồng nhau này đã khiến tôi phát điên một chút ^^
Tôi đã lên kế hoạch thực hiện việc này ở Pyth sau đó, nhưng tôi không nghĩ rằng tôi có thể làm điều này về mặt tinh thần vào lúc này (hoặc bao giờ).

Ung dung:

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)

Bạn [x>12]nên là [x>=12], 12:01 là PM, không phải AM
Dennis van Gils

1
@DennisvanGils Bắt tốt, cảm ơn bạn! Đã sửa nó. :) Chúng tôi người Đức không thoải mái với toàn bộ điều AM / PM này tôi đoán: P
Denker

Tôi là người Hà Lan, vì vậy tôi cũng phải tự tìm kiếm nó để chắc chắn.
Dennis van Gils

1

Perl 5, 367 361 385 byte

Rắc rối

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

Các trường hợp được định dạng và thử nghiệm:

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

Điều này dường như cung cấp one minutes to one o' clock nightnhư đầu ra cho 00:01, thay vì one minutes past twelve o'clock AMhoặcone minutes past twelve night
Dennis van Gils

Bạn đúng. Tôi đã thêm các trường hợp thử nghiệm khoảng 12 lần.
walpen

1

C, 478 byte

*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");}

Các trường hợp thử nghiệm

$ 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

Hãy thử nó ở đây .


Có vẻ ổn. Cũng thú vị làm thế nào 00 00cho đầu ra chính xác, trong khi 00:00cho one minutes past twelve o'clock AM, mặc dù tôi chắc chắn rằng có liên quan đến cách bạn phân tích đầu vào.
Dennis van Gils

Có, nó mong đợi hai số nguyên (giờ và phút). scanfcó lẽ không phân tích '00: 00 'như người ta có thể hy vọng :)
Cole Cameron

0

Batch, 779 774 752 749 byte

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

Thay đổi dòng thứ hai thành set t=%1%time% thành mặc định để nói thời gian hiện tại nếu không có thời gian được cung cấp.

Chỉnh sửa: Đã lưu 22 byte bằng cách tối ưu hóa set/a báo cáo . Đã lưu 3 byte nhờ @ EʀɪᴋᴛʜᴇGᴏʟғᴇʀ.

Khi tôi viết phiên bản gốc của mình, tôi đã mắc lỗi khi nói thời gian như tôi thực sự sẽ nói, tức là chỉ vào giờ chính xác, và nửa đêm và giữa trưa thay vì mười hai đêm và mười hai giờ trưa:

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

Các bài kiểm tra 12:00 và 00:00 của bạn không hoạt động, chúng chỉ lặp lại midnightmiddaythay vì twelve nighttwelve noon. Tôi thực sự thích cách bạn sử dụng các tiện ích mở rộng và tên giả trong vòng lặp btw của bạn.
Dennis van Gils

2
@DennisvanGils Có thể có các thử nghiệm khác không thành công; Tôi sẽ sửa nó sau.
Neil

@DennisvanGils Tôi nghĩ rằng nó đang hoạt động, và thuận tiện là nó cũng ngắn hơn!
Neil
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.