Herkese Mutlu Golfmas!


35

Herkese Noel ve işte kutlamak için bir kod golf mücadelesi. Bir hediye yazdırmak için bir program yapmanız gerekir. Özellikle, "Mutlu Noeller" kelimeleri. AMA, bir yakalamak var: bu program sadece 25 Aralık ise çalışması gerekir. Kod başka bir günde çalıştırılırsa, programın çökmesi gerekir.

Bu Code-Golf, bu yüzden en az sayıda bayt olan cevap kazanıyor.

Mutlu Noeller!


5
Evet, bu ermmmmm idi. .. evet 25 üzgünüm
Leo,


3
Golfy Kodemleri ! :)
Luis Mendo

1
Hayır, çarpışma olmalı. Başvuruyu bırakamazsın
Leo

2
@PhiNotPi Bu zorluklar farklı. Bu bir geri sayım istemiyor ve sonuç vermek için beklemeyi de içermiyor
Leo

Yanıtlar:


8

Pyke, 21 bayt

.dↄґ6C65h*325q/Al

Burada dene!

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

Veya 18 bayt rekabetçi değildir.

.dↄґ6Cs6Y1q/Al

Bu bölüm hariç tamamen aynı:

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

Burada dene!


Bu 30 Ekim ise başarısız olur, değil mi?
Sihirli Ahtapot Urn

1
@ carusocomputing 30 * (10+1)= 330 değil 325
Mavi

6

JavaScript, 55 53 46 bayt

Not: Bu yalnızca Google Chrome'da test edilmiştir, program tarayıcıdan tarayıcıya (veya cihazdan cihaza) farklı davranabilir

@ ConorO'Brien sayesinde 2 bayt kaydedildi

@ETHProductions sayesinde 7 bayt kurtardı

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

Uncaught ReferenceError: a is not definedTarih değilse, ile çıkar Dec 25. Bunun kilitlenme sayıldığından emin değilim.

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


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

@ ConorO'Brien Teşekkürler! Bu akıllı :)
Kritixi Lithos 25:16

@ETProductions Biten herhangi bir gün veya ayı düşünemiyorum c( Octyaklaşıyor, ancak hala regex'i tatmin etmiyor). Bahşiş için teşekkürler!
Kritixi Lithos

Bunun sonucu Date()tamamen uygulamaya bağlıdır. Örneğin, makinenin diline ve konumuna göre değişmesini bekliyorum.
Oriol

@Oriol O zaman cevabımdaki tarayıcıyı belirleyeceğim
Kritixi Lithos

5

Python 3, 66 63 bayt

JavaScript / ES cevaplarından gelen fikirler sayesinde bazı baytları sıkmayı başardım. Sözlük dizin - varolmayan anahtarlar a yükseltir KeyError. Aşağıdaki kod yerel saat diliminde çalışır

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

İçin çıktı biçimi ctimeyerel bağımlı değildir - biçim her zaman ~ dir 'Sun Dec 25 19:23:05 2016'. 3 Aralıklı kısaltmanın yalnızca Aralık ayında bitmesi nedeniyle c, burada kullanılması güvenlidir 'c 25'in time.ctime().


Önceki versiyon:

Bu UTC saat diliminde çalışır. Yerel saat dilimi s/gm/localiçin 3 bayt daha gerekir. Python 2 printiçin parantez 65 byte'dan çıkarılabilir .

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

Yapı KeyErrordiğer tarihlere atar :

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

Bu diğer günlerde çöküyor mu (olması gerekiyordu)?
Erresen

2
Bu anahtar olarak tuple itiraz gibi çalıştırmak için alamadım Çevrimiçi deneyin! . import time;print{'2512':'Merry Christmas'}[time.strftime("%d%m")]Python 2 olarak değiştirir ve etiketlerseniz, hala 66 bayttır ve 25 Aralık dışındaki tarihlerde
KeyError

@ElPedro ayy: D olmalıydı 1:3, test kodumu kazara kopyaladım
Antti Haapala

gmtime()Cevabım için fikrinizi ödünç aldığımda bunu öğrendim . Umarım sakıncası yok :-)
ElPedro

5

PHP, 39 38 bayt, rakip değil (çökmez)

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

veya

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

veya

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

Biri 4 byte golf oynayabilir date(Lz)%1001-358mi? : D
Titus

3
Bu çöküyor mu?
edc65

Size ""2 Byte kazandıran ilk kodda bırakabilirsiniz . Lanet Artık yıllarda olmasaydı, sen değiştirerek 2 Byte daha kurtarabilecek mdtarafından zve 122525 Aralık yılı gününe sayısına göre.
UTF-8

1
Bir alternatif: eval((date(md)^TQZZ).'"Merry Christmas";');(43 byte)
Ismael Miguel,

