Распечатать слово часы

59

Так как я видел первый несколько лет назад, я всегда был покорен этим типом словесных часов, где время фактически прописано словами, подсвеченными или не значащими предложение.

Слово Часы

Текст, отображаемый на этих часах, следующий.

IT IS HALF TEN
QUARTER TWENTY
FIVE MINUTES TO
PAST TWO THREE
ONE FOUR FIVE
SIX SEVEN EIGHT
NINE TEN ELEVEN
TWELVE O'CLOCK

Ваша задача написать такие рабочие часы. Слова загораются тогда и только тогда, когда они имеют отношение к печати текущего времени. В противном случае они загорелись. Слова «подсвечиваются» при печати и «подсвечиваются», когда их заменяет количество пробелов, равное длине слова.

Пример: если текущее время 17:23, напечатанный текст должен быть точно таким:

IT IS 
        TWENTY
FIVE MINUTES
PAST
         FIVE

правила

  1. Напечатанное время - 12-часовой вариант, но без AM / PM.
  2. Округление выполняется только на основе минут (секунды абсолютно не имеют значения). Округление выполняется до ближайшего кратного 5. Таким образом, например, хотя 17:52:38 действительно ближе к 17:55, но поскольку секунды не имеют значения, 17:52 фактически округляется до 17:50, и напечатанный текст "ДЕСЯТЬ МИНУТ ДО ШЕСТИ" (с соответствующим интервалом). Таким образом, если XXкратно пяти, XXбудет использоваться с ЧЧ: (XX-2): 00 до ЧЧ: (XX + 2): 59. Слово MINUTESдолжно появиться , если FIVE, TENили TWENTYосвещены в разделе минут (до «до» или «ПОСЛЕДНИЙ»).
  3. Все нерелевантные слова заменяются на столько пробелов, сколько необходимо, чтобы текст находился в приведенном выше шаблоне. Задние пробелы могут быть обрезаны. Пробелы, относящиеся к сохранению текста в ожидаемой позиции, должны быть сохранены.
  4. Задние линии также могут быть обрезаны. Соответствующие пустые строки все еще должны появиться. Пример:

    IT IS      TEN
    
         MINUTES
    PAST TWO
    
  5. Не загорайтесь TENв первой или FIVEтретьей строке, когда эти значения относятся к часам.

  6. Вы можете принять ввод. Если вы принимаете ввод, то вводом будет время для печати в любом допустимом формате (строка, список целых чисел, тип собственной поддержки вашего языка, ...), но никакие параметры не допускаются, если они не связаны ко времени для печати. Если вы не поддерживаете ввод, вы должны использовать текущее время. Если вы поддерживаете оба, это лучше, но нет бонуса;)
  7. Ваш код может быть программой, функцией, лямбда, но не фрагментом.
  8. Если ваш язык поддерживает печать каким-либо образом, он должен напечатать результат (в файле, на стандартном выводе, я не против). Если ваш язык никак не поддерживает печать, разрешается просто «вернуть» ожидаемый текст. Результат может быть либо прописным, либо строчным, а не сочетанием обоих.
  9. Применяются стандартные лазейки.
  10. Это код-гольф, поэтому выигрывает самый короткий код!
  11. В меру возможного, пожалуйста, предоставьте ссылку на онлайн переводчика вашего языка.

Контрольные примеры

Input:  <no input> (the current local time is 19:20)
Output:     
IT IS
        TWENTY
     MINUTES
PAST 

    SEVEN

Input: 13:15
Output: (empty line is being printed)
IT IS
QUARTER

PAST
ONE

Input: 13:58
Output: (rounding)
IT IS


     TWO



       O'CLOCK

Input: 14:30
Output: (half is always a edge-case)
IT IS HALF


PAST TWO

Input: 15:35
Output: (light up "TO")
IT IS
        TWENTY
FIVE MINUTES TO

    FOUR

Input: 10:00
Output: (do not use the TEN or FIVE on the first line when referring to the hours)
IT IS





    TEN
      O'CLOCK

