Nikomu nie mów, ale naciągnąłem maszynę podróży w czasie mojego wuja! Mój wujek ma jednak obsesję na punkcie liczb pierwszych, co widać na maszynie - zaprogramował ją tak, aby mogła przechodzić tylko do dat, które sumują się do liczby pierwszej.
Tak więc nie można tego zrobić, 1947-08-15
ponieważ 1947 + 8 + 15 = 1970, co nie jest liczbą pierwszą. To może iść do 1947-07-25
, bo 1947 + 7 + 25 = 1979, co jest pierwsze. Więc jeśli chcę wrócić, by obejrzeć uroczystości niepodległości Indii, wygląda na to, że będę musiał pójść kilka tygodni wcześniej i czekać 20 dni.
Mam inne daty, na które chcę iść, i podobnie muszę iść na randkę przed (lub, jeśli mam szczęście, równą) mojej docelowej dacie, co sumuje się do liczby pierwszej. Jestem jednak niecierpliwy i nie chcę zbyt długo czekać - chcę więc znaleźć datę, której mogę użyć, najbliższą mojej docelowej dacie.
Czy możesz napisać mi program, który przyjmuje moją datę docelową i podaje datę, którą powinienem wprowadzić do wehikułu czasu - najbliższą datę przed lub równą podanej dacie, której części składają się na liczbę pierwszą?
(Do tego wyzwania używamy proleptycznego kalendarza gregoriańskiego - co oznacza po prostu, że używamy bieżącego kalendarza gregoriańskiego nawet w okresach, gdy ludzie używali wtedy starszego kalendarza juliańskiego.)
Wkład
- Randka
- idealnie, każda data w obecnej erze (AD); praktycznie każdy podzbiór tego języka może naturalnie sobie poradzić
- w dowolnym formacie czytelnym dla człowieka like lubisz
Wydajność
- Data najbliższa wejściu, która jest mniejsza lub równa wprowadzeniu i której data + miesiąc + rok sumuje się do liczby pierwszej.
- w dowolnym formacie czytelnym dla człowieka like lubisz
⁺: „czytelny dla człowieka” jak w dniu, miesiącu i roku, wszystkie oddzielnie, w dowolnej kolejności
Przypadki testowe
1947-08-15
=> 1947-07-25
1957-10-04
=> 1957-09-27
1776-07-04
=> 1776-07-04
999-12-12
=> 0999-12-10
2018-06-20
=> 2018-06-15
1999-01-02
=> 1998-12-29
1319-12-29
=> 1319-07-01
(Podziękowania dla @Shaggy, @PeterTaylor i @Arnauld za pomoc przy pytaniu.)
Fri Jul 25 02:46:39 CEST 1947
)Odpowiedzi:
Czerwony , 87 bajtów
Wypróbuj online!
Bardziej czytelny:
źródło
JavaScript (Node.js) , 94 bajty
Pobiera dane wejściowe jako 3 liczby całkowite w składni curry
(year)(month)(day)
. Zwraca ciąg rozdzielany łącznikiem z wiodącym łącznikiem.Wypróbuj online!
W jaki sposób?
Najpierw konwertujemy datę do formatu JSON
yyyy-mm-ddT00:00:00.000Z
( ISO 8601 ), dzielimy na'T'
, zachowujemy tylko lewą część i dodajemy wiodący łącznik, co daje-yyyy-mm-dd
.To wyrażenie s można teraz
eval()
„uated dostać przeciwnego n sumy lat + miesiąc + dzień .Używamy funkcji pomocniczej P (), aby sprawdzić, czy -n jest liczbą pierwszą (w którym to przypadku zwraca 0 ). Jeśli tak, zwracamy s . W przeciwnym razie próbujemy ponownie z poprzedniego dnia.
źródło
Python 2 ,
130127 bajtówDane wejściowe to
year, month, day
.-3 bajty dzięki Kevin Cruijssen .
Wypróbuj online!
źródło
Java 8,
144128 bajtówWypróbuj online.
java.time.LocalDate
klasa poprawiła się w porównaniu do starejjava.util.Date
, ale dlaczego musieli wydłużyć te nazwy (getMonthValue
igetDayOfMonth
zamiastgetMonth
igetDay
) ..>.>Wyjaśnienie:
źródło
Ruby , 94 bajty
Wypróbuj online!
Pobiera dane wejściowe z pojedynczą datą i zwraca ciąg znaków w formacie ISO 8601 (
YYYY-MM-DD
).Wykorzystuje główny moduł Ruby. Jeśli nie jest to dozwolone, lub marszczy brwi, to przez dwa kolejne bajty przedstawiam tę obrzydliwość:
Ruby , 97 bajtów
Wypróbuj online!
Wykorzystuje sprawdzanie, czy liczba jest liczbą pierwszą z tej odpowiedzi przepełnienia stosu . Nie mam pojęcia, jak to działa, wygląda trochę jak czary. Takie same dane wejściowe jak powyżej i takie same dane wyjściowe.
źródło
d
i spacji po nimif
, więc możesz ogolić 3 bajty z pierwszej odpowiedzi, usuwając je. Link do TIO?x*n !~ /^x?$|^(xx+?)\1+$/
= aby sprawdzić, czy n jest liczbą pierwszą, utwórz ciąg n 'x, sprawdź, czy nie jest to 0 lub 1 x (które nie są liczbami pierwszymi) i czy nie pasuje do żadnego 2 lub więcej x się powtarza (dopasowanie^(xxxxx)\1+$
oznacza, że n można podzielić przez 5). Nadużywa cofania się silnika regex, aby wykonać dla nas pętlę - jest genialny, monstrualny, a ofiara zwierząt prawdopodobnie była zaangażowana w jego odkrycie.Ruby ,
5753 bajtówWypróbuj online!
Nie mój pomysł - skradziony z „obrzydliwości” przez IMP1
Oryginalny pomysł:
Ruby , 59 bajtów
Wypróbuj online!
źródło
8e4
zamiast tego działałoby?R , 117 bajtów
Wypróbuj online!
źródło
F #,
134133 bajtów-1 bajt dzięki sundar .
Wypróbuj online!
Zsumuj dzień, miesiąc i rok i sprawdź, czy jest to liczba pierwsza. Jeśli tak, zwróć tę datę. Jeśli nie, zmniejsz datę o 1 dzień i spróbuj ponownie.
źródło
-1.0
jako-1.
w wywołaniu AddDays.PowerShell ,
10590 bajtówWypróbuj online!
Dzięki sundar za -13 bajtów.
Pobiera dane wejściowe jako a
DateTime
2018-06-20
i zapisuje je$a
. Więc jesteśmy wfor
pętli. Każdej iteracji bierzemy$a
-f
ormatowane jakyyyy+MM+dd
(tj. Bieżącą datę oddzieloną+
znakami) dodawane razem z|iex
(podobnie jakeval
), mnożąc ciąg znaków przez1
s, aby utworzyć liczbę jednoznaczną, i używając wyrażenia regularnego sprawdzającego liczbę pierwszą aby ustalić, czy bieżąca data jest liczbą pierwszą, czy nie. Jeśli nie jest to liczba pierwsza, musimy.AddDays(-1)
cofnąć się o dzień i kontynuować pętlę. Jeśli jest to liczba pierwsza, wyrywamy się z pętli i umieszczamy$a
na rurociągu z niejawnym wyjściem.Wynikowy wynik zależy od kultury. W TIO, który korzysta
en-us
, dane wyjściowe mają format długiej daty, który wyglądaSaturday, July 1, 1319 12:00:00 AM
.źródło
0001-01-01
suma 3). Zaskoczyłem te zmiany tutaj .Bash ,
114108 bajtówWypróbuj online!
Mój pierwszy w historii golf. Szczerze mówiąc, mój pierwszy prawdziwy program bash w historii ... wzięty z testu pierwotności stąd .
Czasami może się to nie powieść, jeśli nastąpi zmiana strefy czasowej, ale TIO używa UTC, więc powinno działać.
źródło
@$
, daje kod roboczy o wielkości 110 bajtów .C (gcc) , 167 bajtów
Wypróbuj online!
Zniszczony
Funkcja kontroli zalewania. Ponieważ najwcześniejszy ważny rok, z którym musimy się zmierzyć, to 0001-01-01, najniższa liczba, o którą musimy się martwić, to 3, więc kontrole przypadków specjalnych dla n == 2 lub n <2 są usuwane. r jest ustawione na prawdę, jeśli n nie jest liczbą pierwszą. r jest zachowywany globalnie, ponieważ bez konieczności zwracania zapisuje dwa bajty (
i=n;
powrót,r
do sprawdzenia globalnego). i jest ustawiane na 1 przez funkcję wywołującą, aby zapisać kolejne 2 bajty.Przyjmujemy datę jako trzy oddzielne liczby całkowite i rozpoczynamy główną pętlę, która trwa, aż y + m + d będzie liczbą pierwszą. Następnie dochodzimy do sedna funkcji:
Może wydawać się niewygodne użycie miy zarówno podczas sprawdzania roku przestępnego, jak i jako indeksu ciągu, gdy kolejność oceny nie jest określona. Na szczęście sprawdzamy, czy rok przestępny jest sprawdzany tylko wtedy, gdy m == 2, co nie może się zdarzyć w tym samym czasie, kiedy zmieniamy m i y, ponieważ dzieje się tak tylko od stycznia do grudnia, więc sprawdzenie roku przestępnego nigdy nie przeszkadza kolejność oceny.
Na koniec wynik jest drukowany do STDOUT:
źródło
C # -
281239232 Charbez golfa:
Sprawił, że kod był mniej wydajny, ale mniejszy. Pętla Prime przejdzie teraz do liczby całkowitej zamiast pierwiastka kwadratowego. Przetwarza również wszystkie liczby parzyste.
źródło
public
. Ponadto, ponieważ wydaje się, że wprowadzanie daty jako parametru wywołującego nie jest niedozwolone, możesz mieć,Main(string[]a)
a następnieDateTime.Parse(a[0])
MATL , 14 bajtów
Wypróbuj online!
Na przemian:
15 bajtów
Wypróbuj online!
źródło