Це Різдво?


33

Виклик

Враховуючи, що Різдво:

  • Грудень
  • 12 місяць
  • 25 день

Щороку визначайте сьогоднішню дату та чи є сьогодні Різдво чи ні. Якщо це Різдво, ви повинні надрукувати "It's Christmas". Якщо це не Різдво, потрібно якось почекати до Різдва, а потім надрукувати "It's Christmas".

Приклад

З цього питання про переповнення стека

import time
while time.strftime("%b, %d", time.localtime()) != "Dec, 25":
    time.sleep(60)
print "It's Christmas"

Пітон в 115 символів

Правила

Ось правила:

  • Припустимо, що годинник комп'ютера завжди правий.
  • Ваш код повинен бути в змозі запуститися в будь-який час.
  • Ваш код повинен надрукувати "It's Christmas"на Різдво.
  • Цикл, звичайно, не потрібен, але після запуску код не повинен зупинятися, поки він не надрукується.
  • Найкоротший код виграє.

Я подумав, що дані є в даті Джуліана, перш ніж я прочитав цей пост
Мінг-Тан

Відповіді:



143

Баш, 39

Для тих, хто просто не може чекати:

sudo date 12250000
echo It\'s Christmas

Це дотримується всіх правил, особливо першого.


11
Розумний. Не те, що я мав на увазі, але проклятий розумний.
Патрік Періні

8
"... і якщо годинник комп'ютера не завжди достатньо правильний, зробіть це". Добре шоу!
JB

13
Ви можете зберегти 5 символів, якщо ви root. : D
Wug

29

Unix, 39 байт

echo{,} "It\'s christmas"|at -t12252359

За допомогою Денніса, дякую за це.


Це порушує »Цикли, безумовно, не потрібні, але як тільки ви запустите ваш код, він не повинен зупинятися, поки він не надрукується.«.
Джої

Я не розумію вашої критики. Ви стверджуєте, що це петля? Що він зупиняється перед друком?
користувач невідомий

2
Використовуючи echo{,} "It\'s Christmas"|at -t12252359, це коротше, ніж прийнята відповідь. (Зворотний нахил потрібно до речі.)
Денніс

1
@Dennis: Гарне використання розширення дужок.
Джої Адамс

18

PowerShell, 45 46 символів

for(;(date).date-ne'12/25'){}"It's Christmas"

Це, звичайно, не дуже енергоефективно, тому акумулятор ноутбука може померти перед Різдвом (можливо, бажаю нового). Але не спати, безумовно, коротше .

Це також локально-агностично. І дякую Джейкулу за приємний трюк у зменшенні цього ще більше.

Трохи зловживаючи правилами, 45 символів

for(){"It's Christmas"*((date)-like'12/25*')}

Це надрукує порожні рядки до настання Різдва, після чого надрукує "Це Різдво".

Це ...

  • ... можна розпочати в будь-який час.
  • ... друкує "Це Різдво" на Різдво. Кілька разів. Цілий день довгий. (Правила нічого не говорять про те, як часто він може бути надрукований.)
  • ... не друкує "Це Різдво" на не Різдво (хоча воно друкує порожній рядок у такому випадку; його можна виправити, пожертвувавши іншого символу, але тоді це не отримує нічого над більш розумним рішенням вище).
  • ... ніколи не зупиняється (навіть після того, як він надрукував "Це Різдво", але точно не раніше).

2
for (; (дата) .date-ne "12/25") {} "Це Різдво" № 45 символів
Jaykul

Джейкуль: Дякую ... це я ніколи б не подумав працювати.
Joey

Сценарій "зловживань" також може використовуватись -matchі без підстановки, не отримуючи / втрачаючи символи.
Іссі

Ви можете видалити зловживання зараз, це зайве.
Ерік Аутгольфер

@EriktheGolfer: Як так? Він все ще пропонує цікавий альтернативний підхід, хоча він не коротший.
Джої

13

Пітон (36 символів)

У дусі зловживання правилами:

  • Виразно друкує "Це Різдво" на Різдво

  • Якщо це не Різдво, приділіть час, надрукувавши "Це Різдво"

    while True:
        print "It's Christmas"
    

2
29 байт: while 1:print"It's Christmas".
Ерік Аутгольфер

11

PostScript, 90

(%Calendar%)currentdevparams begin{Month 12 eq Day 25 eq and{exit}if}loop(It's Christmas)=

Не працюйте на принтері, він не друкує сторінку, і він буде робити ваш принтер лише до Різдва. Потім знову повернення принтера було б приємним подарунком.


4
Не забудьте наклеїти на принтер табличку із написом: НЕ Вбивайте РОБОТУ ДО РОЖДЕНЬ!
Джої Адамс

Я думаю, що більшість принтерів навіть не матимуть робочого годинника з обладнанням, оскільки це додаткова функція. Дуже приємно, хоча :)
Joey


5

Перл, 44 45

perl -E'1until localtime=~/c 25/;say"It's Christmas"'

