Unicode saat kaçta?


12

Aşağıdaki biçimlerden herhangi birinde bir dize olarak bir girdi süresi verildiğinde, zorluk basittir :

hh, hh:mmYa da hh:mm:ssbirlikte 0 ≤ hh ≤ 23, 0 ≤ mm ≤ 59ve 0 ≤ ss ≤ 59.

Şu anda saat kaçta aşağıdaki sembolleri kullandığını belirtin:

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  

Aşağıdaki biçimde:

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

Örnekler (Tüm saçak kılıfları dahil):

Sadece saatler süren vaka ...

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

Saat ve dakika süren vaka ...

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

Sadece saat, ancak dakika olarak dahil 00 ...

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

Saat, dakika ve saniye içeren durum ...

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

Saat ve dakika olan durum, ancak saniye olarak 00 ...

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

Saatler ve dakikalar, sonraki saate kadar bir dakikadan az bir süre ...

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

Çoğuldan tekil olmak zorunda değilsiniz.


Saat ve dakika süren vaka, sonraki dakikaya 1 dakika ...

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

Çoğuldan tekil olmak zorunda değilsiniz.


Askeri zaman kullanan dava (evet bunu halletmelisin) ...

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

Geçersiz durumlar ...

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.

Geçersiz durumlar için herhangi bir çıktı stiline uymak zorunda değilsiniz, hatalar iyi.


Genel olarak meydan okuma oldukça basit, ama bence eğlenceli olacak kadar dinamik görünüyordu. Buradaki en kısa kod kazanır, çünkü kodun uzunluktan başka değişken bir yönü yoktur.



Bu bir program mı olmalı yoksa bir işlev / lambda yeterli mi?
devRicher

2
Ben yerine düşünüyorum 0 < hh < 24, 0 < mm < 60ve 0 < ss < 60, sen demek 0 ≤ hh ≤ 23, 0 ≤ mm ≤ 59ve 0 ≤ ss ≤ 59.
Outgolfer Erik

2
Dile özgü bir Date / DateTime yapısına giriş olarak izin veriliyor mu?
devRicher

2
@carcusocomputing Kodun 24 saat işlemesi gerektiğini belirtiyorsunuz, kodun işlemesi AMveya PMetiketlemesi gerekiyor mu?
Taylor Scott

Yanıtlar:


3

Befunge, 256 , 250 bayt

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

Çevrimiçi deneyin!

Sonuçlar utf-8 olarak kodlanır, çünkü bu TIO ile en iyi şekilde çalışır, ancak yerel olarak test ediyorsanız, saat yüzlerini doğru bir şekilde görmek için sisteminizin varsayılan kod sayfasını ayarlamanız gerekebilir. Aksi takdirde, çıktıyı bir dosyaya yönlendirin ve bunu utf-8 uyumlu bir düzenleyicide açın.

açıklama

İlk üç satır, stdin'den saat dakika ve saniyeleri okur, her bir değerden sonra EOF veya bir satır beslemesini kontrol eder ve girişte eksik olan bileşenler için sıfırları değiştirir. Dördüncü satırda, saniyeler sıfır değilse dakika değerini ayarlıyoruz, saat değerini 0 ila 11 aralığına dönüştürüyoruz (her saat için uygun unicode karakteri eşleştirmek için) ve çıktının ilk kısmını yazıyoruz. ilk saat yüzü.

Bu noktada hangi bileşenlerin sıfır olmadığına bağlı olarak farklı dalları takip etmemiz gerekiyor. İlk test, beşinci satırın başlangıcında, hem dakikaların hem de saniyelerin sıfır olup olmadığını kontrol eder. Eğer öyleyse, bir final yazıp çıkıyoruz .. Aksi takdirde, altıncı ve yedinci satırlar kalan durumlarla ilgilenir - yolların tümü son satır yüzünü yazmak için (sağdan sola doğru) beşinci satırda tekrar birleşmeden önce uygun metin ve değerleri yazmak.


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

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

Ölçek

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>


Bunun için nasıl bir kazanan seçeceğimi bilmiyorum, ikiniz de aynı dilde 201 bayt ile 2 dakika içinde yayınladınız.
Sihirli Ahtapot Urn

@ carusocomputing tabii ki beni seçmelisin. Ben mi. BEN BEN BEN! ...
edc65

@carusocomputing ya da başka bir dengeyi geri kazanmak için daha az oyu olan (hiçbir sebep olmadan) cevabı seçebilirsiniz
edc65

Veya 4 bayt :) kaydetmek Stringiçin kodunuzdaki kelimeyi ""boş bir dizeyle değiştirebilirsiniz. Ah, saçma, o da yapabilir.
Sihirli Ahtapot Urn

Gösterir It is currently 🕛 with 60 minutes until 🕐. BenceIt is currently 🕛.
Roma Gräf

2

JavaScript (ES6), 201 bayt

(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):``}.`

Çoğulları dikkate alırsanız 226 bayt:

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 bayt

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

Çevrimiçi deneyin!


1

C, 241 bayt

UTF-8'i stdout'a yazar.

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

Çevrimiçi deneyin!

Boşluklu kod:

#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".");
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.