感謝祭はいつですか?


38

バックグラウンド

10月31日、12月25日などのように、覚えやすい日付が固定されている休日もあります。ただし、面倒なことを望む休日もあります。それらは、「9月の第1月曜日」または「11月の第4木曜日」などとして指定されます。いつそれを知るのですか?

私が知っているのは、感謝祭が近づいているということです。ですから、私はそれがいつなのかを理解するのに役立つプログラムが必要です。明日だと言う人もいるので、時間内に再入力できるようにするには、プログラムをできるだけ短くする必要があります。

チャレンジ

4桁までの年(たとえば、2015または1984)を指定して、その年の米国の感謝祭の日付を出力または返すプログラムまたは関数を作成します。ウィキペディアのページによると感謝祭は11月の第4木曜日と定義されています(ヒント:このページには、日付パターンに関する興味深い情報も含まれています。)

入力:Common Era(CE)の年を表す最大4桁の10進数。例:987、1984、2101

出力:月と日を含む、その年の感謝祭が該当する日付、または存在する場合は該当する日付。これは、合理的な形式である可能性があります。最善の判断をしてください。グレゴリオ暦は、その時点で使用されていなかった場合でも、すべての場合に使用します。

(注:うるう年を正しく処理してください!)

テストケース 入力1:

2015

出力1:

Nov 26

入力2:

1917

出力2:

Nov 22

得点

提出はバイト単位で記録されます。好きなカウンターを使用できますが、バイト数を追跡​​するためにこのWebサイトをお勧めします。

ボーナス

負の数としてBCE日付を処理する場合、スコアの-25%(たとえば、-480はThermopylaeの戦いの年になります)。

負のテストケース入力:

-480

対応する出力:

Nov 25

これはなので、最低スコアが勝ちです!

編集:Thomas KwaのTI-BASIC提出物を承認済みとしてマークしています。これにより、新しいエントリの送信が妨げられないようにしてください。

リーダーボード

これは、通常のリーダーボードと言語ごとの勝者の概要の両方を生成するスタックスニペットです。

回答が表示されるようにするには、次のマークダウンテンプレートを使用して、見出しから回答を開始してください。

# Language Name, N bytes

N提出物のサイズはどこですか。スコアを改善する場合、古いスコアを打つことで見出しに残すことができます。例えば:

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

ヘッダーに複数の数字を含める場合(たとえば、スコアが2つのファイルの合計であるか、インタープリターフラグペナルティーを個別にリストする場合)、実際のスコアがヘッダーの最後の数字であることを確認します。

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

言語名をリンクにして、リーダーボードスニペットに表示することもできます。

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


25
今年、感謝祭がいつ開催されるのか疑問に思っている人のために:感謝祭は明日です。
-TheNumberOne

6
しかし、10月10日に感謝しましたか?質問が遅れて申し訳ありません。
-JimmyJazzx

5
@Downgoat必要なバイトカウンターを使用します。それは私が個人的に使用し、お勧めするものです。
bkul

22
オクタル31 ==進25. ;-):これらの例では、彼らが本当に同じ日だから覚えやすい「いくつかの休日は10月31日、12月25日のような覚えやすい日付は、固定している」
エイドリアン・マッカーシー

7
ボーナスを提供する回答の場合、-1と1の間に年0が必要ですか?
feersum

回答:


40

TI-BASIC、15バイト* 0.75 = 11.25

TI-84 +計算機でテスト済み

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

感謝祭は11月29日から9月1日の曜日を引いたもので、1は日曜日、7は土曜日です。これは、形式で出力しますMMDD

テストケース:2015-> 11261917-> 1122-480-> 1125が検証されました。TI-BASICは、すべての日付にグレゴリオ暦を使用しているようです。

TI-BASICは負の年をサポートしていませんが、入力に10000を追加するため、これはボーナスを得ます。グレゴリオ暦の期間は400年なので、これは曜日を変更しません。


5
神聖ながらくた。xDこれが+1のように機能するとは思わなかった。
アディソンクランプ

10000を追加することをお勧めします。
agtoever

私は23文字を数えます。これはどのように15バイトになりますか?
ステファンシンケル

