Роздрукувати слово годинник


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 до HH: (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
Великий виклик, мені це дуже подобається!
Тімтех

Відповіді:


14

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

Дякуємо @Christoph за гольф разом із його чудовими висновками!
На його рахунку принаймні 45 байт; 16 і більше натхненних ним.

Дивовижна команда!

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 байт.

Це дуже приємно! Я спробував цю реалізацію на Java, переконавшись, що питання вирішується, але це в кінцевому підсумку було настільки складним, що я відмовився і застосував довший, але більш простий підхід! Тож вітаюсь з успіхом, де я не зміг;)
Олів'є Грегоар

1
Побиття решти: $i++%3^($i<3)до $i++%3^$i<3. Я зараз офіційно повністю витрачений. Я зроблю перерву, поки хтось не зустрінеться з нами. Це було дійсно весело. Дякую Титу за вашу командну роботу!
Крістоф

1
@Christoph Ви ... ВЕЛИКИЙ, здається, маленьке слово. \ o /
Тіт

18

TI-Basic, 335 334 байт

Насправді дуже досконало, оскільки у калькуляторів TI-84 є літери 8х16, а це 8х15. Дата приймається як вхід для підтримки калькування раніше 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(.


Мені здається, що після виведення 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.
Тімтех

1
Тож @Christoph, схоже, ти відповів на власне запитання за цим посиланням, ти все ще хочеш, щоб я пояснив? Якщо ви хочете побачити, де я перейшов з перегляду ASCII на токенізований, перевірте редакцію №4.
Тімтех

11

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

Вводиться як два цілих числа з синтаксисом currying (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

Тестові кейси


2
Дуже розумний. Я намагався відрізати ще трохи байтів від свого, тоді я побачив це, і немає ніякої надії змагатися.
edc65

У завданні (правило 8) сказано, що його потрібно надрукувати, а не просто повернути
smls

@smls О, ти маєш рацію. Це виправлено.
Арнольд

Дуже круто. За винятком того, що час неправильний :-( Відображення: h = 13 м = 15 Фактичний час: 14:43
Полуниця

@ Strawberry Будь ласка, дивіться правило №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>


Я люблю вашу відповідь! Я дізнався з нього купу речей! Однак, що відбувається з функцією стрілки, яка має квадратні дужки? Також, яка роль i? Я можу бачити, що ви отримуєте всі непробільні групи ("світлодіоди"), і ви заміняєте їх на пробіли залежно від умов, які ви написали для кожної з них. Наприклад, h-2це неправда лише тоді h == 2, коли я припускаю, що ви кудись її перевернули? Чи можете ви пояснити трохи, як це працює? Можливо, як редакція вашої відповіді? Я був би дуже вдячний!
Християн Додов

Оновлення - я майже зрозумів, що ти робиш. У вас є масив нульових і ненульових елементів, і ви використовуєте iдля позначення правильного, збільшуючи його після кожного регексу. Якщо це truthy, ви замінюєте відповідні рядки порожніми пробілами, інакше залишаєте його таким, яким він є. Я не розумію жодної речі. 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-хвилинних шматках, ніж за кілька хвилин. Род вказав, що ще деякі помилки коштували мені зовсім небагато, але я трохи поправлявся більш ефективними завданнями та виправленням помилок, які працювали на мою користь.


Виймає хитрість з відповіді PHP @Titus. Я програю пітону для ==порівняння, і я вважаю, що можу вдосконалити деякі hтести
Кріс Х

Ви можете тільки print cна останньому рядку, cвже має місце a[i]з - заenumerate
Rod

1
Формат виходу порушено, printдодайте новий рядок після кожного друку, ви можете придушити його, додавши ,після c. Крім того, він повинен надрукувати порожні пробіли, коли слово не друкується, ви можете виправити його за допомогою останнього, якщоelse:print' '*len(c),
Rod

1
Порядок байтів краще, якщо зменшується.
Гурупад Мамадапур

@Rod, спасибі за помилки, навіть якщо це набагато довше
Chris H

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 / ...

2

Python3, (569 байт)

Відповідь на це питання вимагає часу в форматі чч мм (розділених пробілами цілих чисел) .Я вдалося мати «\ п» надрукований, який натхненний Кріса method.Thanks, Кріс! Будь-яка допомога щодо зменшення коду цінується.

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())

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


Чи можете ви об'єднати w в один рядок, а потім використовувати .split(',')? Слід заощадити кілька.
ElPedro

Також візьміть свій вклад як місце, H,M=input()де вхід Н, М. За правилами дозволено дві цілі послідовності. Не впевнений, чи працює це так, як задумано в 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


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}

Це очікує години та хвилин як першого та другого параметра на класі.


Безголівки:

{@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

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.