To wyzwanie jest dość proste. Podejmiesz dane wejściowe, które będą rokiem od 1801 do 2400, i dane wyjściowe, jeśli będzie to rok przestępny, czy nie.
Twój wkład nie będzie zawierał znaków nowej linii ani spacji końcowych:
1954
Będziesz generować w dowolny sposób, który ci się podoba, który wyraźnie poinformuje użytkownika, czy jest to rok przestępny, czy nie (akceptuję y lub n dla tak / nie)
Listę lat przestępnych można uzyskać tutaj: http://kalender-365.de/leap-years.php Chciałbym zauważyć, że lata przestępne nie zawsze wynoszą cztery lata. 1896 to rok przestępny, ale 1900 nie. Lata następujące po tym „pominięciu” to:
1900
2100
2200
2300
Przypadki testowe:
1936 -> y
1805 -> n
1900 -> n
2272 -> y
2400 -> y
EDYCJA: Opiera się na standardowym kalendarzu gregoriańskim: http://www.epochconverter.com/date-and-time/daynumbers-by-year.php
źródło
(divisible by 4)∧((divisible by 100)→(divisible by 400))
.Odpowiedzi:
APL,
161412 znakówZwraca
0
za rok przestępny,1
za rok przestępny.Wypróbuj to rozwiązanie na tryapl.org . Zauważ, że zmieniłem rozwiązanie na
{≥/⌽×4 25 4⊤⍵}
dfn, ponieważ tryapl.com nie obsługuje⎕
(weź dane użytkownika). Pamiętaj, że⎕
jest to puste pole, a nie brakująca postać.To samo rozwiązanie w J:
Wyjaśnienie
Dyadic
⊤
(kodowanie) reprezentuje swój prawy argument w bazie określonej przez lewy argument.4 25 4
W tym rozwiązaniu używam bazy . To reprezentuje rok y jako wielomianNiech zdania α, β i γ reprezentują, gdy a, b i c są niezerowe: Twierdzenie γ jest fałszywe, jeśli y można podzielić przez 4, β ∧ γ jest fałszywe, jeśli y jest podzielne przez 100, a α ∧ β ∧ γ wynosi false, jeśli y można podzielić przez 400.
Tabela prawdy (
*
reprezentująca „nie przejmuj się”), w której twierdzenie represents reprezentuje, czy y jest rokiem przestępnym:Poniższe wyrażenie wyraża w α , β i γ :
Ze względu na strukturę tego wyrażenia można wyrazić ¬Δ jako redukcję,
≥/⌽α β γ
gdzie ≥ implementuje ←. To prowadzi do odpowiedzi, którą teraz wyjaśniam.źródło
Pyth, 11 bajtów
Ten pełny program odczytuje ze STDIN i drukuje True przez lata przestępne, a False inaczej.
Dzięki @Jakube za sugerowanie Pytha i po prostu przeniesienie mojego kodu CJam.
Sprawdź samodzielnie przypadki testowe w Pyth Compiler / Executor .
Jak to działa
źródło
CJam, 12 bajtów
Ten pełny program odczytuje ze STDIN i drukuje 1 dla lat przestępnych i 0 w przeciwnym razie.
Sprawdź samodzielnie przypadki testowe w interpretatorze CJam .
Jak to działa
źródło
r2/~~\e|i4%!
,r2/~~\~e|4%!
,r2/:~~\e|4%!
,r2/S*~\e|4%!
I 13 bajtówr2/:~W%:e|4%!
r2/:i:\e|4%!
(12) ir2/:i(fe|~4%!
(13). Próbowałem nawet GolfScript (który nie wymagar
), aleor4
jest interpretowany jako pojedynczy token. Gdyby tylko dane wejściowe miały końcowy znak nowej linii ...JavaScript (ES6), 21 znaków
Standardową zasadą jest to, że
y
rok przestępny następuje, jeśli 4 dzieliy
i jeśli 100 nie dzieliy
lub 400 dzieliy
. W kodzie,Nie ma potrzeby używania tych 100 i 400. Zamiast tego wystarczy sprawdzić, czy 16 lub 4 dzieli y, przy czym 16 wybiera się, jeśli 25 dzieli y, w przeciwnym razie 4. Gra w golfa
Zaimplementowana funkcja javascript ma długość 21 znaków:
Perl,
2826 znakówTen sam pomysł, ale w perlu.
Uruchom używając
-lp
opcji. Na przykład,Przy ustawionym teście jako danych wejściowych daje to wynik
źródło
y=>...
) jest funkcją ES6.Pip , 13 bajtów
Ten był bardziej interesujący, niż się początkowo wydawało. Minęło trochę finagling, ale była w stanie zastąpić te długie odniesień do
400
z4
orazh
zmienną (= 100).Dane wyjściowe
1
za rok przestępny,0
za rok przestępny. Wyjaśnienie:źródło
Pyth,
191514 bajtówO wiele za łatwe. Wypróbuj online: Demonstracja lub Uprząż testowa
edit: Nieodebrane, że możesz wydrukować wartości Prawdy / Falsy zamiast
n/y
. -4 bajtyedycja 2: Wykorzystano ideę pierwiastka kwadratowego Martina. -1 bajt
Wyjaśnienie
źródło
Regex,
836238Podziękowania dla Toby za wskazówki dotyczące łączenia obu połówek wyrażenia regularnego.
Jeśli skupimy się tylko na zakresie 1801..2400 i założymy, że dane wejściowe są liczbami całkowitymi:
Testuj w Ruby (
^
=\A
i$
=\Z
ponieważ Ruby) dla żądanego zakresu:(Premia) za coś, co powinno działać nie tylko dla 1801..2400, ale dla każdego roku nieujemnego:
Testuj w Ruby (
^
=\A
i$
=\Z
ponieważ Ruby) przez pierwsze 100000 lat:źródło
(?!)
, możesz połączyć dwie połówki:(?!00)([02468][048]|[13579][26])(00)?$
- za 38. Nie będzie to jednak działać przez lata z cyframi.JavaScript ( ES6 ) 27
Zasada:
(y%4==0) && (y%100!=0 || y%400==0)
Gra w golfa:
!(y%100<1&&y%400||y%4)
(głównie z wykorzystaniem prawa De Morgansa )Funkcja implementująca regułę:
Test (uruchamiany w przeglądarce Firefox) dla pewności:
źródło
!(y%(y%25?4:16))
zamiast!(y%100<1&&y%400||y%4)
. Dla tych, którym przeszkadza trójkowy operator, możesz użyć!(y%(4<<2*!(y%25)))
i nadal zapisać trzy znaki!(y%100<1&&y%400||y%4)
.TI-BASIC,
20 17 1613Ponieważ jest tokenizowany, TI-BASIC jest często konkurencyjny w prostych wyzwaniach matematycznych, ale nie w tym, ponieważ nie ma polecenia „podzielnego”.Może i tak jest, ale wciąż jest dłużej niż CJam i Pyth.To wykorzystuje metodę Davida Hammonda.
Stary kod o wielkości 16 bajtów:
Nie golfowany:
fPart(
jest „częścią ułamkową”; potęgowanie ma wyższy priorytet niż podział. W TI-BASIC przybliżenia są opcjonalne.Używam nieudokumentowanego zachowania
sub(
polecenia, zwykle używanego do uzyskania podłańcucha: gdy jego argumentem jest liczba zamiast ciągu, dzieli liczbę przez 100. Będzie działać na kalkulatorze serii TI-83 lub 84.20 -> 17 przez zmianę kolejności kodów, aby umożliwić usunięcie zbliżeń; 17 -> 16, zastępując 400 wartością 16; 16 -> 13, wykorzystując pomysł Davida Hammonda.
źródło
Stackylogic, 226 bajtów (niekonkurencyjny)
Tak to prawda. Stworzyłem program w Stackylogic (nie-TC), który został wymyślony przez Helkę Hombę, do wyzwania tutaj . Robi się to po wyzwaniu, więc nie konkuruje.
Stackylogic ma tylko dane binarne, więc 10 (lub więcej, więcej cyfr zostanie zignorowanych) należy zastosować bit binarny (najpierw najmniej znaczący bit). Wszelkie daty spoza określonego zakresu mogą się nie powieść, ponieważ po prostu sprawdza, jaka jest wprowadzona liczba: nie obejmuje niepotrzebnych dat
To nie tylko moje pierwsze wyzwanie w Stackylogic, ale w ogóle pierwsze wyzwanie w Stackylogic.
Przygotuj się na ten bałagan:
Zajęło mi to tak dużo czasu, ponieważ Stackylogic jest najbardziej zagmatwanym językiem, z jakim się spotkałem, i niezwykle nieczytelnym: musisz wiedzieć, jak zrobiła się reszta programu, zanim będziesz mógł przeczytać bieżącą edytowaną sekcję. Podczas tworzenia musiałem nawet dodać spacje dla czytelności.
Skromne wyjaśnienie
To proste wyjaśnienie tego, co robi.
Stackylogic nie ma żadnych funkcji matematycznych, dlatego było to trudniejsze. Musiałem zakodować większość z nich, aby sprawdzić, czy to konkretny numer.
Po pierwsze, program wykona NOR najmniej znaczących bitów, odrzucając je w procesie. oznacza to, że jeśli jest podzielna przez 4, przejdzie do głównej części programu, w przeciwnym razie wyjdzie 0.
Po drugie, wskaźnik jest przenoszony do labiryntu stackylogic, stąd, jeśli następne dwa bity są równe zero, natychmiast wyśle 1 (ponieważ wtedy jest podzielny przez 16, a więc rok przestępny pomimo innych warunków), inne mądre sprawdzi, czy nie jest to żadna z liczb, które można podzielić przez 4, ale nie jest to rok przestępny, między 1801 a 2400.
Aby wyjaśnić szczegółowo, wymagałoby to uczynienia tego postu wiele razy dłuższym niż jest już
źródło
Asembler IBM System Z - 56 bajtów.
(96 bajtów źródła. Wcześniej
712384202 bajtów źródła, 168-bajtowy plik wykonywalny).Jeszcze mniejsza wersja. Nie zapisuje już rejestrów dzwoniącego, zmiany w dosłownej pamięci, zmieniony tryb adresowania.
Nowa wersja. Spowoduje to ABEND z S0C1, jeśli jest to rok przestępny, i zapętlenie, jeśli nie jest. Mam nadzieję, że spełnia to wymaganie wskazania wyniku.
OK, więc nie najkrótszy (chociaż może to być raz, gdy spojrzymy na faktycznie wykonany kod plus rozmiar interpretera ...)
Wynik:
ABEND S0C1 na rok przestępny, S222 (gdy skończy się czas procesora), jeśli nie.
1936 Y 1805 N 1900 N 2272 Y 2400 Y(przy wielokrotnym uruchomieniu)źródło
CJam,
1816 bajtówDaje
1
(prawda) za lata przestępne i0
(fałsz) inaczej.Tutaj uruchom wszystkie przypadki testowe.
Wyjaśnienie
źródło
Mathematica,
4027 bajtów, 17 znakówUżywa 17 znaków, ale 27 bajtów. Dzięki @alephalpha za wskazówkę. Zauważ, że pionowe kreski są w rzeczywistości U + 2223 dla podziałów.
<U+F523>
Należy zastąpić odpowiednim charakterze.źródło
∣
do reprezentowaniaDivisible
:,#∣4&&(!#∣100||#∣400)&
21 znaków, 27 bajtów UTF-8.U+F523
(\[Implies]
), aby uzyskać#∣4&&(#∣100<U+F523>#∣400)&
19 znaków (ale nadal 27 bajtów).R, 29
Testowe uruchomienie
źródło
C, 81
Mogę zrobić krócej, ale ten starannie przylega do typów „char”, bez analizowania argumentu (np. Za pomocą
atoi
):Należy go wywołać nazwą o długości 4 znaków, ponieważ przyjmuje standardowe założenie, że argumenty następują bezpośrednio po nazwie programu, oddzielone wartościami NUL. Ponadto zakłada, że pojedynczy argument jest zakodowany w ASCII i nie ma spacji wiodącej.
Wyjaśnienie:
*v+9
jest pozycją cyfry „dziesiątki” wv[1]+2
.Jeśli znaki „dziesiątki” i „jednostki” dodają do 96, to kończymy
00
, więc wykonaj kopię zapasową dwóch znaków, aby „dziesiątki” i „jednostki” wskazywały na liczbę stulecia.Teraz xor „jednostki” z dwukrotnością „dziesiątek”, mod 4. Działa to dlatego
10==±2 mod 4
, że więc niższy bit „dziesiątek” może po prostu przełączać bit 1 z „jednostek”. Używamy wyniku jako indeksu w naszej tabeli resztek, drukujący
tylko wtedy, gdy wynik modułowy wynosi zero.źródło
Befunge -98, (41 bajtów)
Prostota jest niesamowita.
źródło
sed, 55
Należy pamiętać, że lata bez przestępowania mogą być drukowane jako
n
lub wN
zależności od tego, czy są parzyste czy nieparzyste. Uważam to za twórczą interpretację reguły, która pozwala na alternatywy na „tak” i „nie” bez sprecyzowania, że muszą być spójne.źródło
Python2 - 37
g=lambda x:(x%4or x%400and x%100<1)<1
Zauważ, że jeśli
a
jest nieujemną liczbą całkowitą, toa<1
jest krótki sposób pisanianot bool(a)
. Ten ostatni<1
skutecznie konwertuje wyrażenie w nawiasach na wartość logiczną i neguje wynik.Zastosowanie funkcji
g
do liczby całkowitejn
między 1801 a 2400 powróci,True
jeślin
jest to rok przestępny, i wFalse
innym przypadku.źródło
KDB (Q), 27 bajtów
Wyjaśnienie
Test
źródło
Julia,
3028 bajtówTworzy to nienazwaną funkcję, która przyjmuje argument liczby całkowitej i zwraca wartość logiczną. Aby to nazwać, nadaj mu nazwę, np
f=y->...
.Nie golfowany:
Przykład:
źródło
PHP - 45 bajtów
Naprawdę nic specjalnego, tylko nadużywanie żonglowania czcionkami.
źródło
C #, 23 bajty
Wypróbuj online!
Pełne źródło, w tym przypadki testowe:
źródło
C,
373430 bajtówWandbox
źródło
T-SQL
3722 bajtówZapisano 15 bajtów dzięki komentarzowi BradC.
Zwykła zmienna zakodowana z powodu braku a
stdin
.na przykład
Zatem rozwiązaniem jest:
źródło
1
0
PRINT ISDATE(@+'0229')
Java 8,
49452220 bajtów-2 bajty dzięki @ OlivierGrégoire .
Wypróbuj online.
Niektóre 22 bajtowe rozwiązania:
Wypróbuj online.
Wypróbuj online.
Wypróbuj online.
Wyjaśnienie:
źródło
java.time.Year::isLeap
.n->n%(n%25<1?16:4)<1
Haskell, 19 bajtów
Wypróbuj online!
źródło
JavaScript ES6, 32, 29, 26
Działa dowolny z następujących wierszy:
źródło
C, 57 bajtów
Pobiera dane wejściowe ze standardowego wejścia, z lub bez spacji / nowej linii. Działa tylko na małych komputerach Endian (tak, jak wszyscy są obecnie na BE). Wyjścia Y lub N.
Wyjaśnienie
Nie golfowany:
Po pierwsze,
scanf
czyta rok jako liczbę całkowitą y. Następnie y jest modulowane z 4 lub 400 w zależności od tego, czy rok jest podzielny przez 100. Jeśli reszta to zero, kod ASCII dla Y jest przypisywany do y, w przeciwnym razie otrzymuje kod ASCII dla N. Wartość y jest teraz0x000000??
, gdzie0x??
jest przypisany znak. Będąc na komputerze typu endian, w pamięci jest to przechowywane jako?? 00 00 00
. Jest to ciąg C zakończony znakiem NULL, zawierający tylko przypisane znaki. Adres y jest przekazywany do putów, a znak jest drukowany (z końcowym znakiem nowej linii).źródło
main(y){scanf("%d",&y);y=!(y%(y%100?4:400))+48;puts(&y);}
. Mogę zejść do 48 bajtów, jeśli mogę wypisać pustą linię dla lat przestępnych i dowolnego znaku (ASCII 1-99) w przeciwnym razie, ale wydaje mi się, że to trochę nagina reguły. Co myślisz?PowerShell, 31 bajtów
Jestem podekscytowany, mówiąc, że grałem w tę grę krócej niż wbudowany!
Wyniki są prawdziwe dla lat przestępnych, a fałsz w przeciwnym razie.
Wbudowany:
Chociaż gdybym chciał rozciągnąć stwierdzenie „wyraźnie mówi użytkownikowi, czy to jest rok przestępny, czy nie” i zrobić coś niestandardowego, mógłbym zapisać 3 bajty i użyć:
Daje to wyniki
0
dla lat przestępnych i 1 lub więcej dla lat przestępnych, co mi się nie podoba, ponieważ wolałbym zwrócić bardziej standardową wartość prawdy dla lat przestępnych.źródło
Lolcode,
228202159 bajtówNie golfowany:
W Pythonie bez golfa, ponieważ LOLCODE jest mylący:
źródło
WIN
..