1
電卓のメモリに格納されている@StephanSchinkel TI-BASIC用途トークンは、私はここで、すべての文字がトークンを除き、1バイトであると考えてdayofWK(Ans各バイトの2と1です。
FryAmTheEggman

電卓でテストしましたか?ワオ。

23

PHP、65 48 42 41 36(+2の場合-F)= 38バイト

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

入力を最初のコマンドライン引数として受け取ります。警告付きで実行されますが、これはルールで受け入れられます。プリントはNovDD、どこDD感謝祭の日です。

ideoneはコマンドライン引数をサポートしておらず、サポートしているオンラインインタープリターを知らないため、オンラインリンクはありません。

新しいトリックを教えてくれたAlexander O'Maraと、大幅な削減をしてくれたprimoに感謝します。


2
これはMathematicaより面白いです。
リトシアスト

2
@Trythさらに短く:"4thuXI"。年の間にスペースを落とすこともでき"4thuXI2015"ます。
アレクサンダーオマラ

1
コマンドラインオプションを使用すると-F、入力をに短縮できます"4thuXI$argn"
プリモ

3
待って、これは実際に動作しますか?ちょうどだのは... ...私もしないこと...
ETHproductions

1
私のために働く。私はそれに取り組んでいMdますが、引用符は不要で、E_NOTICE無効になっています。
プリモ

18

Mathematica、59 38バイト

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

+1賢い。WolframAlpha["Thanksgiving " <> #] &日付が文字列として入力される場所もあります。
DavidC

WolframAlphaは、1863年(リンカーンが11月の最後の木曜日にあると宣言したとき)から米国感謝祭の日付を返します。米国は1789年以来、感謝祭を観察している
DavidC

@DavidCarraherただし、OPはプログラムが少なくとも
0-9999

17

JavaScript(ES6)、42 40 31バイト-25%= 23.25

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

日付は「任意の合理的な形式」であるため、この関数はを使用しDD.MMます。私は別の手法でTeaScriptの回答を書きましたが、この式は短かったです。

説明

月はゼロに基づいているため、指定された年の11月1日を表すオブジェクトをnew Date(a,10)返しますDate

からマッピングしたいgetDay()曜日を表す数値を返すため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  

その後、22を追加し(11 - new Date(a,10).getDay()) % 7ます。以下のよう@Thomasクワを指摘し、これは同じであり、28-new Date(a,8).getDay()9月1日の週の28日マイナスです。


いい解決策です。それがどれほど短いか、そしてほとんどのエントリよりも理解しやすいことが大好きです。
マルコグレシャク

16

Japt43 37 36 35 29バイト-25%= 21.75

JaptJa vaScri ptの短縮バージョンです。

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

ハハハ、私は本当に不正なトリックを見つけました:インタープリターは文字列内の括弧を無視します(コードを挿入するために使用されます)。

2つ?のsは、それぞれUnicode unprintables U + 0098およびU + 0085である必要があります。オンラインでお試しください!

解凍後、コードは次のように評価されます。

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

評価されるもの:

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

適切な出力が得られます。

intrepidcoderの手法を使用して、formatで出力しますdd.mm。負の年を適切にサポートします。提案を歓迎します!

編集: 12月2日の時点で、この11バイトコードを使用できます(スコアは8.25ポイント)。

28.11-ÐU8 e

(私はこれをもっと早く実装したかったので!)


とてもうまくできました。
bkul

これは、通常のJavaScriptよりも長くなりました。トーマスクワははるかに短い式を持っています。
intrepidcoder

@intrepidcoderありがとう、修正しました。
-ETHproductions

12

Vitsy、44バイト

私は純粋な数学で計算しています!

ゴルフ:

Ve2 * V2-V41m + Vaa * Dv1m-Vv4 * 1m + 7M-baa * / + N
/ D1M-

Ungolfed(メソッド呼び出しを最初の行に移動して読みやすくしました):

Ve2 * V2-V4 / D1M- + Vaa * Dv / D1M--Vv4 * / D1M- + 7M-baa * / + N

V入力を最終変数として保存します。
 e2 * 28をスタックにプッシュします。
    V入力をスタックにプッシュします。
     2- 2を引きます。
       V4 / D1M-フロアを取得(入力/ 4)。
              +合計に追加します。
               Vaa * Dv / D1M-フロア(入力/ 100)を取得し、一時として100を節約
                                    プロセス内の変数。
                          -合計からそれを引きます。
                           Vv4 * / D1M-フロアを取得(入力/ 400)。
                                    +合計に追加します。
                                     7Mモジュロ7。
                                       -28から結果を引きます。
                                        baa * / + .11を追加
                                              N数値として出力します。

これにはおそらくより良いアルゴリズムがあります(そして恐らく恐ろしいことになります)が、不思議に思う人のために、私のアルゴリズムはここから来ています

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

それを計算し、正確に42バイト持っているためにボーナスポイントを獲得できますか?夢が台無しになった。

間違っていたことを指摘してくれた@ Hosch250に感謝します。:D修正済み。


2
いいえ。ただし、私から+1を受け取ります;)
コナーオブライエン

2016年の感謝祭は11月28日であると言われています。本当に11月24日です。
Hosch25015年

@ Hosch250そのとおりです-今すぐ修正。
アディソンクランプ

10

Python、38 * 0.75 = 28.5バイト

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

これは、質問で指定された方法で負の年で機能しますが、グレゴリオ暦には年0がないため、この動作は少し疑わしいと思われます。


1
落とすことができますf=
feersum

1
これは負の日付に対してどのように機能しますか?Pythonのモジュロはネガに適用されますか?:O
アディソンクランプ

文字列担当者を使用するには短くする必要があります"Nov "+`...`
xnor

@VoteToClose Pythonモジュロは、2番目の引数と同じ符号で答えを返します。したがって-40%7==2、しかし-40%-7==-5
キントピア

@quintopiaちょっと待って、私はバカだ。はい。それは理にかなっている。
アディソンクランプ

10

JavaScript(ES6)、43.5

実際のバイト数は58です。-25%のボーナスが適用されます=> 58 * 0.75 = 43.5

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

トリッキーな回避策や計算なしで、できる限り真っ直ぐで馬鹿げた方法です。

デゴルフ(ES5)+デモ:

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

t(prompt())

0〜100年を入力すると、1900〜2000年になります。しかし、他の答えから判断すると、0-100年は1900-2000と同じ日付を与えるように見えます。


交換a+18して22、それが唯一の「他」、および「他」で呼ばれていますので、どちらも大きいも4未満、つまり正確に4である場合にのみ発生します。


交換a<4?26-a:a>4?a+21:22a<=4?26-a:a+21


2
私が間違っている場合はご容赦くださいが、a<4?x:a>4?y:a+18同等ではありませんa<4?x:a>4?y:22か?
ETHproductions

ところで、0から99までの入力に対して間違った年を教えてくれます。しかし、これが重要かどうかはわかりません。
ETHproductions

@Eth LOLもちろんあなたは正しい、それが常に4 + 18だとは思わなかった:D
nicael

@Eth hm、0〜99は確かに間違っています。それを修正してみましょう。
ニカエル

@Eth他の回答から判断すると、0-100は1900-2000と同じ日付を与えるように見えます。
ニカエル

8

TeaScript、35 33 24バイト-25%= 18

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

これは、Thomas Kwaの巧妙な式を使用するJavaScriptの回答と同じ方法です。

説明付きの代替バージョン

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文字ですが、¡:)のために36バイト
15年

