Kembalikan emoji jam yang paling dekat dengan waktu saat ini ketika dijalankan

20

Saya dapat memiliki if/elsekondisi besar untuk setiap 30 menit tetapi saya mencari lebih banyak solusi berbasis matematika dan Unicode.

Berikut ini adalah emoji jam: 🕐🕑🕒🕓🕔🕕🕖🕗🕘🕙🕚🕛🕜🕝🕞🕟🕠🕡🕢🕣🕤🕥🕦🕧. Jika Anda tidak memiliki dukungan render yang tepat, Anda dapat melihatnya di bawah (mereka tidak berada dalam urutan yang sama dan mereka mungkin terlihat berbeda dengan apa yang Anda lihat) atau pada grafik Unicode , halaman 4. Mereka berhubungan dengan Unicode codepoints U + 1F550 (CLOCK FACE ONE OCLOCK) hingga U + 1F567 (CLOCK FACE TWELVE-THIRTY).

Tantangan Anda adalah menulis sebuah program yang menghasilkan STDOUT emoji jam wajah terdekat dengan waktu sistem saat ini (AM dan PM harus diperlakukan sama). Misalnya jika waktunya tadalah [5:15 <t <5:45), Anda akan menampilkan emoji 5:30 🕠.

Ini adalah kode-golf, jadi kode terpendek dalam byte menang. Anda mungkin ingin memasukkan cara untuk dengan mudah menentukan waktu untuk menguji kode Anda.

Kasus uji tepi

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

masukkan deskripsi gambar di sini

Mohsen
sumber
7
Pertanyaan ini saat ini tidak pada topik di sini tapi itu mungkin perbaikan yang mudah. Anda memerlukan kondisi kemenangan yang objektif, tetapi jika Anda menandai kode pertanyaan -golf , pemenangnya adalah siapa pun yang menulis program terpendek. Ini juga sedikit di bawah yang ditentukan, tetapi Anda bisa mengatakan "skrip yang mengeluarkan jam emoji paling dekat dengan waktu saat ini saat dijalankan" dan itu sudah cukup. Selain itu, meskipun tidak diperlukan secara teknis, saya sarankan Anda mengizinkan pengiriman dalam bahasa lain. (Seseorang mungkin akan melakukannya di Bash.)
undergroundmonorail
Windows Command prompt tidak mendukung emoji :(
stokastic
2
Saya telah mengedit posting Anda untuk berusaha memenuhi standar kami dengan mengklarifikasi aturan dan menjadikannya kode golf. Jangan ragu untuk mengeditnya jika saya salah mengartikan sesuatu.
NinjaBearMonkey
3
Bagaimana xx: 15 dan xx: 45 dibulatkan?
Peter Taylor
1
@PeterTaylor Seperti yang terlihat dalam kasus uji, mereka harus dibulatkan (yaitu 1:45 => 2:00)
NinjaBearMonkey

Jawaban:

9

Ruby - 61 54 byte

Python 3 - 79 77 75 74 byte

sunting: Ternyata ini jauh lebih pendek di Ruby, karena Timetidak perlu diimpor dan pembagian integer adalah default.

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

Hitung:

  • Time.now.to_i: Detik sejak zaman.
  • /900: Gabungkan waktu menjadi segmen 15 menit.
  • -3: -4karena karakter dimulai pada jam 1,+1 sehingga pembulatan dilakukan ke setengah jam terdekat, bukan ke bawah.
  • /2: Gabungkan menjadi segmen setengah jam.
  • %24: Dapatkan segmen setengah jam saat ini dari 12 jam.
  • a/2 + a%2*12: Akun untuk fakta bahwa karakter sepanjang jam datang dalam satu blok sebelum karakter setengah jam.

Versi waktu lokal, 69 byte:

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

Versi Python 3 asli:

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

Mencetak waktu sekarang UTC. Python 2 chrhanya menerima 0-255, dan unichrhanya 0-65535. Dalam Python 3, /selalu divisi floating-point dan //selalu divisi integer.

colevk
sumber
Anda dapat memotong parens dari 12*(a%2)jika Anda melakukannya dalam urutan lain: 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

Emoji membuat baik-baik saja di terminal OSX, tetapi untuk Linux (Ubuntu 14.04) Anda harus melakukannya sudo apt-get install ttf-ancient-fonts

Untuk menguji waktu yang berbeda, masukkan -d $timeke perintah tanggal. misalnya untuk pengujian 12:59:

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

JavaScript - 137 117 107 102 95

Ini akan mudah dikalahkan, tetapi saya akan mencoba yang terbaik di sini.

EDIT 1 : Sekarang mencetak dalam UTC seperti jawaban Python untuk menyimpan 20 byte.

EDIT 2: Berubah new Date().getTime()untuk Date.now()menyimpan 10 byte.

EDIT 3: Berubah Math.round(x)untuk ~~(x+.5)menyimpan 5 byte.

EDIT 4: Dihapus tidak perlu (dan &1023)ditinggalkan dari beberapa versi pengembangan lama di mana saya melakukan pengkodean UTF-16 yang lebih universal untuk menghemat 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 memang memungkinkan untuk emoji, tetapi dalam UTF-16 yang menyandikannya sebagai dua karakter. Untungnya, kita bisa mendefinisikannya sebagai dua karakter; karakter pertama juga konstan ( 0xD83D), sedangkan yang lainnya berubah.

Alternatif, mencetak dalam waktu lokal, 137 132 125:

PurkkaKoodari
sumber
Tidak (d%2?23+d:d)sama dengan d+d%2*23?
Neil
4

CJam, 50 byte

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

Algoritma ini sederhana, bulatkan waktu ke 30 menit terdekat, hitung berapa banyak 30 menit telah berlalu sejak jam 12 pagi / malam, jika angkanya ganjil, kemudian tambahkan 24 ke dalamnya, pisahkan dengan 2 dan pertambahan kode awal dengan jumlah sebanyak itu poin kode untuk mendapatkan tampilan jam yang tepat.

Juga, pastikan Anda mulai dengan 1 AM / PM bukannya 12 jadi ambil offset di sana.

Untuk tujuan pengujian, gunakan kode berikut:

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

Di mana 3:H;bagiannya adalah jam saat ini dan 45:M;bagian adalah menit saat ini dari jam tersebut. Cukup ganti 3dan 45dengan nilai yang diinginkan.

Cobalah online di sini

Tidak semua karakter unicode dapat mencetak dengan benar pada versi online tergantung pada browser Anda dan OS dan font yang diinstal. Tapi bagi saya, semua cetak bagus di Firefox dengan Windows 7.

Pengoptimal
sumber
@ user23013 Bagus !. Saya pikir Anda harus memposting itu sebagai jawaban baru karena saya tidak melakukan golf apa pun di :) :)
Pengoptimal
3

CJam, 31 byte

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

Anda dapat mengubah waktu di program berikut untuk mengujinya:

"🕐")[2014 12 19 22 14 1 901 5 -28800000]5<60b675+30/24%2mdC*++
jimmy23013
sumber