1
@ UTF-8: Haklısın. Ben çoğunlukla Elvis'i boole değerleri için kullanırım; ve bu yazdıracaktı 1. Bu hesaplamanın sonucunu basacaktır. ve 0104-12251121.
Titus

4

Python 2 , 68 67 65 bayt

-Muddyfish sayesinde -1

Başka bir çift kurtardı fikri için @ AnttiHaapala için teşekkürler.

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

Çevrimiçi deneyin!

25 Aralık değilse, bir IndexError atar.

Artık olmayan yıllar için çalıştığı için 59 byte için rakipsiz sürüm (bu yıl 360 olan, artık yıllarda 361 olan yılın gününü kullanır)

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

Bayt yerine bir liste kullanarak bayt kaydedemez misiniz?
Blue

@muddyfish Teşekkürler, iyi yakala.
ElPedro

Güzel, fikrim 2 fazladan bayt oldu : P
FlipTack

Teşekkürler. Ayrıca @AnttiHaapala'nın cevabını yorumlayana ve birkaçını gmtime()tıraş etmeyi düşündüğüme kadar 67 byte versiyonum da vardı . İtiraf etmeliyim ki, keşke yılın fikirleri ile yapabileceğim daha fazla şey olsaydı.
ElPedro

1 byte ile kaydedebilirsiniz: time.ctime () [6:10]! = 'C 25'
Max

4

R, 52 61 58 bayt

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

Mevcut tarih 25 Aralık değilse, üçüncü bir argüman verilmediği için bir hata döndürülür if.

Düzenleme: Aptalca bir hata düzeltildi


Küçük yazıcım için üzgünüm. 25tg demek istedim
Leo

Bu sadece bu yıl çalışıyor!
Erresen

@Erresen Ah doğru aptal hata. Şimdi olsa düzeltildi.
Billywob

4

Buradaki ilk seferim ... Bu iş için şimdiye kadarki en iyi dille başladım:

Java, 200 188 bayt (@Daniel Gray sayesinde), "bay" ı baskıdan kaldıran 186 bayt.

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

Burada dene!


1
PPCG'ye Hoşgeldiniz! Güzel ilk mesaj, Java oldukça kısa olmasa da.
Rɪᴋᴇʀ

1
Değişebilirsin Calendariçin *ve bir kaç bayt tasarruf. Ayrıca argsana yöntemde parametrenin adını kısaltabilirim, sanırım ...
Daniel Gray

@ Daniel Gri, Kesinlikle haklısın, teşekkürler!
Bonifacio

1
Hoşgeldiniz! "Genel sınıf" ı "arabirim" ile değiştirirseniz ve genel değiştiriciyi ana sayfadan kaldırırsanız, "arabirim" {statik geçersiz ana ... "yaparsanız, 10 bayt kaydedebilirsiniz. Ancak bu, Compilejava'nın çalışmasını engeller internet üzerinden.
Zavada

3

MATL , 34 33 bayt

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

Bu dilin güncel sürümünde (19.7.0) çalışır . Hataya neden olmak için, aşağıdaki kod bir dizgenin logaritmasının bir hata vermesi gerçeğinden faydalanır (gelecek sürümlerde bu değişebilir).

Çevrimiçi deneyin!

açıklama

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

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

Açıklama:

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

Bu Amerikan MM-DDtarih gösterimini varsayar . Sonunda QBIC'de bir Substring işlevi yaparsam bu daha kısa olacaktır.


Noel olmayan günlerde ne olur? Olması gerektiği gibi çöküyor mu?
Erresen

@Erresen şimdi yapar.
steenbergh

3

05AB1E ,32 21 bayt

Adnan'ın string sıkıştırması sayesinde 11 bayt kaydedildi :).

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

açıklama

 ž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

Çevrimiçi deneyin!

Aklıma ilk önce gelenleri yaptım, bu yüzden bunun için daha iyi yaklaşımlar olabilir. Ancak PPCG, 05AB1E'de Mutlu Noeller de hak ediyor;).


Ayrıca, xyinelenen kısa ve çift :).
Adnan

3

C # / CS Komut Dosyası 106 100 99 bayt

99 baytlık çözüm

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

Burada dene!

100 baytlık çözüm (bunu tercih edin ... biraz farklı)

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

Açıklaması:

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==1bir bayttan daha kısa, DateTime.Now.ToString("ddMM")=="2512"ancak 1 bayttan daha uzunDateTime.Now.ToString("dM")=="2512"


1
Kullanabilirsiniz $"{DateTime.Now:dM}"=="2512". dMbelirsiz, ancak "2512" için değil.
Kobi

