Najwyższe środy
Twoim zadaniem jest policzenie liczby środy przypadającej na pierwszy dzień miesiąca w danym roku. Na przykład 7-13-16
jest pierwszą środą. Aby zachować spójność, użyj kalendarza gregoriańskiego dla wszystkich dat.
Wkład
Dane wejściowe do Twojego programu / funkcji będą wynosić rok (np. 2016
) I będą elastyczne. Rok będzie liczbą całkowitą między 1912 a 2233 włącznie.
Wydajność
Wynik jest również elastyczny i powinna być liczbą pierwszych środy (np 18
.).
Punktacja
To jest golf golfowy, więc wygrywa najkrótszy kod w bajtach!
Przypadki testowe
wejście -> wyjście
--------------------
1912 -> 19
1914 -> 16
1984 -> 17
1996 -> 19
2063 -> 19
2150 -> 16
2199 - > 18
2233 -> 18
Python 2,
95936867 bajtówDzięki @Josay za grę w golfa z 1 bajtu!
Przetestuj na Ideone .
źródło
0x10ea2c8dbb06c5619
zamiast19501370182350951961
.big_constant//5**long_expression
ale jak, u licha, przyszedłeś z tą stałą i taką ekspresją? To szalone: DBrain-Flak ,
6588,2310,2308, 2290 bajtówPo pierwsze, nie napisałem prawie 100% tego programu, co prawdopodobnie świadczy o ogromnej wielkości programu. Większość tego kodu została napisana przez mój własny algorytm golfowy Brain-Flak . Wraz z dodatkowym skryptem Pythona napisałem, aby podpowiedzieć go we właściwym kierunku.
Wypróbuj online!
Chociaż ten program jest dość długi jak na golfa kodowego, tak naprawdę jest całkiem przyzwoity dla Brain-Flak. Obecnie rekord świata w dzieleniu liczb całkowitych wynosi ponad 1000 bajtów.
Wyjaśnienie
Algorytm jest dość prosty. Ponieważ dostępna jest ograniczona liczba lat (321), po prostu wypycha odpowiedzi w odwrotnej kolejności pod dane wejściowe i używa algorytmu wyszukiwania, aby znaleźć poprawną odpowiedź. Podczas gdy kodowanie na stałe wszystkich 321 możliwości może wydawać się raczej nieefektywne przy tak złożonym zadaniu, jak i języku tak ezoterycznym jak uderzenie mózgu, może być najlepszym rozwiązaniem. (Planuję się dowiedzieć w nadchodzącym tygodniu).
Ponieważ większość z 321 liczb wynosi średnio około 18 i różnią się one nieznacznie z roku na rok, zamiast wypychać wszystkie liczby indywidualnie, przepycham pierwszy rok (2233) normalnie, a następnie po prostu powielam i zmieniam nieco wartość każdego roku po. W ten sposób zamiast płacić za push ~ 18 przez wszystkie 321 lat, płacę tylko za push ~ 2 za każdy rok.
Po wysłaniu wszystkich odpowiedzi odejmuje 1912 od danych wejściowych
({}[(((((((((()()()()())){}{}){}){}){}){}[()]){}){}){}])
(może to być nieoptymalne, przepisałem optymalizator, aby pominąć pewne wartości, które moim zdaniem nie byłyby optymalne, ponieważ liczby zakodowane na stałe są procesem nadwykładniczym i uruchomienie go do końca może mieć zajęło kilka dni).Następnie odejmuje jeden od pierwszego elementu i wyskakuje z drugiego elementu, aż wynik osiągnie zero
{({}[()]<{}>)}
.Zeruje zero
{}
i wszystkie elementy poniżej górnego elementu({}<{{}}>)
.źródło
n
im
które mają długościk
il
, przypuszczamn+m
miałby długośćk+l
? Con*m
?n*m
byłobyk+4m-4
lubl+4n-4
. Wynika to z faktu, że mnożenie jest zakodowane na stałe. Najpierw pchamyn
m-1
czasy. Aby to zrobić, potrzebujemyk
symboli do wyrażenian
i2m-2
symboli do wyrażenia wypchnięć (każde naciśnięcie to 2 symbole). Potem pukamym-1
, kosztując nas dodatkowo2m-2
(popy również kosztują 2 symbole). To sumuje się dok+4m-4
. możemy także pomnożyćm*n
(własność przemienną), aby uzyskaćl+4n-4
. Wynik będzie krótszy z dwóch.+1
kosztuje 2,*2
kosztuje 4,*3
kosztuje 8,*4
kosztuje 12, co jest droższe niż*2*2
, więc nie warto (spośród liczb poniżej 1000 znalazłem tylko 10, które nie wykorzystały*2
: 1, 2, 3 , 4, 5, 9, 15, 27, 45, 135). W 1912 r. Najlepsze, co mogłem zrobić,((((((1+1+1)*2+1)*2*2+1)*2+1)*2+1)*2+1)*2*2*2
to długość 52.Bash + wspólne narzędzia, 39
Trwa rok wprowadzania jako parametr wiersza polecenia. Zazwyczaj wysyła takie wiadomości do STDERR - myślę, że jest to zgodne z prawem w przypadku tej meta-odpowiedzi :
Jeśli chcesz jawnie wyłączyć dane wyjściowe STDERR, możesz to zrobić, uzyskując wynik 43 :
źródło
gd_GB.utf8
, gdzie wszystkie nazwy dni są skrótemDi
.Oktawa, 86 bajtów
Pod żadnym względem nie jest to szybkie. Ale tak naprawdę nie jest to celem golfa kodowego, prawda?
Oktawa może śledzić daty według „numeru daty” - liczby dni, w których 1 stycznia 0 jest dniem 1. Według tego pomiaru 3 stycznia 1912 r. (Pierwsza środa w naszym zestawie) to dzień 698,346. Zacznij od tego i powtarzaj co 7 dni (wszystkie środy) do końca 2233 r. I dodaj 1, jeśli rok jest rokiem docelowym ORAZ dzień miesiąca jest liczbą pierwszą.
źródło
Python 2.7,
166,165, 150 bajtówZ pewnością jest tu miejsce na ulepszenia. Jestem raczej nowy w golfie w Pythonie. To używa
datetime
modułu. Pętla przechodzi przez wszystkie dni w roku, dodając jeden do akumulatora, jeśli spełnia kryterium. Następnie drukuje wynik. Większość dużych obciążeń znajduje się w module, więc kod może być dość cienki.Jeden bajt zapisany dzięki Morgan Thrapp i 15 bajtów zapisanych przez Pietu1998 .
źródło
n%x==0
nan%x<1
.-1
jest to konieczne, ponieważrange
indeks końcowy jest wyłączny. Dodatkowo możesz przekonwertować nafilter
generator.[0for x in range(2,n)if n%x<1]
any(...)
luball(...)
zamiastnot filter(...)
.all
możesz uratować całą grupę.c+=n>1<2==d.weekday()>0<all(n%x for x in range(2,n))
J, 44 bajty
Właśnie odkryłem, że J ma wbudowane funkcje do manipulacji datami.
Stosowanie
Dodatkowe polecenia są używane do formatowania wielu wejść / wyjść.
Wyjaśnienie
źródło
PowerShell v3 +,
9995 bajtówPodejście brutalnej siły -
Pobiera dane wejściowe
$y
, pętle od1
do12
, tymczasowo zapisuje miesiąc$m
, a następnie zapętla każdą liczbę pierwszą od2
do31
. Dla każdego z nich konstruujemy jedenGet-Date
z tego konkretnego dnia, a następnie wybieramy tylko te zDayOfWeek
-eq
ual do3
(tj. Środa). Hermetyzuje to wszystko w parens, aby sformułować tablicę, i bierze.Count
je.Alternatywnie podejście matematyczne -
PowerShell v3 +, 105 bajtów
Skończyło się na tym, że włosy były tylko dłuższe niż podejście brutalnej siły, ale włączam to tutaj, ponieważ może być korzystne dla innych.
Ponownie przyjmuje dane
$y
jako rok. Tym razem wykonujemy operacje matematyczne ściśle w oparciu o pierwszy dzień roku. Najpierw obliczamy, który to dzień tygodnia, i zapamiętujemy go$a
do wykorzystania później. To indeksuje do pierwszej tablicy, która daje nam zwykle prawidłową liczbę. Musimy dodać do tego drugi indeks oparty na tym, czy jest to potencjalny rok przestępny, czy jest to niedziela, wtorek, środa lub czwartek, i na podstawie tego, jaki jest rok.Jest to oparte na poniższej obserwacji. Pierwsza kolumna to dzień tygodnia 1 stycznia, druga to zwykłe wyjście. O ile rok nie jest jedną ze środkowych liczb, to jest to liczba w parenach. Ostatnia kolumna opisuje działanie indeksowania% 5.
Uwaga: w obu przypadkach założono, że
en-us
jest to bieżące ustawienie programu PowerShell dla informacji o kulturze / dacie. Formatowanie daty iDayOfWeek
liczby mogą wymagać odpowiedniego dostosowania w przypadku innych wariantów kultury.źródło
Rubinowy, 83 + 15 (
-rdate -rprime
flagi) = 98 bajtówWypróbuj online! (Zaimportowane moduły są wstawiane, ponieważ idk, jeśli mogę używać flag w repl.it)
źródło
JavaScript ES6,
187182181179 bajtów179 Zamieniono w pętli for na pętlę while
181 Zagęszczony trójskładnikowy
182 Połączone dwie pętle
187
źródło
Partia, 248 bajtów
Objaśnienie:
d
jest dniem tygodnia, w którym0
dla poniedziałku, który jest dogodnie 1 stycznia 1912 r.,l
Jest flaga wskazująca, czy rok jest rokiem przestępnym,1
dla 1912 r. Następnie przechodzimy od 1913 do roku wejściowego, aktualizując dzień tydzień i przeliczanie flagi roku przestępnego w miarę upływu czasu. Na koniec używamy flagi roku przestępnego i dnia tygodnia, aby zindeksować coś, co jest efektywnie dużą instrukcją zmiany w celu ustalenian
liczby pierwszych środy. Ustawienie wartościn
20 i zmniejszenie jej wraz ze spadkiem jest jednak tańsze niż użycie logiki sterowania przepływem, ale wynik jest taki, że jeśli 1 stycznia roku bez skoku jest czwartek lub niedziela, to jest 16 pierwszych środy i tak dalej dla innych przypadków .źródło
JavaScript ES6
206203199197195183182179Nie najkrótszy, ale na razie najlepszy, co mogę zrobić ... Sugestie dotyczące gry w golfa mile widziane ...
Zmiany:
3>=x?3-x:10-x
na6-(x+10)%7
, zapisywanie: 3 Zmiany w lokalizacjach deklaracji;x=w.getDay();z=D(w,6-(x+10)%7)
zz=D(w,6-(w.getDay()+10)%7)
, zapisując: 4Z=0
zfor
pętli na deklarację daty i wciśniętoz=D(w,6-(x+10)%7)
wfor
pętlę, aby uporządkować, oszczędzając: 2w=new Date(a,Z=0,1)
deklarację dofor
pętli, scalając z istniejącąw
deklaracją, oszczędzając: 2+!!
na,~~
aby zmniejszyć i nadal konwertowaćp(d=1)
zNaN
na0
, umożliwiając działanie funkcji Prime Test, oszczędzając: 1W
, ponownie zdefiniowanofor
pętlę - przechodząc w odwrotną stronę od 31 grudnia, zapisującDate
obiekt jako osobną zmienną, a następnie ponownie zapisującfor
pętlę doeval
wywołania; oszczędność 3.@PandaCoder, nadrabiam zaległości, kolego!
źródło
R,
149147 bajtówPrzetestuj na Ideone .
źródło
Groovy, 126
Groovy nie ma sprawdzania poprawności liczb pierwszych, musiał to również zbudować.
źródło