Şükran Günü ne zaman?


38

Arka fon

Bazı tatiller, 31 Ekim, 25 Aralık, vb. Gibi sabit, hatırlaması kolay tarihlerdir. Ancak bazıları sıkıntılı olmak ister. "Eylül ayının ilk Pazartesi günü" veya "Kasım ayının dördüncü Perşembe" gibi şeyler olarak belirtiliyorlar. Bunun ne zaman olduğunu nasıl bilebilirim?

Tek bildiğim şükran gününün hızlı bir şekilde yaklaşmakta olduğu, bu yüzden ne zaman olduğunu anlamama yardımcı olacak bir programa ihtiyacım var. Bazı insanlar bile yarın olduğunu söylüyor, bu yüzden programınızın zamanında yeniden yazabilmem için mümkün olduğunca kısa olması gerekiyor.

Meydan okuma

Dört basamaklı bir yıla kadar (örneğin 2015 veya 1984) verilen, o yılki Birleşik Devletler Şükran Günü'nü veren veya veren bir program veya işlev oluşturun. Şükran günü , Wikipedia sayfasına göre Kasım ayının dördüncü Perşembe olarak tanımlanır . (İpucu: bu sayfa tarih düzeniyle ilgili bazı ilginç bilgiler de içerir.)

Giriş : Ortak Dönem'de (CE) bir yılı temsil eden maksimum dört basamaklı bir ondalık sayı. Örnekler: 987, 1984, 2101

Çıktı : Şükran Günü'nün o yıl içinde düştüğü veya varsa, ay ve günü içeren tarih. Bu herhangi bir makul formatta olabilir; En iyi kararını kullan. Gregorian Calendar'ı her durumda, o anda kullanılmamış olsa bile kullanın.

(Not: Artık yılların doğru kullanıldığından emin olun!)

Test senaryoları Giriş 1:

2015

Çıkış 1:

Nov 26

Giriş 2:

1917

Çıkış 2:

Nov 22

puanlama

Gönderimler bayt olarak puanlanacaktır . Bu web sitesini , bayt sayınızı takip etmenizi öneririm , ancak istediğiniz herhangi bir sayacı kullanabilirsiniz.

Bonuslar

Eğer puanları BCE ile ele alırsanız puanınızın % -25'i negatif sayılardır (ör. -480, Thermopylae savaşının yılı olur).

Negatif test durum girişi:

-480

Karşılık gelen çıktı:

Nov 25

Bu , yani en düşük puan kazanır!

Düzenleme: Thomas Kwa'nın TI-BASIC gönderimini kabul edildi olarak işaretliyorum. Bunun sizi yeni girdiler göndermekten caydırmasına izin verme!

Liderler

Burada hem düzenli bir lider tablosu hem de kazananların dile göre bir genel bakışını oluşturmak için bir Stack Snippet'i var.

Cevabınızın göründüğünden emin olmak için, lütfen aşağıdaki Markdown şablonunu kullanarak cevabınızı bir başlık ile başlatın:

# Language Name, N bytes

Gönderinizin Nbüyüklüğü nerede ? Puanınızı artırmak varsa, olabilir onları içinden vurarak, başlığa eski hesapları tutmak. Örneğin:

# Ruby, <s>104</s> <s>101</s> 96 bytes

Başlığınıza birden fazla sayı eklemek istiyorsanız (örneğin, puanınız iki dosyanın toplamı olduğundan veya tercüman bayrağı cezalarını ayrı ayrı listelemek istediğiniz için), gerçek puanın başlıktaki son sayı olduğundan emin olun :

# Perl, 43 + 2 (-p flag) = 45 bytes

Dil adını, daha sonra büyük afiş snippet'inde görünecek bir bağlantı da yapabilirsiniz:

# [><>](http://esolangs.org/wiki/Fish), 121 bytes


25
Şükran Günü'nün bu yıl ne zaman olacağını merak edenler için: Şükran günü yarın olacak.
TheNumberOne

6
Ama ben 10 Ekim'de şükran günü yaptım? Sorunun geciktiğini söylediğim için üzgünüm.
JimmyJazzx

5
@Downgoat İstediğiniz bayt sayacını kullanın. Kişisel olarak kullandığım ve tavsiye edebileceğim tek şey bu.
bkul

22
"Bazı tatiller, 31 Ekim, 25 Aralık gibi, hatırlanması kolay, sabit tarihleri ​​belirledi" Bu örnekler hatırlamaları kolaydır çünkü gerçekten aynı günlerdir: octal 31 == ondalık 25 ;-)
Adrian McCarthy

7
İkramiye yapan bir cevap için, -1 ile 1 arasında bir yıl olmalı mı, yoksa olmaz mı?
feersum

Yanıtlar:


40

TI-BASIC, 15 bayt * 0.75 = 11.25

TI-84 + hesap makinemde test edildi

