Wytrwały tajski kalendarz

13

W kalendarzu tajlandzkim rok 2017 odpowiada 2560. Kalendarz tajski ma zawsze 543 lata wcześniej niż kalendarz gregoriański.

Obserwatorzy kodujący zauważą, że 2560 jest równy 2^9 * 5, innymi słowy, ma 10 czynników pierwszych. To się nie powtórzy przez kolejne 896 lat! Rok nazywamy wytrwałym, jeśli ma dokładnie dziesięć głównych czynników.

Napisz program, który generuje prawdziwą wartość, jeśli bieżący rok korzystający z kalendarza tajlandzkiego, opartego na zegarze systemowym, jest wytrwały, aw przeciwnym razie - falsey.

Przypadki testowe:

  • Jeśli program zostanie uruchomiony w 2017 r., true
  • Jeśli program jest uruchamiany w którymkolwiek z lat od 2018 do 2912, false
  • Jeśli program jest uruchomiony podczas 2913, true(2913 + 543 = 2^7 * 3^3)
Matt
źródło
Jeśli używasz języka lub działasz w środowisku bez zegara systemowego, czy dopuszczalne jest przyjęcie aktualnego czasu jako danych wejściowych?
Tutleman

Odpowiedzi:

6

Bash + coreutils, 35 bajtów

factor $[`date +%Y`+543]|awk NF==11

Dane wyjściowe to niepusty ciąg znaków (prawda) lub pusty ciąg znaków (fałsz).

Wypróbuj online!

Alternatywna wersja: 37 bajtów.

date -d 543year +%Y|factor|awk NF==11

Nie tak golfowo, ale podoba mi się ten.

Wypróbuj online!

Jak to działa

$[Data rozszerzenia arytmetycznej +% Y jest +543]wykonywana, date +%Yaby uzyskać bieżący (pełny) rok i dodaje 543 do roku.

Współczynnik przyjmuje sumę jako argument i wypisuje ją na czynniki pierwsze: najpierw liczba, która ma zostać uwzględniona, a następnie lista poszczególnych czynników pierwszych.

Na koniec awk filtruje dane wejściowe, drukując tylko wiersze z dokładnie 11 polami (liczba plus 10 czynników pierwszych).

Dennis
źródło
5

05AB1E , 10 bajtów

žg543+ÒgTQ

Wypróbuj online! lub jako pakiet testowy

Wyjaśnienie

      Òg     # the number of primefactors with duplicates of
žg           # the current year
  543+       # plus 543
        TQ   # equals 10
Emigna
źródło
4

CJam , 13 bajtów

et0=543+mf,A=

Wypróbuj online!

Wyjaśnienie

et0=  e# Get current year.
543+  e# Add 543.
mf    e# Get prime factors with multiplicity.
,     e# Get length.
A=    e# Equals 10?
Martin Ender
źródło
4

Mathematica, 37 31 bajtów

5 bajtów zapisanych z powodu lanlock4 .

PrimeOmega[#&@@Date[]+543]==10&

Funkcja anonimowa. Nie pobiera danych wejściowych i zwraca Trueani Falsedanych wyjściowych.

LegionMammal978
źródło
Nowjest niejawny. Możesz użyć DateValue@"Year".
Martin Ender
Czy potrzebujesz &na końcu? Ponadto Date[][[1]]jest o kilka bajtów krótszy niż DateValue@"Year"(jeśli nie przeszkadza, że Datejest przestarzały).
Nie drzewo
1
Możesz zapisać bajt za pomocą #&@@Date[]zamiast Date[][[1]]. Myślę też, że „środowisko Mathematica + REPL” jest tutaj poprawnym językiem programowania, dla którego nie trzeba kończyć &.
Greg Martin
@GregMartin No cóż, nigdy nie byłem wielkim fanem tego
LegionMammal978,
3

Pyth, 11 bajtów

qlP+543.d3T

Tłumacz online dostępny tutaj.

Wyjaśnienie

       .d3   get current year
   +543      add 543
  P          get prime factors of result
 l           count number of prime factors
q         T  check if equal to 10 (result is implicitly printed)
Mike Bufardeci
źródło
2

Japt , 18 14 13 bajtów

543+Ki¹k l ¥A

Oszczędność 4 bajtów dzięki produktom ETH. Zaoszczędzono 1 bajt dzięki obarakon.

Wypróbuj online!

Tomek
źródło
Niezła odpowiedź! Możesz zapisać bajt, jeśli przenosisz rzeczy: A¥º543+Ki¹k llub543+Ki¹k l ¥A
Oliver
@obarakon Thanks! Dlaczego jest ¹używany, czy nie )zrobiłby tego samego?
Tom
Tak, możesz użyć )zamiast tego.
Oliver,
2

Python 2 , 92 89 bajtów

-3 bajty dzięki Jonathanowi Allanowi

