Wesołych golfów, wszyscy!


35

Wszyscy są Święta Bożego Narodzenia, a oto święto wyzwanie golfowego. Musisz stworzyć program do wydrukowania prezentu. W szczególności słowa „Wesołych Świąt”. Ale jest haczyk: ten program musi działać tylko wtedy, gdy jest 25 grudnia. Jeśli kod zostanie uruchomiony w innym dniu, program powinien się zawiesić.

To jest Code-Golf, więc wygrywa odpowiedź z najmniejszą ilością bajtów.

Wesołych Świąt!


5
Tak, to było ermmmmm. .. tak 25 przepraszam
Leo


3
Golfy Codemas ! :)
Luis Mendo,

1
Nie, to musi być awaria. Nie możesz wyjść z aplikacji
Leo

2
@PhiNotPi Te wyzwania są różne. Nie wymaga to odliczania i nie wymaga oczekiwania na wyjście
Leo

Odpowiedzi:


8

Pyke, 21 bajtów

.dↄґ6C65h*325q/Al

Wypróbuj tutaj!

     C65h*        -   multiply the day by the (current month + 1)
          325q    -  ^ == 325
    6         /   - 6 / ^
.dↄґ              -  load "merry christmas"
               Al - ^.capwords()

Lub 18 bajtów niekonkurencyjnych.

.dↄґ6Cs6Y1q/Al

Dokładnie tak samo, z wyjątkiem tej sekcji:

Cs6Y1q 
C      -    get_time()
 s6    -   add 1 week
   Y   -  get day of the year
    1q - ^ == 1

Wypróbuj tutaj!


To się nie powiedzie, jeśli jest 30 października, prawda?
Magic Octopus Urn

1
@carusocomputing 30 * (10+1)= 330 nie 325
Blue

6

JavaScript, 55 53 46 bajtów

Uwaga: zostało to przetestowane tylko w Google Chrome, program może zachowywać się inaczej w zależności od przeglądarki (lub urządzenia na urządzenie)

2 bajty zapisane dzięki @ ConorO'Brien

7 bajtów zapisanych dzięki @ETHProductions

alert(/c 25/.test(Date())?"Merry Christmas":a)

Wyjście z, Uncaught ReferenceError: a is not definedjeśli data nie jest Dec 25. Nie jestem do końca pewien, czy liczy się to jako awaria

alert(/c 25/.test(Date())?"Merry Christmas":a)


Jak o .slice(6,10)=="c 25"?
Conor O'Brien,

@ ConorO'Brien Thanks! To sprytne :)
Kritixi Lithos,

@ETHproductions Nie mogę myśleć o żadnym dniu ani miesiącu, który się skończy c( Octzbliża się, ale nadal nie spełnia wyrażenia regularnego). Dzięki za wskazówkę!
Kritixi Lithos,

Wynik Date()jest całkowicie zależny od implementacji. Na przykład oczekuję, że będzie się różnić w zależności od języka i lokalizacji urządzenia.
Oriol,

@Oriol Następnie w mojej odpowiedzi
określę

5

Python 3, 66 63 bajtów

Dzięki pomysłom z odpowiedzi JavaScript / ES udało mi się tutaj wycisnąć kilka bajtów. Indeksuj słownik - nieistniejące klucze podniosą KeyError. Poniższy kod działa w lokalnej strefie czasowej

import time;print({1:'Merry Christmas'}['c 25'in time.ctime()])

Format wyjściowy dla ctimenie zależy od ustawień regionalnych - format jest zawsze ~ 'Sun Dec 25 19:23:05 2016'. Ponieważ dopiero w grudniu kończy się 3-literowy skrót, można z cniego bezpiecznie korzystać 'c 25'in time.ctime().


Poprzednia wersja:

Działa to w strefie czasowej UTC. Dla lokalnej strefy czasowej potrzeba jeszcze s/gm/local3 bajtów. W Pythonie 2 można usunąć nawiasy z print65 bajtów.

import time;print({(12,25):'Merry Christmas'}[time.gmtime()[1:3]])

Konstrukt rzuca KeyErrorw inne daty:

>>> import time;print({(1,1):'Happy New Year'}[time.gmtime()[1:3]])
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: (12, 25)

