Wandle die Zeit in einen String um


17

Problem

Eines Tages kommt Ihr Chef auf Sie zu und sagt Ihnen, dass er die Zeit kennen muss. Er besteht immer noch darauf, dass Sie auf die Uhr direkt über Ihrem Kopf zeigen, und gibt zu, dass er an einer schweren Dyskalkulie leidet , die dazu führt, dass er nicht einmal Zahlen auf einer Uhr sehen kann. Während Sie sich immer noch fragen, wie jemand, der keine Zahlen sieht, eine Firma leiten kann, sagt er Ihnen, Sie sollen "etwas dagegen unternehmen", was auch immer das ist.

Ihre Aufgabe ist es nun, ein Programm oder eine Funktion zu erstellen, die bei einer Eingabezeit von Stunden und Minuten (Sekunden sind optional) (Stunden basieren auf 24) einen lesbaren englischen Satz ausgibt, der keine Zahlen enthält.

Die Sekunden müssen nicht ausgegeben werden.

Zum Beispiel 08:45:15sollte ausgebenquarter to nine o'clock AM

Testfälle

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

Regeln

Die Ausgabe von Zahlen kann in Form von zweiundvierzig oder zweiundvierzig erfolgen, je nachdem, was Ihnen am besten gefällt. Standardlücken sind nicht erlaubt. Nachgestellte Zeilenumbrüche sind zulässig, der Satz sollte sich jedoch in einer Zeile befinden.

Die Eingabe kann in jedem Format gesendet werden Sie wollen, zum Beispiel HH:MM:SS, HH,MM,SS, HHMMSS, HH/MM/SS, oder jede Variante ohne Sekunden, aber man sollte das Eingabeformat in Ihrer Antwort klar machen. Es ist nicht zur Ausgabe benötigt one minutestattone minutes

Für Minuten von 0 bis 30 (0 und 30 enthalten) sollten Sie verwenden past, und für die anderen sollten Sie verwendento

Da die Zeit relativ ist, gewinnt der kürzeste Code in Bytes.


1
Das sieht nach einer netten Herausforderung aus, aber ich empfehle dringend, die Boni zu entfernen. Wenn Sie nicht genau wissen, was Sie tun, sollten Sie dies beim Schreiben von Herausforderungen vermeiden.
Denker

1
Zwei weitere (kleinere) Punkte: Warum spielt es eine Rolle, wie Sie schreiben, forty-fivewenn in den Testfällen eindeutig quarter todas entsprechende Eingabeformat angegeben ist? (ändere es einfach in zweiundvierzig;)) Auch die Kolmogorov-Komplexität ist kein geeignetes Tag.
Sanchises

@sanchises bearbeitet. Ich habe das kolmogorov-Tag falsch verstanden und dachte, es hätte mit Problemen bei der Ausgabe einer Zeichenfolge statt nur einer bestimmten Zeichenfolge zu tun.
Dennis van Gils

1
@TimmyD Die -70% war ein Witz, ich hätte nicht gedacht, dass jemand versuchen würde, Französisch in Code-Golf zu übersetzen. Ich bin jedoch der Meinung, dass eine negative Größe eine anständige Belohnung für einen perfekten Französisch-Englisch-Übersetzer ist
Dennis van Gils

Das sieht viel besser aus, aber es sind noch einige Formatierungsklärungen erforderlich. Insbesondere in Bezug auf die Auswahl zwischen "Vergangenheit" und "Bis" - aus den Beispielen klingt es so, als wollten Sie nur die Zahlen onebis verwenden twenty-nine, quarterersetzen fifteenund halfdarstellen thirty, aber das ist nicht klar. Auch für zukünftige Fragen empfehle ich der Sandbox von Herzen , die Knicke vor dem Posten zu klären .
AdmBorkBork

Antworten:


2

Javascript, 384 381 Bytes