import time
y=time.gmtime()[0]+543
c=i=1
exec"i+=1\nwhile 1>y%i:y/=i;c-=1\n"*y
print-9==c

Wypróbuj online!
Iteruj do roku, wydobywając (i wykreślając) czynniki pierwsze.
Linia wykonania jest równoważna z:

for i in range(2,y):
 while not(y%i):
  y=y/i
  c=c-1
Pręt
źródło
A 3 bajt zapisać: c=i=1; c-=1; print-9==c.
Jonathan Allan
1

Oktawa , 31 bajtów

nnz(factor(clock()(1)+543))==10

Wypróbuj online!

Zastosowano tutaj dwie sztuczki:

  • clock()(1)indeksować bezpośrednio do wyniku clock( clock(1)nie działa)
  • nnzzamiast numel, ponieważ wszystkie wpisy są niezerowe.

Wersja alternatywna, ta sama liczba bajtów

nnz(factor(max(clock)+543))==10

Ta wersja może być używana tylko przez lata przekraczające 30, ale oczywiście bez uwzględnienia podróży w czasie obejmuje to wszystkie lata, w których program może być wykonywany. Działa również w Matlabie.

Luis Mendo
źródło
1

PHP, 111 68 66

$a=date(Y)+543;for($i=2;$i<$a;)$b+=$a%$i?!++$i:!!$a/=$i;echo$b==9;

bezpośrednio liczy liczbę czynników pierwszych.

$a=date(Y)+543;             // current year
for($i=2;$i<$a;)            // while $i lower than the year
$b+=$a%$i?!++$i:!!$a/=$i;   // if $i divides $a: $a/=$i and ++$b | if not: ++$i
echo$b==9;                  // output if it has 10 prime factors

Stary pomysł: 111 90

for($i=1;++$i<1e3;)for($j=1;++$j<1e3;)${$i*$j}=($$i?:1)+($$j?:1);echo${date('Y')+543}==10;

Nie używa to wbudowanego głównego faktorowania, ale w zasadzie liczącego pierwsze sito, aby uzyskać liczbę czynników pierwszych o wartości <10000. To odwzorowuje na 4-cyfrowy rok, który PHP zapewnia, używając date('Y'):

for($i=1;++$i<1e3;)          // for each number smaller sqrt(1e4)
for($j=1;++$j<1e3;)          // do sqrt(1e4) times
${$i*$j}=($$i?:1)+($$j?:1);  // n_factors[i*j] = n_factors[i] + n_factors[j]
echo${date('Y')+543}==10;          // output 1 if the current year has 10 prime factors or nothing if it doesn't
Christoph
źródło
1
-2 bajty: Ynie wymaga cudzysłowów z -nr.
Tytus
1
Twój stary pomysł: po co inicjować? $a[$i*$j]=($a[$i]?:1)+($a[$j]?:1)oszczędza 13 bajtów. $j=++$i<1e4ratuje jeden. I brak cytatów dla Ydwóch kolejnych.
Tytus
0

MATL , 14 bajtów

1&Z'543+Yfn10=

Wypróbuj online!

1&Z'   % Current year
543+   % Add 543
Yf     % Prime factor decomposition
n      % Number of elements
10=    % Equal to 10? Implicitly display
Luis Mendo
źródło
0

Partia, 123 bajty

@set/ay=%date:~-4%+543,n=d=2
:l
@set/ar=y%%d,d+=1
@if %r%==0 set/ay/=d-=1,n+=1
@if %y% gtr 1 goto l
@if %n%==12 echo 1

Możesz podrobić skrypt, ręcznie nadpisując datezmienną przed jej uruchomieniem.

Neil
źródło
0

J , 18 bajtów

Treść programu:

10=#q:543+{.6!:0''

Wypróbuj online!

10= jest dziesięć równe

# suma z

q: główne czynniki

543+ ten numer został dodany do

{. głowa (pierwsza pozycja, tj. rok) z

6!:0'' data (jako YMD hms)

Adám
źródło
0

JavaScript (ES6), 79 75 bajtów

f=(y=+Date().slice(11,15)+543,d=2,n=10)=>y>1?y%d?f(y,d+1,n):f(y/d,d,n-1):!n

Port mojej odpowiedzi wsadowej. Przekaż tajlandzki rok kalendarzowy, jeśli chcesz wykonać określony test. Edycja: Zapisano 4 bajty dzięki @dandavis.

Neil
źródło
co powiesz nanew Date().getYear()+2443
Matt
@Matt Ugh, to nie to, co mówi MDN, robi ... ale jest przestarzałe, więc nie jestem pewien, czy i tak powinienem go używać.
Neil
mijający 2017 == false? krótsze: +Date().slice(11,15)+543i y?zamiasty>1
dandavis
@dandavis y?jest bezcelowy, ynigdy nie jest równy zero.
Neil