유니 코드로 몇시입니까?


12

입력 시간 다음 형식 중 하나로 문자열로 지정하면 문제가 간단 해집니다 .

hh, hh:mm또는 hh:mm:ss0 ≤ hh ≤ 23, 0 ≤ mm ≤ 590 ≤ ss ≤ 59.

현재 다음 기호를 사용하고있는 시간을 출력하십시오.

AA  LABEL FOR CHARACTER     CODE POINT   HEXADECIMAL
==  ====================    ==========   ===========
🕐  Clock Face 01 Oclock    128336       0x1F550  
🕑  Clock Face 02 Oclock    128337       0x1F551  
🕒  Clock Face 03 Oclock    128338       0x1F552  
🕓  Clock Face 04 Oclock    128339       0x1F553  
🕔  Clock Face 05 Oclock    128340       0x1F554  
🕕  Clock Face 06 Oclock    128341       0x1F555  
🕖  Clock Face 07 Oclock    128342       0x1F556  
🕗  Clock Face 08 Oclock    128343       0x1F557  
🕘  Clock Face 09 Oclock    128344       0x1F558  
🕙  Clock Face 10 Oclock    128345       0x1F559  
🕚  Clock Face 11 Oclock    128346       0x1F55A  
🕛  Clock Face 12 Oclock    128347       0x1F55B  

다음 형식으로 :

It is currently {Clock Face 1} with {mm} minutes and {ss} seconds until {Clock Face 2}.

예 (모든 프린지 케이스 포함) :

시간 만있는 사례 ...

f("12") = "It is currently 🕛."

시간과 분이있는 사례 ...

f("12:30") = "It is currently 🕛 with 30 minutes until 🕐."

시간 만있는 경우이지만 분은 00으로 포함됩니다.

f("12:00") = "It is currently 🕛."

시간, 분 및 초가있는 사례 ...

f("12:30:30") = "It is currently 🕛 with 29 minutes and 30 seconds until 🕐."

시간과 분이 있지만 초가 00으로 포함 된 경우 ...

f("12:30:00") = "It is currently 🕛 with 30 minutes until 🕐."

다음 시간까지 1 분 미만의 시간과 분이있는 사례 ...

f("12:59:59") = "It is currently 🕛 with 1 seconds until 🕐."

복수형에서 단수형으로 변경할 필요는 없습니다.


시간과 분, 1 분 ~ 다음 시간의 사례 ...

f("12:59") = "It is currently 🕛 with 1 minutes until 🕐."

복수형에서 단수형으로 변경할 필요는 없습니다.


군사 시간을 사용하는 사례 (예 : 처리해야 함) ...

f("23:30:30") = "It is currently 🕚 with 29 minutes and 30 seconds until 🕛."

잘못된 경우 ...

f("PPCG") = This cannot occur, you are guaranteed a valid format by the definition of the problem.
f(66:66:66) = This cannot occur, you are guaranteed valid numbers by the definition of the problem.
f(24:60:60) = This cannot occur, you are guaranteed valid numbers by the definition of the problem.

유효하지 않은 경우에 대한 출력 스타일을 따르지 않아도되며 오류는 좋습니다.


전반적으로 도전은 다소 단순하지만 내 의견으로는 재미있을 정도로 역동적 인 것처럼 보입니다. 길이가 아닌 코드에 가변적 인 측면이 많지 않기 때문에 가장 짧은 코드가 승자가됩니다.



이것이 전체 프로그램이어야합니까, 아니면 기능 / 람다면 충분합니까?
devRicher

2
내가 대신의 생각 0 < hh < 24, 0 < mm < 60그리고 0 < ss < 60, 당신은 의미 0 ≤ hh ≤ 23, 0 ≤ mm ≤ 59그리고 0 ≤ ss ≤ 59.
Outgolfer Erik

2
언어 별 Date / DateTime 구조체가 입력으로 허용됩니까?
devRicher