Czy ta awaria w inne dni (powinna)?
Erresen,

2
Nie mogę uruchomić tego, ponieważ sprzeciwia się krotce jako kluczowi Wypróbuj online! . Jeśli zmienisz go import time;print{'2512':'Merry Christmas'}[time.strftime("%d%m")]i
oznaczysz jako

@ElPedro oops: D powinienem był 1:3, przez przypadek skopiowałem mój kod testowy
Antti Haapala,

Podniosłem to, kiedy pożyczyłem twój gmtime()pomysł na moją odpowiedź. Mam nadzieję, że nie masz nic przeciwko :-)
ElPedro,

5

PHP, 39 38 bajtów, nie konkuruje (nie ulega awarii)

<?=date(md)-1225?"":"Merry Christmas";

lub

<?date(md)-1225?die:0?>Merry Christmas

lub

<?=["Merry Christmas"][date(md)-1225];

Czy każdy może odegrać 4 bajty date(Lz)%1001-358? : D
Tytus

3
Czy ta awaria?
edc65,

Możesz pominąć ""pierwszy kod, który oszczędza 2 bajty. Gdyby nie było od lat przestępnych do cholery, można zaoszczędzić 2 Byte więcej zastępując mdprzez zi 1225przez liczbę w dniu 25 grudnia roku.
UTF-8,

1
Alternatywa: eval((date(md)^TQZZ).'"Merry Christmas";');(43 bajty)
Ismael Miguel,

1
@ UTF-8: Masz rację. Najczęściej używam Elvisa do wartości boolowskich; i to by wydrukowało 1. Spowoduje to wydrukowanie wyniku obliczeń. i 0104-1225jest 1121.
Tytus

4

Python 2 , 68 67 65 bajtów

-1 dzięki dzięki @muddyfish

Dzięki @AnttiHaapala za pomysł, który uratował kolejną parę.

import time;print['Merry Christmas'][(12,25)!=time.gmtime()[1:3]]

Wypróbuj online!

Zgłasza błąd indeksu, jeśli nie 25 grudnia.

Niekonkurencyjna wersja na 59 bajtów, ponieważ działa tylko dla lat przestępnych (używa dnia roku, który wynosi 360 w tym roku, ale 361 w latach przestępnych)

import time;print['Merry Christmas'][360!=time.gmtime()[7]]

Czy nie możesz zapisać bajtu za pomocą listy zamiast krotki?
Blue

@muddyfish Dzięki, dobry połów.
ElPedro,

Fajnie, moim pomysłem były 2 dodatkowe bajty : P
FlipTack

Dzięki. To była również moja 67-bajtowa wersja, dopóki nie skomentowałem odpowiedzi z @AnttiHaapala i pomyślałem o wygoleniu gmtime()kilku. Muszę przyznać, że chciałbym mieć więcej możliwości zrobienia tego z pomysłem na cały rok.
ElPedro,

Możesz zapisać 1 bajt za pomocą: time.ctime () [6:10]! = 'C 25'
Max

4

R, 52 61 58 bajtów

`if`(format(Sys.Date(),"%m%d")=="1225","Merry Christmas",)

Jeśli bieżąca data nie przypada na 25 grudnia, zwracany jest błąd, ponieważ nie podano trzeciego argumentu if .

Edycja: Naprawiono głupi błąd


Przepraszam za moją małą literówkę. Chciałem powiedzieć 25 ton
Leo

Działa to tylko w tym roku!
Erresen,

@ Erresen Ah racja, głupi błąd. Naprawiono teraz.
Billywob,

4

Mój pierwszy raz tutaj ... Zacząłem od najlepszego języka do tej pracy:

Java, 200 188 bajtów (dzięki @Daniel Gray), 186 bajtów usuwających „ln” z wydruku.

import java.util.*;public class a{public static void main(String[]r){Calendar c=Calendar.getInstance();if(!(c.get(2)==11&&c.get(5)==25)){int i=1/0;}System.out.print("Merry Christmas");}}

Wypróbuj tutaj!


1
Witamy w PPCG! Niezły pierwszy post, mimo że Java nie jest najkrótsza.
Rɪᴋᴇʀ

