メリー・ゴルフマス、みんな!


35

それは皆クリスマスです、そしてここに祝うべきコードゴルフの挑戦があります。プレゼントを印刷するプログラムを作成する必要があります。具体的には、「メリークリスマス」という言葉。ただし、キャッチがあります。このプログラムは、12月25日の場合にのみ機能する必要があります。コードが他の日に実行された場合、プログラムはクラッシュするはずです。

これはCode-Golfなので、バイト数が最小の答えが勝ちです。

メリークリスマス!


5
ええ、えーと。..ええ25日ごめん
レオ


3
ゴルフィーコードマス!:)
ルイスメンドー

1
いいえ、クラッシュする必要があります。アプリケーションを終了することはできません
レオ

2
@PhiNotPiこれらの課題は異なります。これはカウントダウンを要求するものではなく、出力を待機する必要もありません
レオ

回答:


8

Pyke、21バイト

.dↄґ6C65h*325q/Al

ここで試してみてください!

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

または18バイトの非競合。

.dↄґ6Cs6Y1q/Al

このセクション以外はまったく同じです:

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

ここで試してみてください!


10月30日の場合、これは失敗しますか?
魔法のタコUr

1
@carusocomputing 30 * (10+1)= 330ない325
ブルー

6

JavaScript、55 53 46バイト

注:これはGoogle Chromeでのみテストされており、プログラムはブラウザごとに(またはデバイスごとに)動作が異なる場合があります

@ ConorO'Brienのおかげで2バイト節約

@ETHProductionsのおかげで7バイト節約

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

Uncaught ReferenceError: a is not defined日付がでなければ終了しますDec 25。これがクラッシュとしてカウントされるかどうかは本当にわかりません

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


どう.slice(6,10)=="c 25"
コナーオブライエン

@ ConorO'Brienありがとう!それは賢いです:)
Kritixi Lithos

@ETHproductionsで終わる日も月も思いつきませんcOct近づいていますが、まだ正規表現を満たしていません)。ヒントをありがとう!
Kritixi Lithos

結果Date()は実装に完全に依存します。たとえば、マシンの言語と場所によって異なることが予想されます。
オリオール

それから私は私の答えでブラウザを指定します@Oriol
KritixiのLithos

5

Python 3、66 63バイト

ここでのJavaScript / ESの回答のアイデアのおかげで、なんとかバイトを圧縮できました。辞書に索引を付けます-存在しないキーはを発生させますKeyError。次のコードはローカルタイムゾーンで動作します

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

の出力形式ctimeはロケールに依存しません-形式は常に〜'Sun Dec 25 19:23:05 2016'です。3文字の略語は12月にのみ終わるcため、使用しても安全です。'c 25'in time.ctime()ここでです。


前のバージョン:

これはUTCタイムゾーンで機能します。ローカルタイムゾーンでは、s/gm/localさらに3バイト必要です。Python 2の場合、print65バイトの括弧を削除できます。

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

コンストラクトはKeyError他の日付にスローされます:

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

これは他の日にクラッシュしますか?
エレセン16

2
キーとしてタプルに反対するため、これを実行できません。オンラインで試してみてください!。あなたはそれを変更した場合import time;print{'2512':'Merry Christmas'}[time.strftime("%d%m")]はPython 2とラベルを付け、それはまだ66のバイトだと12月25日以外の日にKeyError例外でクラッシュ
ElPedro

@ElPedro oops:Dであるべきでしたが1:3、偶然にテストコードをコピーしました
アンティハパラ

gmtime()私が答えにあなたのアイデアを借りたとき、それを取り上げました。気にしないでください:-)
ElPedro

5

PHP、39 38バイト、競合しない(クラッシュしない)

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

または

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

または

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

誰でも4バイトオフでゴルフできますdate(Lz)%1001-358か?:D
タイタス

3
これはクラッシュしますか?
edc65 16

あなたは省くことができ""、あなたに2バイトを節約する最初のコードで。うるう年でない場合は、12月25日の日付で置き換えることmdによりz、さらに2バイト節約できます1225
UTF-8

1
代替案:eval((date(md)^TQZZ).'"Merry Christmas";');(43バイト)
イスマエルミゲル

1
@ UTF-8:そのとおりです。私は主にブール値にエルビスを使用します。そして、それは印刷されます1。これにより、計算の結果が出力されます。そして0104-12251121です
タイタス

4

Pythonの268の 67 65バイト

-1 @muddyfishのおかげで

@AnttiHaapalaに別のカップルを救ったアイデアをありがとう。

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

オンラインでお試しください!

12月25日でない場合、IndexErrorをスローします。

うるう年以外でのみ機能するため、59バイトの非競合バージョン(今年は360で、うるう年は361を使用)

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

タプルの代わりにリストを使用してバイトを保存できませんか?
ブルー

