समय को एक स्ट्रिंग में परिवर्तित करें


17

मुसीबत

एक दिन, आप बॉस आपके पास जाते हैं और आपको बताते हैं कि उन्हें समय जानने की जरूरत है। वह आपके सिर के ऊपर सीधे घड़ी की ओर इशारा करने के बाद भी जोर देता है, और कबूल करता है कि उसके पास डिस्केकुलिया का एक गंभीर मामला है , जिसके कारण वह घड़ी पर नंबर भी नहीं देख पा रहा है। जब आप अभी भी आश्चर्यचकित रह जाते हैं कि कोई व्यक्ति किसी कंपनी को नंबर कैसे देख सकता है, तो वह आपको "इसके बारे में कुछ करने" के लिए कहता है, जो कुछ भी है।

अब आपका कार्य एक प्रोग्राम या फ़ंक्शन बनाना है, जिसमें घंटों और मिनटों के साथ एक इनपुट समय दिया गया है (सेकंड वैकल्पिक हैं) (घंटे 24-आधारित हैं), एक पठनीय अंग्रेजी वाक्य को आउटपुट करता है, जिसमें संख्याएं नहीं होती हैं।

यह सेकंडों को अलग करने के लिए आवश्यक नहीं है।

उदाहरण के लिए, 08:45:15आउटपुट चाहिएquarter to nine o'clock AM

परीक्षण के मामलों

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

नियम

आउटपुट संख्या दोनों बयाल्टो या बयालीस के रूप में हो सकती है, जो भी आपको सबसे अच्छा लगता है। मानक खामियों की अनुमति नहीं है। अनुगामी newlines की अनुमति है, लेकिन वाक्य 1 पंक्ति पर होना चाहिए।

इनपुट आप चाहते हैं किसी भी प्रारूप में हो सकता है, उदाहरण के लिए HH:MM:SS, HH,MM,SS, HHMMSS, HH/MM/SS, या किसी भी सेकंड के बिना संस्करण है, लेकिन आप इनपुट प्रारूप अपने जवाब में स्पष्ट करना चाहिए। इसके one minuteबजाय आउटपुट की आवश्यकता नहीं हैone minutes

0 गर्त 30 (0 और 30 शामिल) से मिनट के लिए आप का उपयोग करना चाहिए past , और दूसरों के लिए आप का उपयोग करना चाहिएto

क्योंकि समय सापेक्ष है, बाइट्स में सबसे छोटा कोड जीत जाता है।


1
यह एक अच्छी चुनौती की तरह लग रहा है, बिट मैं जोर से बोनस निकालने का सुझाव देता हूं। जब तक आप वास्तव में नहीं जानते कि आप क्या कर रहे हैं, उन चुनौतियों को लिखने से बचने के लिए एक चीज है।
Denker

1
दो और (मामूली) अंक: यह क्यों मायने रखता है कि forty-fiveजब आप परीक्षण के मामलों को स्पष्ट quarter toरूप से उपयुक्त इनपुट प्रारूप के रूप में लिखते हैं तो आप कैसे लिखते हैं ? (बस इसे बयालीस में बदल दें;)) इसके अलावा, कोलमोगोरोव-जटिलता एक उपयुक्त टैग नहीं है।
Sanchises

@sanchises का संपादन किया। मैंने कोलमोगोरोव टैग को गलत समझा, और सोचा कि इसे किसी भी स्ट्रिंग के बजाय केवल एक स्ट्रिंग के आउटपुट में समस्याओं के साथ करना होगा।
डेनिस वैन गिल

1
@TimmyD -70% एक मजाक था, मैंने कल्पना नहीं की कि कोई भी कोड-गोल्फ में फ्रेंच अनुवाद करने की कोशिश करेगा। हालांकि, मुझे लगता है कि नकारात्मक आकार होने पर एक आदर्श फ्रेंच-अंग्रेजी अनुवादक के लिए एक अच्छा इनाम है
डेनिस वैन गिल्स

यह बहुत बेहतर लग रहा है, लेकिन कुछ और स्वरूपण स्पष्टीकरण की आवश्यकता है। विशेष रूप से "को" "अतीत" और के बीच चुनने के बारे में - उदाहरण से, यह लग रहा है कि आप केवल संख्या का उपयोग करने के लिए इच्छुक रहे हैं oneकरने के लिए twenty-nineके साथ, quarterजगह fifteenऔर halfका प्रतिनिधित्व thirtyहै, लेकिन यह स्पष्ट नहीं है। साथ ही, भविष्य के सवालों के लिए, मैं पोस्ट करने से पहले सैंडबॉक्स को काम करने की सलाह देता हूं ।
AdmBorkBork

जवाबों:


2

जावास्क्रिप्ट, 384 381 बाइट्स