@nicael このサイトではない、そうではない;)
ETHproductions

うーん、mothereff.in /で 36を獲得しています。
ニカエル

@Downgoatは通常、この形式を使用します。この形式では、U + 00FFまでのすべての文字は1バイトです。
ETHproductions

5

Jython、141 155バイト

Python構文でJava CalendarおよびScannerクラスを使用します。

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)

編集:マイナーな構文の問題、14バイトを追加しました。

Brainfuckバージョンもご覧ください。


5

Python、83 81 78バイト

from datetime import*
lambda a:'Nov '+`((10-datetime(a,11,1).weekday())%7)+22`
  • -2バイト:インポートする名前を追加(ありがとう@ΚριτικσιΛίθος)
  • -1バイト: * import **に変更(@FryAmTheEggmanに感謝)
  • -2バイト: reprに変更して日を変換します(@willemに感謝)

1
バイト数を減らすための提案:使用してimport datetime as dから、プログラムでd使用するたびに使用できdatetimeます。
クリティキシリソス

2
パンダを試すこともできます。import pandas;print'Nov '+`((10-pandas.datetime(input(),11,1).weekday())%7)+22`
ウィレム

@ΚριτικσιΛίθος、しかしdatetime.datetimeはd.datetimeに過ぎませんか?
タンマス

