Jam berapa ini dalam unicode?

12

Tantangannya sederhana, diberi waktu input sebagai string dalam salah satu format berikut:

hh, hh:mmatau hh:mm:ssdengan 0 ≤ hh ≤ 23, 0 ≤ mm ≤ 59dan 0 ≤ ss ≤ 59.

Keluarkan jam berapa saat ini menggunakan simbol-simbol berikut:

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  

Dalam format berikut:

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

Contoh (Termasuk semua kasus pinggiran):

Kasus hanya dengan jam ...

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

Kasus dengan jam dan menit ...

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

Kasus hanya dengan jam, tetapi memiliki menit termasuk sebagai 00 ...

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

Kasus dengan jam, menit dan detik ...

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

Kasus dengan jam dan menit, tetapi memiliki detik termasuk sebagai 00 ...

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

Kasus dengan jam dan menit, dengan kurang dari satu menit sampai satu jam berikutnya ...

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

Anda tidak harus berubah dari jamak menjadi tunggal.


Kasus dengan jam dan menit, dengan 1 menit hingga jam berikutnya ...

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

Anda tidak harus berubah dari jamak menjadi tunggal.


Kasus menggunakan waktu militer (ya Anda harus menangani ini) ...

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

Kasus tidak valid ...

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.

Anda tidak harus menyesuaikan dengan gaya keluaran apa pun untuk kasus yang tidak valid, kesalahan baik-baik saja.


Secara keseluruhan tantangannya agak sederhana, tetapi tampaknya cukup dinamis untuk menyenangkan menurut saya. Kode terpendek di sini adalah pemenang karena tidak ada banyak aspek variabel untuk kode selain panjang.

Guci Gurita Ajaib
sumber
1
Erat terkait.
Martin Ender
Haruskah ini keseluruhan program atau fungsi / lambda cukup?
devRicher
2
Saya pikir itu bukan 0 < hh < 24, 0 < mm < 60dan 0 < ss < 60, maksud Anda 0 ≤ hh ≤ 23, 0 ≤ mm ≤ 59dan 0 ≤ ss ≤ 59.
Erik the Outgolfer
2
Apakah struct Date / DateTime spesifik bahasa diizinkan sebagai input?
devRicher
2
@carcusocomputing Anda menentukan bahwa kode harus menangani waktu 24 jam, apakah kode harus menangani AMatau memberi PMtag?
Taylor Scott

Jawaban:

3

Befunge, 256 250 byte

>&~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!#^

Cobalah online!

Hasilnya dikodekan sebagai utf-8, karena itu bekerja paling baik dengan TIO, tetapi jika Anda menguji secara lokal, Anda mungkin perlu menyesuaikan halaman kode default sistem Anda untuk melihat jam menghadap dengan benar. Kalau tidak, hanya mengarahkan output ke file dan buka di editor yang kompatibel utf-8.

Penjelasan

Tiga baris pertama membaca jam menit dan detik dari stdin, memeriksa EOF atau umpan baris setelah setiap nilai, dan mengganti nol untuk komponen yang hilang dari input. Pada baris empat, kami menyesuaikan nilai menit jika detiknya tidak nol, mengubah nilai jam menjadi rentang 0 hingga 11 (untuk mencocokkan karakter unicode yang sesuai untuk setiap jam), dan menuliskan bagian awal dari output, termasuk wajah jam pertama.

Pada titik inilah kita perlu mengikuti cabang yang berbeda tergantung pada komponen apa yang bukan nol. Tes pertama, pada awal baris lima, hanya memeriksa apakah menit dan detik sama dengan nol. Jika demikian, kami menulis final .dan keluar. Kalau tidak, baris enam dan tujuh berurusan dengan kasing yang tersisa - menuliskan teks dan nilai yang sesuai, sebelum jalur semuanya digabungkan lagi pada baris lima untuk menuliskan tampilan jam terakhir (mengeksekusi kanan ke kiri).

James Holderness
sumber
3

JavaScript (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):''))

Kurang golf

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

Uji

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>

edc65
sumber
Saya tidak tahu bagaimana memilih pemenang untuk ini, Anda berdua memposting dalam waktu 2 menit satu sama lain dengan 201 byte dalam bahasa yang sama.
Magic Gurita Guci
@computer tentu saja Anda harus memilih saya. Saya. ME ME ME ME! ...
edc65
@carusocomputing atau Anda dapat memilih jawaban yang memiliki lebih sedikit suara (tanpa alasan) hanya untuk mendapatkan kembali keseimbangan
edc65
Atau Anda bisa mengganti kata Stringdalam kode Anda dengan ""string kosong untuk menyelamatkan diri 4 byte :). Ah, sial, dia juga bisa.
Magic Gurita Guci
Acara It is currently 🕛 with 60 minutes until 🕐. Saya pikir itu harusIt is currently 🕛.
Roman Gräf
2

JavaScript (ES6), 201 byte

(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 byte jika Anda memperhitungkan bentuk jamak:

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>

Neil
sumber
1

PowerShell , 250 243 byte

$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})."

Cobalah online!

briantis
sumber
1

C, 241 byte

Menulis UTF-8 ke stdout.

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

Cobalah online!

Kode dengan spasi putih:

#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".");
}
nwellnhof
sumber