(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
ठीक काम करता है, और यहां तक ​​कि पर्ल को 4 बाइट्स से हराया है! पाँच, एग आदि के साथ अच्छा चाल।
डेनिस वैन

4

लाटेक्स, 466 बाइट्स

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

मैक्रो \fको इस रूप में कहें \f[hour]{minutes}, यहाँ कुछ परीक्षण हैं:

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

क्या आप जानते हैं कि मैं यह कैसे और कहाँ से आज़मा सकता हूँ? मैंने arachnoid और papeeria की कोशिश की, लेकिन उन्होंने काम नहीं किया।
डेनिस वैन गिल 20

@ डेनिसवनगिल्स मैंने पपीरिया में इस pastebin.com/kdpSQHSb की कोशिश की और यह काम कर गया।
बॉब

इसे pastebin कोड के साथ आज़माया और यह काम किया, यह अनुमान लगाते हुए कि यह काम नहीं किया क्योंकि मेरे पास नहीं था\documentclass[a4paper,12pt]{article}
डेनिस वैन Gils

3

पायथन 2, 498 बाइट्स

इनपुट फ़ंक्शन तर्क के रूप में आता है। पहले घंटे और फिर मिनट, दोनों पूर्णांक के रूप में। रिजल्ट स्क्रीन पर प्रिंट हो जाता है।

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)

इसे ऑनलाइन आज़माएं! (थोड़े विस्तारित टेस्टकेस के साथ)

वह काफी मजेदार गोल्फ था। हालाँकि उन सभी नेस्टेड टेरानरीज़ ने मुझे थोड़ा पागल कर दिया ^ ^
मैं इसके बाद पाइथ में ऐसा करने की योजना बना रहा था, लेकिन मुझे नहीं लगता कि मैं इस समय (या कभी) मानसिक रूप से ऐसा करने में सक्षम हूं।

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)

आपका [x>12]होना चाहिए [x>=12], 12:01 PM है, AM नहीं
डेनिस वैन गिल्स

1
@DennisvanGils अच्छा कैच, धन्यवाद! ठीक कर दिया। :) हम जर्मन इस पूरे एएम / पीएम-बात के साथ सहज नहीं हैं जो मुझे लगता है: पी
डेनकर

मैं डच हूं, इसलिए मुझे यह सुनिश्चित करने के लिए खुद को देखना होगा।
डेनिस वैन गिल

1

पर्ल 5, 367 361 385 बाइट्स

विकृत

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

प्रारूपित और परीक्षण मामले:

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

यह देने के लिए लगता है one minutes to one o' clock night, 0:01 के लिए आउटपुट के रूप में के बजाय one minutes past twelve o'clock AMयाone minutes past twelve night
डेनिस वैन Gils

आप सही हे। मैंने 12 बार परीक्षण के मामले जोड़े हैं।
Walpen

1

सी, 478 बाइट्स

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

परीक्षण के मामलों

$ 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

इसे यहाँ आज़माएँ ।


ठीक लग रहा है। यह भी दिलचस्प है कि कैसे 00 00सही आउटपुट 00:00देता है , जबकि देता है one minutes past twelve o'clock AM, हालांकि मुझे यकीन है कि इनपुट पार्स करने के तरीके के साथ कुछ करना है।
डेनिस वैन

हां, यह दो पूर्णांक (घंटे और मिनट) की अपेक्षा करता है। scanfशायद '00: 00 'को पार्स नहीं करता है क्योंकि कोई आशा कर सकता है :)
कोल कैमरून

0

बैच, 779 774 752 749 बाइट्स

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

दूसरी पंक्ति को बदलें set t=%1%time%यदि कोई समय प्रदान नहीं किया जाता है, तो वर्तमान समय कहने के लिए डिफ़ॉल्ट में ।

संपादित करें: मेरा अनुकूलन करके 22 बाइट्स सहेजे गए set/a बयानों का । @ EʀɪᴋᴛʜᴇG 3 के लिए 3 बाइट्स को सहेजा गया।

जब मैंने अपना मूल संस्करण लिखा तो मैंने समय कहने की गलती की क्योंकि मैं वास्तव में इसे कहूंगा, यानी ठीक घंटे पर, और आधी रात और बारह दोपहर के बजाय मध्यरात्रि।

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

आपका 12:00 और 00:00 परीक्षण काम नहीं करते, वे केवल गूंज midnightऔर middayके बजाय twelve nightऔर twelve noon। मुझे वास्तव में पसंद है कि आप अपने लूप btw के लिए नकली एक्सटेंशन और नामों का उपयोग कैसे करते हैं।
डेनिस वैन गिल 20

2
@ डेनिसवनगिल्स शायद अन्य परीक्षण हैं जो इसे विफल करते हैं; मैं इसे बाद में ठीक कर दूंगा।
नील

@DennisvanGils मुझे लगता है कि यह अब काम कर रहा है, और आसानी से यह भी छोटा है!
नील
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.