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)
Mat
sumber
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).

Dennis
sumber
Mari kita lanjutkan diskusi ini dalam obrolan .
seshoumara
5

05AB1E , 10 byte

žg543+ÒgTQ

Cobalah online! atau sebagai Test suite

Penjelasan

      Òg     # the number of primefactors with duplicates of
žg           # the current year
  543+       # plus 543
        TQ   # equals 10
Emigna
sumber
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?
Martin Ender
sumber
4

Mathematica, 37 31 byte

5 byte disimpan karena lanlock4 .

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

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

LegionMammal978
sumber
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
3

Pyth, 11 byte

qlP+543.d3T

Penerjemah online tersedia di sini.

Penjelasan

       .d3   get current year
   +543      add 543
  P          get prime factors of result
 l           count number of prime factors
q         T  check if equal to 10 (result is implicitly printed)
Mike Bufardeci
sumber
2

Japt , 18 14 13 byte

543+Ki¹k l ¥A

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

Cobalah online!

Tom
sumber
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
tongkat
sumber
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.

Luis Mendo
sumber
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
Christoph
sumber
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
Luis Mendo
sumber
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.

Neil
sumber
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)

Adm
sumber
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.

Neil
sumber
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