시간을 문자열로 변환


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

규칙

숫자 출력은 fortytwo 또는 fortytwo 형식 중 하나 일 수 있습니다. 표준 허점은 허용되지 않습니다. 후행 줄 바꿈은 허용되지만 문장은 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가 적절한 입력 형식으로 명확하게 기술 될 때 어떻게 작성하는 것이 중요한가 ? (단순히; 42로 변경하십시오.) 또한 kolmogorov-complexity 는 적절한 태그가 아닙니다.
Sanchises

@sanchises가 편집되었습니다. kolmogorov 태그를 잘못 이해했으며 주어진 문자열 대신 문자열을 출력하는 데 문제가 있다고 생각했습니다.
Dennis van Gils

1
@TimmyD -70 %가 농담 이었기 때문에 코드 골프에서 프랑스어를 번역하려는 사람은 없을 것입니다. 그러나, 나는 음의 크기를 갖는 것은 완벽 한 프랑스 - 영어 번역기에 대한 괜찮은 보상이라고 생각
데니스 반 GILS

훨씬 나아 보이지만 몇 가지 서식 설명이 더 필요합니다. 구체적으로 "를" "과거"와 사이의 선택에 관한 - 당신은 숫자 만 활용하고자하는 것 같은 예에서,이 소리 one에를 twenty-nine로, quarter교체 fifteenhalf대표 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
잘 작동하고 심지어 Perl을 4 바이트 씩 이길 수 있습니다! 5와 같은 좋은 트릭, 등 btw.
Dennis van Gils

4

LaTeX, 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}

어떻게 그리고 어디서 시도 할 수 있는지 알고 있습니까? 나는 시도 거미papeeria 하지만 그들은 작동하지 않았다.
Dennis van Gils

@DennisvanGils 나는이 pastebin.com/kdpSQHSb 를 papeeria에서 시도해 보았습니다 .
Bob

pastebin 코드로 시험해 보았는데 그것이 없었기 때문에 작동하지 않는 것 같아요\documentclass[a4paper,12pt]{article}
Dennis van 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)

온라인으로 사용해보십시오! (약간의 확장 된 테스트 케이스)

꽤 재미있는 골프였습니다. 모든 중첩 된 삼항이 나를 조금 미치게
만들었지 만 ^^ 나는이 후 Pyth 에서이 작업을 계획하고 있었지만 지금은 정신적으로 이것을 할 수 있다고 생각하지 않습니다.

언 골프 드 :

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시 1분 오후가 아닌 오전
데니스 반 GILS

1
@DennisvanGils 잘 잡아 주셔서 감사합니다! 고쳤다. :) 우리 독일인은 내가 생각하는이 AM / PM 전체에 그다지 안락하지 않다 : P
Denker

나는 네덜란드 사람입니다. 그래서 나는 그것을 확신하기 위해 스스로를 찾아야했습니다.
Dennis van Gils

1

Perl 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대신에 00:01에 대한 출력 으로 제공 되는 것 같습니다.one minutes past twelve o'clock AMone minutes past twelve night
Dennis van Gils

네가 옳아. 나는 약 12 ​​번 테스트 사례를 추가했습니다.
walpen

1

C, 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:00one minutes past twelve o'clock AM
Dennis van Gils

예, 두 개의 정수 (시간 및 분)가 필요합니다. scanf아마도 희망하는 것처럼 '00 : 00 '을 파싱하지 않을 것입니다 :)
Cole Cameron

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%시간이 제공되지 않으면 현재 시간을 말하도록 두 번째 줄을 기본값으로 변경하십시오 .

편집 : 내 set/a문장 을 최적화하여 22 바이트를 절약했습니다 . @ EʀɪᴋᴛʜᴇGᴏʟғᴇʀ 덕분에 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 0시 테스트 그들은 단지 에코 작동하지 않습니다 midnightmidday대신을 twelve night하고 twelve noon. for 루프 btw에서 가짜 확장명과 이름을 사용하는 방법이 정말 좋습니다.
Dennis van Gils

2
@DennisvanGils 아마도 실패한 다른 테스트가있을 것입니다; 나중에 수정하겠습니다.
Neil

@DennisvanGils 지금 작동한다고 생각하고 편리하게 짧습니다!
Neil
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.