@Kobi CS Script için string interpolasyon kullanamıyorum :(
Erresen

1
Eğer LinqPad kullanıyorsanız (ör. $"{DateTime.Now:dM}"=="2512"?"Merry Christmas":1/1-1+""55 bytes) =)
Kenneth K.

Neden int ive değil 1/0?
NoOneIsHere

1
@Erresen Ah, benim hatam. Yeterince sınamadım. Tweaked: $"{DateTime.Now:dM}"=="2512"?"Merry Christmas":"".Remove(1)(59 bayt)
Kenneth K.

2

C # / CS Script, 96 Bayt, Çoğunlukla Erresen'den alıntılanmış

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

int iBildirimi, bölümü zorlayan kodlamanın lehine siler . Bunu yorum olarak bırakacaktım, ama itibarım yok.


PPCG'ye Hoşgeldiniz! Güzel ilk mesaj! Yorum / cevap konusunda endişelenmeyin, çok da önemli değil.
Rɪᴋᴇʀ

2

bash + Unix yardımcı programları, 51 49 47 bayt

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

* Yankıdaki tırnakların kaldırılabileceğini belirten @ KenY-N ve durum boyutunu 2 bayt azaltmak için @IporSircer öğesine teşekkürler.


Bu bana bash: ${}: bad substitutionhata veriyor . Ayrıca iki bayttan tasarruf etmek için Merry Christmas'dan alıntıları bırakabilirsiniz . Dahası, benim[ `date +%m%d` = 1225 ]&&echo Merry Christmas için çalışıyor, 45 baytım eşittir .
Ken YN,

1
@ KenY-N Hata kasıtlı: programın Noel dışındaki günlerde çökmesi bekleniyor . Yankıdaki alıntıların düşebileceğini belirttiğiniz için teşekkür ederiz; Onu özledim.
Mitchell Spector,

Maalesef, bu şartı kaçırdım! Tarih dizesini değiştirerek test edildi ve artık çarpışmadığını görüyorum. Cevabımı sildim ... Ama bir alternatifim var, o yüzden güncellememe izin ver.
Ken YN,

Beni bir bayt yenmek için ${}ile değiştirmeyi deneyin !-. Kazandıkça seni büyüteceğim.
Ken YN,

1
@ KenY-N Teşekkürler, ama $ {} 'i değiştirmeyeceğim! - ikincisinin sadece komut satırında doğru çalışacağını düşünüyorum, çünkü bir komut dosyasında değil (tarih değiştirme özelliğini açmazsanız, ki bu ek olarak alınacaktır) karakter).
Mitchell Spector,

1

Groovy, 57 bayt

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

25.12 dışındaki tarihlerde çarpışmalar. ile groovy.lang.MissingPropertyExceptionçünkü btanımlı değil.


1

Yığılmış , 42 bayt

Burada dene!

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

Bu, yani içeren tek elemanlı bir dizi oluşturur 'Merry Christmas!'. Daha sonra, tarihi gün takip eden ayın bulunduğu bir dizgeye yerleştirir. '1225'(Noel) ile eşitliği kontrol eder , onu ters çevirir ¬, daha sonra bu üyeyi önceki diziden alır. Noel değilse, bu bir dizin hatasıyla hata verir. Aksi takdirde, yazdırır Merry Christmas. (Diğer günlerde nasıl çalıştığını görmek için dizedeki tarihi değiştirin.)


1

Toplu iş, 66 bayt

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

Sondaki yeni satır, ififadenin ayrıştırılmasının başarısız olmasına neden olduğu için önemlidir . Yerel tarih biçiminize uyması için tarih kontrolünü ince ayar yapmanız gerekebilir.


1

Python 2, 69 77 75 veya 72 70 Bayt

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

Noel olduğunda bir hatayla çıkıp çıkmaması önemli değilse, o zaman:

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

DÜZENLE:

Bir hatayı düzeltmem gerektiğini belirttiğim için teşekkürler @ Flp.Tkc

Strftime işlevinden virgüllerin çıkarılmasını işaret etmek için @Max'tan gelen -2 bayt


1
Noel değilse çökmesi gerekiyordu, bu normal bir şekilde çıkıyor.
FlipTack

> '% D% m' == '2512' - Sen 2 byte iki nokta üst üste çıkarmadan kaydedebilirsiniz
Maksimum

@Max Tamam, bahşiş için teşekkürler. Daha önce bu işlevi kullanmamıştım, bu yüzden bunu yapmayı düşünmemiştim
sonrad10

time.ctime () [06:10] == 'C 25' ile bir 3 bayt kaydetmek
Azami

1

CJam, 28

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

Çevrimiçi deneyin

Açıklama:

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 bayt

Kritixi Lithos sayesinde 8 bayt kaydedildi