1
Możesz zmienić Calendardla *i zapisać kilka bajtów. argsMyślę, że można także skrócić nazwę parametru w głównej metodzie, myślę ...
Daniel Gray,

@Daniel Gray, masz absolutną rację, dzięki!
Bonifacio,

1
Witamy! Możesz zapisać 10 bajtów, jeśli zamienisz „klasę publiczną” na „interfejs” i usuniesz publiczny modyfikator z głównego, czyniąc go „interfejsem {static void main ...” To jednak uniemożliwi Compilejava uruchomienie go online.
Zavada,

3

MATL , 34 33 bajty

'Merry Christmas'IHh&Z'5U12h=?}Yl

Działa to w bieżącej wersji (19.7.0) języka. Aby spowodować błąd, poniższy kod wykorzystuje fakt, że logarytm ciągu powoduje błąd (może to ulec zmianie w przyszłych wersjach).

Wypróbuj online!

Wyjaśnienie

'Merry Christmas'  % Push this string
IHh                % Push 3, then 2, concatenate: gives array [3 2]
&Z'                % Get 3rd and 2nd outputs of clock vector: current day and month
5U12h              % Push 5, square, push 12, concatenate: gives [25 12]
=                  % Compare if corresponding entries are equal in the two arrays
?                  % If all entries are equal: do nothing
}                  % Else
  Yl               %   Logarithm. Gives an error when applied on a string
                   % End (implicit). Display (implicit)

3

QBIC , 48 bajtów

~left$$|(_D,5)=@12-25||?@Merry Christmas|\?a(12)

Wyjaśnienie:

~             IF
left$$|(_D,5) the date string starts with
=@12-25|      the string "12-25"
|             THEN
?@Me..as|     PRINT "Merry Christmas"
\             ELSE
?a(12)        Print the twelfth index of an undefined array. 
              Since there are only 11 elements in undefined arrays, this 
              results in an index-out-of-bounds error.    
The the IF statement is auto-closed by QBIC.

Zakłada to amerykańską MM-DDnotację daty. Byłoby to krótsze, gdybym w końcu utworzył funkcję Substring w QBIC.


Co dzieje się w dni, które nie są świętami Bożego Narodzenia? Czy ulega awarii, jak powinien?
Erresen,

@ Erresen robi to teraz.
steenbergh,

3

05AB1E ,32 21 bajtów

Zaoszczędzono 11 bajtów dzięki kompresji ciągów Adnana :).

1žfže‚12D·>‚Q÷”ÞٌΔ×

Wyjaśnienie

 žfže‚                Push [current month, current day]
      12D·>‚          Push [12, 25]
            Q         Push tmp = 1 if the two arrays are equal, tmp = 0 otherwise
1            ÷        Evaluate x = 1/tmp. If tmp = 0 a division by 0 exception is thrown
              ”ÞÙŒÎ”× Implicitly display "Merry Christmas" x times

Wypróbuj online!

Zrobiłem to, co przyszło mi do głowy, więc może być lepsze podejście do tego. Ale PPCG również zasługuje na Wesołych Świąt w 05AB1E;).


Jest także xskrótem od duplikatu i podwóju :).
Adnan

3

C # / CS Script 106 100 99 bajtów

99 bajtowe rozwiązanie

using System;int i;Console.WriteLine(DateTime.Now.ToString("dM")=="2512"?"Merry Christmas":i/0+"");

Wypróbuj tutaj!

100 bajtowe rozwiązanie (wolę ten ... trochę inny)

using System;int i;Console.WriteLine(DateTime.Now.AddDays(7).DayOfYear==1?"Merry Christmas":i/0+"");

Wyjaśnił:

using System;
int i;

// if today plus 7 days is the first day of the year, then it's xmas!
Console.WriteLine(DateTime.Now.AddDays(7).DayOfYear==1
    ? "Merry Christmas"

// otherwise divide i by 0
    : i/0+"");

DateTime.Now.AddDays(7).DayOfYear==1jest o jeden bajt krótszy niż, DateTime.Now.ToString("ddMM")=="2512"ale o 1 bajt dłuższy niżDateTime.Now.ToString("dM")=="2512"


1
Możesz użyć $"{DateTime.Now:dM}"=="2512". dMjest niejednoznaczny, ale nie dla „2512”.
Kobi,