@muddyfishありがとう、良いキャッチ。
エルペドロ16

いいですね、私のアイデアは余分な2バイト
でした

ありがとう。@AnttiHaapalaからの回答にコメントし、gmtime()カップルを削除することを考えたまで、これは私の67バイトバージョンでもありました。私は認めなければなりません、しかし、私はその日のアイデアでもっとできることがあればいいのにと思います。
エルペドロ16

time.ctime()[6:10]!= 'c 25'
Max

4

R、52 61 58バイト

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

現在の日付が12月25日でない場合、3番目の引数がに提供されないため、エラーが返されifます。

編集:愚かなエラーを修正


私のちょっとしたタイプミスについてすみません。私は25tgと言うつもりだった
レオ

ただし、これは今年のみ有効です!
エレセン16

@Erresenああ、愚かな間違い。ただし、現在は修正されています。
ビリーウォブ16

4

この辺りで初めて...この仕事で最高の言語で始めました:

Java、200 188バイト(@Daniel Grayのおかげ)、186バイトで印刷から「ln」を削除。

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");}}

ここで試してみてください!


1
PPCGへようこそ!最初の投稿は、javaが最短ではないにもかかわらずです。
Rɪᴋᴇʀ

1
Calendarfor *を変更して、数バイトを保存できます。あなたはまたの名前を短くする可能性がargs...私が思うに、mainメソッドのパラメータを
ダニエル・グレー

@ダニエルグレイ、あなたは絶対に正しいです、ありがとう!
ボニファシオ

1
Welcome! You can save 10 bytes if you replace "public class" with "interface" and remove the public modifier from main, making it "interface a{static void main..." This, however, will prevent Compilejava from being able to run it online.
Zavada

3

MATL, 34 33 bytes

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

This works in current version (19.7.0) of the language. To cause the error, the following code exploits the fact that the logarithm of a string gives an error (this may change in future versions).

Try it online!

Explanation

'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 bytes

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

Explanation:

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

This assumes American MM-DD date notation. This would be shorter if I'd finally make a Substring function in QBIC.


What happens on days that aren't Christmas? Does it crash as it's supposed to?
Erresen

@Erresen it does now.
steenbergh

3

05AB1E, 32 21 bytes

Saved 11 bytes thanks to Adnan's string compression :) .

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

Explanation

 ž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

Try it online!

I did what came to mind first, so there may be better approaches for this one. But PPCG deserves a Merry Christmas in 05AB1E as well ;) .


Also, x is short for duplicate and double :).
Adnan

3

C# / CS Script 106 100 99 bytes

99 byte solution

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

Try it here!

100 byte solution (prefer this one... a bit different)

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

Explained:

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==1 is one byte shorter than DateTime.Now.ToString("ddMM")=="2512" but 1 byte longer than DateTime.Now.ToString("dM")=="2512"


1
You can use $"{DateTime.Now:dM}"=="2512". dM is ambiguous, but not for "2512".
Kobi

@Kobi I can't use string interpolation for CS Script :(
Erresen

1
You can if you use LinqPad (e.g. $"{DateTime.Now:dM}"=="2512"?"Merry Christmas":1/1-1+"" 55 bytes) =)
Kenneth K.

Why int i and notjust 1/0?
NoOneIsHere

1
@Erresen Ah, my mistake. I didn't test thoroughly enough. Tweaked: $"{DateTime.Now:dM}"=="2512"?"Merry Christmas":"".Remove(1) (59 bytes)
Kenneth K.

2

C#/CS Script, 96 Bytes, Mostly Plagiarized from Erresen

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

Deletes the int i declaration in favor of hard coding the division. I would leave this as a comment but don't have the reputation.


Welcome to PPCG! Nice first post! Don't worry about the comment/answer thing, it doesn't matter too much.
Rɪᴋᴇʀ

2

bash + Unix utilities, 51 49 47 bytes

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

*Thanks to @KenY-N for pointing out that the quotes in the echo can be removed, and to @IporSircer for reducing the condition size by 2 bytes.


That gives me bash: ${}: bad substitution error. Also you can drop the quotes from Merry Christmas to save two bytes. Furthermore, [ `date +%m%d` = 1225 ]&&echo Merry Christmas works for me, equalling my 45 bytes.
Ken Y-N

1
@KenY-N The error is intentional: the program is supposed to crash on days other than Christmas. Thank you for mentioning that the quotes in the echo can be dropped; I missed that.
Mitchell Spector

Oops, missed that requirement! Tested out by changing the date string, and I see now that it doesn't crash. Deleted my answer... But, I have an alternative, so let me update it.
Ken Y-N

Try replacing ${} with !- to beat me by one byte. I'll upvote you as you win.
Ken Y-N

1
@KenY-N Thanks, but I'm not going to change ${} to !- since I think the latter will only work correctly on the command line, not in a script (unless you turn history substitution on, which would take additional characters).
Mitchell Spector

