Le calendrier thaï tenace


13

Dans le calendrier thaïlandais, l'année 2017 correspond à 2560. Le calendrier thaïlandais a toujours 543 ans d'avance sur le calendrier grégorien.

Les codeurs attentifs noteront que 2560 est égal à 2^9 * 5, c'est-à-dire qu'il a 10 facteurs premiers. Cela ne se reproduira plus avant 896 ans! Nous appelons une année tenace si elle a exactement dix facteurs premiers.

Écrivez un programme qui génère une valeur véridique si l'année en cours en utilisant le calendrier thaïlandais, basé sur l'horloge système, est tenace, et une valeur falsey sinon.

Cas de test:

  • Si le programme est exécuté en 2017, true
  • Si le programme est exécuté au cours de l'une des années 2018 à 2912, false
  • Si le programme est exécuté pendant 2913, true(2913 + 543 = 2^7 * 3^3)

Si vous utilisez une langue ou si vous utilisez un environnement sans horloge système, est-il acceptable de prendre l'heure actuelle en entrée?
Tutleman

Réponses:


6

Bash + coreutils, 35 octets

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

La sortie est soit une chaîne non vide (véridique), soit une chaîne vide (falsifiée).

Essayez-le en ligne!

Version alternative: 37 octets.

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

Pas aussi golfique, mais j'aime celui-ci.

Essayez-le en ligne!

Comment ça fonctionne

La $[date d' expansion arithmétique +% Y +543]s'exécute date +%Ypour obtenir l'année (complète) en cours et ajoute 543 à l'année.

Factor prend la somme en argument et l'imprime factorisation première: d'abord le nombre à factoriser, puis une liste de facteurs premiers individuels.

Enfin, awk filtre l'entrée, imprimant uniquement les lignes avec exactement 11 champs (le nombre plus 10 facteurs premiers).





4

Mathematica, 37 31 octets

5 octets enregistrés grâce à lanlock4 .

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

Fonction anonyme. Ne prend aucune entrée et retourne Trueou Falsecomme sortie.


Nowest implicite. Vous pouvez utiliser DateValue@"Year".
Martin Ender

Avez-vous besoin du &à la fin? En outre, Date[][[1]]quelques octets sont plus courts que DateValue@"Year"(si cela ne vous dérange pas, cela Dateest obsolète).
Pas un arbre

1
Vous pouvez enregistrer un octet #&@@Date[]à la place de Date[][[1]]. En outre, je pense que "l'environnement Mathematica + REPL" est un langage de programmation valide ici, pour lequel vous n'avez pas besoin de la terminaison &.
Greg Martin

@GregMartin Oh bien, je n'ai jamais été un grand fan de ça
LegionMammal978


2

Japt , 18 14 13 octets

543+Ki¹k l ¥A

4 octets enregistrés grâce à ETHproductions. 1 octet enregistré grâce à obarakon.

Essayez-le en ligne!


Bonne réponse! Vous pouvez enregistrer un octet si vous déplacez des objets: A¥º543+Ki¹k lou543+Ki¹k l ¥A
Oliver

@obarakon Merci! Pourquoi est ¹utilisé, ne ferait pas )la même chose?
Tom

Oui, vous pouvez utiliser à la )place.
Oliver

2

Python 2 , 92 89 octets

-3 octets grâce à 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

Essayez-le en ligne!
Itérer jusqu'à l'année, en extrayant (et en coutant) les facteurs premiers.
La ligne exec équivaut à:

for i in range(2,y):
 while not(y%i):
  y=y/i
  c=c-1

A 3 octets Enregistrer: c=i=1; c-=1; print-9==c.
Jonathan Allan

1

Octave , 31 octets

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

Essayez-le en ligne!

Deux astuces utilisées ici:

  • clock()(1)pour indexer directement dans la sortie de clock(clock(1) ne fonctionne pas)
  • nnzau lieu de numel, car toutes les entrées sont garanties différentes de zéro.

Version alternative, même nombre d'octets

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

Cette version ne peut être utilisé pendant des années supérieures 30, mais de toute évidence Voyage dans le temps sans tenir compte cela inclut toutes les années qui peut être exécuté le programme. Cela fonctionne également dans Matlab.


1

PHP, 111 68 66

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

compte directement le nombre de facteurs premiers.

$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

Vieille idée: 111 90

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

Cela n'utilise pas de facteur factoriel intégré mais essentiellement un tamisage de comptage pour obtenir le nombre de facteurs premiers d'un nombre <10000. Cela correspond à l'année à 4 chiffres que PHP fournit en utilisant 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 octets: Yne nécessite pas de guillemets avec -nr.
Titus

1
Sur votre ancienne idée: pourquoi initialiser? $a[$i*$j]=($a[$i]?:1)+($a[$j]?:1)enregistre 13 octets. $j=++$i<1e4enregistre un. Et pas de devis pour Ydeux de plus.
Titus


0

Lot, 123 octets

@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

Vous pouvez simuler le script en remplaçant manuellement la datevariable avant de l'exécuter.


0

J , 18 octets

Organe du programme:

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

Essayez-le en ligne!

10= est égal à dix

# le décompte de

q: les facteurs premiers de

543+ ce nombre ajouté à

{. la tête (premier élément, c'est-à-dire l'année)

6!:0'' la date (en hms YMD)


0

JavaScript (ES6), 79 75 octets

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 de ma réponse de lot. Passez l' année civile thaïlandaise si vous souhaitez effectuer un test spécifique. Edit: 4 octets enregistrés grâce à @dandavis.


que diriez-vousnew Date().getYear()+2443
Matt

@Matt Ugh, ce n'est pas ce que MDN dit qu'il fait ... mais il est obsolète, donc je ne suis pas sûr que je devrais l'utiliser de toute façon.
Neil

en passant 2017 == false? shortners: +Date().slice(11,15)+543et y?au lieu dey>1
dandavis

@dandavis y?est inutile, yn'est jamais nul.
Neil
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.