Стойкий тайский календарь


13

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

Наблюдательные кодеры заметят, что 2560 равно 2^9 * 5, другими словами, оно имеет 10 простых факторов. Это не повторится еще 896 лет! Мы называем год упорным, если в нем ровно десять основных факторов.

Напишите программу, которая выводит истинное значение, если текущий год с использованием тайского календаря, основанного на системных часах, цепкий, а в противном случае - ложное значение.

Тестовые случаи:

  • Если программа запускается в течение 2017 года, true
  • Если программа выполняется в течение любого периода с 2018 по 2912 годы, false
  • Если программа запускается в течение 2913, true(2913 + 543 = 2^7 * 3^3)

Если вы используете язык или работаете в среде без системных часов, допустимо ли принимать текущее время в качестве входных данных?
Тутлеман

Ответы:


6

Bash + coreutils, 35 байт

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

Выходные данные являются непустой строкой (истина) или пустой строкой (ложь).

Попробуйте онлайн!

Альтернативная версия: 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 байт благодаря obarakon.

Попробуйте онлайн!


Хороший ответ! Вы можете сохранить байт, если вы перемещаете вещи: 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. Это соответствует 4-значному году, который 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 hms)


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 Тьфу, это не то, что MDN говорит, что делает ... но это устарело, так что я не уверен, что мне все равно следует его использовать.
Нил

прохождение 2017 == false? Коротышки: +Date().slice(11,15)+543и y?вместоy>1
Дандавис

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