@Kobi Nie mogę używać interpolacji ciągów znaków dla skryptu CS :(
Erresen,

1
Możesz, jeśli używasz LinqPad (np. $"{DateTime.Now:dM}"=="2512"?"Merry Christmas":1/1-1+""55 bajtów) =)
Kenneth K.

Dlaczego int ii nie w porządku 1/0?
NoOneIsHere

1
@ Erresen Ah, mój błąd. Nie przetestowałem wystarczająco dokładnie. Poprawione: $"{DateTime.Now:dM}"=="2512"?"Merry Christmas":"".Remove(1)(59 bajtów)
Kenneth K.,

2

Skrypt C # / CS, 96 bajtów, głównie plagiat z Erresen

using System;Console.WriteLine(DateTime.Now.AddDays(7).DayOfYear==1?"Merry Christmas":1/0+"");

Usuwa int ideklarację na korzyść twardego kodowania podziału. Zostawiłbym to jako komentarz, ale nie mam reputacji.


Witamy w PPCG! Miły pierwszy post! Nie przejmuj się komentarzem / odpowiedzią, to nie ma większego znaczenia.
Rɪᴋᴇʀ

2

narzędzia bash + Unix, 51 49 47 bajtów

((`date +%m%d`-1225))&&${};echo Merry Christmas

* Dzięki @ KenY-N za wskazanie, że można usunąć cytaty w echu, oraz @IporSircer za zmniejszenie rozmiaru warunku o 2 bajty.


To daje mi bash: ${}: bad substitutionbłąd. Możesz także usunąć cytaty z Wesołych Świąt, aby zaoszczędzić dwa bajty. Ponadto [ `date +%m%d` = 1225 ]&&echo Merry Christmasdziała dla mnie, co odpowiada moim 45 bajtom .
Ken YN

1
@ KENY-N Błąd jest zamierzone: program miał awarię w dniach innych niż Boże Narodzenie. Dziękujemy, że wspomniałeś, że cytaty w echu można usunąć; Tęsknie za tym.
Mitchell Spector,

Ups, przegapiłem ten wymóg! Testowane przez zmianę ciągu daty i teraz widzę, że nie ulega awarii. Usunąłem swoją odpowiedź ... Ale mam alternatywę, więc pozwól mi ją zaktualizować.
Ken YN

Spróbuj wymienić ${}ze !-pokazał mi przez jednego bajta. Będę cię głosować, jak wygrasz.
Ken YN

1
@ KenY-N Dzięki, ale nie zamierzam zmienić $ {} na! - ponieważ myślę, że ten ostatni będzie działał poprawnie tylko w wierszu poleceń, a nie w skrypcie (chyba że włączysz podstawianie historii, co wymagałoby dodatkowego postacie).
Mitchell Spector,

1

Groovy, 57 bajtów

print new Date().format("Md")=="1225"?"Merry Christmas":b

Awarie w datach innych niż 25.12. z groovy.lang.MissingPropertyExceptionponieważ bnie jest zdefiniowana.


1

Ułożone , 42 bajty

Wypróbuj tutaj!

('Merry Christmas')'MMDD'date'1225'=¬#out

To tworzy tablicę jednoelementową zawierającą mianowicie 'Merry Christmas!'. Następnie wstawia datę w ciąg znaków wraz z miesiącem i dniem. Sprawdza równość z '1225'(Boże Narodzenie), odwraca to ¬, a następnie pobiera ten element z poprzedniej tablicy. Jeśli to nie Boże Narodzenie, wystąpi błąd z indeksem. W przeciwnym razie drukuje się Merry Christmas. (Zmień datę w ciągu, aby zobaczyć, jak działa w inne dni).


1

Partia, 66 bajtów

@echo off
if %date:~0,5%==25/12 echo Merry Christmas&exit/b
if

Końcowy znak nowej linii jest znaczący, ponieważ powoduje, że parsowanie ifinstrukcji kończy się niepowodzeniem. Konieczne może być dostosowanie funkcji sprawdzania daty w celu dopasowania do lokalnego formatu daty.


1

Python 2, 69 77 75 lub 72 70 Bajtów

import time
if time.strftime("%d%m")=="2512":print"Merry Christmas"
else:1/0