2
from datetime import*d.もう必要ないので少し短くなります
-FryAmTheEggman

5

Excel、367 154 53-25%= 39.75バイト

年が日付形式のセルA1に保持されていると仮定します。感謝祭が開催される11月の日の整数値を返します。

これは通常のうるう年のみを考慮しています。2100年、2200年、2300年がうるう年ではないという事実は考慮されていません。

これは、1621年以降、つまり感謝祭が開催され始めてから機能するように設計されています。(ただし、AD 0までは確実に機能しますが)。

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

プリティプリント:

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

ああ!1月1日に基づいて計算し、2月29日に対処するために多くのうるう年の計算を行う代わりに、11月1日に計算に基づいている必要があります。 、ただし、インストールはExcelインストールのデフォルトの日付形式に依存します。このバージョンはdd / mm / yyyy向けに設計されています。

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

そして今、Smalltalkで簡潔な計算を取得するための手直しを行い、Excelの結果にバックポートします。

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

(年はまだA1ですが、整数として)。これは、トーマス・クワの日付繰り返しトリックを使用して、7700BC / E以降のすべての日付について、2100年、2200年、2300年でも機能します。


1
1900年より前の日付でこれを試しても、Excelのコピーでは機能しません。
アンジェロフックス

長いバージョンも機能しません。
アンジェロフックス

古い日付については、Excelユーザーの1900年以前の日付のブックを使用してください。< exceluser.com/downloads/examples/post_900_123/index.html >
Euan M

これが機能するかどうかについての質問ですが、11月の日付だけを出力することは許可されていないと思います。何らかの形で「Nov」または「11」が必要です。
リトシアスト

@Thomas Kwa日付入力は、日付形式の年です。その後、11月1日が属する曜日を計算し、11月の第4木曜日の日付を計算します。
ユアンM

4

PowerShell、67 64 84 72 58 45バイト

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

入力整数をとして受け取り$a、すぐに出力Novして改行します。次に、新しいものを生成し、それが何であるかを決定する$a前に、ゼロと9月1日を先頭に00$a/9/1追加dateDayOfWeekます。9月1日が日曜日(に.DayOfWeek等しい0)の場合、感謝祭は28日です。9月1日が月曜日(に.DayOfWeek等しい1)の場合、感謝祭は27日です。等々。したがって、28答えを出力するためにその曜日を差し引きます。

2桁のゼロを前に付けると、3桁または4桁の年の解析を中断することなく、1桁および2桁の年を考慮します。.NET datetimeは未満の年をサポートしていないため、負の数では機能しません0

これに関する支援をしてくれたTessellatingHecklerToby Speightに感謝します。


"{0:D3}/Nov/$_" -f $aより短い"$($a.ToString("000"))/Nov/$_"と同じ結果を生成し、私はあなたが使うことができると思う11の代わりにNov
n0rd

@ n0rdああ、素晴らしい!はい-これNovは、2桁の年を正しく認識させるために取得しようとしていたときの残骸だったので、それも交換します。ありがとう!
AdmBorkBork

@TessellatingHecklerこのアプローチは機能しますが、1桁の年を説明するために2つのゼロを追加する必要があります。それ以外の場合は、私が遭遇した20XXに戻ります。支援してくれてありがとう-答えを更新しました。
AdmBorkBork

1
@TessellatingHeckler私のシステムでは、少なくとも、1桁の年をのdate "11/1/$a"結果に入力しThursday, November 1, 2007 12:00:00 AMます。これは、Calendar.TwoDigitYearMaxプロパティを編集していないためです。そのため、解析時に、ダブルゼロパディングを使用してそれを回避します。
AdmBorkBork

そうそう。ダブルパディングです。
TessellatingHeckler

3

Golfscript、25 * 0.75 = 18.75バイト

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

これは、曜日に坂本の式を使用しています。これを行う人がいるため、出力はの形式になりdd-mmます。私の以前の提出物は以下にあります:

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

3

TSQL、478 296バイト

