Trả lại biểu tượng cảm xúc đồng hồ gần nhất với thời gian hiện tại khi chạy


20

Tôi có thể có một if/elseđiều kiện lớn cho mỗi 30 phút nhưng tôi đang tìm kiếm thêm giải pháp dựa trên toán học và Unicode.

Đây là biểu tượng cảm xúc đồng hồ:. Nếu bạn thiếu hỗ trợ kết xuất phù hợp, bạn có thể thấy chúng bên dưới (chúng không theo cùng thứ tự và chúng có thể trông khác với những gì bạn thấy) hoặc tại biểu đồ Unicode , trang 4. Chúng tương ứng với các bảng mã Unicode U + 1F550 (CLOCK FACE ONE OCLOCK) thông qua U + 1F567 (CLOCK FACE TWELVE-THIRTY).

Thách thức của bạn là viết một chương trình xuất ra STDOUT biểu tượng cảm xúc mặt đồng hồ gần nhất với thời gian hệ thống hiện tại (AM và PM nên được xử lý như nhau). Ví dụ: nếu thời gian tlà [5:15 <t <5:45), bạn sẽ hiển thị biểu tượng cảm xúc 5:30.

Đây là mã golf, vì vậy mã ngắn nhất tính bằng byte thắng. Bạn có thể muốn bao gồm một cách để dễ dàng chỉ định thời gian để kiểm tra mã của bạn.

Trường hợp kiểm tra cạnh

Time   Output  Written
----------------------
11:48  🕛       12:00
3:15   🕞       3:30
9:45   🕙       10:00

nhập mô tả hình ảnh ở đây


7
Câu hỏi này hiện không có chủ đề ở đây nhưng có lẽ đây là một cách khắc phục dễ dàng. Bạn cần một điều kiện giành chiến thắng khách quan, nhưng nếu bạn gắn thẻ câu hỏi mã golf , người chiến thắng sẽ là người viết chương trình ngắn nhất. Đó cũng là một chút theo quy định, nhưng bạn có thể nói "tập lệnh xuất biểu tượng cảm xúc đồng hồ gần nhất với thời gian hiện tại khi chạy" và điều đó là đủ. Ngoài ra, mặc dù không bắt buộc về mặt kỹ thuật, tôi khuyên bạn nên cho phép gửi bằng các ngôn ngữ khác. (Ai đó có thể sẽ làm một trong Bash dù thế nào.)
ngầmmonorail

