İnatçı Tay Takvimi


13

Gelen Tay takvim 2560. The Thai takvimine yılını 2017 karşılık gelir hep 543 yıl önde Gregoryen takvimin olduğunu.

Gözlem kodlayıcıları, 2560'ın eşit olduğunu 2^9 * 5, yani 10 ana faktöre sahip olduğunu not edecektir . Bu 896 yıl daha olmayacak! Tam olarak on asal faktörü varsa bir yılı inatçı olarak adlandırıyoruz.

Tayland takvimini kullanarak geçerli saati sistem saatine dayalı olarak inatçı ise, aksi halde bir falsey değeri veren bir doğruluk değeri veren bir program yazın.

Test senaryoları:

  • Program 2017 boyunca çalıştırılırsa, true
  • Program 2018 ila 2912 yılları arasında çalıştırılırsa, false
  • Program 2913 sırasında çalıştırılırsa, true(2913 + 543 = 2^7 * 3^3)

Bir dil kullanıyorsanız veya sistem saati olmayan bir ortamda çalışıyorsa, geçerli saati giriş olarak almak kabul edilebilir mi?
Mart'ta Tutleman

Yanıtlar:


6

Bash + coreutils, 35 bayt

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

Çıktı, boş olmayan bir dize (doğruluk) veya boş bir dizedir (yanlış).

Çevrimiçi deneyin!

Alternatif sürüm: 37 bayt.

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

Golf gibi değil, ama bunu sevdim.

Çevrimiçi deneyin!

Nasıl çalışır

Aritmetik genişleme $[tarihi +% Y +543]yürütür date +%Yakımı (tam) yıl olsun ve ekler 543 yıla.

Faktör, toplamı bir argüman olarak alır ve asal çarpanlara ayırma işlemini yazdırır: önce çarpanlara ayrılacak sayı, daha sonra bireysel asal çarpanların bir listesi.

Son olarak awk, girişi tam olarak 11 alana sahip satırları (sayı artı 10 asal faktör) yazdırarak filtreler.





4

Mathematica, 37 31 bayt

Lanlock4 nedeniyle 5 bayt kaydedildi .

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

Anonim işlev. Herhangi bir girdi almaz ve döndürür Trueveya Falseçıktı olarak.


Nowörtük. Kullanabilirsiniz DateValue@"Year".
Martin Ender

&Sonunda ihtiyacınız var mı? Ayrıca, Date[][[1]]birkaç bayt daha kısadır DateValue@"Year"(eğer sakıncası yoksa Dateeski).
Bir ağaç değil

1
Sen bir byte kaydedebilirsiniz #&@@Date[]yerine Date[][[1]]. Ayrıca, bence "Mathematica + REPL ortamı" burada sonlandırmanıza gerek olmayan geçerli bir programlama dilidir &.
Greg Martin

@GregMartin Ah, bunun büyük bir hayranı
olmadım


2

Japt , 18 14 13 bayt

543+Ki¹k l ¥A

ETHproductions sayesinde 4 bayt tasarruf etti. Obarakon sayesinde 1 bayt kurtarıldı.

Çevrimiçi deneyin!


Güzel cevap! Bir şeyleri hareket ettirirseniz bir bayt kaydedebilirsiniz: A¥º543+Ki¹k lveya543+Ki¹k l ¥A
Oliver

@obarakon Teşekkürler! Neden ¹kullanılır, )aynı şeyi yapmaz?
Tom

Evet, )bunun yerine kullanabilirsiniz .
Oliver

2

Python 2 , 92 89 bayt

Jonathan Allan sayesinde -3 bayt

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

Çevrimiçi deneyin!
Yıla kadar tekrarlayın, asal faktörleri çıkarın (ve couting).
Yürütme satırı şuna eşittir:

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

3 bayt tasarruf c=i=1:; c-=1; print-9==c.
Jonathan Allan

1

Oktav , 31 bayt

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

Çevrimiçi deneyin!

Burada kullanılan iki numara:

  • clock()(1)doğrudan çıktısına endekslemek clock( clock(1)çalışmıyor)
  • nnzBunun yerine, numeltüm girişlerin sıfırdan farklı olduğu garanti edilir.

Alternatif sürüm, aynı bayt sayısı

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

Bu sürüm yalnızca aşan yıllar boyunca kullanılabilir 30, ancak açıkçası zaman yolculuğunu göz ardı etmek, programın çalıştırılabileceği tüm yılları içerir. Matlab'da da çalışır.


1

PHP, 111 68 66

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

doğrudan asal faktörlerin sayısını sayar.

$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

Eski fikir: 111 90

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

Bu, asal çarpanlara ayırma yerleşikini kullanmaz, temelde <10000 sayısının asal çarpanlarının sayısını elde etmek için bir sayıcı ana elek kullanır. Bu, PHP'nin sağladığı 4 basamaklı yıla eşlenir 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 bayt: Ytırnak işareti gerektirmez -nr.
Titus

1
Eski fikriniz üzerine: neden başlamalısınız? $a[$i*$j]=($a[$i]?:1)+($a[$j]?:1)13 bayt tasarruf sağlar. $j=++$i<1e4birini kaydeder. Ve Yiki tane daha alıntı yok .
Titus


0

Toplu, 123 bayt

@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

dateDeğişkeni çalıştırmadan önce manuel olarak geçersiz kılarak komut dosyasını taklit edebilirsiniz .


0

J , 18 bayt

Program gövdesi:

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

Çevrimiçi deneyin!

10= on eşit

# çetelesi

q: başlıca faktörler

543+ bu numara eklendi

{. başı (ilk madde, yani yıl)

6!:0'' tarih (YMD hms olarak)


0

JavaScript (ES6), 79 75 bayt

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

Toplu cevabımın limanı. Aktarın Tay Belirli bir testi gerçekleştirmek istiyorsanız takvim yılı. Düzenleme: @dandavis sayesinde 4 bayt kaydedildi.


nasılnew Date().getYear()+2443
Matt

@ Matt Ugh, MDN'nin söylediği şey bu değil ... ama kullanımdan kaldırıldı, bu yüzden yine de kullanmam gerektiğinden emin değilim.
Neil

geçen 2017 == false? shortners: +Date().slice(11,15)+543ve y?yeriney>1
dandavis

@dandavis y?anlamsızdır, yasla sıfır değildir.
Neil
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.