Вернуть часы эмодзи, наиболее близкие к текущему времени при запуске


20

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

Вот часы смайликов: 🕐🕑🕒🕓🕔🕕🕖🕗🕘🕙🕚🕛🕜🕝🕞🕟🕠🕡🕢🕣🕤🕥🕦🕧. Если вам не хватает надлежащей поддержки рендеринга, вы можете увидеть их ниже (они не в том же порядке и могут отличаться от того, что вы видите) или на диаграмме Unicode , стр. 4. Они соответствуют кодовым точкам Unicode U + 1F550 (CLOCK ЛИЦО ОДИН ЧАС) через U + 1F567 (ЧАС ЛИЦО ДВАДЦАТЬ ТРИДЦАТЬ).

Ваша задача - написать программу, которая выводит в STDOUT самые близкие эмодзи циферблата к текущему системному времени (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
Этот вопрос сейчас не актуален, но, вероятно, это легко исправить. Вам нужно объективное условие выигрыша, но если вы пометите код вопроса - гольф, победителем станет тот, кто напишет самую короткую программу. Это также немного не указано, но вы могли бы сказать «скрипт, который выводит эмодзи часов, наиболее близкие к текущему времени при запуске», и этого должно быть достаточно. Кроме того, хотя технически это не требуется, я бы рекомендовал разрешить отправку сообщений на других языках. (Кто-то, вероятно, все равно сделает это в Баше.)
подземный

Командная строка Windows не поддерживает Emojis :(
Stokastic

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

3
Как округлить xx: 15 и xx: 45?
Питер Тейлор

1
@PeterTaylor Как видно из тестовых примеров, они должны быть округлены (т.е. 1:45 => 2:00)
NinjaBearMonkey

Ответы:


9

Рубин - 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в команду date. например для тестирования 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

Это будет легко победить, но я буду стараться изо всех сил здесь.

РЕДАКТИРОВАТЬ 1 : Теперь печатает в UTC, как ответ Python, чтобы сохранить 20 байтов.

EDIT 2: Измененный new Date().getTime()для , Date.now()чтобы сохранить 10 байт.

EDIT 3: Измененный Math.round(x)для , ~~(x+.5)чтобы сохранить 5 байт.

РЕДАКТИРОВАТЬ 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:00 / PM, если число нечетное, затем прибавить к нему 24, поделить на пол на 2 и увеличить начальный юникод на столько кодовые точки, чтобы получить правильный циферблат.

Кроме того, убедитесь, что вы начинаете с 1 AM / PM вместо 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 Отлично! Я думаю, что вы должны опубликовать это как новый ответ, так как я не занимался гольфом в этом :)
Optimizer

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.