Lịch Thái ngoan cường


13

Trong lịch Thái Lan năm 2017 tương ứng với 2560. Lịch Thái luôn đi trước lịch Gregorian 543 năm.

Các lập trình viên quan sát sẽ lưu ý rằng 2560 bằng 2^9 * 5, nói cách khác, nó có 10 yếu tố chính. Điều này sẽ không xảy ra một lần nữa trong 896 năm nữa! Chúng tôi gọi một năm kiên trì nếu nó có chính xác mười yếu tố chính.

Viết chương trình đưa ra giá trị trung thực nếu năm hiện tại sử dụng lịch Thái Lan, dựa trên đồng hồ hệ thống, là ngoan cường và giá trị falsey khác.

Các trường hợp thử nghiệm:

  • Nếu chương trình được chạy trong năm 2017, true
  • Nếu chương trình được chạy trong bất kỳ năm nào 2018 đến 2912, false
  • Nếu chương trình được chạy trong 2913, true(2913 + 543 = 2^7 * 3^3)

Nếu sử dụng ngôn ngữ hoặc chạy trong môi trường không có đồng hồ hệ thống, có thể chấp nhận lấy thời gian hiện tại làm đầu vào không?
Người hướng dẫn

Câu trả lời:


6

Bash + coreutils, 35 byte

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

Đầu ra là một chuỗi không trống (trung thực) hoặc chuỗi rỗng (giả).

Hãy thử trực tuyến!

Phiên bản thay thế: 37 byte.

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

Không phải là golf, nhưng tôi thích cái này.

Hãy thử trực tuyến!

Làm thế nào nó hoạt động

Ngày mở rộng số học $[+% Y +543]thực hiện date +%Yđể có được năm hiện tại (đầy đủ) và thêm 543 vào năm.

Yếu tố lấy tổng số làm đối số và in ra hệ số nguyên tố: đầu tiên là số được tính, sau đó là danh sách các thừa số nguyên tố riêng lẻ.

Cuối cùng, awk lọc đầu vào, chỉ in các dòng có chính xác 11 trường (số cộng với 10 thừa số nguyên tố).





4

Toán học, 37 31 byte

5 byte được lưu do lanlock4 .

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

Chức năng ẩn danh. Không có đầu vào và trả lại Truehoặc Falselà đầu ra.


Nowlà ngầm. Bạn có thể sử dụng DateValue@"Year".
Martin Ender

Bạn có cần &ở cuối không? Ngoài ra, Date[][[1]]là một vài byte ngắn hơn DateValue@"Year"(nếu bạn không nghĩ rằng Datenó đã lỗi thời).
Không phải là một cái cây vào

1
Bạn có thể lưu một byte với #&@@Date[]thay thế Date[][[1]]. Ngoài ra, tôi nghĩ rằng "Môi trường toán học + REPL" là ngôn ngữ lập trình hợp lệ ở đây mà bạn không cần kết thúc &.
Greg Martin

@GregMartin Ồ, tôi chưa bao giờ là một fan hâm mộ lớn của điều đó
LegionMammal978


2

Japt , 18 14 13 byte

543+Ki¹k l ¥A

Đã lưu 4 byte nhờ vào ETHproductions. Đã lưu 1 byte nhờ obarakon.

Hãy thử trực tuyến!


Câu trả lời tốt đẹp! Bạn có thể lưu một byte nếu bạn di chuyển mọi thứ xung quanh: A¥º543+Ki¹k lhoặc543+Ki¹k l ¥A
Oliver

@obarakon Cảm ơn! Tại sao được ¹sử dụng, sẽ không )làm điều tương tự?
Tom

Đúng, bạn có thể sử dụng )thay thế.
Oliver

2

Python 2 , 92 89 byte

-3 byte nhờ 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

Hãy thử trực tuyến!
Lặp đi lặp lại cho đến năm, trích xuất (và trích dẫn) các yếu tố chính.
Dòng exec tương đương với:

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

Lưu 3 byte : c=i=1; c-=1; print-9==c.
Jonathan Allan

1

Octave , 31 byte

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

Hãy thử trực tuyến!

Hai thủ thuật được sử dụng ở đây:

  • clock()(1)để lập chỉ mục trực tiếp vào đầu ra của clock( clock(1)không hoạt động)
  • nnzthay vì numel, vì tất cả các mục được đảm bảo là khác không.

Phiên bản thay thế, cùng số byte

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

Phiên bản này chỉ có thể được sử dụng trong nhiều năm 30, nhưng rõ ràng không quan tâm đến việc du hành thời gian, bao gồm tất cả các năm mà chương trình có thể được thực thi. Nó hoạt động trong Matlab là tốt.


1

PHP, 111 68 66

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

trực tiếp đếm số lượng các yếu tố chính.

$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

Ý tưởng cũ: 111 90

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

Điều này không sử dụng một phần tử tích hợp chính nhưng về cơ bản là một số nguyên tố đếm để có được số lượng các số nguyên tố của một số <10000. Bản đồ này cho năm 4 chữ số mà PHP cung cấp bằng cách sử dụng 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: Ykhông cần trích dẫn với -nr.
Tít

1
Về ý tưởng cũ của bạn: tại sao khởi tạo? $a[$i*$j]=($a[$i]?:1)+($a[$j]?:1)tiết kiệm 13 byte. $j=++$i<1e4tiết kiệm một. Và không có trích dẫn cho Yhai hơn.
Tít


0

Mẻ, 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

Bạn có thể giả mạo tập lệnh bằng cách ghi đè thủ công datebiến trước khi chạy nó.


0

J , 18 byte

Chương trình cơ thể:

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

Hãy thử trực tuyến!

10= là mười bằng

# kiểm đếm của

q: các yếu tố chính của

543+ số này được thêm vào

{. người đứng đầu (mục đầu tiên, tức là năm) của

6!:0'' ngày (dưới dạng 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

Cổng câu trả lời hàng loạt của tôi. Vượt qua trong năm dương lịch Thái Lan nếu bạn muốn thực hiện một bài kiểm tra cụ thể. Chỉnh sửa: Đã lưu 4 byte nhờ @dandavis.


làm thế nào vềnew Date().getYear()+2443
Matt

@Matt Ugh, đó không phải là những gì MDN nói ... nhưng nó không được dùng nữa, vì vậy tôi không chắc mình nên sử dụng nó.
Neil

vượt qua 2017 == false? rút gọn: +Date().slice(11,15)+543y?thay vìy>1
dandavis

@dandavis y?là vô nghĩa, ykhông bao giờ bằng không.
Neil
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.