Таємний календар Тайланду


13

У тайському календарі 2017 рік відповідає 2560. Тайський календар завжди на 543 роки випереджає григоріанський календар.

Кодери, що спостерігають, відзначають, що 2560 дорівнює 2^9 * 5, іншими словами, він має 10 простих факторів. Це не повториться ще протягом 896 років! Ми називаємо рік важким, якщо в ньому рівно десять головних факторів.

Напишіть програму, яка виводить значення "truthy", якщо поточний рік із використанням тайського календаря на основі системного годинника є стійким, а значення фальси - в іншому випадку.

Тестові приклади:

  • Якщо програма запускається протягом 2017 року, true
  • Якщо програма виконується протягом будь-якого з 2018 року по 2912 рік, false
  • Якщо програма виконується протягом 2913, true(2913 + 543 = 2^7 * 3^3)

Якщо ви використовуєте мову або працюєте в середовищі без системного годинника, чи прийнятно вважати поточний час введенням?
Тутлеман

Відповіді:


6

Bash + coreutils, 35 байт

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

Вихід - це не порожній рядок (truthy) або порожній рядок (фальшивий).

Спробуйте в Інтернеті!

Альтернативна версія: 37 байт.

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

Не настільки гофрований, але мені подобається цей.

Спробуйте в Інтернеті!

Як це працює

Дата арифметичного розширення $[+% Y +543]виконується date +%Yдля отримання поточного (повного) року та додає 543 до року.

Фактор приймає суму як аргумент і роздруковує її основну факторизацію: спочатку число, яке підлягає врахуванню, потім список окремих простих факторів.

Нарешті, awk фільтрує вхід, друкуючи лише рядки з рівно 11 полями (число плюс 10 простих коефіцієнтів).





4

Математика, 37 31 байт

5 байт збережено завдяки lanlock4 .

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

Анонімна функція. Не приймає введення та повернення Trueабо Falseяк вихід.


Nowнеявна. Можна використовувати DateValue@"Year".
Мартін Ендер

Вам потрібен &кінець? Крім того, Date[][[1]]на пару байт коротше, ніж DateValue@"Year"(якщо ви не заперечуєте, що Dateце застаріло).
Не дерево

1
Ви можете зберегти байт за допомогою #&@@Date[]замість Date[][[1]]. Крім того, я думаю, що "Mathematica + середовище REPL" є дійсною мовою програмування, для якої вам не потрібно закінчувати &.
Грег Мартін

@GregMartin О, ну, я ніколи не був великим прихильником цього
LegionMammal978,


2

Japt , 18 14 13 байт

543+Ki¹k l ¥A

Збережено 4 байти завдяки ETHproductions. Збережено 1 байт завдяки обаракону.

Спробуйте в Інтернеті!


Гарна відповідь! Ви можете зберегти байт, якщо перемістити речі: A¥º543+Ki¹k lабо543+Ki¹k l ¥A
Олівер

@obarakon Дякую! Чому ¹використовується, не )зробить те саме?
Том

Так, ви можете використовувати )замість цього.
Олівер

2

Python 2 , 92 89 байт

-3 байти завдяки Джонатану Аллану

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

Спробуйте в Інтернеті!
Переносяться до року, витягуючи (і кладучи) основні фактори.
Рядок exec еквівалентний:

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

3 байт збереження c=i=1:; c-=1; print-9==c.
Джонатан Аллан

1

Октава , 31 байт

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

Спробуйте в Інтернеті!

Тут використовуються два хитрощі:

  • clock()(1)індексувати безпосередньо у висновку clock( clock(1)не працює)
  • nnzзамість цього numel, оскільки всі записи гарантовано не будуть нульовими.

Альтернативна версія, кількість байтів

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

Цю версію можна використовувати лише протягом років, що перевищують 30, але, очевидно, не враховуючи проїзду в часі, це стосується всіх років, протягом яких програма може бути виконана. Він працює і в Matlab.


1

PHP, 111 68 66

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

безпосередньо підраховує кількість простих факторів.

$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

Стара ідея: 111 90

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

При цьому не використовується вбудований основний чинник, але, в основному, підрахунок основного сита, щоб отримати число простих коефіцієнтів числа <10000. Це відображає чотиризначний рік, який надає PHP, використовуючи 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 байти: Yне потребує жодних лапок -nr.
Тит

1
Ваша стара ідея: навіщо ініціалізувати? $a[$i*$j]=($a[$i]?:1)+($a[$j]?:1)економить 13 байт. $j=++$i<1e4рятує один. І жодних цитат на ще Yдві.
Тит


0

Пакетна, 123 байти

@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

Ви можете підробити сценарій, змінивши dateзмінну вручну перед її запуском.


0

J , 18 байт

Орган програми:

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

Спробуйте в Інтернеті!

10= дорівнює десяти рівним

# підрахунок

q: основні фактори

543+ це число додано до

{. голова (перший пункт, тобто рік)

6!:0'' дата (як YMD хм)


0

JavaScript (ES6), 79 75 байт

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

Порт моєї відповіді партії. Пройдіть тайський календарний рік, якщо ви хочете провести певний тест. Редагувати: Збережено 4 байти завдяки @dandavis.


як щодоnew Date().getYear()+2443
Метт

@Matt Ugh, це не те, що MDN каже, що це робить ... але це застаріло, так що я не впевнений, що я повинен його використовувати в будь-якому випадку.
Ніл

проходить 2017 == false? коротше: +Date().slice(11,15)+543а y?замістьy>1
dandavis

@dandavis y?безглуздо, yніколи не дорівнює нулю.
Ніл
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.