Apa Waktu Binernya?


14

Apa Waktu Binernya?

Semua orang tahu apa waktu yang normal. Itu ada di sana di kanan atas (atau di mana pun Anda meletakkannya) layar Anda. Tapi pertanyaan yang jarang ditanyakan oleh orang kepada diri mereka sendiri adalah ini: Apa waktu binernya ?

Waktu Biner

Binary Time (True Binary Time) bekerja dengan terlebih dahulu membaca bit paling signifikan (MSB) dari nomor tersebut. Jika angka itu 0, waktu yang dinyatakan sebelum siang. Jika nomor itu 1, waktu yang dinyatakan adalah setelah tengah hari. Bit berikutnya membagi separuh hari bit pertama diekspresikan menjadi dua bagian yang sama, kali ini 6 jam. Bit berikut dibagi menjadi 3 jam, 90 menit berikutnya, dan seterusnya. Saat-saat seperti 12:00:00, di mana seharusnya tidak menjadi, menjadi 1.

Saya hanya dapat memahami sistem pengaturan waktu yang aneh ini, jadi saya perlu sebuah program untuk mengubahnya menjadi untuk saya. Tetapi karena angka-angka biner adalah Basis-2, dan 2 adalah angka kecil, program Anda harus sesingkat mungkin.

Persyaratan

  • Program Anda harus mengambil waktu (sebagai 24 jam) sebagai input dan output nomor waktu biner yang sesuai.
  • Nomor output harus memiliki presisi 16-bit (panjangnya harus 16 digit).
  • Anda tidak dapat menggunakan bawaan yang melakukan semua konversi itu untuk Anda.
  • Anda harus lantai jika perlu dibulatkan.

Aturan

  • Celah standar dilarang.
  • Program Anda seharusnya tidak menulis apa pun STDERR.

Uji Kasus

00:00:00==> 0000000000000000
12:00:00==> 1000000000000000
01:30:00==> 0001000000000000
10:33:06==> 0111000010001101
09:57:30==> 0110101000111000
06:00:00==> 0100000000000000
18:00:00==>1100000000000000

Mencetak gol

Untuk menang, seperti yang saya sebutkan sebelumnya, Anda harus memiliki byte paling sedikit.

Pengajuan

Untuk memastikan bahwa jawaban Anda muncul, silakan mulai jawaban Anda dengan tajuk utama, menggunakan templat Penurunan harga berikut:

# Language Name, N bytes

di mana Nukuran kiriman Anda. Jika Anda meningkatkan skor Anda, Anda dapat menyimpan skor lama di headline, dengan mencoretnya. Contohnya:

# Ruby, <s>104</s> <s>101</s> 96 bytes

Jika Anda ingin memasukkan beberapa angka dalam tajuk Anda (mis. Karena skor Anda adalah jumlah dari dua file atau Anda ingin membuat daftar hukuman penterjemah secara terpisah), pastikan bahwa skor sebenarnya adalah angka terakhir di tajuk:

# Perl, 43 + 2 (-p flag) = 45 bytes

Anda juga dapat membuat tautan nama bahasa yang kemudian akan muncul di cuplikan papan peringkat:

# [><>](http://esolangs.org/wiki/Fish), 121 bytes

Papan peringkat

Berikut ini adalah Stack Snippet untuk menghasilkan leaderboard biasa dan gambaran umum pemenang berdasarkan bahasa.


3
Bisakah saya memasukkan sebagai [hour, minute, second]? Kami tidak suka membatasi format input.
Leaky Nun

2
Bagaimana 09:57:30membuat 0110110000000000?
Leaky Nun

2
16 bit hanya dapat mewakili nilai 65536. Ada 86400 detik dalam sehari. Bagaimana seharusnya kita mewakili sesuatu yang tidak persis cocok dengan representasi biner?
PurkkaKoodari

Bisakah kita mengembalikan hasilnya sebagai daftar 16 angka?
Adám

@ Adám Ya, Anda bisa.
George Gibson

Jawaban:


1

MATL , 15 byte

YOtk-KWW*k16&YB

Menggunakan bawaan untuk mengonversi string yang mewakili waktu ke tanggal seri / nomor waktu, yang diizinkan oleh tantangan.

Cobalah online!

Penjelasan

YO       % Input time string. Convert to serial date/time. Time is fractional part
tk-      % Duplicate, round down, subtract. This keeps fractional part only
KWW      % 34, 2 raised to, 2 raised to (`16W` would require an extra space)
*        % Multiply
k        % Round down
16&YB    % Convert to binary string with 16 digits. Display

5

CJam, 20 byte

l':/60b9m<675/2bG0e[

Suite uji.

Penjelasan

Menggunakan fakta bahwa 65536 (2 16 ) lebih dari 86400 (jumlah detik dalam sehari) disederhanakan menjadi 512 lebih dari 675.