ファンシーのためだけに。通常、これを簡単にするために日付次元テーブルがありますselect * from dimDate where [Year] = @Year and [Holiday] = 'Thanksgiving'が、それがない場合は...

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

ゴルフをしていない:

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

これは本当に最短の方法ですか?
リルトシアスト

私はコードゴルフのルールに慣れていないかもしれませんが、答えは入力を受け入れ、OPに一致する出力を返すDBオブジェクトを作成します。入力をインラインコードに受け入れることができる場合に発生する可能性のある明らかな短縮がありますが、これは関数オブジェクトタイプに対する私の考えでした。どちらの場合でも、さらにゴルフができると確信しています。@ThomasKwa、提案はありますか?
ピーターヴァンディヴィエ

まあ、私はあなたがこの答えが言及している純粋な数学の式を使用することができ、そのすべての日付オブジェクトのものに煩わされることはないようです。
リルトシアスト

厳密に純粋な数学の解決策ではありませんが、その答えを読むと、200キャラクターをゴルフアウトするいくつかのアイデアが得られました。ありがとう!!
ピーターヴァンディヴィエ

(私が意味した(28 - ( x - 2 + floor(x / 4) - floor(x / 100) + floor(x / 400) ) % 7)うん、他の答えを読むことは多くの助けになる傾向があります。
リトシアスト

3

Pyth、30 28 * 75%= 21バイト

私はこれをもっと短くすることができると100%肯定していますが、それは私の最初のPythプログラムです!\ o /

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

テストスイート

日付をdd.mm形式で出力します。

できればこれをゴルフする方法を提案してください!Pythについてもっと知りたいです。


2

Excel、 64 48

A1の年

= DATE(A1,11、CHOOSE(WEEKDAY(DATE(A1,11,1))、26,25,24,23,22,28,27))

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

Excelはローカライズベースであるため、これをテストしたいと思います。私の言語で適切なものを選択できるように、関数が何をするのか説明してください。
アンジェロフックス

1
また、これは1900年より前の日付では機能しません(少なくとも私のExcelのコピーでは)
アンジェロフックス

また、13バイトをTEXTfromに保存しました=TEXT(DATE(A1,11,MOD(12-WEEKDAY(DATE(A1,11,1)),7)+22),"d mmm")-出力はフォーマットされていない整数です。
user3819867

@ user3819867、それはExcelが日付を保存する方法です。書式設定は、ユーザに委ねられている
SeanC

@ AngeloFuchs、DATEは、年、月、日をパラメーターとして使用して、日付値を返します。MODは、除算の剰余部分(モジュラス)を返します。WEEKDAYは、日付の曜日を返します(1 =日曜日、2 =月曜日など)。
SeanC

2

Befunge、41バイト

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

このインタープリターで実行します。

説明: 一般的な年は365 = 1のmod 7日、今年ので、プラスのすべての4 回目の今年、マイナスのすべての100 番目dアスキーで)年、プラスのすべての400 番目(現在の年を含む)任意のうるう日の年を占めます。その結果:::4"d"*/\"d"/-\4/++、その後3月5日と考えることができ番目、2月は共通年間で年の最初の日と同じ日に落ちる後の最初の日。我々がパターンに校正することをした後、5+7%-28から一週間の日数を差し引い47*11月以前の保存されました)。次に印刷します。

BC年を修正するバージョンは現在、ボーナスが提供するよりも長く、59 -25%= 44.25バイトです。

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


2

Ruby、60 58 57 * 0.75 = 42.75バイト

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

58バイト

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

60バイト

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

ゴルフをしていない:

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

使用法:

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

=> Nov 26

0

VBA、124バイト* 75%= 93バイト

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

スペースが重要かどうかはわかりませんが、102から124の間です。自由に編集してください。
整数が有効な出力である場合、私はそのFormat部分を削除しても大丈夫です。


スペースカウント。プログラムに不要な場合は削除できます。
リルトシアスト

0

PHP 5.3以降、59バイト

これは、PHP組み込み関数strtotimeを使用して日付を解析します。

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

これは、値がGETパラメーターY ORを介して渡されることを想定していますphp-cli Y=<year>

11月19日以降の次の木曜日を見つけようとします。
これまでのところ、私が行ったテストでは、問題なく動作します。