2
@carcusocomputing 코드가 24 시간을 처리해야한다고 지정 합니까? 코드가 처리 AM하거나 PM태그를 지정해야합니까?
Taylor Scott

답변:


3

비 펀지, 256 250 바이트

>&~85+`v
8~-&"<"_00v`+5
0v%\-&"<<"_
v>:00p!!-"<"%10p65++:66+%0" yltnerruc si tI">:#,_$"Hu 5x"2*,3*,+,2*+,10g00g+
_".",@,".",+*2,+,*3,*2"x5 uH"%+66+1$_,#!>#:<v0
" litnu  htiw ",,,,,,10g:>#v_$"sdnoces"00g.^>
_>,,,,,,,>" dna ">,,,,,00^ >."setunim"00g!#^

온라인으로 사용해보십시오!

결과는 TIO에서 가장 잘 작동하므로 utf-8로 인코딩되지만 로컬에서 테스트하는 경우 시계가 올바르게 표시되도록 시스템의 기본 코드 페이지를 조정해야 할 수도 있습니다. 그렇지 않으면 출력을 파일로 리디렉션하고 utf-8 호환 편집기에서 출력을 엽니 다.

설명

처음 세 줄은 stdin에서 분과 초를 읽고 각 값 뒤에 EOF 또는 줄 바꿈을 확인하고 입력에서 누락 된 구성 요소를 0으로 대체합니다. 네 번째 줄에서 초가 0이 아닌 경우 분 값을 조정하고 시간 값을 0에서 11 범위로 변환하고 (각 시간에 적합한 유니 코드 문자와 일치) 출력의 초기 부분을 작성합니다. 첫 번째 시계 문자판

이 시점에서 0이 아닌 구성 요소에 따라 다른 분기를 따라야합니다. 다섯 번째 줄의 첫 번째 테스트는 분과 초가 모두 0인지 확인합니다. 그렇다면, 우리는 최종을 작성 .하고 종료합니다. 그렇지 않으면 6 행과 7 행은 나머지 경우를 처리합니다. 경로가 모두 5 행에 다시 결합되어 최종 시계 문자판 (오른쪽에서 왼쪽으로 실행)을 작성하기 전에 적절한 텍스트와 값을 작성하십시오.


3

자바 스크립트 (ES6), 201

t=>(T=h=>String.fromCodePoint(128336+h%12),[h,m,s]=t.match(/\d+/g),'It is currently '+T(h-=~10)+((m-=-!!-s)?` with ${60-m?60-m+' minutes'+(-s?' and ':''):''}${-s?60-s+' seconds':''} until `+T(-~h):''))

덜 골프

t=>(
  T=h=>String.fromCodePoint(128336+h%12),
  [h,m,s]=t.match(/\d+/g),
  'It is currently '+T(h-=~10)
   +( 
      // if seconds is not 0, increment m else just convert to number
      // have to use '- -' to force conversion to number 
     (m -= - !!-s) 
-s?++m:m)
      ? ` with ${60-m ? 60-m+' minutes'+(-s?' and ':''):''}${-s?60-s+' seconds':''} until `+T(-~h)
      : ''
    )
)

테스트

F=
t=>(T=h=>String.fromCodePoint(128336+h%12),[h,m,s]=t.match(/\d+/g),'It is currently '+T(h-=~10)+((m-=-!!-s)?` with ${60-m?60-m+' minutes'+(-s?' and ':''):''}${-s?60-s+' seconds':''} until `+T(-~h):'')
)


var tid=0

function getTime(t)
{
  var a=t.match(/\d+/g)
  if (a) {
    var [h,m,s]=a
    h|=0, s|=0, m|=0
    if(h>=0 & h<24 & m>=0 & m<60 & s>=0 & s<60) 
      return [h,m,s]
  }
  return null
}      