Dấu nhắc Windows không hỗ trợ biểu tượng cảm xúc :(
stokastic

2
Tôi đã chỉnh sửa bài đăng của bạn để cố gắng đáp ứng các tiêu chuẩn của chúng tôi bằng cách làm rõ các quy tắc và biến nó thành mã golf. Hãy chỉnh sửa nó nếu tôi giải thích sai bất cứ điều gì.
NinjaBearMonkey

3
Làm thế nào xx: 15 và xx: 45 được làm tròn?
Peter Taylor

1
@PeterTaylor Như đã thấy trong các trường hợp thử nghiệm, chúng nên được làm tròn lên (tức là 1:45 => 2:00)
NinjaBearMonkey

Câu trả lời:


9

Ruby - 61 54 byte

Python 3 - 79 77 75 74 byte

chỉnh sửa: Hóa ra cái này ngắn hơn nhiều trong Ruby, vì Timekhông cần nhập và phân chia số nguyên là mặc định.

a=(Time.now.to_i/900-3)/2%24
puts""<<128336+a/2+a%2*12

Số học:

  • Time.now.to_i: Giây kể từ kỷ nguyên.
  • /900: Kết hợp thời gian thành các phân đoạn 15 phút.
  • -3: -4bởi vì các ký tự bắt đầu lúc 1 giờ, +1do đó việc làm tròn được thực hiện đến nửa giờ gần nhất, thay vì đi xuống.
  • /2: Kết hợp thành các phân đoạn nửa giờ.
  • %24: Nhận phân khúc nửa giờ hiện tại trong số 12 giờ.
  • a/2 + a%2*12: Tài khoản cho thực tế là các ký tự cả giờ xuất hiện trong một khối trước các ký tự nửa giờ.

Phiên bản giờ địa phương, 69 byte:

n=Time.now
a=((n.to_i+n.gmtoff)/900-3)/2%24
puts""<<128336+a/2+a%2*12

Phiên bản Python 3 gốc:

import time
a=int((time.time()/900-3)/2%24)
print(chr(128336+a//2+a%2*12))

In UTC thời gian hiện tại. Python 2 chrchỉ chấp nhận 0-255 và unichrchỉ 0-65535. Trong Python 3, /luôn là phép chia dấu phẩy động và //luôn là phép chia số nguyên.


Bạn có thể cắt các parens từ 12*(a%2)nếu bạn làm theo thứ tự khác : a%2*12.
xnor

7

Bash + Coreutils, 60 byte

date +%I\ 60*%M+45-30/24%%2+2~C*+C8335+0PP|dc|iconv -f ucs-4

Biểu tượng cảm xúc hiển thị tốt trên thiết bị đầu cuối OSX, nhưng đối với Linux (Ubuntu 14.04), bạn sẽ phải sudo apt-get install ttf-ancient-fonts

Để kiểm tra thời gian khác nhau, chèn -d $timevào lệnh ngày. ví dụ để thử nghiệm 12:59:

date -d 12:59 +%I\ 60*%M+45-30/24%%2+2~C*+C8335+0PP|dc|iconv -f ucs-4

5

JavaScript - 137 117 107 102 95

Điều này sẽ dễ dàng bị đánh bại, nhưng tôi sẽ cố gắng hết sức ở đây.

EDIT 1 : Bây giờ in bằng UTC như câu trả lời Python để lưu 20 byte.

EDIT 2: Thay đổi new Date().getTime()để Date.now()tiết kiệm 10 byte.

EDIT 3: Thay đổi Math.round(x)để ~~(x+.5)tiết kiệm 5 byte.

EDIT 4: Đã xóa không cần thiết (&1023)rời khỏi một số phiên bản phát triển cũ, nơi tôi đã thực hiện mã hóa UTF-16 phổ quát hơn để lưu 7 byte.

d=~~(Date.now()/18e5+.5)%24;d+=d<2?24:0;alert(String.fromCharCode(55357,56655+(d%2?23+d:d)/2));

JavaScript không cho phép biểu tượng cảm xúc, nhưng trong UTF-16 mã hóa chúng thành hai ký tự. May mắn thay, chúng ta có thể chỉ cần định nghĩa chúng là hai nhân vật; ký tự đầu tiên cũng là hằng số ( 0xD83D), trong khi các ký tự khác thay đổi.

Thay thế, in trong giờ địa phương, 137 132 125:


Không (d%2?23+d:d)giống như d+d%2*23?
Neil

4

CJam, 50 byte

"🕐":i~et3=C%60*et4=+30d/mo2m24+24%_2%24*+2/+]:c

Thuật toán rất đơn giản, làm tròn thời gian đến 30 phút gần nhất, đếm xem 30 phút đã trôi qua kể từ 12 giờ sáng / giờ, nếu số đó là số lẻ, sau đó thêm 24 vào số đó, chia sàn cho 2 và tăng số unicode ban đầu cho số đó điểm mã để có được mặt đồng hồ đúng.

Ngoài ra, hãy đảm bảo rằng bạn bắt đầu với 1 AM / PM thay vì 12 vì vậy hãy bù vào đó.

Đối với mục đích thử nghiệm, sử dụng mã sau đây:

3:H;45:M;"🕐":i~HC%60*M+30d/mo2m48+48%_2%24*+2/+]:c

Trong đó 3:H;phần là giờ hiện tại và 45:M;phần là phút hiện tại của giờ. Đơn giản chỉ cần thay thế 345với giá trị mong muốn.

Dùng thử trực tuyến tại đây

Không phải tất cả các ký tự unicode có thể in chính xác trên phiên bản trực tuyến tùy thuộc vào trình duyệt và hệ điều hành của bạn và phông chữ được cài đặt. Nhưng đối với tôi, tất cả đều in tốt trên Firefox với Windows 7.


@ user23013 Đẹp!. Tôi nghĩ bạn nên đăng nó như một câu trả lời mới vì tôi không chơi gôn trong đó :)
Trình tối ưu hóa

3

CJam, 31 byte

"🕐")et5<60b675+30/24%2mdC*++

Bạn có thể thay đổi thời gian trong chương trình sau để kiểm tra nó:

"🕐")[2014 12 19 22 14 1 901 5 -28800000]5<60b675+30/24%2mdC*++
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.