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)

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).





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.


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


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!


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

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.


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

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

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 .


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)


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.


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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.