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.