tło
Niektóre święta mają ustalone, łatwe do zapamiętania daty, takie jak 31 października, 25 grudnia itp. Niektóre jednak chcą być kłopotliwe. Są one określane jako „pierwszy poniedziałek września” lub „czwarty czwartek listopada”. Skąd mam wiedzieć, kiedy to jest?
Wiem tylko, że Święto Dziękczynienia zbliża się bardzo szybko, dlatego potrzebuję programu, który pomoże mi ustalić, kiedy to nastąpi. Niektórzy nawet twierdzą, że jest jutro , więc twój program musi być jak najkrótszy, aby upewnić się, że mogę go ponownie wpisać na czas.
Wyzwanie
Utwórz program lub funkcję, która, biorąc pod uwagę maksymalnie czterocyfrowy rok (np. 2015 lub 1984), wyświetla lub zwraca datę Święta Dziękczynienia Stanów Zjednoczonych w tym roku. Święto Dziękczynienia jest zdefiniowane jako czwarty czwartek listopada według strony Wikipedii . (Wskazówka: ta strona zawiera także kilka interesujących informacji na temat wzorca daty).
Wprowadzanie : liczba dziesiętna z maksymalnie czterema cyframi reprezentującymi rok w erze wspólnej (CE). Przykłady: 987, 1984, 2101
Wyjście : data, w tym miesiąc i dzień, w którym przypada Święto Dziękczynienia, lub spadłoby, gdyby istniało, w tym roku. Może to być dowolny rozsądny format; użyj najlepszej oceny. Korzystaj z kalendarza gregoriańskiego we wszystkich przypadkach, nawet jeśli w tym czasie nie był używany.
(Uwaga: pamiętaj, aby poprawnie obchodzić lata przestępne!)
Przypadki testowe
Wejście 1:
2015
Wyjście 1:
Nov 26
Wejście 2:
1917
Wyjście 2:
Nov 22
Punktacja
Zgłoszenia będą oceniane w bajtach . Polecam tę stronę do śledzenia liczby bajtów, chociaż możesz użyć dowolnego licznika, który ci się podoba.
Bonusy
-25% do twojego wyniku, jeśli traktujesz daty BCE jako liczby ujemne (np. -480 byłby rokiem bitwy pod Termopilami).
Wprowadzanie negatywnych przypadków testowych:
-480
Odpowiednia wydajność:
Nov 25
To jest golf golfowy , więc wygrywa najniższy wynik!
Edycja: Oznaczam zgłoszenie TI-BASIC Thomasa Kwa jako zaakceptowane. Nie zniechęcaj Cię do przesyłania nowych wpisów!
Liderów
Oto fragment kodu, który pozwala wygenerować zarówno zwykłą tabelę wyników, jak i przegląd zwycięzców według języka.
Aby upewnić się, że twoja odpowiedź się pojawi, zacznij od nagłówka, korzystając z następującego szablonu Markdown:
# Language Name, N bytes
gdzie N
jest rozmiar twojego zgłoszenia. Jeśli poprawić swój wynik, to może zachować stare porachunki w nagłówku, uderzając je przez. Na przykład:
# Ruby, <s>104</s> <s>101</s> 96 bytes
Jeśli chcesz umieścić w nagłówku wiele liczb (np. Ponieważ twój wynik jest sumą dwóch plików lub chcesz osobno wymienić kary za flagi tłumacza), upewnij się, że rzeczywisty wynik jest ostatnią liczbą w nagłówku:
# Perl, 43 + 2 (-p flag) = 45 bytes
Możesz także ustawić nazwę języka jako link, który pojawi się we fragmencie tabeli wyników:
# [><>](http://esolangs.org/wiki/Fish), 121 bytes
var QUESTION_ID=64785,OVERRIDE_USER=45162;function answersUrl(e){return"http://api.stackexchange.com/2.2/questions/"+QUESTION_ID+"/answers?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+ANSWER_FILTER}function commentUrl(e,s){return"http://api.stackexchange.com/2.2/answers/"+s.join(";")+"/comments?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+COMMENT_FILTER}function getAnswers(){jQuery.ajax({url:answersUrl(answer_page++),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){answers.push.apply(answers,e.items),answers_hash=[],answer_ids=[],e.items.forEach(function(e){e.comments=[];var s=+e.share_link.match(/\d+/);answer_ids.push(s),answers_hash[s]=e}),e.has_more||(more_answers=!1),comment_page=1,getComments()}})}function getComments(){jQuery.ajax({url:commentUrl(comment_page++,answer_ids),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){e.items.forEach(function(e){e.owner.user_id===OVERRIDE_USER&&answers_hash[e.post_id].comments.push(e)}),e.has_more?getComments():more_answers?getAnswers():process()}})}function getAuthorName(e){return e.owner.display_name}function process(){var e=[];answers.forEach(function(s){var r=s.body;s.comments.forEach(function(e){OVERRIDE_REG.test(e.body)&&(r="<h1>"+e.body.replace(OVERRIDE_REG,"")+"</h1>")});var a=r.match(SCORE_REG);a&&e.push({user:getAuthorName(s),size:+a[2],language:a[1],link:s.share_link})}),e.sort(function(e,s){var r=e.size,a=s.size;return r-a});var s={},r=1,a=null,n=1;e.forEach(function(e){e.size!=a&&(n=r),a=e.size,++r;var t=jQuery("#answer-template").html();t=t.replace("{{PLACE}}",n+".").replace("{{NAME}}",e.user).replace("{{LANGUAGE}}",e.language).replace("{{SIZE}}",e.size).replace("{{LINK}}",e.link),t=jQuery(t),jQuery("#answers").append(t);var o=e.language;/<a/.test(o)&&(o=jQuery(o).text()),s[o]=s[o]||{lang:e.language,user:e.user,size:e.size,link:e.link}});var t=[];for(var o in s)s.hasOwnProperty(o)&&t.push(s[o]);t.sort(function(e,s){return e.lang>s.lang?1:e.lang<s.lang?-1:0});for(var c=0;c<t.length;++c){var i=jQuery("#language-template").html(),o=t[c];i=i.replace("{{LANGUAGE}}",o.lang).replace("{{NAME}}",o.user).replace("{{SIZE}}",o.size).replace("{{LINK}}",o.link),i=jQuery(i),jQuery("#languages").append(i)}}var ANSWER_FILTER="!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe",COMMENT_FILTER="!)Q2B_A2kjfAiU78X(md6BoYk",answers=[],answers_hash,answer_ids,answer_page=1,more_answers=!0,comment_page;getAnswers();var SCORE_REG=/<h\d>\s*([^\n,]*[^\s,]),.*?([\d.]+)(?=[^\n\d<>]*(?:<(?:s>[^\n<>]*<\/s>|[^\n<>]+>)[^\n\d<>]*)*<\/h\d>)/,OVERRIDE_REG=/^Override\s*header:\s*/i;
body{text-align:left!important}#answer-list,#language-list{padding:10px;width:290px;float:left}table thead{font-weight:700}table td{padding:5px}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <link rel="stylesheet" type="text/css" href="//cdn.sstatic.net/codegolf/all.css?v=83c949450c8b"> <div id="answer-list"> <h2>Leaderboard</h2> <table class="answer-list"> <thead> <tr><td></td><td>Author</td><td>Language</td><td>Size</td></tr></thead> <tbody id="answers"> </tbody> </table> </div><div id="language-list"> <h2>Winners by Language</h2> <table class="language-list"> <thead> <tr><td>Language</td><td>User</td><td>Score</td></tr></thead> <tbody id="languages"> </tbody> </table> </div><table style="display: none"> <tbody id="answer-template"> <tr><td>{{PLACE}}</td><td>{{NAME}}</td><td>{{LANGUAGE}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody> </table> <table style="display: none"> <tbody id="language-template"> <tr><td>{{LANGUAGE}}</td><td>{{NAME}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody> </table>
Odpowiedzi:
TI-BASIC, 15 bajtów * 0,75 = 11,25
Testowany na moim kalkulatorze TI-84 +
Święto Dziękczynienia przypada na 29 listopada minus dzień tygodnia 1 września, gdzie 1 to niedziela, a 7 to sobota. Dane wyjściowe są w formacie
MMDD
.Przypadki testowe:
2015
->1126
,1917
->1122
,-480
->1125
zostały zweryfikowane. Wydaje się, że TI-BASIC używa kalendarza gregoriańskiego dla wszystkich dat.TI-BASIC nie obsługuje lat ujemnych, ale dostaje to bonus, ponieważ dodajemy 10000 do nakładów. Ponieważ kalendarz gregoriański ma okres 400 lat, nie zmienia to dnia tygodnia.
źródło
dayofWK(
iAns
które są 2 i 1 bajtów każdy.PHP,
6548424136 (+2 dla-F
) = 38 bajtówPobiera dane wejściowe jako pierwszy argument wiersza poleceń. Działa z ostrzeżeniami, które są akceptowane przez nasze zasady. Odbitki
NovDD
, gdzieDD
jest dzień Dziękczynienia.Brak linku online, ponieważ ideone nie obsługuje argumentów wiersza poleceń i nie znam takiego interpretera.
Dzięki Alexander O'Mara za nauczenie mnie nowej sztuczki i primo za znaczną redukcję
źródło
"4thuXI"
. Możesz nawet upuścić przestrzeń między rokami"4thuXI2015"
.-F
można skrócić dane wejściowe"4thuXI$argn"
.Md
nie potrzebuje cytatów, zE_NOTICE
wyłączonym.Mathematica,
5938 bajtówźródło
WolframAlpha["Thanksgiving " <> #] &
data jest wprowadzana jako ciąg.JavaScript (ES6),
424031 bajtów - 25% = 23,25Ponieważ data „może mieć dowolny rozsądny format”, funkcja ta używa
DD.MM
. Napisałem odpowiedź na TeaScript inną techniką, ale ta formuła była krótsza.Wyjaśnienie
Ponieważ miesiące liczone są od zera,
new Date(a,10)
zwracaDate
obiekt reprezentujący 1 listopada określonego roku.Ponieważ
getDay()
zwraca liczbę reprezentującą dzień tygodnia, od0..6
którego chcemy mapowaćnastępnie dodaj 22. Okazuje się, że
(11 - new Date(a,10).getDay()) % 7
to załatwi sprawę. Jak zauważył Thomas Kwa , jest to to samo,28-new Date(a,8).getDay()
co 28 minus dzień tygodnia 1 września.źródło
Japt ,
4337363529 bajtów - 25% = 21,75Japt to skrócona wersja Ja vaScri pt .
Hahaha, znalazłem naprawdę podstępną sztuczkę: interpreter ignoruje nawiasy wewnątrz ciągów (używanych do wstawiania kodu) podczas ich dekompresji, dzięki czemu możemy skompresować cały kod źródłowy, aby zapisać bajt>: D
Te dwa
?
znaki powinny być, odpowiednio, niedrukowalnymi kodami U + 0098 i U + 0085 w Unicode. Wypróbuj online!Po dekompresji kod ocenia to:
Co ocenia:
Co daje odpowiednią wydajność.
Używa techniki intrepidcodera , wyświetlając dane w formacie
dd.mm
. Właściwie obsługuje lata ujemne. Sugestie mile widziane!Edycja: Od 2 grudnia możesz teraz używać tego 11-bajtowego kodu (zdobywając 8,25 punktu ):
(Szkoda, że nie wdrożyłem tego wcześniej!)
źródło
Vitsy , 44 bajty
Obliczam z czystą matematyką !
Gra w golfa:
Ungolfed (przeniesiono wywołanie metody do pierwszego wiersza, aby było czytelne):
Prawdopodobnie jest na to lepszy algorytm (i to prawdopodobnie strasznie gra w golfa), ale dla tych, którzy zastanawiają się, mój algorytm pochodzi stąd .
Wypróbuj online!
Czy dostaję punkty bonusowe za ich obliczenie i posiadanie dokładnie 42 bajtów?Zniszczone marzenia.Dzięki @ Hosch250 za wskazanie, że robiłem to źle. : D Naprawiono.
źródło
Python, 38 * 0,75 = 28,5 bajtów
Działa to z ujemnymi latami w sposób określony w pytaniu, chociaż zwróciłem uwagę, że w kalendarzu gregoriańskim nie ma roku 0, więc takie zachowanie jest nieco podejrzane.
źródło
f=
."Nov "+`...`
-40%7==2
ale-40%-7==-5
JavaScript (ES6), 43.5
Rzeczywista liczba bajtów wynosi 58. Obowiązuje premia w wysokości -25% => 58 * 0,75 = 43,5
Całkiem prosto
i głupio,jak to możliwe, bez żadnych skomplikowanych obejść ani obliczeń.De-golf (ES5) + wersja demo:
Uwaga: wprowadzenie roku 0-100 daje 1900-2000 lat. Chociaż wygląda na to, że 0-100 lat podaje tę samą datę co 1900-2000, sądząc po innych odpowiedziach.
Wymiana
a+18
z22
, ponieważ jest wywoływana tylko w „inny” i „inny” występuje tylko wtedy, gdy nie jest ani większa, ani mniejsza niż 4, to znaczy dokładnie 4.Zastępuje
a<4?26-a:a>4?a+21:22
sięa<=4?26-a:a+21
źródło
a<4?x:a>4?y:a+18
równoważnea<4?x:a>4?y:22
?TeaScript,
353324 bajty - 25% = 18Jest to ta sama metoda, co moja odpowiedź JavaScript , która wykorzystuje sprytną formułę Thomasa Kwa .
Wersja alternatywna z objaśnieniem
źródło
Jython,
141155 bajtówKorzysta z klas kalendarza i skanera Java ze składnią Python.
Edycja: drobne problemy ze składnią, dodano 14 bajtów.
Zobacz także moją wersję Brainfuck .
źródło
Python,
838178 bajtówźródło
import datetime as d
a następnie możesz użyćd
za każdym razem, gdy używaszdatetime
w swoim programie.import pandas;print'Nov '+`((10-pandas.datetime(input(),11,1).weekday())%7)+22`
from datetime import*
jest nawet nieco krótszy, ponieważ nie będziesz jużd.
więcejExcel,
36715453 - 25% = 39,75 bajtówZakłada, że rok jest przechowywany w komórce A1 w formacie daty. Zwraca liczbę całkowitą dnia w listopadzie, w którym odbywa się Święto Dziękczynienia.
To tylko normalne lata przestępne. Nie uwzględnia to faktu, że lata 2100, 2200, 2300 nie są latami przestępnymi.
Jest to przeznaczone tylko do pracy w 1621 roku - tj. Od początku Święta Dziękczynienia. (Chociaż z pewnością będzie działać aż do 0 AD).
Dość wydrukowane:
Gah! Zamiast wykonywać obliczenia na podstawie 1 stycznia, a następnie wykonywać wiele obliczeń roku przestępnego, aby poradzić sobie z 29 lutego, powinienem był oprzeć obliczenia na 1 listopada. Nb To dotyczy teraz poprawnie lat 2100, 2200 i 2300 , ale uzależnia implementację od domyślnego formatu daty instalacji programu Excel. Ta wersja jest przeznaczona dla dd / mm / rrrr:
A teraz, kiedy zrobiłem pfaffing, aby uzyskać zwięzłe obliczenia w Smalltalk, przeniesienie go do Excela powoduje:
(z rokiem wciąż w A1, ale jako liczba całkowita). Działa to nawet w latach 2100, 2200 i 2300, dla wszystkich dat od 7700BC / E, przy użyciu sztuczki polegającej na powtarzaniu dat przez Thomasa Kwa.
źródło
PowerShell,
676484725845 bajtówBierzemy naszą całkowitą liczbę wejściową jako
$a
, i natychmiast wypisujemyNov
i nową linię. Następnie bierzemy$a
i poprzedzamy go zerami i 1 września00$a/9/1
przed wygenerowaniem nowegodate
i ustaleniem, coDayOfWeek
to jest. Jeśli 1 września przypada w niedzielę (.DayOfWeek
równa się0
), Święto Dziękczynienia przypada na 28. Jeśli 1 września przypada w poniedziałek (.DayOfWeek
równy1
), Święto Dziękczynienia przypada na 27. I tak dalej. Dlatego odejmujemy ten dzień tygodnia od,28
aby uzyskać odpowiedź.Przygotowywanie kont z podwójnymi zerami dla lat jedno- i dwucyfrowych bez przerywania parsowania przez trzy- lub czterocyfrowe lata. Nie działa dla liczb ujemnych, ponieważ .NET
datetime
nie obsługuje lat mniej niż0
.Dzięki TessellatingHeckler i Toby Speight za pomoc w tym zakresie.
źródło
"{0:D3}/Nov/$_" -f $a
jest krótszy niż"$($a.ToString("000"))/Nov/$_"
i daje ten sam wynik, i myślę, że możesz użyć11
zamiastNov
Nov
była to pozostałość po tym, jak starałem się, aby poprawnie rozpoznała dwucyfrowe lata, więc też to zmienię. Dzięki!date "11/1/$a"
wynikachThursday, November 1, 2007 12:00:00 AM
. Wynika to z faktu, że nie edytujemy właściwości Calendar.TwoDigitYearMax , więc kiedy się analizuje , utkniemy w miejscu podwójnego zerowania, aby obejść ten problem .Skrypt golfowy, 25 * 0,75 = 18,75 bajtów
To używa formuły Sakamoto na dzień tygodnia. Ponieważ są ludzie, którzy to robią, dane wyjściowe mają postać
dd-mm
. Moje poprzednie zgłoszenie można znaleźć poniżej:źródło
TSQL,
478296 bajtówTylko dla miłośników. Zwykle masz tabelę wymiarów daty, aby uczynić to prostym,
select * from dimDate where [Year] = @Year and [Holiday] = 'Thanksgiving'
ale bez tego ...Nie golfowany:
źródło
(28 - ( x - 2 + floor(x / 4) - floor(x / 100) + floor(x / 400) ) % 7
) Tak, czytanie innych odpowiedzi bardzo pomaga.Pyth,
3028 * 75% = 21 bajtówJestem w 100% przekonany, że można to skrócić, ale hej, to mój pierwszy program w języku Pyth! \ o /
Zestaw testowy
Wyświetla datę w
dd.mm
formacie.Proszę zaproponować sposoby golfowym, jeśli potrafisz! Chciałbym dowiedzieć się więcej o Pyth.
źródło
Przewyższać,
6448Rok w A1
= DATA (A1,11, WYBIERZ (WEEKDAY (DATE (A1,11,1)), 26,25,24,23,22,28,27))źródło
13
bajtyTEXT
z=TEXT(DATE(A1,11,MOD(12-WEEKDAY(DATE(A1,11,1)),7)+22),"d mmm")
- wyjście jest liczbą całkowitą bez formatowania.Befunge, 41 bajtów
Uruchom tego tłumacza .
Objaśnienie: Wspólne roku jest 365 = 1 mod 7 dni, więc w roku oraz co 4 -tego roku minus każde 100 th (
d
w ASCII) lat, plus co 400 TH roku rachunki za wszystkie dni przestępnych (w tym obecnego roku). Efektem:::4"d"*/\"d"/-\4/++
może następnie być traktowane jako March 5 th , pierwszego dnia po lutym spadnie na tego samego dnia jako pierwszy dzień roku we wspólnych lat. Po tym możemy skalibrować do wzoru z5+7%-
odejmując liczbę dni w tygodniu od 28 th (The47*
zapisanej wcześniej) listopada. Następnie wydrukuj.Wersja korygująca dla lat pne jest obecnie dłuższa niż przewiduje premia, przy 59 -25% = 44,25 bajtów:
źródło
Matlab, 78 bajtów
źródło
Rubinowy,
605857 * 0,75 = 42,75 bajtów58 bajtów
60 bajtów
Nie golfowany:
Stosowanie:
źródło
VBA, 124 bajty * 75% = 93 bajty
Nie jestem pewien, czy spacje się liczą, jest to gdzieś pomiędzy 102 a 124, możesz je edytować.
Jeśli liczby całkowite są prawidłowym wyjściem, jestem więcej niż szczęśliwy, że mogę usunąć tę
Format
część.źródło
PHP 5.3+, 59 bajtów
Używa wbudowanej funkcji PHP
strtotime
do analizowania daty.Oczekuje się, że wartość zostanie przekazana przez parametr GET
Y
LUB powyżejphp-cli Y=<year>
.Próbuje znaleźć następny czwartek po 19 listopada.
Do tej pory dzięki testom, które przeprowadziłem, działa dobrze.
Pamiętaj, że dwucyfrowe lata mogą być interpretowane inaczej.
Używam,
gmdate
aby uniknąć problemów ze strefą czasową, ale działa równie dobrze, używającdate
(przynajmniej tam, gdzie mieszkam).źródło
T-SQL
215 bajtów248 * 0,75 = 186 bajtówBez golfa
które z tym rusztowaniem testowym
plony zgodnie z życzeniem
źródło
Szczupak ,
87 91 107 7776 bajtów - 25% = 57pozostawiając stary do porównania, ponieważ uważam, że jest bardziej sprytny, jeśli chodzi o korzystanie z modułu Kalendarza, ale powyższe jest znacznie krótsze.
źródło
string t(int y){object n=Calendar.Month(y,11);return"Nov "+(n->weeks()->day(4)&n->days())[3]->month_day();}
, liczę to jako 107 bajtów.Smalltalk - Squeak and Pharo ,
6957544935343332 - 25% = 24 bajty„Nov nn”:
69B49B (-25% = 36,75B)11nn (anInt):
575432B (-25% = 24B)Poprzednie wersje
Wyjście 11nn
Wyjście Nov nn
wyjście nn
nb Jest to dostarczane jako program - w szczególności wyrażenie Workspace - a nie jako metoda.
Zakłada się, że dane wejściowe są dane (zgodnie z frazą „podany maksymalnie czterocyfrowy rok”.
Włączenie deklaracji i podania danych wejściowych dodałoby kolejnych 11 znaków:
|y|y:=2015.(12-(Date y:y m:11 d:1)w)\\7+1122
Dzięki eMBee za pokazanie, jak usunąć jeszcze jeden znak - spację bezpośrednio przed „w”.
W rzeczywistości zainspirowało mnie to do usunięcia spacji przed „d:”:
|y|y:=2015.(12-(Date y:y m:11d:1)w)\\7+1122
Które działało!
źródło
Coreutils GNU, 35 bajtów
Po prostu przeszukuje tydzień 22-28 listopada w czwartek. Uruchom go w lokalizacji C lub POSIX, ponieważ zależę od tego, że czwartek to jedyny skrót dnia zawierający „h”.
Oto mądrzejsza odpowiedź, choć bajt dłuższy:
Pobieramy numer dnia tygodnia w dość arbitralnym tygodniu między marcem a wrześniem (więc dzień i miesiąc są jednocyfrowe, a ewentualny dzień przestępny nie ma na nas wpływu). Wybieramy dzień tak, aby była to niedziela (
%w==0
), kiedy Święto Dziękczynienia przypada 28. Następnie możemy odjąć tę wartość od 28, aby uzyskać odpowiedni czwartek.źródło
TSQL,
5352 bajtySkrzypce
Obliczanie poniedziałku przed lub w dniu 2 września i dodanie 59 dni
(lepsze niż obliczanie poniedziałku przed lub w dniu 4 października i dodawanie 31 dni, ponieważ październik jest 10. miesiącem, oszczędzając w ten sposób 1 bajt)
źródło
Perl, 92 bajty
EDYCJA: Naprawiono format wyjściowy, naprawiono błąd, np. Wynik 2012, zastosowano krótszy format „do”. Dzięki msh210.
źródło
use Time::Local;(localtime(timelocal 0,0,0,$_,10,$ARGV[0]))[6]==4?print:0for 22..29
. Ale oba skrypty mają te same wady: (1) nie drukują reprezentacji miesiąca zgodnie z wymaganiami; (2) mają błędne dane wyjściowe, np. 2012 r.