Input: 12:00
Output: (O'CLOCK and a lot of empty lines)
IT IS






TWELVE O'CLOCK
Оливье Грегуар
источник
8
Отличный вызов, мне очень нравится!
Timtech

Ответы:

14

PHP, 387 384 353 352 342 323 310 306 298 293 291 байт

Спасибо @Christoph за игру в гольф вместе с его отличными результатами!
На его счету не менее 45 байт; 16 или более вдохновлены им.

Команда Marvel Up!

IT IS <?foreach([HALF,TEN,QUARTER,TWENTY,FIVE,MINUTES,TO,PAST,TWO,THREE,ONE,FOUR,FIVE,SIX,SEVEN,EIGHT,NINE,TEN,ELEVEN,TWELVE,"O'CLOCK"]as$w)echo strstr([w,ghj,dhj,ej,fhj,fghj,cj,fghi,fhi,ei,dhi,ghi][$m=date(i)/5+.5].mklnopqrstuvm[date(h)-($m<7)],99+$i)?$w:$w^$w^"       ","
  "[$i++%3^$i<3];

циклически просматривает данные и проверяет, находится ли текущий индекс в сгенерированной строке, которая содержит индексы слов, которые должны загореться (сопоставленные с буквами); добавляет перевод строки или пробел в зависимости от индекса.

Может выдавать уведомления, если вы не используете значение по умолчанию для error_reporting(22519).

Проверьте это онлайн.

сломать

IT IS <?
foreach([HALF,TEN,QUARTER,TWENTY,FIVE,MINUTES,TO,PAST,  // loop through words
TWO,THREE,ONE,FOUR,FIVE,SIX,SEVEN,EIGHT,NINE,TEN,ELEVEN,TWELVE,"O'CLOCK"]as$w)
    echo strstr(                    // search word index in ...
        [w,ghj,dhj,ej,fhj,fghj,cj,fghi,fhi,ei,dhi,ghi][$m=date(i)/5+.5] // minutes & co
        .mklnopqrstuvm[date(h)-($m<7)]                          // hours (-1 if minutes<33)
    ,99+$i                          // (map 0..20 to c..w)
    )?$w:$w^$w^"       ",           // if found, print string, else print spaces
    "\n  "[$i++%3^$i<3];            // if $i in [3,5,8,...], print newline, else space

Гольфы :

  • $x/5+.5|0на два байта короче round($x/5).
  • Два вызова на date(h)один байт короче, чем присвоение dateрезультата переменной.
  • Используя одно задание, вычеркнули переменную, в которой хранились индексы освещения.
  • Строка для индексов освещения вместо массива, сохраненного в пределах 30 байтов .
  • $w<Aна три байта короче $w=="\n"- убедитесь, что после разделителя нет пробелов!
  • abs сэкономил 8 байтов на слове минут.
  • Спасибо @Christoph: переход от цифр к буквам для карты сделал разделители устаревшими и позволил использовать еще одну строку вместо массива; сохранено 23 + 8 байт .
    Использование подчеркивания в качестве первого индекса позволило включить его в альтернативы «оно есть»; и это сделало цитату для часов устаревшими.
  • Дублирование 1значения на карте часов делает модуль устаревшим, а при дополнительном гольфе экономится 10 байтов. Вдохновленный @Christoph.
  • Вычисление разрывов строк и пробелов вместо их жесткого кодирования сбрасывает 19 байтов .
  • Битовая логика на строках сохраняет 7 байтов: str_pad("",strlen($w))-> $w^$w^" ". (Кристоф)
  • Если strtrвторой параметр не является строкой, он будет интерпретирован как код ascii. экономит 5 байтов.
Titus
источник
Это очень мило! Я попробовал эту реализацию в Java, когда убедился, что вопрос решаем, но в итоге он оказался настолько сложным, что я сдался и использовал более длинный, но более простой подход! Так что поздравляю с успехом там, где я потерпел неудачу;)
Оливье Грегуар
1
Избиение остальных: $i++%3^($i<3)до $i++%3^$i<3. Я официально полностью впустую сейчас. Я сделаю перерыв, пока кто-нибудь не сравнится с нами. Это было действительно весело. Спасибо Титус за вашу командную работу!
Кристоф
1
@Christoph Вы ... ВЕЛИКИЙ, кажется, мало слова. \ o /
Тит
18

TI-Basic, 335 334 байта

