El calendario tailandés tenaz

13

En el calendario tailandés, el año 2017 corresponde a 2560. El calendario tailandés siempre está 543 años por delante del calendario gregoriano.

Los codificadores observadores notarán que 2560 es igual a 2^9 * 5, en otras palabras, tiene 10 factores primos. ¡Esto no volverá a suceder por otros 896 años! Llamamos a un año tenaz si tiene exactamente diez factores primos.

Escriba un programa que arroje un valor verdadero si el año actual que usa el calendario tailandés, basado en el reloj del sistema, es tenaz y un valor falso de lo contrario.

Casos de prueba:

  • Si el programa se ejecuta durante 2017, true
  • Si el programa se ejecuta durante cualquiera de los años 2018 a 2912, false
  • Si el programa se ejecuta durante 2913, true(2913 + 543 = 2^7 * 3^3)
Mate
fuente
Si usa un idioma o se ejecuta en un entorno sin un reloj del sistema, ¿es aceptable tomar la hora actual como entrada?
Tutleman

Respuestas:

6

Bash + coreutils, 35 bytes

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

La salida es una cadena no vacía (verdad) o una cadena vacía (falsa).

Pruébalo en línea!

Versión alternativa: 37 bytes.

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

No es tan golfoso, pero me gusta este.

Pruébalo en línea!

Cómo funciona

La $[fecha de expansión aritmética +% Y se +543]ejecuta date +%Ypara obtener el año actual (completo) y agrega 543 al año.

Factor toma la suma como argumento e imprime su factorización prima: primero el número a factorizar, luego una lista de factores primos individuales.

Finalmente, awk filtra la entrada, imprimiendo solo líneas con exactamente 11 campos (el número más 10 factores primos).

Dennis
fuente
Continuemos esta discusión en el chat .
seshoumara
4

CJam , 13 bytes

et0=543+mf,A=

Pruébalo en línea!

Explicación

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

Mathematica, 37 31 bytes

5 bytes guardados debido a lanlock4 .

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

Función anónima. No toma entrada y regresa Trueo Falsecomo salida.

LegionMammal978
fuente
NowEs implícito. Puedes usar DateValue@"Year".
Martin Ender
¿Necesitas el &al final? Además, Date[][[1]]es un par de bytes más corto que DateValue@"Year"(si no le importa que Datesea ​​obsoleto).
No es un árbol
1
Puede guardar un byte con #&@@Date[]en lugar de Date[][[1]]. Además, creo que el "entorno Mathematica + REPL" es un lenguaje de programación válido aquí, para el cual no necesita la terminación &.
Greg Martin
@GregMartin Oh, bueno, nunca he sido un gran admirador de eso
LegionMammal978
3

Pyth, 11 bytes

qlP+543.d3T

Intérprete en línea disponible aquí.

Explicación

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

Japt , 18 14 13 bytes

543+Ki¹k l ¥A

Guardado 4 bytes gracias a ETHproductions. Guardado 1 byte gracias a obarakon.

Pruébalo en línea!

Tom
fuente
¡Buena respuesta! Puede guardar un byte si mueve cosas: A¥º543+Ki¹k lo543+Ki¹k l ¥A
Oliver
@obarakon ¡Gracias! ¿Por qué se ¹usa, no )haría lo mismo?
Tom
Sí, puedes usar )en su lugar.
Oliver
2

Python 2 , 92 89 bytes

-3 bytes gracias a 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

Pruébalo en línea!
Iterar hasta el año, extrayendo (y eliminando) los factores primos.
La línea ejecutiva es equivalente a:

for i in range(2,y):
 while not(y%i):
  y=y/i
  c=c-1
varilla
fuente
Un byte 3 ahorra: c=i=1; c-=1; print-9==c.
Jonathan Allan
1

Octava , 31 bytes

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

Pruébalo en línea!

Dos trucos usados ​​aquí:

  • clock()(1)para indexar directamente en la salida de clock(clock(1) no funciona)
  • nnzen lugar de numel, ya que todas las entradas están garantizadas para ser distintas de cero.

Versión alternativa, mismo recuento de bytes

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

Esta versión solo se puede usar durante años que exceden 30, pero obviamente , sin tener en cuenta el viaje en el tiempo, esto incluye todos los años en los que se puede ejecutar el programa. Funciona en Matlab también.

Luis Mendo
fuente
1

PHP, 111 68 66

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

cuenta directamente el número de factores primos.

$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

Vieja idea: 111 90

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

Esto no utiliza un factor principal de valorización incorporado, sino básicamente un tamiz primo de conteo para obtener el número de factores primos de un número <10000. Esto se asigna al año de 4 dígitos que PHP proporciona usando 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
fuente
1
-2 bytes: Yno necesita comillas con -nr.
Titus
1
En su vieja idea: ¿por qué inicializar? $a[$i*$j]=($a[$i]?:1)+($a[$j]?:1)ahorra 13 bytes. $j=++$i<1e4salva uno. Y no hay citas para Ydos más.
Titus
0

MATL , 14 bytes

1&Z'543+Yfn10=

Pruébalo en línea!

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

Lote, 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

Puede falsificar el script anulando manualmente la datevariable antes de ejecutarlo.

Neil
fuente
0

J , 18 bytes

Cuerpo del programa:

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

Pruébalo en línea!

10= es diez igual a

# el recuento de

q: los factores primos de

543+ este número agregado a

{. la cabeza (primer elemento, es decir, el año) de

6!:0'' la fecha (como AMD hms)

Adán
fuente
0

JavaScript (ES6), 79 75 bytes

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

Puerto de mi respuesta Batch. Pase el año calendario tailandés si desea realizar una prueba específica. Editar: Guardado 4 bytes gracias a @dandavis.

Neil
fuente
¿qué talnew Date().getYear()+2443
Matt
@ Matt Ugh, eso no es lo que MDN dice que hace ... pero está en desuso, por lo que no estoy seguro de que deba usarlo de todos modos.
Neil
pasando 2017 == false? acortadores: +Date().slice(11,15)+543y en y?lugar dey>1
dandavis
@dandavis no y?tiene sentido, ynunca es cero.
Neil