Kalender Thailand yang Ulet


13

Dalam kalender Thailand tahun 2017 sama dengan 2560. Kalender Thailand selalu 543 tahun lebih awal dari kalender Gregorian.

Coder yang taat akan mencatat bahwa 2560 sama dengan 2^9 * 5, dengan kata lain memiliki 10 faktor prima. Ini tidak akan terjadi lagi selama 896 tahun lagi! Kami memanggil satu tahun ulet jika memiliki tepat sepuluh faktor utama.

Tulis program yang menampilkan nilai kebenaran jika tahun saat ini menggunakan kalender Thailand, berdasarkan jam sistem, ulet, dan nilai palsu sebaliknya.

Kasus uji:

  • Jika program ini dijalankan selama 2017, true
  • Jika program ini dijalankan selama tahun 2018 hingga 2912, false
  • Jika program dijalankan selama 2913, true(2913 + 543 = 2^7 * 3^3)

Jika menggunakan bahasa atau berjalan di lingkungan tanpa jam sistem, apakah bisa menerima waktu saat ini sebagai input?
Tutleman

Jawaban:


6

Bash + coreutils, 35 byte

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

Output adalah string yang tidak kosong (benar) atau string kosong (palsu).

Cobalah online!

Versi alternatif: 37 byte.

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

Tidak seperti golf, tapi aku suka yang ini.

Cobalah online!

Bagaimana itu bekerja

$[Tanggal ekspansi aritmatika +% Y +543]dijalankan date +%Yuntuk mendapatkan tahun saat ini (penuh) dan menambah 543 tahun.

Factor mengambil penjumlahan sebagai argumen dan mencetaknya dengan faktorisasi utama: pertama angka yang diperhitungkan, kemudian daftar faktor prima individu.

Akhirnya, awk memfilter input, hanya mencetak garis dengan tepat 11 bidang (angka plus 10 faktor utama).




4

CJam , 13 byte

et0=543+mf,A=

Cobalah online!

Penjelasan

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 byte

5 byte disimpan karena lanlock4 .

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

Fungsi anonim. Tidak mengambil input dan mengembalikan Trueatau Falsesebagai output.


Nowtersirat. Anda bisa menggunakannya DateValue@"Year".
Martin Ender

Apakah Anda memerlukannya &di akhir? Juga, Date[][[1]]beberapa byte lebih pendek dari DateValue@"Year"(jika Anda tidak keberatan itu Datesudah usang).
Bukan pohon

1
Anda dapat menyimpan byte dengan #&@@Date[]di tempat Date[][[1]]. Juga, saya pikir "Lingkungan Mathematica + REPL" adalah bahasa pemrograman yang valid di sini, di mana Anda tidak perlu mengakhiri &.
Greg Martin

@GregMartin Oh well, saya belum pernah menjadi penggemar berat itu
LegionMammal978


2

Japt , 18 14 13 byte

543+Ki¹k l ¥A

Disimpan 4 byte berkat produk ETH. Disimpan 1 byte berkat obarakon.

Cobalah online!


Jawaban bagus! Anda dapat menyimpan satu byte jika Anda memindahkan berbagai hal: A¥º543+Ki¹k latau543+Ki¹k l ¥A
Oliver

@obarakon Terima kasih! Mengapa ¹digunakan, tidak akan )melakukan hal yang sama?
Tom

Yap, Anda bisa menggunakannya ).
Oliver

2

Python 2 , 92 89 byte

-3 byte terima kasih kepada 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

Cobalah online!
Iterate hingga tahun ini, mengekstraksi (dan couting) faktor utama.
Garis exec sama dengan:

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

Sebuah 3 byte menghemat: c=i=1; c-=1; print-9==c.
Jonathan Allan

1

Oktaf , 31 byte

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

Cobalah online!

Dua trik yang digunakan di sini:

  • clock()(1)untuk mengindeks langsung ke output dari clock(clock(1) tidak berfungsi)
  • nnzalih-alih numel, karena semua entri dijamin bukan nol.

Versi alternatif, jumlah byte yang sama

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

Versi ini hanya dapat digunakan selama bertahun-tahun 30, tetapi jelas mengabaikan perjalanan waktu ini termasuk semua tahun di mana program dapat dieksekusi. Ia bekerja di Matlab juga.


1

PHP, 111 68 66

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

secara langsung menghitung jumlah faktor utama.

$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

Gagasan lama: 111 90

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

Ini tidak menggunakan built-in factortoring bawaan tetapi pada dasarnya saringan prime penghitungan untuk mendapatkan jumlah faktor prima dari angka <10000. Ini memetakan ke tahun 4 digit yang disediakan PHP menggunakan 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 byte: Ytidak perlu kutip dengan -nr.
Titus

1
Pada ide lama Anda: mengapa menginisialisasi? $a[$i*$j]=($a[$i]?:1)+($a[$j]?:1)menghemat 13 byte. $j=++$i<1e4menghemat satu. Dan tidak ada tanda kutip untuk Ydua lagi.
Titus

0

MATL , 14 byte

1&Z'543+Yfn10=

Cobalah online!

1&Z'   % Current year
543+   % Add 543
Yf     % Prime factor decomposition
n      % Number of elements
10=    % Equal to 10? Implicitly display

0

Batch, 123 byte

@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

Anda bisa memalsukan skrip dengan menimpa datevariabel secara manual sebelum menjalankannya.


0

J , 18 byte

Badan program:

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

Cobalah online!

10= sepuluh sama dengan

# penghitungan

q: faktor utama dari

543+ nomor ini ditambahkan ke

{. kepala (item pertama, yaitu tahun) dari

6!:0'' tanggal (seperti YMD hms)


0

JavaScript (ES6), 79 75 byte

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

Port of Batch saya menjawab. Lulus di tahun kalender Thailand jika Anda ingin melakukan tes tertentu. Sunting: Disimpan 4 byte berkat @dandavis.


bagaimananew Date().getYear()+2443
Matt

@ Mat Ugh, bukan itu yang dikatakan MDN ... tapi sudah usang, jadi saya tidak yakin saya tetap harus menggunakannya.
Neil

melewati 2017 == false? shortner: +Date().slice(11,15)+543dan y?bukannyay>1
dandavis

@andavis y?tidak ada gunanya, ytidak pernah nol.
Neil
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.