1129-dayOfWk(Ans+ᴇ4,9,1

Şükran Günü 29 Kasım, eksi 1 Eylül haftası, 1 Pazar ve 7 Cumartesi. Bu formatta çıkar MMDD.

Test durumları: 2015-> 1126, 1917-> 1122, -480-> 1125doğrulandı. TI-BASIC, Gregoryen takvimini tüm tarihler için kullanıyor gibi görünüyor.

TI-BASIC olumsuz yılları desteklemiyor, ancak girdiye 10000 eklediğimiz için bu bonus alıyor. Gregoryen takviminin 400 yıllık bir dönemi olduğundan, bu haftanın gününü değiştirmez.


5
Kutsal bok xD Bunun işe yarayacağını hiç düşünmezdim, +1.
Addison Crump

10000 eklemek için iyi bir fikir. Güzel.
agtoever

23 Harf sayıyorum. Bu nasıl 15 bayt olabilir?
Stephan Schinkel

1
@StephanSchinkel TI-TEMEL hesap bellekte saklanan belirteçleri, burada tüm karakterleri inanıyoruz simgeleri için hariç olmak üzere 1 bayt olan kullanır dayofWK(ve Ans2 ve 1 her biri bayt olan.
FryAmTheEggman

Hesap makinesinde test ettin mi? vay.

23

PHP, 65 48 42 41 36 (+2 için -F) = 38 bayt

<?date(Md,strtotime("4thuXI$argn"));

İlk komut satırı argümanı olarak girdi alır. Kurallarımızca kabul edilebilir uyarılarla çalışır. Baskı NovDD, DDŞükran Günü nerede .

Çevrimiçi bağlantı yok, çünkü ideone komut satırını desteklemiyor ve bunu yapan bir çevrimiçi tercüman bilmiyorum.

Bana yeni bir numara öğrettiği için Alexander O'Mara'ya ve önemli bir indirim için primo'ya teşekkür ederim.


2
Bu Mathematica'dan daha komik.
lirtosiast

2
Hatta daha kısa @Tryth: "4thuXI". Yıl arasındaki boşluğu bile bırakabilirsiniz "4thuXI2015".
Alexander O'Mara

1
Komut satırı seçeneğini kullanarak -F, giriş kısaltılabilir "4thuXI$argn".
primo

3
Bekle, bu gerçekten işe yarıyor mu? Bu ... bu sadece ... Ben bile ...
ETHproductions 26:15

1
Benim için çalışıyor . Ben bu Mdişteyken, E_NOTICEdevre dışı bırakılmış alıntılara gerek yok .
primo

18

Mathematica, 59 38 bayt

DayRange[{#,11},{#,12},Thursday][[4]]&

+1 Zeki. Orada da WolframAlpha["Thanksgiving " <> #] &tarih bir dize olarak girilir nerede.
DavidC

WolframAlpha, 1863’teki ABD Şükran Günü’nü (Lincoln’un Kasım’ın Perşembe’nin LAST’de olduğunu ilan ettiği gün) geri veriyor. ABD, 1789'dan beri Şükran Günü'nü gözlemledi.
DavidC

@DavidCarraher Bununla birlikte, OP, programın en az 0 - 9999 CE
LegionMammal978

17

JavaScript (ES6), 42 40 31 bayt -% 25 = 23,25

a=>28.11-new Date(a,8).getDay()

"Herhangi bir makul biçimde" tarihi olabileceğinden, bu işlevi kullanır DD.MM. Bir TeaScript cevabını farklı bir teknikle yazdım , ancak bu formül daha kısaydı.

açıklama

Aylar sıfıra dayalı olduğu için, belirtilen yılın 1 Kasım’ını temsil eden new Date(a,10)bir Datenesne döndürür .

O zamandan getDay()itibaren haftanın gününü temsil eden bir sayı döndürdüğünden 0..6,

Su Mo Tu We Th Fr Sa 
0  1  2  3  4  5  6  
to to to to to to to
4  3  2  1  0  6  5  

sonra 22 ekleyin. Bu (11 - new Date(a,10).getDay()) % 7hile yapacağız ortaya çıkıyor . @Thomas Kwa'nın belirttiği gibi , bu 28-new Date(a,8).getDay()1 Eylül haftası günü 28 eksi ile aynıdır .


Güzel bir çözüm, ne kadar kısa olduğunu ve girişlerin çoğundan daha anlaşılır olduğunu seviyorum.
Marko Grešak 28:15

16

Japt , 43 37 36 35 29 bayt -% 25 = 21.75

Japt kısaltılmış versiyonudur Ja vaScri nk .

`{28.11-?w D?e(U,8).getDay()}

Hahaha, gerçekten hileli bir numara buldum : tercüman dizeleri içindeki tüm parantezleri görmezden gelir (kod eklemek için kullanılır), bunları açarken tüm kaynak kodunu bir bayt kaydetmek için sıkıştırabiliriz: D

İkisi ?, sırasıyla Unicode yazdırılamaz U + 0098 ve U + 0085 olmalıdır. Çevrimiçi deneyin!

Dekompresyondan sonra kod şöyle değerlendirilir:

"{28.11-new Date(U,8).getDay()}"

Hangi değerlendirir:

""+(28.11-new Date(U,8).getDay())+""

Hangi uygun çıktıyı verir.

İntrepidcoder tekniğini kullanır , biçiminde basar dd.mm. Olumsuz yılları doğru şekilde destekler. Önerilerinizi bekliyoruz!

Düzenleme: 2 Aralık'tan itibaren bu 11 baytlık kodu kullanabilirsiniz ( 8,25 puanla ):

28.11-ÐU8 e

(Keşke bunu daha önce uygulamış olsaydım!)


Çok iyi yapmışsın.
bkul

Bu şimdi vanilya JavaScript'ten daha uzun. Thomas Kwa'nın daha kısa bir formülü var .
intrepidcoder

@intrepidcoder Teşekkürler, düzeltildi.
ETHProductions

12

Vitsy , 44 bayt

Birlikte hesap yapıyorum saf mathemagics !

golfed:

VE2 * V2 V41m + Vaa * Dv1m-VV4 * 1 ay + 7M-baa * / + N
/ D1M-

Ungolfed (yöntem çağrısını okunabilir hale getirmek için ilk satıra taşıdı):

VE2 *, V2-V4 / D1M- + Vaa * DV / D1M - VV4 * / D1M- + 7M-baa * / + N

V Girişi son değişken olarak kaydedin.
 e2 * 28'i yığına itin.
    V Girişi yığına itin.
     2- İkisini çıkarın.
       V4 / D1M - Zemini alın (giriş / 4).
              + Toplamı ekleyin.
               Vaa * Dv / D1M - Zemini alın (giriş / 100) ve geçici olarak 100 tasarruf edin
                                    süreçte değişken.
                          - Toplamdan çıkarın.
                           Vv4 * / D1M - Zemini alın (giriş / 400).
                                    + Toplamı ekleyin.
                                     Yedi 7M Modulo.
                                       - Sonucu 28'den çıkar.
                                        baa * / + Ekle .11
                                              N Sayı olarak çıktı.

Muhtemelen bunun için daha iyi bir algoritma vardır (ve bu büyük olasılıkla korkunç golf), ama merak edenler için algoritmam buradan geliyor .

Çevrimiçi deneyin!

Hesaplamak ve tam olarak 42 bayta sahip olmak için bonus puanları alabilir miyim? Düşler mahvoldu.

@ Hosch250 'ye işaret ettiğim için teşekkürler, yanlış yapıyorum. : D Sabit.


2
Hayır ama benden +1 alıyorsunuz;)
Conor O'Brien

2016'da Şükran Günü 28 Kasım diyor. Gerçekten 24 Kasım.
Hosch250

@ Hosch250 Haklısın - şimdi düzeltildi.
Addison Crump,

10

Python, 38 * 0,75 = 28,5 bayt

lambda x:28.11-(x-2+x/4-x/100+x/400)%7

Bu, olumsuz yıllarla soruda belirtilen şekilde çalışır, ancak Gregoryen takviminde 0 yıl olmadığı için dikkatimi çekmiştir, bu nedenle bu davranış biraz şüphelidir.


1
Düşebilirsin f=.
feersum

1
Bu olumsuz tarihler için nasıl çalışır? Python'daki modulo negatifler için geçerli midir? : O
Addison Crump,

String reps kullanmak daha kısa olmalıdır,"Nov "+`...`
xnor

@ OyToClose Python modulo, ikinci argüman ile aynı işareti ile bir cevap verir. Böylece -40%7==2ama-40%-7==-5
quintopia

@quintopia Bekle, bekle, ben bir aptalım. Tamam. Bu mantıklı.
Addison Crump

10

JavaScript (ES6), 43,5

Gerçek bayt sayısı 58'dir. -25% bonusu uygulanır => 58 * 0.75 = 43.5

s=>new Date(s,10,(a=new Date(s,10).getDay())<5?26-a:a+21)

Herhangi bir zor geçici çözüm veya hesaplamalar olmadan, olduğu gibi oldukça düz ve saçma bir şekilde.

De-golf (ES5) + demo:

function t(s) {
    a = new Date(s, 10).getDay();
    alert(new Date(s,10,a<=4?26-a:a+21))
}

t(prompt())

Unutmayın ki, 0-100 yılına girme 1900-2000 yıl üretir. Yine de, 0-100 yıl, 1900-2000 tarihiyle aynı tarihi veriyor gibi gözüküyor, diğer cevaplara bakılırsa.


Değiştirme a+18ile 22sadece "Başka", ve "Diğer" denilen çünkü, bir ne büyük ne de az 4, yani tam olarak 4 ise oluşur.


Değiştirme a<4?26-a:a>4?a+21:22ilea<=4?26-a:a+21


2
Afedersiniz, yanılıyorsam ama a<4?x:a>4?y:a+18eşdeğer değil misiniz a<4?x:a>4?y:22?
ETHProductions

BTW, bana 0'dan 99'a kadar olan herhangi bir giriş için yanlış yılı gösteriyor. Yine de bunun önemli olup olmadığından emin değil.
ETHProductions

@Eth LOL elbette haklısınız, bunun her zaman 4 + 18: D
nicael

@Eth hm, 0 ila 99 gerçekten yanlış, bunu düzeltmeyi deneyeyim.
nicael

@Eth, 0-100, 1900-2000 ile aynı cevapları veriyor ve diğer cevapları değerlendiriyor.
nicael

8

TeaScript, 35 33 24 bayt -% 25 = 18

28.11-new D(x,8).getDay¡

Bu, Thomas Kwa'nın akıllı formülünü kullanan JavaScript cevabımla aynı yöntemdir .

Açıklama ile Alternatif Sürüm

r(22,28)F(#/h/t(new D(x,10,l)))+'-11'

r(22,28)    // Range from 22 to 28
        F(    // filter, keeps elements for which the function returns true. 
          #    // Expands to function(l,i,a,b)
           /h/    // RegExp literal, Thursday is the only day with an 'h'.
              t(    // test, true if date string contains an 'h'.
                new D(x,10,l) // Create date object
                             ))+'-11' // Append '-11' for the month.

35 karakter, ancak 36 bayt nedeniyle ¡:)
nicael

@nicael Bu site tarafından değil;)
ETHproductions

Hm, 36 ile birlikte almak .
nicael

@Downgoat, genellikle U + 00FF'ye kadar olan tüm karakterlerin 1 bayt olduğu bu formatı kullanır .
ETHProductions

5

Jython, 141 155 Bayt

Python sözdizimi ile Java Calendar ve Scanner sınıflarını kullanır.

import java.util.Scanner as s;import java.util.Calendar as c
d=c.getInstance();k=s(System.in);d.set(c.YEAR,k.nextInt());d.set(c.DAY_OF_WEEK,c.THURSDAY)

Düzenleme: Küçük sözdizimi sorunları, 14 bayt eklendi.

Ayrıca Brainfuck versiyonuma bakın.


5

Python, 83 81 78 bayt

from datetime import*
lambda a:'Nov '+`((10-datetime(a,11,1).weekday())%7)+22`
  • -2 bayt: içe aktarılacak bir ad ekledi (thanks @ Κριτικσι Λίθος)
  • -1 bayt: * import ** olarak değiştirildi (thanks @FryAmTheEggman)
  • -2 bayt: günü dönüştürmek için repr olarak değiştirildi (thanks @willem)

1
Sadece bayt sayısını azaltmak için bir öneri: kullanın import datetime as dve sonra programda dher zaman kullanmak için kullanabilirsiniz datetime.
Kritixi Lithos

2
Ayrıca pandaları deneyebilirsin. import pandas;print'Nov '+`((10-pandas.datetime(input(),11,1).weekday())%7)+22`
Willem

@ ΚριτικσιΛίθος ama sonra datetime.datetime sadece d.datetime olur, öyle değil mi?
TanMath

2
from datetime import*biraz daha kısa, d.daha fazlasına ihtiyacınız olmayacak
FryAmTheEggman

5

Excel, 367 154 53 - 25% = 39,75 bayt

Yılın Tarih hücresinde A1 hücresinde tutulduğunu varsayar. Şükran Günü yapılan kasım ayında günün tam sayı değerini döndürür.

Bu sadece normal artık yıllardır. 2100, 2200, 2300 yıllarının artık yıl olmadığı gerçeğini hesaba katmaz.

Bu sadece 1621'den sonra çalışmak üzere tasarlanmıştır - yani Şükran Günü gerçekleşmeye başladı. (Her ne kadar kesinlikle AD’ye geri dönecek olsa da).

=IF(MOD(YEAR(A1),4)=0,IF(WEEKDAY(305+DATEVALUE(("01/01/"&TEXT(A1,"yyyy"))))<6,1127-WEEKDAY(305+DATEVALUE(("01/01/"&TEXT(A1,"yyyy")))),1134-WEEKDAY(305+DATEVALUE(("01/01/"&TEXT(A1,"yyyy"))))),IF(WEEKDAY(304+DATEVALUE(("01/01/"&TEXT(A1,"yyyy"))))<6,1127-WEEKDAY(304+DATEVALUE(("01/01/"&TEXT(A1,"yyyy")))),1134-WEEKDAY(304+DATEVALUE(("01/01/"&TEXT(A1,"yyyy"))))))

Oldukça baskılı:

=IF(MOD(YEAR(A1),4)=0,
    IF(WEEKDAY(305+DATEVALUE(("01/01/"&TEXT(A1,"yyyy"))))<6,
       1127-WEEKDAY(305+DATEVALUE(("01/01/"&TEXT(A1,"yyyy")))),
       1134-WEEKDAY(305+DATEVALUE(("01/01/"&TEXT(A1,"yyyy"))))),
    IF(WEEKDAY(304+DATEVALUE(("01/01/"&TEXT(A1,"yyyy"))))<6,
       1127-WEEKDAY(304+DATEVALUE(("01/01/"&TEXT(A1,"yyyy")))),
       1134-WEEKDAY(304+DATEVALUE(("01/01/"&TEXT(A1,"yyyy"))))))

Gah! 1 Ocak’a dayanarak hesaplamak yerine, 29 Şubat’la başa çıkmak için çok fazla yıl hesaplaması yapmak yerine, 1 Kasım’daki hesaplamaları temel almalıydım. , ancak uygulamayı Excel kurulumunuzun varsayılan tarih biçimine bağlı hale getirir. Bu sürüm gg / aa / yyyy için tasarlanmıştır:

 =IF(WEEKDAY(DATEVALUE(("01/11/"&TEXT(C1,"yyyy"))))<6,  
     1127-WEEKDAY(DATEVALUE(("01/11/"&TEXT(C1,"yyyy")))),
     1134-WEEKDAY(DATEVALUE(("01/11/"&TEXT(C1,"yyyy")))))

Ve şimdi Smalltalk’ta kısa bir hesaplama yapmak üzere pfaffing yaptığımı ve bunu Excel’e geri gönderdiğimi:

=DATE(A1,11,MOD(12-WEEKDAY(DATE(9600+A1,11,1)),7)+22)

(yıl hala A1’de ancak tamsayı olarak). Bu, 2100, 2200 ve 2300 yıllarında bile, 7700BC / E'den itibaren bütün tarihler için, Thomas Kwa'nın tarih tekrarı numarasını kullanarak çalışır.


1
Bunu 1900'den önceki tarihlerle denediğimde, excel kopyamda çalışmıyor.
Angelo Fuchs

Uzun versiyon da çalışmıyor.
Angelo Fuchs

Eski tarihler için, Excel Kullanıcısının 1900 öncesi tarihler çalışma kitabını kullanın. < exceluser.com/downloads/examples/post_900_123/index.html >
Euan M

Bunun bir işe yarayıp yaramadığına ilişkin sorular, kasım ayında sadece tarih çıkarmanıza izin vermediğini düşünüyorum; Bir biçimde bir "Nov" veya "11" gerekir.
lirtosiast

@Thomas Kwa Tarih girişi, tarih biçiminde yıldır. Hesaplama daha sonra 1 Kasım’ın düştüğü haftanın gününü ve ardından dördüncü Perşembe’nün Kasım’da hangi tarihte olduğunu hesaplar.
Euan M

4

PowerShell, 67 64 84 72 58 45 Bayt

param($a)'Nov';28-(date "00$a/9/1").DayOfWeek

Girdi tamsayımızı $ahemen Novçıkarıp çıktı ve yeni bir satır alırız . Daha sonra $a, sıfır üretip, 1 Eylül ile birlikte 00$a/9/1yeni bir tane dateüretip ne DayOfWeekolduğunu belirlemeden önce alıp hazırlarız . 1 Eylül Pazar günü ise ( .DayOfWeekeşittir 0), Şükran Günü 28'de. 1 Eylül Pazartesi ( .DayOfWeekeşit 1) ise, Şükran Günü 27th. Ve bunun gibi. Böylece, haftanın o gününü 28cevabımızın çıktısını almak için çıkardık.

Çift sıfırlı hazırlıklar, üç veya dört basamaklı yıllara ayrıştırma işlemine ara vermeden tek ve çift basamaklı yıllar için hesap oluşturur. .NET datetime, yıllardan daha az desteklemediği için negatif sayılar için çalışmaz 0.

Bu konuda yardım için TessellatingHeckler ve Toby Speight'a teşekkürler .


"{0:D3}/Nov/$_" -f $adaha kısa "$($a.ToString("000"))/Nov/$_"ve aynı sonucu veriyor ve 11bunun yerine kullanabileceğinizi düşünüyorumNov
n0rd

@ n0rd Ah, mükemmel! Evet - Noviki basamaklı yılı doğru bir şekilde tanımayı sağlamaya çalıştığım zamandan beri kalmıştı, o yüzden onu da değiştireceğim. Teşekkürler!
AdmBorkBork 27:15

@TessellatingHeckler Bu yaklaşım işe yarıyor, ancak bir basamaklı yıllar için iki sıfır hazırlamanız gerekiyor, aksi halde karşılaştığım 20XX'e geri döndünüz. Yardımın için teşekkürler - Cevabı güncelledim.
AdmBorkBork,

1
@TessellatingHeckler Sistemimde, en azından, tek basamaklı yılların date "11/1/$a"sonuçlara girilmesi Thursday, November 1, 2007 12:00:00 AM. Bunun nedeni, Calendar.TwoDigitYearMax özelliğini düzenlemememizdir , bu yüzden ayrıştırırken , bunu aşmak için çift sıfırlama dolgusu ile sıkışıp kaldık.
AdmBorkBork

Doğru doğru. Çift dolgu maddesidir.
Mozaikleme 16-15

3

Golfscript, 25 * 0.75 = 18.75 bayt

~.4/.25/.4/2---+7%28\--11

Bu Sakamoto'nun formülünü haftanın günü için kullanıyor. Bunu yapan insanlar olduğu için, çıktı şeklindedir dd-mm. Önceki gönderimim aşağıda bulunabilir:

~.4/.25/.4/2---+7%"Nov "28@-

3

TSQL, 478 296 bayt

Sadece eğlenceler için. Tipik olarak, bunu basit hale getirmek için tarih boyutlu bir tablonuz olur, select * from dimDate where [Year] = @Year and [Holiday] = 'Thanksgiving'ama yokluğunda ...

create function a(@y varchar(4))returns date as begin declare @d date,@i int=0 set @d=convert(date,@y+'-11-01')declare @t table(d date,c int identity)while @i<28 begin if datepart(weekday,@d)=5 insert @t(d) select @d select @d=dateadd(d,1,@d),@i+=1 end select @d=d from @t where c=4 return @d end

Ungolfed:

if exists(select * from sys.objects where name='a' and [type]='FN') drop function a
go

create function a(@y varchar(4))returns date
-- select dbo.a('2015')
as
begin
    declare @d date,@i int=0;

    set @d=convert(date,@y+'-11-01'); -- cannot golf out dashes for dates <year 1000

    declare @t table(d date,c int identity)

    while @i<28 
    begin -- populate "November" array
        if datepart(weekday,@d)=5 insert @t(d) select @d -- assumes @@datefirst = 7
        select @d=dateadd(d,1,@d),@i+=1
    end;

    select @d=d from @t where c=4 

    return @d

end

Bu gerçekten en kısa yol mu?
lirtosiast

Sanırım golf kodunun kurallarına aşina olmayabilirim, ancak cevap, girişi kabul eden ve OP ile eşleştirmek için çıktıyı döndüren bir DB nesnesi oluşturuyor. Girdi satır içi kodda kabul edilebilirse ortaya çıkabilecek bazı kısaltmalar var, ancak bu fonksiyon nesne tipi için benim düşüncemdi. Her iki durumda da golf oynayabileceğinden eminim. @ThomasKwa, önerileriniz var mı?
Peter Vandivier

Bana öyle geliyor ki, bu cevabın bahsettiği saf tarih formülünü kullanabiliyorsunuz ve tüm bu tarih nesnesiyle uğraşmıyorsunuz.
lirtosiast 26:15

Tamamen saf bir matematik çözümü değil, bu cevabı okumak kesinlikle bana 200 karakter atmam için bazı fikirler verdi. Teşekkürler!!
Peter Vandivier 26:15

(Yani (28 - ( x - 2 + floor(x / 4) - floor(x / 100) + floor(x / 400) ) % 7) Evet, diğer cevapları okumak çok yardımcı olur.
lirtosiast

3

Pyth, 30 28 * 75% = 21 bayt

Bunun daha kısa yapılabileceği konusunda% 100 pozitifim ama hey, bu benim ilk Pyth programım \Ö/

-28.11%+-+-Q2/Q4/Q100/Q400 7

Test odası

Tarihi dd.mmbiçiminde verir.

Lütfen bunu yapabilmeniz için golf yapmanın yollarını önerin! Pyth hakkında daha fazla bilgi edinmek istiyorum.


2

Excel, 64 48

A1 yılında yıl

= TARİH (A1,11, TERCİH (GÜN (TARİH (A1,11,1)), 26,25,24,23,22,28,27))

=DATE(A1,11,MOD(12-WEEKDAY(DATE(A1,11,1)),7)+22)

Excel yerelleştirme temelli olduğundan ve bunu test etmek istiyorum. Lütfen fonksiyonların ne yaptığını açıklayın, böylece kendi dilimden doğru olanı seçebilirim.
Angelo Fuchs

1
Ayrıca, bu 1900'den önceki tarihler için çalışmaz (en azından Excel
Angelo Fuchs

Ayrıca, kaydedilen 13üzerinde bayt TEXTgelen =TEXT(DATE(A1,11,MOD(12-WEEKDAY(DATE(A1,11,1)),7)+22),"d mmm")çıkış biçimlendirmeden bir tam sayıdır -.
user3819867 26:15

@ user3819867, excel tarihlerini böyle saklar. biçimlendirme kullanıcıya bırakılmıştır
SeanC

@AngeloFuchs, DATE, parametre olarak yıl, ay ve günü kullanarak bir tarih değeri döndürür. MOD, bir bölümün geri kalan kısmını (modül) döndürür. HAFTA, tarihin haftanın gününü döndürür (1 = Pazar, 2 = Pazartesi vb.).
SeanC

2

Befunge, 41 Bayt

47*&:::4"d"*/\"d"/-\4/++5+7%-" voN",,,,.@

Bu tercümana koş .

Açıklama: Ortak bir yıl 365 = 1 mod 7 yıl böylece artı 4 günde inci yıl, eksi Her 100 inci ( dASCII olarak) yıl artı her 400 inci yıl (şimdiki yıl dahil) herhangi bir sıçrama gün oluşturuyor. Sonucu :::4"d"*/\"d"/-\4/++daha sonra 5 Mart olarak düşünülebilir th Şubat ortak yıllarda yılın ilk günü olarak aynı gün düşmeye sonraki ilk günden. Biz desenine kalibre Bundan sonra 5+7%-28 haftanın gün sayısı çıkarılarak th ( 47*Kasım önceki saklanan). Ardından yazdırın.

BC yılları için düzeltilen bir sürüm şu anda bonusun sağladığından daha uzundur,% 59 -25 = 44.25 bayt:

47*&v
!`0:<+*"(F"_v#
" voN",,,,.@>:::4"d"*/\"d"/-\4/++5+7%-

2

Matlab, 78 bayt

x=find(all(bsxfun(@eq,datestr(datenum(input(''),11,1:30),'ddd'),'Thu')'));x(4)

2

Ruby, 60 58 57 * 0,75 = 42,75 bayt

->y{puts"Nov #{[5,4,3,2,1,7,6][Time.new(y,11).wday]+21}"}

58 bayt

->y{puts "Nov #{[5,4,3,2,1,7,6][Time.new(y,11).wday]+21}"}

60 bayt

->y{puts "Nov #{[5,4,3,2,1,7,6][Time.new(y,11,1).wday]+21}"}

Ungolfed:

-> y {
  puts "Nov #{[5,4,3,2,1,7,6][Time.new(y,11).wday]+21}"
}

Kullanımı:

->y{puts"Nov #{[5,4,3,2,1,7,6][Time.new(y,11).wday]+21}"}

=> Nov 26

0

VBA, 124 bayt * 75% = 93 bayt

Function e(y)
For i = 1 To 7
x = DateSerial(y, 11, 21) + i
If Weekday(x) = 5 Then e = Format(x, "mmm dd")
Next
End Function

Boşlukların sayılıp sayılmadığından emin değilim, 102 ile 124 arasında bir yerde, düzenleme yapmaktan çekinmeyin.
Tamsayılar geçerli bir çıktıysa, Formatparçayı çıkardığım için çok mutluyum .


Boşluk sayısı; Programa gerek duymazlarsa, bunları kaldırabilirsiniz.
lirtosiast

0

PHP 5.3+, 59 bayt

Bu strtotimetarih ayrıştırmak için PHP yerleşik işlevi kullanır .

<?=gmdate('M d',strtotime("Next Thursday $_GET[Y]-11-19"));

Bu değer, GET parametresi üzerinden Y VEYA üstünden geçilmesini bekler php-cli Y=<year>.

Bir sonraki Perşembe 19 Kasım'dan sonra bulmaya çalışır.
Şimdiye kadar yaptığım testlerle iyi sonuç veriyor.

2 basamaklı yılların farklı şekilde yorumlanabileceğini unutmayın.

Saat gmdatedilimi sorunlarından kaçınmak için kullanıyorum , ancak date(en azından yaşadığım yer) kullanırken eşit derecede iyi çalışıyor .


1
Bir cevap, bir giriş yönteminin geçerliliğini tartışmak için uygun bir yer değildir. Oluşturduğum bu seçeneği (topluluk oylayabiliriz böylece) varsayılan G / Ç meta post ve konuşma taşındı sohbet etmek . (CC @Mego)
Dennis

0

T-SQL 215 bayt 248 * 0,75 = 186 bayt

create function t(@y int)returns table return select x=convert(char(6),x,107)from(select x=cast(dateadd(dd,d,dateadd(yy,@y-2015+7600,'20151101'))as date)from(select d=21+n from(values(0),(1),(2),(3),(4),(5),(6))b(n))c)t where datepart(weekday,x)=5

Ungolfed

set nocount on;
if object_id('dbo.t') is not null drop function dbo.t
go

create function t(@y int)returns table return
    select x=convert(char(6),x,107)
    from (
        select
        x=cast(dateadd(dd,d,dateadd(yy,@y-2015+7600,'20151101'))as date)
        from (
            select d=21+n 
            from (values (0),(1),(2),(3),(4),(5),(6))b(n)
        )c
    )t
    where datepart(weekday,x)=5
go

hangi bu iskele ile

select 
  [ 2015 = Nov. 26]=(select x from dbo.t( 2015))
 ,[ 1917 = Nov. 22]=(select x from dbo.t( 1917))
 ,[ 1752 = Nov. 23]=(select x from dbo.t( 1752))
 ,[ 1582 = Nov. 25]=(select x from dbo.t( 1582))
 ,[ 1400 = Nov. 27]=(select x from dbo.t( 1400))
 ,[ -480 = Nov. 25]=(select x from dbo.t( -480))
 ,[-5480 = Nov. 28]=(select x from dbo.t(-5480))
;
go

istenildiği gibi verim

2015 = Nov. 26  1917 = Nov. 22  1752 = Nov. 23  1582 = Nov. 25  1400 = Nov. 27  -480 = Nov. 25 -5480 = Nov. 28
--------------- --------------- --------------- --------------- --------------- --------------- ---------------
Nov 26          Nov 22          Nov 23          Nov 25          Nov 27          Nov 25          Nov 28

0

Pike , 87 91 107 77 76 bayt -% 25 = 57

string t(int y){return"Nov "+((11-Calendar.Day(y,11,1)->week_day())%7+22);}

eskisini karşılaştırma için bıraktım çünkü Takvim modülünden faydalanma açısından daha akıllıca buluyorum, ancak yukarıdaki yöntem daha kısa.

string t(int y){object n=Calendar.Month(y,11);return"Nov "+(n->weeks()->day(4)&n->days())[3]->month_day();}

Bu girdi almak gibi gözükmüyor.
Peter Taylor

evet, kafam karıştı, bazı çözümler bir fonksiyon tanımına sahip ve bazıları sadece herhangi bir yerde tanımlanmayan bir değişken kullanıyorlar, bu yüzden bytecount için ne kullanmam gerektiğinden emin değilim.
eMBee

" Hiçbir yerde tanımlanmayan bir değişken " olarak gördüğünüz cevapların aslında çok kısa bir işlev bildirimi sözdizimi kullandığını düşünüyorum. Stdin için özel muamele gören ve bu yüzden de tam programlar yazmayı tercih eden esolanguları kullanan bir veya iki cevap vardır. Pike'ı tanımıyorum, ancak boşlukları kaldırabilir ve işlev ismini kısaltmak isterseniz, string t(int y){object n=Calendar.Month(y,11);return"Nov "+(n->weeks()->day(4)&n->days())[3]->month_day();}bunu 107 bayt olarak sayıyorum.
Peter Taylor

işlev bildirimi olmayan birkaç tane gördüğümü sanıyordum, ancak düzeltildikleri görülüyor, yalnızca ufak tefek örneği uymuyor. eğer bu geçerliyse, bunun bir diğer 17 baytını tıraş edebilirim ...
eMBee

Smalltalk sürümü bir program olarak yazılmıştır - özellikle bir Çalışma Alanı ifadesi. Girdi talep etmek yerine bize girdi verildi.
Euan M,

0

Smalltalk - Squeak ve Pharo , 69 57 54 49 35 35 34 33 32 -% 25 = 24 bayt

"Kas nn": 69B 49B (% 25 = 36.75B)
11nn (anInt): 57 54 32B (% 25 = 24B)

"Year supplied as an integer value, y  
 Result provided as an integer value, 11nn
 Methods Date>>y:m:d: and >>w created as duplicates 
 of year:month:day and weekdayIndex"
(12-(Date y:y m:11d:1)w)\\7+1122

Önceki sürümler

11nn çıkış

"Year supplied as an integer value, y  
 Result provided as an integer value, 11nn"
(12-(Date year:y month:11 day:1) weekdayIndex)\\7+1122

"Year supplied as an integer value, y  
 Result provided as an integer value, d, prefixed by 11"
d:=(12-(Date year:y month:11 day:1) weekdayIndex)\\7+1122

Kasım nn çıkışı

"Year supplied as an integer value, y  Result provided as a string, 'Nov nn'"
'Nov ', (12-(Date year:y month:11 day:1) weekdayIndex\\7+22) asString

nn çıkışı

"Year supplied as an integer value, y  Result provided as an integer value, d"
d:=(12-(Date year:y month:11 day:1) weekdayIndex)\\7+22

nb Bu, bir yöntem olarak değil, bir program olarak - özellikle bir Çalışma Alanı ifadesi - olarak sağlanır.

Girişin verilen (varsayımlara göre "dört basamaklı bir yıla kadar verilen") olduğu varsayılmaktadır. Girişin bildirilmesi
ve verilmesi de 11 karakter daha ekleyecektir:

|y|y:=2015.(12-(Date y:y m:11 d:1)w)\\7+1122

EMBee sayesinde, bir karakter daha çıkarmayı gösterdiği için - 'w' den hemen önce boşluk.

Aslında, bu bana 'd:' den önce boşluk bırakmayı denememe ilham verdi:
|y|y:=2015.(12-(Date y:y m:11d:1)w)\\7+1122
Hangisi işe yaradı!


OP’nin açıklamasına göre, gün numarası sürümü geçerli değildir.
Mego

Katılıyorum - ama listede sadece birkaç günlük sayı sürümü varken, elmalarımı elma karşılaştırması için oraya koydum
Euan M

0

GNU coreutils, 35 bayt

seq -f$1-11-2%g 2 8|date -f-|grep h

Basitçe 22-28 Kasım haftasını Perşembe günü arar. Bir C veya POSIX yerel ayarında çalıştırın, çünkü perşembeye 'h' içeren tek günün kısaltması olmasına bağlıyım.


İşte daha uzun bir bayt olsa da akıllıca bir cevap:

echo Nov $((28-`date -d$1-5-5 +%w`))

Haftanın günü sayısını Mart ve Eylül ayları arasında oldukça keyfi bir haftada alıyoruz (bu nedenle gün ve ay her biri bir basamaktır ve olası bir artık günden etkilenmiyoruz). Günü seçiyoruz, böylece %w==0Şükran Günü 28'inde. Ardından uygun Perşembe gününü elde etmek için bu değeri 28'den çıkartabiliriz.


2
Sean Connery çalıştırmazsa bu işe yarıyor.
bkul

0

TSQL, 53 52 bayt

DECLARE @ CHAR(4)=2000

PRINT DATEADD(d,59,DATEDIFF(d,1,DATEADD(m,9,@))/7*7)

Keman

2 eylül öncesi veya sonrasında pazartesi gününü hesaplama ve 59 gün ekleme

(pazartesi günü 4 Ekim’den önce veya sonra hesaplamaktan ve 31 gün eklemek daha iyidir çünkü ekim 10. aydır, dolayısıyla 1 bayt tasarruf sağlar)


-1

Perl, 92 bayt

use Time::Local;(localtime(timelocal 0,0,0,$_,10,$ARGV[0]))[6]==4?print "Nov $_":0for 22..28

EDIT: Sabit çıktı formatı, sabit hata örn. 2012 sonucu, "for" formatı için daha kısa kullanılan. Msh210'a teşekkürler.


Bu kısadır ve aynı şeyi yapar: use Time::Local;(localtime(timelocal 0,0,0,$_,10,$ARGV[0]))[6]==4?print:0for 22..29. Ancak her iki komut dosyası da aynı kusurlardan muzdariptir: (1) gerektiği gibi ayın bir sunumunu basmazlar; (2) örneğin 2012 için yanlış çıktıya sahipler.
msh210
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.