Повертайте смайли годинника, найближчі до поточного часу під час запуску


20

У мене можуть бути великі if/elseумови кожні 30 хвилин, але я шукаю більше математичного рішення та рішення на основі Unicode.

Ось годинник емоджи::. Якщо вам не вистачає належної підтримки візуалізації, ви можете їх побачити нижче (вони не в тому ж порядку, і вони можуть виглядати по-різному, ніж ви бачите) або на діаграмі Unicode , сторінка 4. Вони відповідають кодовим точкам Unicode U + 1F550 (CLOCK) ЛИЦЕ ОДНІЙ ОКЛОК) через U + 1F567 (Обличчя годинника дванадцять-тридцять).

Ваше завдання полягає в тому, щоб написати програму, яка виводить для виведення найближчих годин смайликів емоції до поточного системного часу (AM та PM слід розглядати однаково). Наприклад, якщо час tдорівнює [5:15 <t <5:45), ви б відображали емоції 5:30 🕠.

Це код-гольф, тому найкоротший код у байтах виграє. Можливо, ви хочете включити спосіб легко визначити час для тестування вашого коду.

Крайові тестові кейси

Time   Output  Written
----------------------
11:48  🕛       12:00
3:15   🕞       3:30
9:45   🕙       10:00

введіть тут опис зображення


7
Наразі це запитання тут не є тематичним, але, ймовірно, це легко вирішити. Вам потрібна об'єктивна умова виграшу, але якщо ви поставите тег код-гольф, переможцем стане той, хто пише найкоротшу програму. Це також трохи нижче вказаного, але ви можете сказати "сценарій, який виводить смайли годинника, найближчі до поточного часу при запуску", і цього має бути достатньо. Також, якщо це технічно не потрібно, я рекомендую вам дозволити подання матеріалів іншими мовами. (Хтось, мабуть, зробить його в Баші все одно.)
undergroundmonorail

Вікно Windows Command не підтримує emojis :(
stokastic

2
Я відредагував ваше повідомлення, щоб спробувати його відповідати нашим стандартам, уточнивши правила та зробивши його кодом гольфу. Не соромтесь редагувати це, якщо я щось неправильно тлумачив.
NinjaBearMonkey

3
Як слід заокруглювати xx: 15 та xx: 45?
Пітер Тейлор

1
@PeterTaylor Як видно з тестових випадків, їх слід округнути вгору (тобто 1:45 => 2:00)
NinjaBearMonkey

Відповіді:


9

Ruby - 61 54 байт

Python 3 - 79 77 75 74 байт

edit: Виходить, що у Ruby це набагато коротше, тому Timeщо не потрібно імпортувати, а ціле ділення - за замовчуванням.

a=(Time.now.to_i/900-3)/2%24
puts""<<128336+a/2+a%2*12

Арифметика:

  • Time.now.to_i: Секунди з епохи.
  • /900: Поєднайте час на 15-хвилинні сегменти.
  • -3: -4тому що символи починаються з 1 години, +1так що округлення проводиться до найближчої півгодини, а не донизу.
  • /2: Об’єднайте в півгодинні сегменти.
  • %24: Отримайте поточний півгодинний сегмент за 12 годин.
  • a/2 + a%2*12: Врахуйте той факт, що цілодобові символи надходять у блок перед півгодинними символами.

Місцева версія часу, 69 байт:

n=Time.now
a=((n.to_i+n.gmtoff)/900-3)/2%24
puts""<<128336+a/2+a%2*12

Оригінальна версія Python 3:

import time
a=int((time.time()/900-3)/2%24)
print(chr(128336+a//2+a%2*12))

Друкує поточний час UTC. Python 2 chrприймає лише 0-255, і unichrлише 0-65535. У Python 3 - /це завжди ділення з плаваючою комою і //завжди ціле ділення.


Ви можете вирізати з дужки , 12*(a%2)якщо ви робите це в іншому порядку: a%2*12.
xnor

7

Bash + Coreutils, 60 байт

date +%I\ 60*%M+45-30/24%%2+2~C*+C8335+0PP|dc|iconv -f ucs-4

Emojis справляє штрафи на терміналі OSX, але для Linux (Ubuntu 14.04) вам доведеться sudo apt-get install ttf-ancient-fonts

Для тестування різного часу вставте -d $timeкоманду дати. наприклад для тестування 12:59:

date -d 12:59 +%I\ 60*%M+45-30/24%%2+2~C*+C8335+0PP|dc|iconv -f ucs-4

5

JavaScript - 137 117 107 102 95

Це легко переможеться, але я тут просто постараюся.

EDIT 1 : Тепер друкується в UTC, як відповідь Python, щоб зберегти 20 байт.

EDIT 2: Змінений new Date().getTime()для , Date.now()щоб зберегти 10 байт.

EDIT 3: Змінений Math.round(x)для , ~~(x+.5)щоб зберегти 5 байт.

EDIT 4: Видалено непотрібне (і &1023)залишилося зі старої версії розробки, де я зробив універсальнішу кодування UTF-16, щоб зберегти 7 байт.

d=~~(Date.now()/18e5+.5)%24;d+=d<2?24:0;alert(String.fromCharCode(55357,56655+(d%2?23+d:d)/2));

JavaScript це дозволить смайликів, але в UTF-16 , який кодує їх в вигляді двох символів. На щастя, ми можемо просто визначити їх як два символи; перший символ також є постійним ( 0xD83D), а другий змінюється.

Альтернативно, відбитки за місцевим часом, 137 132 125:


Це не (d%2?23+d:d)те саме, що d+d%2*23?
Ніл

4

CJam, 50 байт

"🕐":i~et3=C%60*et4=+30d/mo2m24+24%_2%24*+2/+]:c

Алгоритм простий, округніть час до найближчих 30 хвилин, порахуйте, скільки минуло 30 хвилин з 12 AM / PM, якщо число непарне, тоді додайте до нього 24, ділимо підлогу на 2 і збільшуємо початковий уникод на стільки кодові очки, щоб отримати правильне обличчя годинника.

Крім того, переконайтеся, що ви починаєте з 1 ранку / вечора замість 12, тому зробіть компенсацію.

Для тестування використовуйте наступний код:

3:H;45:M;"🕐":i~HC%60*M+30d/mo2m48+48%_2%24*+2/+]:c

Де 3:H;частина - поточна година, а 45:M;частина - поточна хвилина години. Просто замініть 3і 45на потрібне значення.

Спробуйте його онлайн тут

Не всі символи Unicode можуть правильно друкувати в онлайн-версії залежно від вашого браузера та ОС та встановлених шрифтів. Але для мене все добре друкується на Firefox з Windows 7.


@ user23013 Приємно !. Я думаю, ви повинні опублікувати це як нову відповідь, тому що я не займався жодним гольфом у цьому :)
Оптимізатор

3

CJam, 31 байт

"🕐")et5<60b675+30/24%2mdC*++

Ви можете змінити час у наступній програмі, щоб перевірити її:

"🕐")[2014 12 19 22 14 1 901 5 -28800000]5<60b675+30/24%2mdC*++
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.