Jeśli nie ma znaczenia, czy kończy się z błędem, gdy są święta, to:

import time
if time.strftime("%d%m")=="2512":print"Merry Christmas"
1/0

EDYTOWAĆ:

Dzięki @ Flp.Tkc za zwrócenie uwagi, że muszę zgłosić błąd

-2 bajty od @Max za wskazanie na temat usuwania dwukropków z funkcji strftime


1
To ma się zawiesić, jeśli nie są święta Bożego Narodzenia, to po prostu kończy się normalnie.
FlipTack,

Możesz zapisać 2 bajty usuwając dwukropki -> '% d% m' == '2512'
Max

@ Max OK, dziękuję za podpowiedź. Nie korzystałem wcześniej z tej funkcji, więc nie pomyślałem o zrobieniu tego
sonrad10,

zapisz kolejne 3 bajty za pomocą: time.ctime () [6:10] == 'c 25'
Max

1

CJam, 28

et[C25]#1="Merry Christmas"/

Wypróbuj online

Wyjaśnienie:

et                   push an array of current [year month day hour ...]
[C25]                push the array [12 25] (C=12)
#                    find the position of the 2nd array within the first one
1=                   compare it with 1, resulting in 1 for 1 and 0 otherwise
"Merry Christmas"/   split "Merry Christmas" into pieces of that length
                      (it crashes if the length is 0)
                     at the end, all the pieces are concatenated
                      and printed automatically

0

C # .NET, 180 172 171 bajtów

Zaoszczędź 8 bajtów dzięki Kritixi Lithos

Oszczędność 1 bajtu dzięki Kritixi Lithos, ponownie;)

namespace System{class P{static void Main(string[] args){var d=DateTime.Today;if(d.Day==25)if(d.Month>11){Console.Write("Merry Christmas!");return;}throw new Exception();}}}

Alternatywny wariant bez golfa:

namespace System //In System, so we don't have to use system.
{
    class Program
    {
        static void Main(string[] args) //Main function.
        {
            var d = DateTime.Today; //Get Today.
            if (d.Day == 25) if (d.Month == 12) //Day has to be 25th, Month has to be 12nd.
                {
                    Console.Write("Merry Christmas!"); return; //Prints.
                }
            throw new NotChristmasException(); //Errors/Crashes the program.
        }
    }
    class NotChristmasException : Exception { } //Holiday exception, hooray!
}

Nie możesz nadać programowi krótszej nazwy klasy?
Kritixi Lithos,

Możesz usunąć niektóre bajty, zmieniając „NotChristmasException” na coś krótszego.
Leo

@FishProHD NotChristmasExceptionJest tylko w wariancie bez golfa.
devRicher

@KritixiLithos Dzięki, zmieniłem to.
devRicher

1
if(d.Day==25&&d.Month>11)Console.Write(...);else throw new Exception()uwaga połączone if i usuwanie szelki wokół Console.Writei wymienić returnz else. Zmień także var d=DateTime.Now, aby pozbyć się wyjątku rzucania, być może args[-1];po zmianie nazwy argumentów na atak a[-1];(tak więc nie jest to identyczne z dzieleniem przez zera używane gdzie indziej)
pinkfloydx33

0

Mathematica, 46 bajtów

If[Today[[1,2;;]]=={12,25},"Merry Christmas!"]

Nowoszczędza 2 bajty ponadToday
Kelly Lowder

Ponadto potrzebujesz awarii w wyniku False, więc myślę, że coś takiego powinno Quit[]lub 1/0powinno wystarczyć.
Kelly Lowder

0

Common Lisp, 140

(let((m(multiple-value-list(decode-universal-time(get-universal-time)))))(if(and(eq(nth 3 m)25)(eq(nth 4 m)12))(write"Merry Christmas")(c)))

Awaria z niezdefiniowaną funkcją, jeśli data nie jest prawidłowa.


0

awk, 29 bajtów (+ długość („Wesołych świąt”))

v=1225==strftime("%m%d")||1/0

Uruchamianie:

$ echo Merry xmas | awk 'v=1225==strftime("%m%d")||1/0'
awk: cmd. line:1: (FILENAME=- FNR=1) fatal: division by zero attempted