Чи не вистачить часу GMT? (Вимкнено 3 символи ;-)


1until localtime=~/c 25/;врятувало б вам одну чару. :)
Ільмарі Каронен

Я думав, що вже пробував це, і це не вдалося, але виявляється, я фактично забув -Eна той час. Спасибі!
JB

Без проблем. (Пса. Я щойно опублікував версію вашого рішення, використовуючи задні посилання замість localtimeнижче. Не соромтеся його вкрасти, якщо хочете, але я відчув, що додаткова залежність виправдовує окрему відповідь.)
Ілмарі Каронен

Ні, ганьба, що я не думав про це знову . Окрема відповідь цілком виправдана ІМО (і схвалена).
JB

5

Перл, 45

{localtime=~/c 25/&&die"It's Christmas";redo}

Перл, 44

використовуючи потрійний оператор (спасибі Ільмарі Каронен).

{localtime=~/c 25/?say"It's Christmas":redo}

? :замість того, && ;щоб врятувати вас і одну цукерку. (І я б використав sayзамість того, dieщоб видати
красу

@Ilmari Karonen: спасибі Але використовуючи sayзамість die, сценарій ніколи не закінчується.
Тото

Це станеться, якщо використовувати термінальний оператор.
Ільмарі Каронен

@Ilmari Karonen: так, звичайно. Можливо, я занадто втомився !!!
Тото


4

Я хотів це зробити без розбору рядків. Згодом у моєму коді багато магічних цифр.

Я зробив деяке наближення до обліку високосних років. Ніхто не сказав, що потрібно було роздрукувати його о 00:00:00, 25 грудня!

Perl, 80 69 57 символів

{(time-30931200)%31557600<86399?die"It's Christmas":redo}

Відредаговано для більш короткого циклу!



3

Пітона, 66 68

import time
while'c 25'not in time.ctime():1
print"It's Christmas"

Що 1в кінці другого рядка мені здається досить підозрілим. : P
cjfaure

@ Trimsty: 1забезпечує тіло для циклу while. В основному це зайняте очікування до 25 грудня. Це має подібний ефект while 1:if'c 25'in time.asctime():break.
Стівен Румбальський

Ах, добре, дякую за очищення.
cjfaure

Я думаю, time.ctime()що зробив би.
гніблер

@gnibbler: Дійсно, це було б. Гарний улов.
Стівен Румбальський

3

TI-BASIC, 42 38

Repeat 769=sum(getDate²,2
End
"It's Christmas

Очікує, що формат дати буде РРРР / ММ / ДД.

getDate створює триелементний список {year,month,day}; тільки на Різдво місяць ^ 2 + день ^ 2 дорівнює 769.

23 байти використовуються для рядка, оскільки малі літери - це два байти, за винятком i, який відображається як уявний маркер одиниці.


2

Пакетний файл, 68 символів

:l
@date/t|findstr/c:"-12-25">nul&&echo It's Christmas&&exit
@goto l

Не можна використовувати інтерактивно, оскільки це вбиває сеанс. Розв’язання, що потребує ще 5 символів.

Також чутливий до локального. Це працює на моєму локалі, який використовує формат дати ISO 8601.

Але ей, це пакетний файл (більшість із них навіть не вважається мовою програмування). І коротший, ніж Javascript (і нарівні з Python).


2

Гроовий, 55

while(!new Date()==~/.*c 25.*/);
println"It's Christmas"

Думаю, що це працює, але все ще чекає виходу.


Якщо виразки Groovy подібні до більшості інших мов, .*вони абсолютно не потрібні. (Пс. Ви можете перевірити це, чекаючи 5 грудня замість 25.)
Ілмарі Каронен

1
Ilmari, Groovy - мова JVM, а шрифти Java за замовчуванням прикріплені.
Joey

1
Ilmari, я би перевірив, але моя програма все ще працює
Armand

2

(pdf) eTeX - 180 символів лише 1-25 грудня.

\lccode`m`~\let\e\expandafter\def~{\ifdim900pt<\pdfelapsedtime
sp\pdfresettimer\else\e~\fi}\lowercase\e{\e\scantokens\e
{\romannumeral\numexpr (25 - \day)*96000}}It's Christmas!\bye

TeX має лише спосіб отримати дату, коли програма запускається, і час, що минув з моменту запуску, обмежився 32768 секундами, тому мені потрібно обчислити кількість секунд, щоб чекати, і на кожну секунду робити цикл, який чекає на минув час, щоб досягти 1sта скинути час. (Точно я роблю блоки по 900 секунд.)

Робота на будь-який місяць вимагає більше роботи: 355 символів.

\lccode`m=`~\let\o\or\let\y\year\let\n\numexpr\let\e\expandafter
\def\b#1{\ifnum#1=\n(#1/4)*4\relax+1\fi}\def~{\ifdim
900pt<\pdfelapsedtime sp\pdfresettimer\else\e~\fi}\lowercase
\e{\e\scantokens\e{\romannumeral\n(25-\day+\ifcase\month\o334\b\y
\o303\b\y\o275\o244\o214\o183\o153\o122\o91\o61\o30\o0\ifnum25<\day
365\b{\n\y+1}\fi\fi)*96000}}It's Christmas!\bye

2

MySQL, 180 символів

Тому що для чого ви використовуєте двигун бази даних?

DELIMITER $$
CREATE FUNCTION c() RETURNS CHAR(14) BEGIN a: LOOP IF DAY(NOW())=25 && MONTH(NOW())=12 THEN RETURN 'It\'s Christmas'; END IF; END LOOP a; END$$
DELIMITER ;
SELECT c();

Не дуже конкурентоспроможний по довжині, але ей, це можливо!


Спробуйте DELIMITER /, RETURNS TEXTі CURDATE()LIKE'%12-25'; і спробуйте видалити пробіл.
Тит


2

PHP, 40 байт

<?while(date(dm)-1225);?>It´s Christmas;

Петля до 25 грудня; потім перейдіть до звичайного режиму та друкуйте.

Запустити з налаштуваннями за замовчуванням (не показувати сповіщення).


2

8086 машинного коду, 33 байти

00000000  b4 2a cd 21 81 fa 19 0c  75 f6 b4 09 ba 12 01 cd  |.*.!....u.......|
00000010  21 c3 49 74 27 73 20 43  68 72 69 73 74 6d 61 73  |!.It's Christmas|
00000020  24                                                |$|
00000021

1

Javascript, 93 89 78 77 символів

function x(){Date().match("c 25")?alert("It's Christmas"):setTimeout(x,1)}x()


@Joey Дякую! Я про це забув.
JiminP

2
Ще одна неблокуюча версія: setInterval('/c 25/.test(Date())&&alert("It\'s Christmas")',9)на 61 годин… єдиний недолік - це те, що це буде alert()весь день на Різдво.
Девід Мердок

Чому setIntervalдо 1? setInveralщоб 1000*60*60*24і він як зробить процес страждати і повідомить тільки один раз на Різдво.
Джордж Мауер

1

Д, 130

import std.datetime,std.stdio;
main(){
do{
auto t = Clock.currTime();
}while(t.month!=12||t.day!=25);
writeln("It's Christmas");
}

Можливо, ви можете зберегти два символи у призначенні. І ще кілька за рахунок зменшення кількості рядків.
Джої

Я також можу зберегти деякі, використовуючи t.month^12|t.day^25 (якщо я правильно
визначу

1

Q, 63 символів

system"t 1000";.z.ts:{$["12.25"~-5#-3!.z.d;1"It's Christmas";]}

буде працювати на день Різдва кожного року


1

SQL * Plus + PL / SQL - 100

EXEC LOOP EXIT WHEN TO_CHAR(SYSDATE,'DDMM')='2512';END LOOP;DBMS_OUTPUT.put_line('It''s Christmas');
  • Припускаючи SERVEROUTPUT ON
  • Коротше, ніж рішення MySql (їжте це, MySql!)
  • Занадто пізно на минулий рік, але вчасно на цей рік
  • Пробували DBMS_OUTPUT.putзамість цього, DBMS_OUTPUT.put_lineале це нічого не друкує.

1

C # (126)

using System;class P{static void Main(){while(DateTime.Now.Date.ToString("Md")!="1225");Console.WriteLine("It's Christmas");}}

Приємніше для вашого акумулятора:

C # (163)

using s=System;class P{static void Main(){s.Threading.Thread.Sleep(s.DateTime.ParseExact("1225","Md",null)-s.DateTime.Now);s.Console.WriteLine("It's Christmas");}}

редагувати

У другій ("приємнішій для вашого акумулятора") версії є дещо проблеми. 26-го груд. 31-й я щойно думав: P

Обидві версії, можливо, можна скоротити трохи більше.


1

Япт , 27 байт (неконкурентоспроможний)

Ks f"c 25" ?`It's CËItµs`:P

Щоб перевірити сьогоднішню дату: Замініть c 25останній лист (скорочення) цього місяця + пробіл + день місяця. Feb 02==b 02

Спробуйте в Інтернеті! Без конкуренції, тому що Japt набагато новіший, ніж цей виклик.


1

VBA, 58 байт

Анонімний VBE одразу виконує функцію вікна, яка не приймає ніяких даних і не працює до дня Різдва, і в цей час він виводить It's Christmasу вікно безпосереднього VBE.

While Left(Now,5)<>"12/25":DoEvents:Wend:?"It's Christmas"


0

Q (60)

 system"t 1000";.z.ts:{if[.z.d~2012.12.25;1"It’s Christmas"]}

> Якщо це не Різдво, треба якось дочекатися Різдва, а потім надрукувати «Це Різдво».
skeevey

Мої вибачення, виправлені, щоб перевірити щосекунди, чи це Різдво ... тож це буде надруковано "Це Різдво" 86 400 разів кожного 25 грудня. Очевидно, ви можете змінити це, збільшивши таймер, який знаходиться в мілісекундах.
sinedcm
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.