粘り強いタイのカレンダー


13

タイ暦 2560年に2017対応のタイ暦は543年先グレゴリオ暦のは常にあります。

観察者のコーダーは、2560がに等しい2^9 * 5、つまり10個の素因数があることに気付くでしょう。これは、さらに896年は再び起こりません!正確に10の素因数がある場合、1年は粘り強いと呼びます。

システムクロックに基づいて、タイのカレンダーを使用した現在の年が粘り強い場合は真実の値を出力し、そうでない場合は偽の値を出力するプログラムを作成します。

テストケース:

  • プログラムが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を追加します。

Factorは合計を引数として取り、素因数分解を出力します。最初に因数分解される数、次に個々の素因数のリストです。

最後に、awkは入力をフィルタリングし、正確に11フィールド(数値に10の素因数を加えたもの)を持つ行のみを印刷します。





4

Mathematica、37 31バイト

lanlock4により5バイトが節約されました

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

無名関数。入力を受け取らず、TrueまたはFalse出力として返します。


Now暗黙的です。を使用できますDateValue@"Year"
マーティンエンダー

&最後に必要ですか?また、Date[][[1]]2バイトよりも短いDateValue@"Year"(これDateが時代遅れになっても構わない場合)。
ツリーではない

1
#&@@Date[]代わりにを使用してバイトを保存できますDate[][[1]]。また、「Mathematica + REPL環境」はここでは有効なプログラミング言語であり、終了する必要はありません&
グレッグマーティン

@GregMartinまあ、私はその大ファンではない
-LegionMammal978


2

Japt18 14 13バイト

543+Ki¹k l ¥A

ETHproductionsのおかげで4バイト節約されました。obarakonのおかげで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

オンラインでお試しください!

ここで使用される2つのトリック:

  • 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が提供する4桁の年に対応します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<1e41つ保存します。そして、Yさらに2つの引用符はありません。
タイタス


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= 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?shortners:+Date().slice(11,15)+543y?の代わりにy>1
dandavis

@dandavis y?は無意味で、y決してゼロではありません。
ニール
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.