Який час у Unicode?


12

Завдання спрощене, враховуючи час введення у вигляді рядка в будь-якому з наступних форматів:

hh, hh:mmабо hh:mm:ssз 0 ≤ hh ≤ 23, 0 ≤ mm ≤ 59і 0 ≤ 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 🕐."

Справа з годинами і хвилинами, менше ніж хвилина до наступної години ...

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.
Ерік Аутгольфер

2
Чи дозволена як вхідна інформація про конкретну мову / дату DateTime?
devRicher

2
@carcusocomputing Ви вказуєте, що код повинен працювати 24 години, чи повинен він обробляти AMчи PMтеги?
Тейлор Скотт

Відповіді:


3

Befunge, 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!#^

Спробуйте в Інтернеті!

Результати кодуються як utf-8, оскільки це найкраще працює з TIO, але якщо ви тестуєте локально, вам може знадобитися налаштувати кодову сторінку за замовчуванням у вашій системі, щоб правильно побачити обличчя годинника. В іншому випадку просто перенаправляйте вихідний файл на файл та відкрийте його у сумісному редакторі utf-8.

Пояснення

Перші три рядки читають години хвилин і секунди від stdin, перевіряючи наявність EOF або передачу рядків після кожного значення, і замінюючи нулі для компонентів, які відсутні у вхідних даних. У четвертому рядку ми регулюємо значення хвилини, якщо секунди не дорівнюють нулю, перетворюємо значення години в діапазон від 0 до 11 (щоб відповідати відповідному символу Unicode на кожну годину) і виписуємо початкову частину виводу, в т.ч. перше обличчя годинника.

Саме в цей момент нам потрібно слідкувати за різними гілками залежно від того, які компоненти не нульові. Перший тест, на початку рядка п'ятий, просто перевіряє, чи дорівнюють нулю і хвилини, і секунди. Якщо так, ми виписуємо фінал .і вихід. В іншому випадку рядки шість та сім стосуються решти випадків - виписування відповідного тексту та значень, перш ніж всі шляхи знову поєднуються на п'ятому рядку, щоб виписати остаточне обличчя годинника (виконуючи праворуч ліворуч).


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

Менше гольфу

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>


Я не знаю, як вибрати переможця для цього, ви обидва опублікували протягом 2 хвилин один з одним 201 мовою байтів.
Magic Octopus Urn

@carusocomputing, звичайно, ти повинен вибрати мене. Я. МЕНЕ МЕНЕ! ...
edc65

@carusocomputing інакше ви можете вибрати відповідь, яка має менше голосів (без причин) просто для того, щоб відновити баланс
edc65

Або ви можете замінити слово Stringу своєму коді ""порожнім рядком, щоб зберегти себе 4 байти :). Ах, лайно, він теж може хоч.
Чарівний восьминіг Урна

Показує 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

C, 241 байт

Записує UTF-8 у 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".");}

Спробуйте в Інтернеті!

Код з пробілом:

#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".");
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.