function update()
{
  clearTimeout(tid)
  var t=I.value, a=getTime(t)
  if (a) {
    O.textContent = F(t)
    tid = setTimeout(again,5000)
  }
  else {
    O.textContent = 'invalid ' + t
  }
}
function again()
{      
  var t=I.value, a=getTime(t)
  if (a) {
    var [h,m,s]=a
    ++s>59?(s=0,++m>59?(m=0,++h):0):0
    h%=24
    s<10?s='0'+s:0
    m<10?m='0'+m:0
    t = h+(-m-s?':'+m+(-s?':'+s:''):'')
    I.value = t
    O.textContent=F(t)
    tid = setTimeout(again, 1000)
  }
}

update()
#O { font-size:16px }
Time <input id=I value='12' oninput='update()' onkeydown='update()'>
(modify current time as you wish - but use valid values)
<pre id=O></pre>


우승자를 선택하는 방법을 모르겠습니다. 둘 다 같은 언어로 201 바이트로 서로 2 분 이내에 게시했습니다.
Magic Octopus Urn

@carusocomputing 물론 당신은 나를 선택해야합니다. 나를. ME ME ME! ...
edc65

@carusocomputing 또는 그렇지 않으면 당신은 균형을 다시 얻기 위해 투표가 적은 답변을 선택할 수 있습니다 (이유없이)
edc65

또는 String코드 의 단어 를 ""빈 문자열로 바꿔서 4 바이트를 절약 할 수 있습니다. :). 아, 쓰레기, 그래도 그는 할 수 있습니다.
Magic Octopus Urn

표시합니다 It is currently 🕛 with 60 minutes until 🕐. 나는 그것이해야한다고 생각It is currently 🕛.
로마 그라프에게

2

JavaScript (ES6), 201 바이트

(i,[h,m,s]=i.split`:`,c=n=>String.fromCodePoint(128336+(n+11)%12))=>`It is currently ${c(+h)}${m|s?` with ${(m=59+!+s-m)?m+` minutes`:``}${+s&&m?` and `:``}${+s?60-s+` seconds`:``} until `+c(-~h):``}.`

복수를 고려하면 226 바이트 :

f=
(i,[h,m,s]=i.split`:`,c=n=>String.fromCodePoint(128336+(n+11)%12))=>`It is currently ${c(+h)}${m|s?` with ${(m=59+!+s-m)?m+` minute`+(m-1?`s`:``):``}${+s&&m?` and `:``}${+s?60-s+` second`+(59-s?`s`:``):``} until `+c(-~h):``}.`
<input oninput=o.textContent=f(this.value)><div id=o>


1

PowerShell을 , 250 243 바이트

$h,$m,$s=$args-split':'
$f={[char]::ConvertFromUtf32(128336+(11+$args[0])%12)}
$u=(60-$s)%60
$v=(59-$m+!$u)%60
"It is currently $(&$f $h;"with $(("$v minutes"|?{$v}),("$u seconds"|?{$u})-match'.'-join' and ') until $(&$f (1+$h))"|?{$u-or$v})."

온라인으로 사용해보십시오!


1

C, 241 바이트

표준 출력에 UTF-8을 씁니다.

#define p printf(
c(v,h){p"%s \xf0\x9f\x95%c",v,144+h%12);}f(t){int h=0,m=0,s=0;sscanf(t,"%d:%d:%d",&h,&m,&s);m=(59-m+!s)%60;c("It is currently",h-1);m&&p" with %d minutes",m);s&&p" %s %d seconds",m?"and":"with",60-s);m|s&&c(" to",h);p".");}

온라인으로 사용해보십시오!

공백이있는 코드 :

#define p printf(

c(v, h) {
    p"%s \xf0\x9f\x95%c", v, 144 + h % 12);
}

f(t) {
    int h = 0, m = 0, s = 0;

    sscanf(t, "%d:%d:%d", &h, &m, &s);
    c("It is currently", h - 1);
    m = (59 - m + !s) % 60;
    m && p" with %d minutes", m);
    s && p" %s %d seconds", m ? "and" : "with", 60 - s);
    m | s && c(" to", h);
    p".");
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.