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)

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





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.


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


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!


¡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

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.


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

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

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.


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)


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.


¿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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.