l     e# Read input.
':/   e# Split around ':', so we get ["hh" "mm" "ss"].
60b   e# Interpret as base-60 digits, which computes hh*60^2 + mm*60 + ss,
      e# i.e. it computes the total number of seconds. Note that this implicitly
      e# converts all three strings to integers.
9m<   e# Bitwise left-shift by 9 positions, which is the same as multiplying by
      e# 2^9 = 512.
675/  e# Divide by 675, flooring the result.
2b    e# Convert to binary.
G0e[  e# Left-pad with zeros to 16 digits.

3

Pyth, 31 27 byte

.[\016.Bs*512cisMcQ\:60 675

Suite uji.

Mengubah input menjadi jumlah detik yang berlalu, kalikan dengan faktor 2^16 / 24*60*60, dan kemudian lantai dan konversikan ke biner 16-bit.

Disimpan 4 byte dengan menyederhanakan 65536/86400menjadi 512/675(bodoh saya).

Input output

00:00:00    0000000000000000
11:00:00    0111010101010101
12:00:00    1000000000000000
01:30:00    0001000000000000
10:33:06    0111000010001101
09:57:30    0110101000111000
06:00:00    0100000000000000
18:00:00    1100000000000000
23:59:59    1111111111111111

Bisakah Anda membenarkan " lalu lantai "?
Peter Taylor

@PeterTaylor Apa yang harus saya lakukan?
Leaky Nun

4
Tunggu hingga spek telah ambigu sebelum mengirim jawaban.
Peter Taylor

@PeterTaylor Cara pembulatan yang benar terlihat oleh 10:33:06.
Adám

@ Adam, tidak juga, karena itu memberikan output yang sama dengan lantai dan bulat-ke-terdekat.
Peter Taylor

3

TSQL (sqlserver 2012), 103 byte

DECLARE @d datetime = '10:33:06'

DECLARE @ char(16)='',@x INT=cast(@d as real)*131072WHILE
len(@)<16SELECT @x/=2,@=concat(@x%2,@)PRINT @

Cobalah online

Tidak disatukan

DECLARE @d datetime = '10:33:06'

DECLARE @ char(16)='',
        @x INT=cast(@d as real)*131072
WHILE len(@)<16
SELECT @x/=2,@=concat(@x%2,@)
PRINT @

TSQL (sqlserver 2012), 119 106 byte

Juga termasuk versi yang berbeda tanpa variabel @x, namun beberapa byte lebih lama. Termasuk versi ungolfed bagi mereka yang tertarik:

DECLARE @d datetime = '23:59:59'

DECLARE @ varchar(16) =''
WHILE LEN(@)<16
SET @+=LEFT(CAST(@d as decimal(9,9))*2*POWER(2,LEN(@))%2,1)
PRINT @

Itu tidak terlihat seperti golf. Tidak bisakah Anda menghapus banyak spasi putih?
Adám

@ Adám sangat goolfed, saya menggunakan metode yang berbeda dari standar untuk membuat skrip lebih pendek dan bahkan mencoba metode yang berbeda. Saya baru saja memasukkan spasi putih yang tidak disengaja ketika menjawab jawaban saya menjadi codegolf (hanya satu tambahan). Saya ingin meletakkan linebreak di sana, tetapi memutuskan untuk meletakkannya setelah WHILE sebagai gantinya. Menghapus ruang dan bertanya-tanya apakah Anda benar-benar menurunkan saya untuk satu ruang ekstra
t-clausen.dk

@ Adám dan jika Anda melihat metode kedua, ini bukan golf (kecuali jumlah karakter), karena itu bukan jawaban saya yang sebenarnya. Hanya metode penyelesaian yang lebih berbeda untuk menyelesaikannya
t-clausen.dk

3
Tidak, saya tidak downvote. Mungkin seseorang yang memiliki prinsip untuk menurunkan semua jawaban yang diposting sebelum OP mengklarifikasi pertanyaan aturan yang beredar. Semua kecuali jawaban yang paling baru memiliki satu downvote. (Mungkin Peter Taylor, karena dia terakhir di sini sebelum pos itu, dan dia telah mengeluh tentang ini.) Anda dapat melihat ini ketika Anda mendapatkan cukup perwakilan. Di sini, miliki!
Adám

2

JavaScript (ES6), 72 76 byte

Edit 4 byte, simpan thx @Neil

Masih belum jelas tentang pembulatan. Yang ini terpotong dan tidak apa-apa.

t=>(t.split`:`.map(v=>t=+v+60*~~t),t*512/675|65536).toString(2).slice(1)

Uji

f=t=>(t.split`:`.map(v=>t=+v+60*~~t),t*512/675|65536).toString(2).slice(1)

function test() {
  var v=I.value
  R.textContent=f(v)
}

test()


;`00:00:00 ==> 0000000000000000
12:00:00 ==> 1000000000000000
01:30:00 ==> 0001000000000000
10:33:06 ==> 0111000010001101
09:57:30 ==> 0110101000111000
06:00:00 ==> 0100000000000000
18:00:00 ==> 1100000000000000`
.split('\n').forEach(t=>{
  [i,k]=t.split(' ==> ')
  r=f(i)
  ok=r==k
  O.textContent += (ok ? 'OK ':'KO ')+ i + ' -> ' + r + (ok? '\n' : ' Expected '+k+'\n')
})
<input id=I value='12:34:56' oninput=test()>
<span id=R></span>
<pre id=O></pre>


Saya mencoba mencari tahu mengapa ini
diturunkan

t=>([h,m,s]=t.split`:`,(+h+m/60+s/3600)*8192/3|65536).toString(2).slice(1)menghemat 2 byte, tetapi reduceberjalan satu byte lebih jauh:t=>(t.split`:`.reduce((n,m)=>+m+n*60)*512/675|65536).toString(2).slice(1)
Neil

Pengunduran diri tanpa komentar tidak keren,
terbalik

@Neil terima kasih banyak! Dan dengan .map 1 byte lebih tersimpan
edc65

Hah, saya bertanya-tanya dari mana Anda akan mendapatkan 0 dari untuk peta ...
Neil

1

APL (Dyalog) , 24 21 byte

Peraturan sekarang telah diklarifikasi.

Meminta waktu sebagai daftar 3-elemen.

(16/2)⊤⌊512×675÷⍨60⊥⎕

Edit: Diperbarui ( ) untuk mencocokkan hasil baru untuk 10:33:06.

Cobalah online!

 meminta input

60⊥ mengevaluasi dalam basis-60

675÷⍨ bagi dengan 675

512× kalikan dengan 512

 lantai

(... )⊤ convert to (mnemonic: basis terbalik adalah anti-basis) sistem angka berikut:

16/2 replikasi 2 enam belas kali (yaitu biner 16-bit)   


0

Q, 32 Bytes

48_0b\:_(512%675)*60/:"I"$":"\:

Uji

   t "00:00:00"
0000000000000000b
   t "12:00:00"
1000000000000000b
   t "01:30:00"
0001000000000000b
   t "10:33:06"
0111000010001101b
   t "09:57:30"
0110101000111000b
   t "06:00:00"
0100000000000000b
   t "18:00:00"
1100000000000000b
  • Untuk mengurangi tampilan yang berantakan, saya berasumsi sedikit modifikasi pada ekspresi asli, yang memberi nama tpada lambda

  • b suffix mengindikasikan biner

Penjelasan

CATATAN.- baca kiri ke kanan, evaluasi kanan ke kiri

Dibaca sebagai: 48 drop dari representasi biner dari lantai 512 divideb oleh 675 dan dikalikan dengan 60 scalarFromVector melalui bilangan bulat integer dari splits di ":" string asli

Evaluasi:

":"\:x memisahkan string x (argumen implisit dari lambda) di karakter ":" (Q menggunakan "" untuk menunjukkan karakter)

"I"$x masukkan string x ke int - s> jam, menit, detik

60/:x menggunakan basis 60 untuk menghitung nilai tunggal dari urutan int -> total detik

(512%675)*x menghitung rasio 512%675(% dibagi) dan mengalikan detik. 512% 675 adalah bentuk fraksi yang disederhanakan (totalSecondsPerDay% 64K)

_ x menunjukkan lantai float x

0b\:x menghitung representasi biner x (64 bit)

48_ x drop 48 bit pertama, jadi kami memiliki representasi 16 bit kami

Contoh (x = "01:30:00"). CATATAN.- "/" menunjukkan komentar ke akhir baris

":"\:"01:30:00" /-> ("01";"30";"00") "I"$ /-> 1 30 0 60/: /-> 5400 (512%675)* /-> 4096.0 _ /-> 4096 0b\: /-> 0000000000000000000000000000000000000000000000000001000000000000b 48_ /-> 0001000000000000b


0

Ruby, 75 byte

h,m,s=t.split(':').map &:to_i;((h*3600+m*60+s<<9)/675).to_s(2).rjust 16,'0'

Saya merasa harus ada metode yang lebih singkat untuk mengubah waktu menjadi detik, tetapi hanya ini yang bisa saya pikirkan.


0

Python, 45 byte

lambda h,m,s:bin((s+m*60+h*3600)*512/675)[2:]

Datang dengan 512/675faktor saya sendiri, kemudian melihat orang lain melakukan hal yang sama.


0

C, 91 byte

f(h,m,s,n,i){i=0;n=(s+m*60+h*3600)*512/675;while(i<16)printf((n&32768)?"1":"0"),n<<=1,i++;}

0

PHP, 47 46 43 byte

Menggunakan pengkodean IBM-850.

printf(~┌Ø,strtotime($argn.UTC,0)*512/675);

Jalankan seperti ini:

echo "18:00:00" | php -nR 'printf(~┌Ø,strtotime($argn.UTC,0)*512/675);';echo

Tweaks

  • Menyimpan byte dengan menggunakan pengkodean IBM-850.
  • Disimpan 3 byte dengan menggunakan $argn
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.