Yine Kritixi Lithos sayesinde 1 bayt kaydedildi;)

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

Alternatif, etiketsiz değişken:

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

Programa daha kısa bir sınıf adı veremez misin?
Kritixi Lithos

"NotChristmasException" u daha kısa bir değere değiştirerek bazı baytları kaldırabilirsiniz.
Leo,

@FishProHD Bu NotChristmasExceptionsadece ungolfed varyantındadır.
devRicher

@KritixiLithos Teşekkürler, bunu değiştirdi.
devRicher

1
if(d.Day==25&&d.Month>11)Console.Write(...);else throw new Exception()tablo ve çevresinde parantez çıkarılması durumunda not kombine Console.Writeve değiştirme returnile else. Ayrıca değiştirmek var d=DateTime.Nowbelki birlikte istisna atmak kurtulabilirsiniz args[-1];için args yeniden adlandırma sonra aöylesine a[-1];(başka yerde kullanılan sıfır bölün bu yüzden aynı olmayan)
pinkfloydx33

0

Mathematica, 46 bayt

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

Now2 Bayt bittiToday
Kelly Lowder

Ayrıca, Yanlış sonuçta bir çökmeye ihtiyacınız var, bu yüzden bence bir şey yeter Quit[]ya da 1/0yeter.
Kelly Lowder

0

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

Tarih doğru değilse tanımsız işlevi olan kilitlenmeler.


0

awk, 29 bayt (+ uzunluk ("Merry xmas"))

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

Çalıştırılıyor:

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

Sezon selamlaması yapıldı awk. strftimeay + günü döndürür (örneğin 1226) ve eğer 1225 $0kayıtla eşleşirse çıktı alınır. Karşılaştırma sonucu , tarih karşılaştırması başarısız olursa 1'i bölmek için kullanılan var değerine 1225==1226yerleştirilir v.


0

Haskell, 116

Noel değilse, "f işlevinde ayrıntılı olmayan desenler" ile kilitleniyor.

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

Ne yazık ki, zamanı hemen faydalı bir biçimde almanıza izin veren bir işlev yoktur, bu nedenle bunların çoğu tarih biçimlerini dönüştürür.


0

C #, 122 104 bayt

@Raznagul sayesinde 18 bayt kurtarıldı

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

Geçerli güne 7 gün ekler ve yılın ilk günü olup olmadığını kontrol eder, evet ise "Mutlu Noeller" gösterir, aksi takdirde sıfıra bölünür.


returnGerekli değildir. Yerine ikullanın ().
raznagul

0

Ruby, 69 bayt

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

2016'da çalışır. Normal ve artık yıllar arasında ayrım yapmaz, artık olmayan yıllar için ayarlanması gerekebilir.


0

ForceLang, 180 bayt

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

( datetime.toDateStringYerel ayarlara bağlı olduğunu unutmayın , bu nedenle yerel ayarınıza bağlı olarak çalışmayabilir)


0

C #, 90 bayt

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

Noel değilse IndexOutOfRangeException öğesini atar.

Burada dene!


0

bash komut satırı, 45 48 49 48 bayt

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

Mitchell Spector’a benzer şekilde , ancak grepbir eşleşmeyi kontrol etmek için sessiz modda kullanın, ardından &&yalnızca başarıya yazdırıldığından ve ||geçmişe bakmasına neden !-olan, bana şunu veren:

-bash: !-: event not found

Ve !- ; echo foogösterdiği gibi yürütmeyi durdurur . bashBelgeler söylüyor !-ngeçerli komut eksi belirtir nşekilde belki de yorumlanır, !-0bir özdeş olabilir (ve lokalize olmayan) bir hata mesajı verir.


İyi fikir, ama bu Noel'den başka günlerde çökmez, olması gerektiği gibi değil mi?
Mitchell Spector,

Şimdi başarısızlıkta hata veriyor.
Ken YN,

1
Bu bir hata mesajı basar ancak devam eder; aslında çökmez. Değiştirirseniz. $ {} ile sonra aslında basitçe bir hata mesajı yazdırmak ve devam etmek çökecek. Bence çökme, programın bu noktada sonlandırılmasını gerektiriyor. Sizinkinin sonuna "" echo x "koyarak ve idam edildiğini görerek sona ermediğini söyleyebilirsiniz. (Bu yüzden cevabım yerine $ {} kullandım.) Gerçek bir çarpışmaya neden olacak bir 1 veya 2 karakter dizisi olup olmadığını bilmiyorum.
Mitchell Spector,

@ MitchellSpector: 2 karakter dizisi buldum!
Ken YN,

Ve şimdi mantığı değiştirerek 48'e geri dönelim, böylece ;yerine kullanabilirim ||.
Ken YN,
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.