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)
Mat
la source
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).

Dennis
la source
Continuons cette discussion dans le chat .
seshoumara
5

05AB1E , 10 octets

žg543+ÒgTQ

Essayez-le en ligne! ou comme suite de tests

Explication

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

CJam , 13 octets

et0=543+mf,A=

Essayez-le en ligne!

Explication

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
la source
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.

LegionMammal978
la source
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
3

Pyth, 11 octets

qlP+543.d3T

Interprète en ligne disponible ici.

Explication

       .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
la source
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!

À M
la source
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
Barre
la source
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.

Luis Mendo
la source
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
Christoph
la source
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

MATL , 14 octets

1&Z'543+Yfn10=

Essayez-le en ligne!

1&Z'   % Current year
543+   % Add 543
Yf     % Prime factor decomposition
n      % Number of elements
10=    % Equal to 10? Implicitly display
Luis Mendo
la source
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.

Neil
la source
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)

Adam
la source
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.

Neil
la source
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