顽强的泰国日历


13

泰国日历中,2017年对应于2560年。泰国日历始终比公历提前543年。

细心的编码人员会注意到2560等于2^9 * 5,也就是说它有10个素数。这将不会再发生896年!如果说有十个主要因素,我们就称其为顽强的一年。

编写一个程序,如果根据系统时钟使用泰国日历的当年是顽强的,则输出一个真值,否则输出假值。

测试用例:

  • 如果该程序在2017年运行, true
  • 如果该程序在2018年至2912年的任何一年中运行, false
  • 如果程序在2913年期间运行,true(2913 + 543 = 2^7 * 3^3

如果使用某种语言或在没有系统时钟的环境中运行,将当前时间作为输入是否可以接受?
Tutleman '17

Answers:


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

CJam,13个字节

et0=543+mf,A=

在线尝试!

说明

et0=  e# Get current year.
543+  e# Add 543.
mf    e# Get prime factors with multiplicity.
,     e# Get length.
A=    e# Equals 10?

4

Mathematica,37 31个字节

由于lanlock4而节省了5个字节。

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

匿名函数。不接受任何输入并返回TrueFalse作为输出。


Now是隐式的。您可以使用DateValue@"Year"
Martin Ender

您最后需要&吗?此外,还要Date[][[1]]短几个字节DateValue@"Year"(如果您不介意的话,这Date已经过时了)。
不是一棵树

1
您可以保存一个字节#&@@Date[]代替Date[][[1]]。另外,我认为“ Mathematica + REPL环境”在这里是一种有效的编程语言,您不需要终止&
格雷格·马丁

@GregMartin哦,好吧,我从来不是一个超级粉丝
LegionMammal978



2

Python 2中92 89个字节

-3个字节,感谢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

在线尝试!
迭代到一年,提取(并计算)主要因素。
exec行等效于:

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

A 3字节保存:c=i=1; c-=1; print-9==c
乔纳森·艾伦

1

八度,31字节

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

在线尝试!

这里使用两个技巧:

  • clock()(1)直接索引到的输出clockclock(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')以下方法提供的4位数字:

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

我的批次答案的端口。如果要执行特定的测试,请通过泰国历年。编辑:由于@dandavis,节省了4个字节。


怎么样new Date().getYear()+2443
马特

@Matt Ugh,那不是MDN所说的。。。但是它已经过时了,所以我不确定我是否应该使用它。
尼尔

通过 2017 == false?短裤:+Date().slice(11,15)+543y?不是y>1
dandavis '17

@dandavis y?是毫无意义的,y永远不会为零。
尼尔
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.