Der zähe thailändische Kalender

13

Im thailändischen Kalender entspricht das Jahr 2017 2560. Der thailändische Kalender ist dem gregorianischen Kalender immer 543 Jahre voraus.

Beobachter werden bemerken, dass 2560 gleich ist 2^9 * 5, mit anderen Worten, es hat 10 Primfaktoren. Dies wird für weitere 896 Jahre nicht wieder vorkommen! Wir nennen ein Jahr zäh, wenn es genau zehn Primfaktoren hat.

Schreiben Sie ein Programm, das einen Wahrheitswert ausgibt, wenn das aktuelle Jahr unter Verwendung des thailändischen Kalenders, basierend auf der Systemuhr, hartnäckig ist, und ansonsten einen falschen Wert.

Testfälle:

  • Wenn das Programm im Jahr 2017 ausgeführt wird, true
  • Wenn das Programm in einem der Jahre 2018 bis 2912 läuft, false
  • Wenn das Programm während 2913 ausgeführt wird, true(2913 + 543 = 2^7 * 3^3)
Matt
quelle
Wenn Sie eine Sprache verwenden oder in einer Umgebung ohne Systemuhr arbeiten, ist es akzeptabel, die aktuelle Zeit als Eingabe zu verwenden?
Tutleman

Antworten:

6

Bash + Coreutils, 35 Bytes

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

Die Ausgabe ist entweder eine nicht leere Zeichenfolge (wahr) oder eine leere Zeichenfolge (falsch).

Probieren Sie es online!

Alternative Version: 37 Bytes.

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

Nicht so golfen, aber ich mag dieses.

Probieren Sie es online!

Wie es funktioniert

Das arithmetische Erweiterungsdatum $[+% Y wird +543]ausgeführt date +%Y, um das aktuelle (vollständige) Jahr abzurufen , und fügt dem Jahr 543 hinzu .

Der Faktor nimmt die Summe als Argument und gibt sie als Primfaktor aus: zuerst die zu berücksichtigende Zahl, dann eine Liste der einzelnen Primfaktoren.

Schließlich filtert awk die Eingabe und druckt nur Zeilen mit genau 11 Feldern (die Zahl plus 10 Primfaktoren).

Dennis
quelle
Lassen Sie uns diese Diskussion im Chat fortsetzen .
Seshoumara
5

05AB1E , 10 Bytes

žg543+ÒgTQ

Probieren Sie es online! oder als Testsuite

Erläuterung

      Òg     # the number of primefactors with duplicates of
žg           # the current year
  543+       # plus 543
        TQ   # equals 10
Emigna
quelle
4

CJam , 13 Bytes

et0=543+mf,A=

Probieren Sie es online!

Erläuterung

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
quelle
4

Mathematica, 37 31 Bytes

5 Bytes gespart durch lanlock4 .

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

Anonyme Funktion. Nimmt keine Eingabe und gibt Trueoder Falseals Ausgabe zurück.

LegionMammal978
quelle
Nowist implizit. Sie können verwenden DateValue@"Year".
Martin Ender
Benötigst du das &am Ende? Außerdem Date[][[1]]sind ein paar Bytes kürzer als DateValue@"Year"(wenn Sie nichts dagegen haben, Dateist das veraltet).
Kein Baum
1
Sie können ein Byte mit #&@@Date[]anstelle von speichern Date[][[1]]. Außerdem denke ich, dass "Mathematica + REPL-Umgebung" hier eine gültige Programmiersprache ist, für die Sie die Terminierung nicht benötigen &.
Greg Martin
@ GregMartin Na ja, ich war noch nie ein großer Fan davon
LegionMammal978
3

Pyth, 11 Bytes

qlP+543.d3T

Online-Dolmetscher hier verfügbar.

Erläuterung

       .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
quelle
2

Japt , 18 14 13 Bytes

543+Ki¹k l ¥A

4 Bytes gespart dank ETHproductions. 1 Byte dank obarakon gespeichert.

Probieren Sie es online!

Tom
quelle
Gute Antwort! Sie können ein Byte speichern, wenn Sie Dinge verschieben: A¥º543+Ki¹k loder543+Ki¹k l ¥A
Oliver
@obarakon Danke! Warum wird ¹verwendet, würde nicht )das Gleiche tun?
Tom
Ja, Sie können )stattdessen verwenden.
Oliver
2

Python 2 , 92 89 Bytes

-3 Bytes dank Jonathan Allan

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

Probieren Sie es online!
Iterieren Sie bis zu dem Jahr, indem Sie die Primfaktoren extrahieren (und couten).
Die exec-Zeile entspricht:

for i in range(2,y):
 while not(y%i):
  y=y/i
  c=c-1
Stange
quelle
A 3 Byte speichern c=i=1:; c-=1; print-9==c.
Jonathan Allan
1

Oktave , 31 Bytes

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

Probieren Sie es online!

Zwei hier verwendete Tricks:

  • clock()(1)direkt in die Ausgabe von indexieren clock( clock(1)funktioniert nicht)
  • nnzstattdessen numel, da alle Einträge garantiert ungleich Null sind.

Alternative Version, gleiche Bytezahl

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

Diese Version kann nur seit Jahren verwendet werden , übersteigt 30, aber offensichtlich ohne Berücksichtigung Zeitreise darunter fallen alle Jahre , in denen das Programm ausgeführt werden. Das funktioniert auch in Matlab.

Luis Mendo
quelle
1

PHP, 111 68 66

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

zählt direkt die Anzahl der Primfaktoren.

$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

Alte Idee: 111 90

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

Dies stellt keinen Primzahl factortoring builtin verwenden , aber im Grunde ein Zählen prime Sieb die Anzahl der Primfaktoren einer Zahl zu bekommen <10000. Diese Karten auf das 4 - stelligen Jahr , dass PHP bietet mit 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
quelle
1
-2 Bytes: Ybraucht keine Anführungszeichen mit -nr.
Titus
1
Zu Ihrer alten Idee: Warum initialisieren? $a[$i*$j]=($a[$i]?:1)+($a[$j]?:1)spart 13 Bytes. $j=++$i<1e4spart einen. Und keine Zitate mehr für Yzwei.
Titus
0

MATL , 14 Bytes

1&Z'543+Yfn10=

Probieren Sie es online!

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

Batch, 123 Bytes

@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

Sie können das Skript durch manuelles Überschreiben der dateVariablen vor dem Ausführen herausfiltern .

Neil
quelle
0

J , 18 Bytes

Programmkörper:

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

Probieren Sie es online!

10= ist zehn gleich

# die Bilanz von

q: die Hauptfaktoren von

543+ Diese Nummer wurde zu hinzugefügt

{. der Kopf (erster Punkt, dh das Jahr) von

6!:0'' das Datum (als YMD hms)

Adam
quelle
0

JavaScript (ES6), 79 bis 75 Byte

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 of My Batch Antwort. Bestehen Sie das thailändische Kalenderjahr, wenn Sie einen bestimmten Test durchführen möchten. Bearbeiten: 4 Bytes dank @dandavis gespeichert.

Neil
quelle
wie wäre esnew Date().getYear()+2443
Matt
@Matt Ugh, das sagt MDN nicht ... aber es ist veraltet, also bin ich mir nicht sicher, ob ich es trotzdem verwenden soll.
Neil
vorbei an 2017 == false? Shortners: +Date().slice(11,15)+543und y?anstelle vony>1
Dandavis
@dandavis y?ist sinnlos, yist nie Null.
Neil