В значительной степени идеально, так как калькуляторы TI-84 имеют 8x16 буквенных дисплеев, а это 8x15. Дата берется в качестве входных данных для поддержки вычислений, предшествующих TI-84, которые не имеют внутренних часов. Без аргументов, Inputполучает ввод по умолчанию в Xи Y, аналогично Prompt X,Y. Так что Xбудьте часами (все >=0будет работать правильно) и Yбудьте минутами.

Input 
ClrHome
int(Y/5-5.6
Output(1,1,"IT IS
If Ans=~6
Output(8,8,"O'CLOCK
If 2=abs(3-abs(Ans
Output(3,1,"FIVE
If 4=abs(Ans
Output(1,12,"TEN
If 3=abs(Ans
Output(2,1,"QUARTER
If 2=abs(Ans
Output(2,8,"TWENTY
If sum(abs(Ans)={1,2,4,5
Output(3,5,"MINUTES
If not(Ans
Output(1,7,"HALF
If Ans<1 and Ans+6
Output(4,1,"PAST
If Ans>0
Output(3,14,"TO
12fPart(12(^~1)(X+(Y>32->A
If not(Ans
12->A
{21,6,10,25,30,41,45,51,61,66,70,81
.05Ans(A
Output(int(4+Ans),20fPart(Ans),sub("ONE   TWO   THREE FOUR  FIVE  SIX   SEVEN EIGHT NINE  TEN   ELEVENTWELVE",6A-5,6

Примечание 1: для TI-84 + вы можете заменить Inputчто-то вроде getTime:Ans(1->X:getTime:Ans(2->Y. Кроме того, int(Y/5-5.6эквивалентно round(Y/5,0)-6. И нет, в этом случае int(нельзя было поменять местами iPart(.

Примечание 2: Это печатает входные данные очень хорошо, но по причинам, которые вы, вероятно, хотите Pauseв конце программы, чтобы избежать Doneсообщения после завершения программы.

Редактировать: Количество байтов уменьшено из-за токенизации (см. Примечание к предыдущей ревизии), также исправлена ​​ошибка благодаря @Neil. В-третьих, я обнаружил, что исправил ошибку, которая стоила бы 2 байта, но оптимизация фактически сэкономила 1 байт в целом, и я также понял, что получаю ввод, поэтому мне не нужно вызывать getTime(да?). Наконец, для тех, кто хочет подтвердить это количество байтов, есть только два байта sub(.

Timtech
источник
Мне кажется, что после вывода O'CLOCKкода будет продолжаться и вывод PAST...
Нил
2
Я считаю 545 байт, не могли бы вы просветить меня?
Кристоф
2
@Christoph Найдена соответствующая мета-запись: meta.codegolf.stackexchange.com/a/4764/29637
Кристоф
1
@ OlivierGrégoire На самом деле это никак не связано с предыдущей строкой. Он выполняет преобразование 24-часового в 12-часовое время, а также в ближайший час (например, округление с учетом минут). По сути, на нормальном языке это будет выглядеть примерно так, x+(y>32) mod 12если сравнение даст 1 или 0, как в TI-Basic.
Timtech
1
Итак, @Christoph похоже, что вы ответили на свой вопрос с помощью этой ссылки, вы все еще хотите, чтобы я объяснил? Если вы хотите увидеть, где я переключился с оценки ASCII на токены, проверьте версию № 4.
Timtech
11

JavaScript (ES6), 291 303 295 байт

Принимает ввод как два целых числа с синтаксисом карри (h)(m)

h=>m=>console.log(`IT IS HALF TEN
QUARTER TWENTY
FIVE MINUTES TO
PAST TWO THREE
ONE FOUR FIVE
SIX SEVEN EIGHT
NINE TEN ELEVEN
TWELVE O'CLOCK`.replace(/\S+/g,w=>(k/=2)&1?w:w.replace(/./g,' '),k=[x=1<<19,88,81,66,84,92,64.5,60,52,34,49,56,x,h=(m<33?h+11:h)%12][m/5+.4|0]*16|6|2048<<(h?h-(h<3):2)))

Как это устроено

Все часы можно увидеть как 23 светодиода, которые либо включены, либо выключены. Итак, состояние часов - это 23-разрядное целое число.

Bit | Word        Bit | Word
----+--------     ----+--------
00  | IT          12  | ONE
01  | IS          13  | FOUR
02  | HALF        14  | FIVE
03  | TEN         15  | SIX
04  | QUARTER     16  | SEVEN
05  | TWENTY      17  | EIGHT
06  | FIVE        18  | NINE
07  | MINUTES     19  | TEN
08  | TO          20  | ELEVEN
09  | PAST        21  | TWELVE
10  | TWO         22  | O'CLOCK
11  | THREE             

Минут логика, нам необходимо реализовать для того, чтобы правильные слова не так просто , как можно было бы думать , на первый взгляд. Может существовать волшебная формула игры в гольф, но я пошел простым путем и решил просто жестко закодировать каждую возможную конфигурацию:

Minutes | Words                    | Enabled bits | Value   | Value / 8
--------+--------------------------+--------------+---------+----------
  00    | O'CLOCK                  | 22           | 4194304 | 524288
  05    | FIVE MINUTES PAST        | 6, 7, 9      | 704     | 88
  10    | TEN MINUTES PAST         | 3, 7, 9      | 648     | 81
  15    | QUARTER PAST             | 4, 9         | 528     | 66
  20    | TWENTY MINUTES PAST      | 5, 7, 9      | 672     | 84
  25    | TWENTY FIVE MINUTES PAST | 5, 6, 7, 9   | 736     | 92
  30    | HALF PAST                | 2, 9         | 516     | 64.5
  35    | TWENTY FIVE MINUTES TO   | 5, 6, 7, 8   | 480     | 60
  40    | TWENTY MINUTES TO        | 5, 7, 8      | 416     | 52
  45    | QUARTER TO               | 4, 8         | 272     | 34
  50    | TEN MINUTES TO           | 3, 7, 8      | 392     | 49
  55    | FIVE MINUTES TO          | 6, 7, 8      | 448     | 56

Контрольные примеры

Arnauld
источник
2
Очень умно. Я пытался вырезать еще один байт из моего, затем я увидел это, и нет никакой надежды на соревнование.
edc65
Задание (правило 8) говорит, что оно должно быть напечатано, а не просто возвращено
смс
@smls О, ты прав. Это исправлено.
Арно
Очень круто. За исключением неправильного времени :-( Отображение: h = 13 м = 15 Фактическое время: 14:43
Клубника
@ Клубника Пожалуйста, см. Правило № 6. Эта реализация использует исключительно ввод, а не местное время.
Арно
6

Пакетный, 789 байт

@echo off
if not "%1"=="" setlocal&set time=%1
set/a"h=%time:~0,2%,m=6%time:~3,2%%%60+2,h+=m/35,h%%=12,m=6-m/5%%12,n=m%%3,o=m%%2
set p=
set s=
call:c %m:-=% "IT IS HALF" 0 "IT IS      TEN" 4 "IT IS"
call:c %m:-=% QUARTER 3 "        TWENTY" 2 "        TWENTY" 1
if %m% lss 0 set s= TO
call:c 0 "            " %n% "     MINUTES" %o% "FIVE MINUTES"
set s=
set p=PAST 
if %m%==6 set p=     
if %m% lss 0 set p=     
call:c %h% TWO 2 "    THREE" 3
set p=
call:c %h% ONE 1 "    FOUR" 4 "          FIVE" 5
call:c %h% SIX 6 "    SEVEN" 7 "          EIGHT" 8
call:c %h% NINE 9 "     TEN" 10 "         ELEVEN" 11
if %m%==6 set s= O'CLOCK
call:c %h% TWELVE 0 "      "
exit/b
:c
set t=%1
:l
if %t%==%3 echo(%p%%~2%s%&exit/b
shift
shift
if not "%3"=="" goto l
echo(%p%%~2%s%

Примечание. Пробел после PASTи 5 пробелов в каждой из следующих двух строк.

Нил
источник
Я запустил его, и он прекрасно работает (за исключением одного часа 3)! Я просто не понимаю, что происходит ( call:cнапример)! Я, наверное, должен выучить какую-нибудь партию :)
Оливье Грегуар
@ OlivierGrégoire К сожалению, пространство пропало, но это исправлено.
Нил
4

JavaScript, 567 564 551 542 529 527 519 байт

Я не знаю, можно ли считать часы и минуты аргументами. Вы сказали "список целых чисел". Это все еще считается?

Кстати, я впервые играю в гольф. Как вы думаете?


Изменить: Сохранение нескольких байтов путем деления минут. Спасибо, Оливье!

Христиан Додов
источник
Да, идея этого правила заключается в том, что вы можете принимать аргументы, но только если они относятся к вводу, который является временем для печати.
Оливье Грегуар
1
Что касается игры в гольф, вы, вероятно, можете сыграть в гольф несколько байтов, если рассмотрите возможность деления своих минут на 5. Кроме того, вы можете захотеть перейти cв свою функцию. Я полагаю, что при этом не следует терять ни одного байта, но это делает его больше похожим на фрагмент, чем на функцию (по крайней мере, мне, может быть, гуру JS скажут иначе).
Оливье Грегуар
4

JavaScript (ES6) 360

Функция с входными параметрами час (0..23) и минута (0..59).
Использование alertдля вывода, так как это стандартная функция вывода в JavaScript, даже если это неудобно. (И это коротко)

(k,n,m=(n+2)/5|0,h=(k+(m>6))%12,i=0)=>alert(`IT IS HALF TEN
QUARTER TWENTY
FIVE MINUTES TO
PAST TWO THREE
ONE FOUR FIVE
SIX SEVEN EIGHT
NINE TEN ELEVEN
TWELVE O'CLOCK`.replace(/\S+/g,w=>[,,m-6,m-2&&m-10,m-3&&m-9,m-4&&m-8&&m-5&&m-7,m-1&&m-11&&m-5&&m-7,!(m%3),m<7|m==12,!m|m>6,h-2,h-3,h-1,h-4,h-5,h-6,h-7,h-8,h-9,h-10,h-11,h%12,m%12][i++]?w.replace(/./g,' '):w))

Тестовое примечание: для вашего спокойствия в тестовом фрагменте выходные данные оповещения перенаправляются на текст страницы

F=
(k,n,m=(n+2)/5|0,h=(k+(m>6))%12,i=0)=>alert(`IT IS HALF TEN
QUARTER TWENTY
FIVE MINUTES TO
PAST TWO THREE
ONE FOUR FIVE
SIX SEVEN EIGHT
NINE TEN ELEVEN
TWELVE O'CLOCK`.replace(/\S+/g,w=>[,,m-6,m-2&&m-10,m-3&&m-9,m-4&&m-8&&m-5&&m-7,m-1&&m-11&&m-5&&m-7,!(m%3),m<7|m==12,!m|m>6,h-2,h-3,h-1,h-4,h-5,h-6,h-7,h-8,h-9,h-10,h-11,h%12,m%12][i++]?w.replace(/./g,' '):w))

function alert(x) { O.textContent=x }
function update() { F(+H.value,+M.value) }

update()
input { width:3em }
Hours<input id=H type=number min=0 max=23 value=17 oninput='update()'>
Minutes<input id=M type=number min=0 max=59 value=37 oninput='update()'>
<pre id=O></pre>

edc65
источник
Я люблю твой ответ! Я узнал много вещей из этого! Однако, что происходит с функцией стрелки, которая имеет квадратные скобки? Кроме того, какова роль i? Я вижу, как вы получаете все непробельные группы («светодиоды»), и вы заменяете их пробельными символами в зависимости от условий, которые вы написали для каждой из них. Например, h-2это ложно только тогда h == 2, когда , я полагаю, вы куда-то инвертируете это? Можете ли вы объяснить немного, как это работает? Возможно, как редактирование вашего ответа? Я был бы очень благодарен!
Христиан Додов
Обновление - я почти понял, что ты делаешь. У вас есть массив нулевых и ненулевых элементов, и вы используете iссылку на правильный, увеличивая его после каждого совпадения с регулярным выражением. Если это правда, вы заменяете соответствующую строку пробелами, иначе вы оставляете ее как есть. Я не понимаю одну вещь, хотя. replace()использует возвращаемое значение указанной функции (функция стрелки в этом случае). Где вы возвращаете значение? Я просто вижу троичного оператора.
Христиан Додов
3
@HristiyanDodov функция стрелки, состоящая только из выражения, просто возвращает значение этого выражения. Пример (a,b)=>{ return a+b }такой же как(a,b)=>a+b
edc65
4

Python 2, 466 , 460 , 449 , 452 , 459 449 байт

Поскольку это может быть функция, принимающая h и m как целые числа, мы можем сохранить несколько байтов. Попробуйте онлайн .

def t(h,m):


m=(2+m)//5
 h=h%12
 n=0
 if m>6:n,m=1,12-m;h+=1
 a="""IT IS _HALF _TEN_
 _QUARTER _TWENTY_
 _FIVE _MINUTES _TO_
 _PAST _TWO _THREE_
 _ONE _FOUR _FIVE_
 _SIX _SEVEN _EIGHT_
 _NINE _TEN _ELEVEN_
 _TWELVE _O'CLOCK""".split("_")
 b=[1,m==6,m==2,1,m==3,3<m<6,1,m in[1,5],m in[1,2,4],n*m,1,(1-n)*m,h==2,h==3,1,h==1,h==4,h==5,1,h==6,h==7,h==8,1,h==9,h==10,h==11,1,h==0,m==0]
 for i,c in enumerate(a):
  if b[i]:print c,
  else:print' '*len(c),

У меня было несколько ошибок (исправлено) с логикой для TO/ PASTпротив O'CLOCK. Также сохранено несколько байтов для enumerate, изменяя import, и 19<m<26вместо m in [20,25]. Сохранено еще 8 для работы в 5-минутных чанках чаще чем минуты. Род указал на еще несколько ошибок, которые стоили мне совсем немного, но я немного поправился с более эффективными заданиями и исправлением, которое работало в мою пользу.

Крис Н
источник
Принимает трюк из ответа @Titus 'PHP. Я ==h
Крис Х
Вы можете только print cна последней линии, cуже держит a[i]должныйenumerate
Род
1
Формат вывода поврежден, printдобавляйте новую строку после каждого отпечатка, вы можете подавить его, добавив ,после c. Кроме того, он должен печатать пробелы, когда слово не печатается, вы можете исправить с помощью else в последнем ifelse:print' '*len(c),
Rod
1
Порядок байтов лучше, если убывать.
Гурупад Мамадапур
@Rod, спасибо за ошибки, хотя это делает его намного длиннее
Крис Х
2

Perl 6 , 308 296 293 байта

->\h,\m{my \n=round(m/5)%12;say "IT IS HALF TEN
QUARTER TWENTY
FIVE MINUTES TO
PAST TWO THREE
ONE FOUR FIVE
SIX SEVEN EIGHT
NINE TEN ELEVEN
TWELVE O'CLOCK".subst: /\S+/,{++$==1|2|(0,7,4,5,6,(6|7),3)[min n,12-n]|8*?(n%3)|(23,10,9)[(n+5)/6]|(13,11,12,|(14..*))[(h+m/33-1)%12]??$_!!" "x.comb},:g}

Попробуйте онлайн!

объяснение

Основная структура выглядит следующим образом:

-> \h, \m {                             # A lambda taking two args (hour and minute).
    my \n = round(m / 5) % 12;          # Index from 0 to 11, representing the minutes.
    say "...".subst: /\S+/, {           # Print the template with each word replaced:
        ++$ == ...|...|...|...          # If counter equals one of expected indices,
            ?? $_                       # then replace the word with itself,
            !! " " x .comb              # else replace it with spaces.
    }, :g                               # (Use global matching.)
}

Выражение, исключенное, как ...|...|...|...указано выше, представляет собой соединение целых чисел, представляющих индексы слов на основе 1, и состоит из следующего:

  1|2                                   # IT IS
| (0,7,4,5,6,(6|7),3)[min n,12-n]       # FIVE / TEN / QUARTER / TWENTY / TWENTY FIVE / HALF
| 8*?(n%3)                              # MINUTES
| (23,10,9)[(n+5)/6]                    # O'CLOCK / PAST / TO
| (13,11,12,|(14..*))[(h+m/33-1)%12]    # ONE / TWO / THREE / FOUR / FIVE / SIX / SEVEN / ...
SMLS
источник
2

Python3, (569 байт)

Этот ответ требует времени в формате чч мм (целые числа, разделенные пробелами). Мне удалось напечатать '\ n', вдохновленный методом Криса. Спасибо, Крис! Любая помощь по сокращению кода приветствуется.

H,M=input().split()
w="""HALF _TEN_
_QUARTER _TWENTY_
_FIVE _MINUTES _TO_
_PAST _TWO _THREE_
_ONE _FOUR _FIVE_
_SIX _SEVEN _EIGHT_
_NINE _TEN _ELEVEN_
_TWELVE _O'CLOCK""".split("_")
h,m=int(H),int(M)
if h>12:h-=12
m=(m//5+1)*5 if m%5>2.5 else m//5*5
if m>30:
    m=60-m
    h=(h+1)%12
X=[m==30,m==10,1,m==15,m in[20,25],1,m in[5,25],m not in[0,15,30],int(M)>30 and m!=0,1,m!=0 and int(M)<31,h==2,h==3,1,h==1,h==4,h==5,1,h==6,h==7,h==8,1,h==9,h==10,h==11,1,h in[0,12],m==0]
t="IT IS "
for i in range(0,28):
    if(X[i]):t+=w[i]
    else:t+=" "*len(w[i])
print(t.strip())

Попробуйте онлайн

EffyCoder
источник
Можете ли вы объединить w в одну строку, а затем использовать .split(',')? Следует сохранить несколько.
ElPedro
Также примите ваши входные данные как H,M=input()где ввод H, M. В правилах допускается последовательность из двух целых чисел. Не уверен, что это работает так, как задумано в Python 3. Я все еще 2 парня :-)
ElPedro
Спасибо @ElPedro. Сохранено 57 байт. H,M=input()не работал, как вы сомневались.
EffyCoder
1

Python 2 , 443 440 байт

R=range
w="HALF TEN QUARTER TWENTY FIVE MINUTES TO PAST TWO THREE ONE FOUR FIVE SIX SEVEN EIGHT NINE TEN ELEVEN TWELVE O'CLOCK".split(' ')
h=[10,8,9]+R(11,20)
c=['IT','IS']+[' '*len(x)for x in w]
i,j=input()
i=(i,i+1)[j>30]%13-1
j=int(round(j/5.0)*5.0)%60
for z in[[20],[4,5,7],[1,5,7],[2,7],[3,5,7],[3,4,5,7],[0,7],R(3,7),[3,5,6],[2,6],[1,5,6],R(4,7)][j/5]:c[z]=w[z]
c[h[i]]=w[h[i]]
x=0
for y in[4]+R(6,22,3)+[23]:print' '.join(c[x:y]);x=y

Попробуйте онлайн!

Возможно, он еще выиграет от игры в гольф. Ввод представляет собой список целых чисел, например, 7,23 = 7:23

ElPedro
источник
1

SimpleTemplate , 737 708 байт

Да, многословие и отсутствие «настоящей» математики сильно повредили счету.

{@seth argv.0}{@php$DATA[m]=ceil($DATA[argv][1]/5)*5%60|0}{@ifm}{@ifm is30}{@setA"HALF"}{@/}{@if"@[15]0$@"is matchesm}{@setB"TEN"}{@/}{@if"@[14]5$@"is matchesm}{@setC"QUARTER"}{@/}{@if"@[24]0$@"is matchesm}{@setD"TWENTY"}{@/}{@if"@^[25]?5$@"is matchesm}{@setE"FIVE"}{@/}{@if"@^([235]?5|[1245]0)$@" is matchesm}{@setF"MINUTES"}{@/}{@ifm is greater30}{@setG"TO"}{@else}{@setH"PAST"}{@/}{@else}{@setU"O\'CLOCK"}{@/}{@setZ"","ONE","TWO","THREE","FOUR","FIVE","SIX","SEVEN","EIGHT","NINE","TEN","ELEVEN","TWELVE"}{@setY"J"}{@incbyh Y}{@php$DATA[$DATA[Y]]=$DATA[Z][$DATA[h]]}{@print"IT IS%-6s%s\n%8s%s\n%-5s%-7s %s\n%4s %3s %s\n%3s %4s %s\n%3s %5s %s\n%4s %3s %s\n%6s %s",A,B,C,D,E,F,G,H,J,K,I,L,M,N,O,P,Q,R,S,T,U}

Это ожидает час и минуты как 1-й и 2-й параметр в классе.


Ungolfed:

{@set hour argv.0}

{@//The bitwise is required for the `@if minutes is 30`}
{@//Otherwise, I would be forced to write `@if minutes is equal to 30`}
{@php $DATA['minutes'] = ((ceil($DATA['argv'][1] / 5) * 5) % 60) | 0}

{@if minutes}
    {@if minutes is 30}
        {@set A "HALF"}
    {@/}
    {@if "@[15]0$@" is matches minutes}
        {@set B "TEN"}
    {@/}
    {@if "@[14]5$@" is matches minutes}
        {@set C "QUARTER"}
    {@/}
    {@if "@[24]0$@" is matches minutes}
        {@set D "TWENTY"}
    {@/}
    {@if "@^[25]?5$@" is matches minutes}
        {@set E "FIVE"}
    {@/}
    {@if "@^([235]?5|[1245]0)$@" is matches minutes}
        {@set F "MINUTES"}
    {@/}
    {@if m is greater than 30}
        {@set G "TO"}
    {@else}
        {@set H "PAST"}
    {@/}
{@else}
    {@set U "O\'CLOCK"}
{@/}


{@set numbers "", "ONE", "TWO", "THREE", "FOUR", "FIVE", "SIX", "SEVEN", "EIGHT", "NINE", "TEN", "ELEVEN", "TWELVE"}
{@set key "J"}
{@inc by hour key}
{@php $DATA[$DATA['key']] = $DATA['numbers'][$DATA['hour']]}

{@print "IT IS%-6s%s\n%8s%s\n%-5s%-7s %s\n%4s %3s %s\n%3s %4s %s\n%3s %5s %s\n%4s %3s %s\n%6s %s", A, B, C, D, E, F, G, H, J, K, I, L, M, N, O, P, Q, R, S, T, U}

Как запустить:

  1. Получите код с https://github.com/ismael-miguel/SimpleTemplate.
  2. Запустите следующий код:

    <?php
        include 'SimpleTemplate.php';
    
        $template = new SimpleTemplate('<code>');
    
        $template->render($hour, $minutes);
    
        //system-time: $template->render(date('g'), date('i'));
    
  3. Готово!

Исмаэль Мигель
источник
1

Java (OpenJDK 9) , 437 байт

(h,m)->{h=(h+m/35+11)%12+1;Object[]s="HALF TEN QUARTER TWENTY FIVE MINUTES TO PAST TWO THREE ONE FOUR FIVE SIX SEVEN EIGHT NINE TEN ELEVEN TWELVE O'CLOCK".split(" ");for(int i=s.length,M[]={1<<20,176,162,132,168,184,129,120,104,68,98,112};i-->0;)s[i]=(7<i&i<20?h==i-(h>3?7:h>1?6:9):(M[(m+2)/5%12]&(1<<i))>0)?s[i]:"";System.out.printf("IT IS %4s %3s%n%7s %6s%n%4s %7s %2s%n%4s %3s %5s%n%3s %4s %4s%n%3s %5s %5s%n%4s %3s %6s%n%6s %7s",s);}

Попробуйте онлайн!

Я думал, что я, наконец, дать шанс на мой вызов;)

Оливье Грегуар
источник
1

Perl 5 , 487 449 байт

($a,$_,$h)=localtime;s/[3-7]$/5/;s/[12]$/0/;$m=s/(.?)[89]$/($1+1)*10/er;$_="IT IS half ten
quarter tw
five minutes to
past 2two 3three
1one 4four 5five
6six 7seven 8eight
9nine 10ten 11eleven
12twelve oc";if($m>30){s/to/TO/;$h++;$m=60-$m}elsif($m){s/past/PAST/}$h=$h%12||12;$m!=30?$m%15?s/m\w+/uc$&/e:$m?s/q\w+/uc$&/e:s/oc/O'CLOCK/:s/half/HALF/;$m%10&&!/Q/&&s/five/FIVE/;$m>15&&$m<30?s/tw/TWENTY/:$m==10&&s/ten/TEN/;s/\b$h\w+/uc$&/es;y/a-z0-9/ /;say

Попробуйте онлайн!

Xcali
источник