2桁の年の解釈が異なる場合があることに注意してください。

私はgmdateタイムゾーンの問題を回避するために使用していますが、date(少なくとも、私が住んでいる場所では)同じように機能します。


1
回答は、インプットメソッドの妥当性を議論するのに適切な場所ではありません。デフォルトのI / Oメタ投稿でこのオプションを作成し(コミュニティが投票できるように)、会話をチャットに移動しました。(CC @Mego)
デニス

0

T-SQL 215バイト 248 * 0.75 = 186バイト

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

非ゴルフ

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

このテスト足場で

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

必要に応じて収量

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

パイク87 91107 77 76バイト-25%= 57

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

比較のために古いものを残します。これは、Calendarモジュールを利用するという点ではより賢いのですが、上記の方法ははるかに短いためです。

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

これは入力を受け付けていないようです。
ピーターテイラー

ええ、私はそれで混乱しました、いくつかのソリューションには関数定義があり、いくつかはどこでも定義されていない変数を使用するので、バイトカウントに何を使うべきかわかりません。
eMBee

どこにも定義されていない変数」を使用していると思われる答えは、実際には非常に短い関数宣言構文を使用していると思います。stdinを特別に扱い、完全なプログラムの作成に有利なエソランを使用する1つまたは2つの答えがあります。Pikeはわかりませんが、空白を削除して関数名を短縮して取得できるstring t(int y){object n=Calendar.Month(y,11);return"Nov "+(n->weeks()->day(4)&n->days())[3]->month_day();}場合は、107バイトとカウントします。
ピーターテイラー

関数宣言ではないものを見たことがありますが、修正されたように見えますが、smalltalkの例だけが適合しません。それが有効な場合、このバイトをさらに17バイト削ることができます
...-eMBee

Smalltalkバージョンは、プログラム(具体的にはワークスペース式)として記述されています。入力を求めるのではなく、入力が与えられると言われました。
ユアンM

0

Smalltalk-スキークとファロ69 57 54 49 35 34 33%= 24バイト

「11月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

以前のバージョン

11nn出力

"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

Nov nn出力

"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出力

"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これは、メソッドとしてではなく、プログラム(具体的にはワークスペース式)として提供されます。

入力が与えられていることを前提としています(「4桁までの年を与える」という言い回しに従って。
入力の宣言と与えを含めると、さらに11文字追加されます。

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

さらにもう1つの文字(「w」の直前の空白)を削除する方法を示してくれたeMBeeに感謝します。

実際、それは 'd:'の前にある空白を削除してみようと思いました。
|y|y:=2015.(12-(Date y:y m:11d:1)w)\\7+1122
ました。


OPの説明によると、日番号のバージョンは無効です。
メゴ

私は同意します-しかし、リストにかなりの数の日数のみのバージョンがあるので、私はリンゴ対リンゴの比較のためにそこに置きます
ユアンM

0

GNU coreutils、35バイト

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

11月22〜28週の週を検索して、木曜日を検索します。CまたはPOSIXロケールで実行します。「h」を含む唯一の曜日の省略形は木曜日に依存しているためです。


1バイトは長くなりますが、これは賢い答えです。

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

3月から9月までのかなり任意の週の日付の曜日番号を取得します(したがって、日と月はそれぞれ1桁であり、うるう日の影響を受けません)。%w==0感謝祭が28日の日曜日()になるように日を選びます。次に、28からその値を減算して、適切な木曜日を取得できます。


2
これは、Sean Conneryが実行しない限り機能します。
bkul

0

TSQL、53 52バイト

DECLARE @ CHAR(4)=2000

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

フィドル

9月2日前または9日の月曜日を計算し、59日を加算します

(10月は10月であるため10月4日の月曜日を計算し、31日を追加するよりも良いです。


-1

Perl、92バイト

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

編集:出力形式を修正、2012年の結果などのバグを修正、短い「for」形式を使用。msh210に感謝します。


これは短く、同じことを行いますuse Time::Local;(localtime(timelocal 0,0,0,$_,10,$ARGV[0]))[6]==4?print:0for 22..29。しかし、両方のスクリプトには同じ欠点があります。(1)必要に応じて月の表現を出力しません。(2)たとえば、2012の出力が間違っています。
msh210
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.