Sezonowe powitanie jest przekazywane awk. strftimezwraca miesiąc + dzień (na przykład 1226) i jeśli pasuje, 1225 $0rekord jest generowany. Wynik porównania 1225==1226jest ustawiany na vvar, który służy do podzielenia 1, jeśli porównanie daty się nie powiedzie.


0

Haskell, 116

Występuje awaria z „Niewyczerpującymi wzorami w funkcji f”, jeśli nie jest to Boże Narodzenie.

import Data.Time
f(_,12,25)="Merry Christmas"
main=getZonedTime>>=print.f.toGregorian.localDay.zonedTimeToLocalTime

Niestety nie ma żadnej funkcji, która pozwala od razu uzyskać czas w przydatnym formacie, więc większość z nich to konwersja formatów daty.


0

C #, 122 104 bajty

18 bajtów zapisanych dzięki @raznagul

using System;i=>{if(DateTime.Now.AddDays(7).DayOfYear==1)Console.Write("Merry Christmas");else{i/=0;};};

Dodaje 7 dni do bieżącego dnia i sprawdza, czy jest to pierwszy dzień roku, jeśli tak, wyświetla „Wesołych Świąt”, w przeciwnym razie dzieli przez zero.


To returnnie jest konieczne. Użyj izamiast ().
raznagul

0

Rubinowy, 69 bajtów

if Time.now.strftime("%j")=="360";puts "Merry Christmas";else 0/0;end

Działa w 2016 r. Nie rozróżnia lat normalnych i przestępnych, może wymagać korekty w odniesieniu do lat innych niż przestępne.


0

ForceLang, 180 bajtów

set s datetime.toDateString datetime.now()
set t "Dec 25"
def c s.charAt i
def d t.charAt i
set i -1
label 1
set i 1+i
if i=6
 io.write "Merry Christmas!"
 exit()
if c=d
goto 1
z.z

(Pamiętaj, że datetime.toDateStringjest to zależne od ustawień regionalnych, więc może nie działać w zależności od ustawień regionalnych)


0

C #, 90 bajtów

using System;Console.Write(new[]{"Merry Christmas"}[DateTime.Now.AddDays(7).DayOfYear-1]);

Zgłasza wyjątek IndexOutOfRangeException, jeśli nie jest to Boże Narodzenie.

Wypróbuj tutaj!


0

wiersz poleceń bash, 45 48 49 48 bajtów

date +%m%d|grep -q 1225&&echo Merry Christmas||!-
date +%m%d|grep -q 1225||!-;echo Merry Christmas

Podobne do Mitchella Spectora , ale używaj go grepw trybie cichym, aby sprawdzić dopasowanie, a następnie &&upewni się, że drukuje tylko po sukcesie i ||powoduje, że sprawdza historię !-, co daje mi to:

-bash: !-: event not found

I zatrzymuje wykonywanie, jak !- ; echo foopokazuje. bashDokumentacja mówi, że!-n odnosi się do bieżącego polecenia minus n, więc być może jest on interpretowany jako !-0, co daje komunikat o błędzie identyczne (i nie zlokalizowane).


Dobry pomysł, ale nie dzieje się tak w inne dni niż Boże Narodzenie, tak jak powinno, prawda?
Mitchell Spector,

Teraz wyświetla błąd przy awarii.
Ken YN

1
Wyświetla komunikat o błędzie, ale kontynuuje; tak naprawdę nie ulega awarii. Jeśli wymienisz. z $ {} wtedy właściwie się zawiesi, po prostu drukując komunikat o błędzie i kontynuując. Myślę, że zawieszanie się wymaga zakończenia programu w tym momencie. Możesz powiedzieć, że twoje nie kończy się, umieszczając dodatkowy „; echo x” na końcu i widząc, że zostanie wykonany. (Dlatego użyłem $ {} zamiast. W mojej odpowiedzi.) Nie wiem, czy jest jakaś sekwencja 1- lub 2-znakowa, która może spowodować awarię.
Mitchell Spector,

@ MitchellSpector: Znalazłem 2-znakową sekwencję!
Ken YN

A teraz wracam do 48, zmieniając logikę, więc mogę używać ;zamiast ||.
Ken YN
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.