(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
Funktioniert einwandfrei und hat sogar das Perl einen Takt von 4 Bytes! Netter Trick mit Fif, Eigh usw. übrigens.
Dennis van Gils

4

LaTeX, 466 Bytes

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

Rufen Sie das Makro \fwie \f[hour]{minutes}folgt auf:

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

Weißt du wie und wo ich das probieren kann? Ich habe es mit Arachnoidea und Papeeria versucht, aber sie haben nicht funktioniert.
Dennis van Gils

@DennisvanGils Ich habe versucht , diese pastebin.com/kdpSQHSb in papeeria und es funktionierte.
Bob

Versuchte es mit dem Pastebin-Code und das hat funktioniert, schätze, es hat nicht funktioniert, weil ich nicht\documentclass[a4paper,12pt]{article}
Dennis van Gils

3

Python 2, 498 Bytes

Die Eingabe erfolgt als Funktionsargument. Erste Stunde und dann Minute, beide als Ganzzahl. Das Ergebnis wird auf dem Bildschirm angezeigt.

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)

Probieren Sie es online! (mit leicht erweiterten Testfällen)

Das war ein ziemlich lustiger Golf. Obwohl all diese verschachtelten Ternaries mich ein bisschen verrückt gemacht haben ^^
Ich hatte vor, dies danach in Pyth zu tun, aber ich glaube nicht, dass ich dies im Moment (oder jemals) mental tun kann.

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)

Ihr [x>12]solltet sein [x>=12], 12:01 ist PM, nicht AM
Dennis van Gils

1
@ TennisvanGils Guter Fang, danke! Repariert. :) Wir Deutschen fühlen uns mit dieser ganzen AM / PM-Sache wohl nicht so wohl: P
Denker

Ich bin Holländer, also musste ich es selbst nachschlagen, um sicherzugehen.
Dennis van Gils

1

Perl 5, 367 361 385 Bytes

Verstümmelt

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

Formatierte und Testfälle:

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

Dies scheint one minutes to one o' clock nightals Ausgabe für 00:01 statt one minutes past twelve o'clock AModerone minutes past twelve night
Dennis van Gils

Du hast recht. Ich habe ungefähr 12 Mal Testfälle hinzugefügt.
Walpen

1

C 478 Bytes

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

Testfälle

$ 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

Probieren Sie es hier aus .


Sieht gut aus. Interessant ist auch, wie man 00 00die richtige Ausgabe 00:00gibt , während man gibt one minutes past twelve o'clock AM, obwohl ich mir sicher bin, dass das etwas damit zu tun hat, wie man Eingaben analysiert.
Dennis van Gils

Ja, es werden zwei ganze Zahlen (Stunden und Minuten) erwartet. scanfWahrscheinlich parst '00: 00 'nicht, wie man hoffen könnte :)
Cole Cameron

0

Batch, 779 774 752 749 Bytes

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

Ändern Sie die zweite Zeile in " set t=%1%time%Standard" und sagen Sie die aktuelle Uhrzeit, wenn keine Uhrzeit angegeben ist.

Bearbeiten: 22 Bytes durch Optimierung meiner set/aAnweisungen gespeichert . 3 Bytes gespart dank @ EʀɪᴋᴛʜᴇGᴏʟғᴇʀ.

Als ich meine ursprüngliche Version schrieb, habe ich den Fehler gemacht, die Zeit so zu sagen, wie ich es eigentlich sagen würde, dh nur auf genaue Stunden und Mitternacht und Mittag anstatt auf zwölf Nacht und zwölf Mittag:

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

Ihre 12:00 und 00:00 Tests funktionieren nicht, sie geben nur midnightund middaystatt twelve nightund wieder twelve noon. Ich mag es wirklich, wie Sie gefälschte Erweiterungen und Namen in Ihrer for-Schleife verwenden.
Dennis van Gils

2
@ TennisvanGils Es gibt wahrscheinlich andere Tests, bei denen dies fehlschlägt. Ich werde es später reparieren.
Neil

@DennisvanGils Ich denke, es funktioniert jetzt und bequemerweise ist es auch kürzer!
Neil
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.