Wiesz, czym jest palindrom , liczba pierwsza i randka .
Twoim zadaniem jest wymienić wszystkie daty w ciągu 100 tysięcy lat, które spełniają wszystkie trzy cechy.
Nie licz nic poza liczbami, użyj następujących formatów: RRRRMMDD i RRRRRMMDD .
Daty między 0000-01-01 a 9999-12-31 powinny być wydrukowane jako 8-cyfrowe daty palindromów (jeśli istnieją?), A daty między 10000-01-01 a 99999-12-31 powinny być wydrukowane jako 9-cyfrowe palindromy.
Podanie dat w porządku chronologicznym nie jest obowiązkowe.
Przykładowa część prawidłowego wyniku.
Pierwsze trzy 9-cyfrowe pierwsze palindromiczne daty:
...
100111001
100131001
100161001
...
Zasady
02-29
istnieje tylko przez lata, które można podzielić przez 400 lub (podzielne przez 4 i niepodzielne przez 100).Odpowiedzi:
Rubin ,
144141 bajtów (134 + 7 dla-rprime
flagi)Zaoszczędź 3 bajty dzięki benj2240 !
Wypróbuj online!
Algorytm:
Time
instancję z danymy
,m
,d
wartości. Jeśli wynikowy obiekt czasu ma#day
wartość równąd
, to była to prawidłowa data. W przeciwnym razie zmieniłaby datę (na przykładTime.new 2018,2,30
zwraca2018-03-02
).Pętla wewnętrzna była początkowo funkcją wywoływaną dla każdego elementu w
(?0..?9)
zakresie, a także dla pustego łańcucha.Ponieważ pusty ciąg nie przyniósł żadnych wyników (nie ma poprawnych 8-cyfrowych palindromów liczb pierwszych), postanowiłem go usunąć i przełączyć do tej wersji.
źródło
t
zmienną: TIOPython 2 ,
116107128122119 bajtówDruga połowa 4. wierszu jest inspirowana przez mxdsp jest odpowiedź na pytanie innego tutaj golfowego .
Wyjaśnienie
Funkcja
g()
przyjmuje argument tylko w celu zainicjowanian
zmiennej przy użyciu jej wartości domyślnej. Wartością początkową jest liczba nieparzysta, która jest tak krótka, jak to możliwe i tak duża, jak to możliwe, a jednocześnie jest mniejsza niż pierwsza poprawna odpowiedź 100111001.Pętla, aż
n
osiągnie koniec zakresu dat 10 9 . Przyrostn
o 2.m
jest miesiącem datyn
.Jeśli
n
jest prawidłową datą, palindromem i liczbą pierwszą, wydrukuj ją:0 < m < 13
sprawdza, którym
jest prawidłowy miesiąc.n % 100 < 31 + (m+m/8)%2
sprawdza, czyn
dzień miesiąca jest ważny.(m+m/8)%2
dodaje1
za wszystkie miesiące z 31 dniami. To zasługa odpowiedzi ArmanX . W dniach 29-30 lutego nie ma liczb pierwszych.`n`[::-1] == `n`
. Backticks strifyn
.[::-1]
odwraca ciąg.2**n % n == 2
jest testem pierwotności Fermata . Ten test jest tylko probabilistyczny. Istnieją również pasujące nie-liczby pierwsze. Ale nie w zakresie liczb, na które patrzymy.źródło
APL (Dyalog Unicode) , 155 bajtów
Wypróbuj online!
To Tradfn ( upr itional F unctio n ), który jeden argument
arg = yyyymmdd
alboarg = yyyyymmdd
. Wykorzystanie jestf arg
.To nie wyświetli niczego, gdy argument rozpocznie się od,
10000101
ponieważ nie znajdzie pierwszej daty palindromu w 60 sekund.Oto mniej golfowe podejście, które da przykładowy wynik PO
( Wypróbuj online! )
Zauważ, że oba kody są dokładnie takie same, dopóki nie zostaną wywołane rekurencyjnie dla następnej daty. Podczas gdy wersja z golfem nazywa to po prostu
f arg+1
, mniej golfowy kod przeskakuje z dnia31
na dzień01
i z miesiąca12
na miesiąc01
, co znacznie przyspiesza.Jak to działa:
źródło
Python 3, 163 bajty
Rozwiązanie jest dość długie (i prawdopodobnie można je ulepszyć), ale nie używa żadnych wbudowanych funkcji do sprawdzania liczby pierwszej / daty / palindromu. Nieco golfowa wersja dla przejrzystości:
Prawidłowe daty są generowane przez wybranie miesiąca i dnia. Jak skomentowano wcześniej, należy wziąć pod uwagę tylko rozmiar 9. Należy również pamiętać, że lata przestępne nie są brane pod uwagę. Nie jest to wymagane ze względu na szczęśliwy zbieg okoliczności, że liczby pierwsze palindromu o długości 9, które kończą się 0229, po prostu nie istnieją (inne anomalie daty, takie jak 30 lutego 1712 r., Mogą zostać odrzucone z tego samego powodu).
Następnie środkowa cyfra jest wybierana dowolnie i przeprowadzany jest test podstawowy. Ponieważ pierwszy test musiał być jak najkrótszy, jest bardzo naiwny, a przez to kaleki powolny. Korzystanie z zewnętrznej biblioteki może rozwiązać ten problem (i zaoszczędzić trochę bajtów), ale jak wspomniano wcześniej, nie chciałem ich używać.
źródło
WolframLanguage (Mathematica) 187 bajtów
Może wystąpić pewne zmniejszenie rozmiaru. Wyjaśnienie do naśladowania ...
Przypadki testowe
(* {„100111001”, „100131001”, „100161001”} *)
Objaśnienie kodu
DayRange[d@#,d@#2]
zwraca wszystkie daty pomiędzy{10011, 10, 1}
i{10017, 1, 1}
. W tym przypadku zwraca około 5 lat, 4 miesiące dat (dokładnie 1920 dat). Lata przestępne są brane pod uwagę.Daty są zwracane w standardowym formacie Wolfram. Na przykład pierwsza data pojawi się jako
DateObject[List[1,1,1],"Day","Gregorian",-5.
] `#[[1]] & /@
usunie część daty, w każdej dacie, która nas dotyczy. W tym przykładzieDateObject[List[1,3,7],"Day","Gregorian",-5.]
zwraca skróconą datę{1,3,7}
.t/@p[#3,2]}
lubToString/@Padleft[#3,2]
wypełnia trzeci element, mianowicie 7, stojąc „na 7 dzień miesiąca” jak"07"
. Podobne wypełnienie jest zapewnione dla jednocyfrowego symbolu dla marca, mianowicie3
jest zwracane jako"03"
.p[#, If[Length@# < 5, 4, 5]]
wypełnia rok zerami, aby osiągnąć długość 4 lub 5 cyfr ciągu. W tym przypadku styczeń1
jest zwrócony jako „00001”."" <>...
łączy struny. W takim przypadku zwraca"000010307"
.Cases[...x_ /; PalindromeQ@x && PrimeQ@ToExpression@x]
zwraca te przypadki spośród dat z 1920 r., które są palindromami i liczbami pierwszymi.źródło
JavaScript ,
187177Założenia: brak pasujących 4-cyfrowych lat; brak pasujących dni w lutym między 29-30
Działa to tak:
Historia:
Uwagi:
Dzięki testom odkryłem, że nie ma prawidłowych dopasowań, które mają 4-cyfrowe lata lub przypadają 29 lub 30 lutego. Niestety, ze względu na kod, dokładnie pięć (nieprawidłowych) wyników przypada na 31 różnych miesięcy które mają tylko 31 dni.
źródło
Java 10,
329327320318312308307264 bajtów-1 bajt dzięki @assylias .
Wyjaśnienie:
Wypróbuj online (uwaga: część sprawdzania liczby pierwszych została zastąpiona bardziej wydajną metodą oddzielania, chociaż mimo to nadal upływa ona po 60 sekundach, generując tylko pierwsze ~ 115 palindromicznych dat pierwszych).
Wklejanie wszystkich 197 wyników z przebiegu lokalnego.
źródło
if(t.equals(new StringBuffer(t).reverse()+"")
->if(t.contains(new StringBuffer(t).reverse())
aby zapisać 1 znak (działa, ponieważ wiemy, że oba ciągi mają tę samą długość). To niewiele :-(VBA, 347
źródło
DateString
to dowolna nazwa zmiennej, więc powinieneś być w stanie sprowadzić ją do jednego znaku, prawda?Czysty ,
262... 213 bajtówWypróbuj online!
źródło
JavaScript ,
234229 bajtówTrochę nieporęczne, ale opublikowanie go, aby rzucić piłkę JS. Wszelkie sugestie mile widziane!
Nie golfowany:
Jak to działa:
Magia rzucania cyframi opiera się głównie na eksperymentach.
Zacząłem od wymyślenia, którą liczbę odjąć, aby uzyskać wersję odwróconą. Zależy mi tylko na dwóch ostatnich cyfrach.
Więc jeśli weźmiemy
n
, znajdźk
ton+k=flip(n)
. Dla początku10<n<20
k
zaczął się od 101 i wzrastał w przyrostach o 9. Jednak dlan<10
, było to 100. Zakładałemk
wzrost dla każdego skoku o 10, a po odrobinie majstrowania pomyślałem, że to prawda.Więc,
k=100+9*n+n//10
gdzie // środki całkowitymi podziału.Tak otrzymujemy
n+k = n+(100+9*n+n//10) = 100+10*n+n//10 = flipped(n)
.Nie mogę udowodnić ani twierdzić, że działa to na dowolną liczbę, ale przyniosło prawidłowe wyniki dla liczb użytych tutaj.
W teście pierwotności podziękowania dla odpowiedzi Kevina Cruijssena . Miałem nieco krótszą wersję, ale nie mogłem tego zrobić poprawnie:
Pominąłem test palindromu, zapętlając miesiące, dni i środkową cyfrę, aby móc budować ciągi, ponieważ
dDmMxMmDd
gdzieD
pierwsza cyfra dniad
jest druga, itd.Historia
Zaoszczędzono 5 bajtów, pozbywając się warunkowej części q
źródło
f
wyniku jako parametruq
, więc wytnij środkowego człowieka i piszf=n=>''+n%10+(n/10|0)
, a wynik q jest zawsze używany jako ciąg znaków, więc możesz pisaćq=n=>n<10?'0'+n:n
.APL NARS 626 bajtów, 313 znaków
wydrukuj to, co znajdę w 50 sekund, niż zatrzymaj się (bo inaczej nie mogę zatrzymać programu do kopiowania, wklej test, ponieważ nie wiem jak zatrzymać program bez zamykania okien interpretera) test:
źródło
Julia 0.6 , 109 bajtów
Link przechodzi do dłuższej wersji z dwiema różnicami:
Wypróbuj online!
źródło