1

Groovy, 57 bytes

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

Crashes on dates other than 25.12. with groovy.lang.MissingPropertyException because b is not defined.


1

Stacked, 42 bytes

Try it here!

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

This creates a single-element array containing namely 'Merry Christmas!'. After, it puts the date into a string with the month followed by the day. It checks for equality with '1225' (Christmas), inverts it with ¬, then gets that member from the preceding array. If it isn't Christmas, this will error with an index error. Otherwise, it prints Merry Christmas. (Change the date in the string to see how it works on other days.)


1

Batch, 66 bytes

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

The trailing newline is significant, as it causes parsing of the if statement to fail. You may need to tweak the date check to match your local date format.


1

Python 2, 69 77 75 or 72 70 Bytes

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

If it doesn't matter if it exits with an error when it is Christmas, then:

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

EDIT:

Thanks @Flp.Tkc for pointing out that I needed to raise an error

-2 Bytes from @Max for pointing out about removing colons from the strftime function


1
It's meant to crash if it's not Christmas, this just exits normally.
FlipTack

You can save 2 bytes removing the colons --> '%d%m' == '2512'
Max

@Max OK, thanks for the tip. I hadn't used this function before, so I hadn't thought of doing that
sonrad10

save another 3 bytes with: time.ctime()[6:10]=='c 25'
Max

1

CJam, 28

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

Try it online

Explanation:

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 bytes

Saved 8 bytes thanks to Kritixi Lithos

Saved 1 byte thanks to Kritixi Lithos, again ;)

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

Alternative, ungolfed variant:

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!
}

Can't you give the program a shorter class name?
Kritixi Lithos

You could remove some bytes by changing the "NotChristmasException" to something shorter.
Leo

@FishProHD The NotChristmasException is only in the ungolfed variant.
devRicher

@KritixiLithos Thanks, changed that.
devRicher

1
if(d.Day==25&&d.Month>11)Console.Write(...);else throw new Exception() note combined if statements and removal of braces around the Console.Write and replace return with else. Also change var d=DateTime.Now you can get rid of exception throw with perhaps args[-1]; after renaming args to a so a[-1]; (this so not identical to divide by zeros used elsewhere)
pinkfloydx33

0

Mathematica, 46 bytes

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

Now saves 2 Bytes over Today
Kelly Lowder

Also, you need a crash in the False outcome, so I think something like Quit[] or 1/0 should suffice.
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)))

Crashes with undefined function if the date isn't right.


0

awk, 29 bytes (+ length("Merry xmas"))

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

Running it:

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

Season greeting is piped to awk. strftime returns month+day (for example 1226) and if it matches 1225 $0 record gets outputed. Result of comparison 1225==1226 is placed to v var which is used to divide 1 if the date comparison fails.


0

Haskell, 116

Crashes with "Non-exhaustive patterns in function f" if it's not Christmas.

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

Unfortunately, there's no function that allows you to just immediately get the time in a useful format, so most of this is converting the date formats.


0

C#, 122 104 bytes

18 bytes saved, thanks to @raznagul

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

It adds 7 days to the current day, and checks if it is the first day of the year, if yes, it displays "Merry Christmas", otherwise it divides by zero.


The return is not necessary. Use i instead of ().
raznagul

0

Ruby, 69 bytes

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

Works in 2016. Doesn't differentiate between normal and leap years, may need to be adjusted for non-leap years.


0

ForceLang, 180 bytes

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

(Remember that datetime.toDateString is locale-dependent, so this may not work depending on your locale)


0

C#, 90 bytes

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

Throws IndexOutOfRangeException if it's not christmas.

Try it here!


0

bash command line, 45 48 49 48 bytes

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

Similar to Mitchell Spector's, but use grep in silent mode to check for a match, then && will ensure that it only prints on success, and the || causes it to look up history with !-, which gives me this:

-bash: !-: event not found

And it stops execution as !- ; echo foo demonstrates. The bash documentation says that !-n refers to the current command minus n, so perhaps it is being interpreted as !-0, which gives an identical (and non-localised) error message.


Good idea, but this doesn't crash on days other than Christmas, like it's supposed to, does it?
Mitchell Spector

It now gives an error on failure.
Ken Y-N

1
This prints an error message but it continues; it doesn't actually crash. If you replace the . with ${} then it will actually crash rather simply printing an error message and going on. I think crashing requires that the program be terminated at that point. You can tell that yours doesn't terminate by putting an extra ";echo x" at the end and seeing that it gets executed. (That's why I used ${} instead of . in my answer.) I don't know if there's some 1- or 2-character sequence you can use that will cause an actual crash.
Mitchell Spector

@MitchellSpector: I found a 2 character sequence!
Ken Y-N

And now back to 48 by switching the logic so I can use ; instead of ||.
Ken Y-N
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.