เวลาไบนารีคืออะไร


14

เวลาไบนารีคืออะไร

ทุกคนรู้ว่าเวลาปกติคืออะไร มันขึ้นที่ด้านบนขวา (หรือที่ใดก็ตามที่คุณใส่ไว้) ของหน้าจอ แต่คำถามที่คนไม่ค่อยถามตัวเองคือ: เวลาไบนารีคืออะไร?

เวลาไบนารี

Binary Time (True Binary Time) ทำงานโดยการอ่านบิตที่สำคัญที่สุด (MSB) ของจำนวน หากตัวเลขนั้นเป็น0เวลาที่แสดงก่อนเที่ยง หากตัวเลขนั้นเป็น1เวลาที่แสดงคือหลังเที่ยง บิตถัดไปแบ่งครึ่งวันของบิตแรกที่แสดงเป็นครึ่งเท่ากันอีกสองครั้งคราวนี้ 6 ชั่วโมง บิตต่อไปนี้แบ่งออกเป็น 3 ชั่วโมง 90 นาทีถัดไปและอื่น ๆ เวลาเช่น12:00:00ที่ดูเหมือนว่ามันไม่ควรจะกลายเป็น1ที่มันดูเหมือนว่ามันควรจะไม่กลายเป็น

ฉันสามารถเข้าใจระบบกำหนดเวลาที่แปลกประหลาดนี้ได้ดังนั้นฉันจึงต้องการโปรแกรมแปลงให้เป็นแบบนั้นสำหรับฉัน แต่เนื่องจากเลขฐานสองเป็น Base-2 และ 2 เป็นตัวเลขขนาดเล็กโปรแกรมของคุณจะต้องสั้นที่สุด

ความต้องการ

  • โปรแกรมของคุณควรใช้เวลา (เป็น 24 ชั่วโมง) ในฐานะที่เป็นอินพุทและเอาท์พุทหมายเลขเวลาไบนารีที่สอดคล้องกัน
  • หมายเลขผลลัพธ์ควรมีความแม่นยำ 16 บิต (หมายเลขควรมีความยาว 16 หลัก)
  • คุณไม่สามารถใช้ builtin ที่ทำหน้าที่แปลงให้คุณทั้งหมด
  • คุณควรปูพื้นถ้ามันจะต้องถูกปัดเศษ

กฎระเบียบ

กรณีทดสอบ

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

เกณฑ์การให้คะแนน

ในการชนะดังที่ฉันได้กล่าวไปแล้วคุณต้องมีจำนวนไบต์น้อยที่สุด

การส่ง

เพื่อให้แน่ใจว่าคำตอบของคุณปรากฏขึ้นโปรดเริ่มคำตอบด้วยหัวข้อโดยใช้เทมเพลต Markdown ต่อไปนี้:

# Language Name, N bytes

ที่Nมีขนาดของส่งของคุณ หากคุณปรับปรุงคะแนนของคุณคุณสามารถเก็บคะแนนเก่าไว้ในบรรทัดแรกโดยการตีพวกเขาผ่าน ตัวอย่างเช่น

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

หากคุณต้องการรวมหลายตัวเลขไว้ในส่วนหัวของคุณ (เช่นเนื่องจากคะแนนของคุณคือผลรวมของสองไฟล์หรือคุณต้องการแสดงรายการการลงโทษการตั้งค่าสถานะของล่ามแยกต่างหาก) ตรวจสอบให้แน่ใจว่าคะแนนจริงเป็นตัวเลขสุดท้ายในส่วนหัว:

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

นอกจากนี้คุณยังสามารถตั้งชื่อภาษาให้เป็นลิงค์ซึ่งจะปรากฏในตัวอย่างกระดานแต้มนำ:

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

ลีดเดอร์บอร์ด

นี่เป็นตัวอย่างข้อมูลเพื่อสร้างทั้งกระดานผู้นำปกติและภาพรวมของผู้ชนะตามภาษา


3
ฉันสามารถป้อนข้อมูลที่เป็น[hour, minute, second]? เราไม่ชอบการ จำกัด รูปแบบการป้อนข้อมูล
Leun Nun

2
อย่างไร09:57:30ให้0110110000000000?
Leun Nun

2
16 บิตสามารถแสดงค่า 65536 เท่านั้น มี 86400 วินาทีต่อวัน เราจะแสดงสิ่งที่ไม่ตรงกับการแทนฐานสองได้อย่างไร?
PurkkaKoodari

เราสามารถส่งคืนผลลัพธ์เป็นรายการตัวเลข 16 ตัวได้หรือไม่?
Adám

@ Adámใช่คุณสามารถ
George Gibson

คำตอบ:


1

MATL , 15 ไบต์

YOtk-KWW*k16&YB

ใช้ builtin สำหรับแปลงสตริงที่แทนเวลาเป็นวันที่ / เวลาอนุกรมซึ่งได้รับอนุญาตจากการท้าทาย

ลองออนไลน์!

คำอธิบาย

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 ไบต์

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

ชุดทดสอบ

คำอธิบาย

ใช้ข้อเท็จจริงที่ว่า 65536 (2 16 ) มากกว่า 86400 (จำนวนวินาทีในหนึ่งวัน) ลดความซับซ้อนลงเป็น 512 มากกว่า 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 ไบต์

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

ชุดทดสอบ

แปลงอินพุตเป็นจำนวนวินาทีที่ผ่านไปคูณด้วยตัวคูณ2^16 / 24*60*60แล้วลากและแปลงเป็นไบนารี่ 16 บิต

บันทึก 4 ไบต์โดยทำให้ง่ายขึ้น 65536/86400เป็นแบบ512/675 (stupid me)

อินพุต / เอาต์พุต

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

คุณสามารถปรับ " และพื้น " ได้ไหม?
Peter Taylor

@PeterTaylor ฉันควรทำอะไรแทน
Leun Nun

4
รอจนกว่าสเป็คจะไม่ชัดเจนก่อนที่จะโพสต์คำตอบ
Peter Taylor

@PeterTaylor 10:33:06ทางที่ถูกต้องของการปัดเศษเป็นที่ประจักษ์โดย
Adám

@ Adámไม่จริงเพราะให้ผลลัพธ์เดียวกันกับพื้นและรอบที่ใกล้ที่สุด
Peter Taylor

3

TSQL (sqlserver 2012), 103 ไบต์

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

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

ลองออนไลน์

Ungolfed

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 ไบต์

รวมเวอร์ชันที่แตกต่างโดยไม่มีตัวแปร @x แต่มีความยาวไม่กี่ไบต์ รวมถึงรุ่นที่ไม่น่ารังเกียจสำหรับผู้ที่สนใจ:

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 @

ที่ไม่ได้ดูกอล์ฟ คุณไม่สามารถลบช่องว่างได้มากใช่ไหม
Adám

@ Adam เป็น goolfed มากฉันใช้วิธีที่แตกต่างกว่ามาตรฐานเพื่อให้สคริปต์สั้นลงและลองใช้วิธีอื่น ฉันเพิ่งมีพื้นที่ว่างโดยไม่ได้ตั้งใจใส่เมื่อรับมือกับคำตอบของฉันใน codegolf (เพิ่มเพียงหนึ่ง) ฉันต้องการที่จะวาง linebreak ที่นั่น แต่ตัดสินใจที่จะวางไว้ในขณะที่แทน เอาพื้นที่และสงสัยว่าคุณ downvoted ฉันจริง ๆ สำหรับพื้นที่พิเศษที่เดียว
t-clausen.dk

@ Adámและหากคุณกำลังมองหาวิธีที่สองก็ไม่ได้เล่นกอล์ฟ (ยกเว้นการนับตัวละคร) เพราะมันไม่ใช่คำตอบที่แท้จริงของฉัน เพียงวิธีการคำนวณที่แตกต่างกันมากขึ้นในการแก้ปัญหา
t-clausen.dk

3
ไม่ฉันไม่ได้ลงคะแนน มันอาจจะเป็นคนที่มีหลักการในการลดคำตอบทั้งหมดที่โพสต์ก่อนที่ OP จะชี้แจงคำถามกฎที่โดดเด่น ทั้งหมด แต่คำตอบล่าสุดนั้นมีหนึ่ง downvote อย่างแน่นอน (อาจเป็น Peter Peter เพราะเขาอยู่ที่นี่ก่อนโพสต์นั้นและเขาก็บ่นเกี่ยวกับเรื่องนี้) คุณสามารถเห็นสิ่งนี้เมื่อคุณได้รับตัวแทนมากพอ ที่นี่มีบางอย่าง!
Adám

2

JavaScript (ES6), 72 76ไบต์

แก้ไข 4 ไบต์บันทึกขอบคุณ @Neil

ยังไม่ชัดเจนเกี่ยวกับการปัดเศษ อันนี้ตัดปลายแล้วก็โอเค

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

ทดสอบ

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>


ฉันกำลังพยายามหาสาเหตุว่าทำไมการลงคะแนนนี้
t-clausen.dk

t=>([h,m,s]=t.split`:`,(+h+m/60+s/3600)*8192/3|65536).toString(2).slice(1)ช่วยให้คุณประหยัด 2 ไบต์ แต่reduceจะเพิ่มอีกหนึ่งไบต์:t=>(t.split`:`.reduce((n,m)=>+m+n*60)*512/675|65536).toString(2).slice(1)
Neil

Downvote โดยไม่ต้องแสดงความคิดเห็นไม่เย็นโหวตขึ้น
t-clausen.dk

@ Neil ขอบคุณมาก! และด้วย.
map

อืมฉันสงสัยว่าคุณจะได้รับ 0 จากแผนที่ ...
Neil

1

APL (Dyalog) , 24 21 ไบต์

กฎได้รับการชี้แจงในขณะนี้

แจ้งเวลาเป็นรายการองค์ประกอบ 3 รายการ

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

แก้ไข: อัปเดต ( ) เพื่อให้ตรงกับผลลัพธ์ใหม่สำหรับ 10:33:06

ลองออนไลน์!

 พรอมต์สำหรับการป้อนข้อมูล

60⊥ ประเมินในฐาน -60

675÷⍨ หารด้วย 675

512× คูณด้วย 512

 ชั้น

()⊤ แปลงเป็น (ตัวช่วยจำ: ฐานคว่ำเป็นฐานต่อต้าน) ระบบตัวเลขต่อไปนี้:

16/2 ทำซ้ำ 2 สิบหกครั้ง (เช่นไบนารี 16 บิต)   


0

Q, 32 ไบต์

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

ทดสอบ

   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
  • เพื่อลดความยุ่งเหยิงของจอแสดงผลฉันถือว่าการดัดแปลงเล็กน้อยกับนิพจน์ดั้งเดิมที่ให้ชื่อtแก่แลมบ์ดา

  • คำต่อท้ายขบ่งชี้ว่าไบนารี

คำอธิบาย

NOTE.- อ่านจากซ้ายไปขวาประเมินจากขวาไปซ้าย

อ่านเป็น: 48 ลดลงจากการเป็นตัวแทนไบนารีของชั้น 512 หารด้วย 675 และคูณด้วย 60 scalarFromVector กว่าจำนวนเต็มโยนจากการแยกที่ ":" สตริงเดิม

การประเมินผล:

":"\:x แยกสตริง x (ARG โดยนัยของแลมบ์ดา) ที่ ":" อักขระ (Q ใช้ "" เพื่อแสดงถึงอักขระ)

"I"$x สตริงคาสต์ x ถึง int (s) -> ชั่วโมงนาทีวินาที

60/:x ใช้ฐาน 60 เพื่อคำนวณค่าเดียวจากลำดับของ ints -> รวมวินาที

(512%675)*x คำนวณอัตราส่วน 512%675 (% คือหาร) และคูณวินาที 512% 675 เป็นรูปแบบเศษส่วนแบบง่าย ๆ (totalSecondsPerDay%% 64K)

_ x หมายถึงพื้นของลอย x

0b\:x คำนวณการแทนเลขฐานสองของ x (64 บิต)

48_ x ปล่อย 48 บิตแรกดังนั้นเราจึงมีตัวแทน 16 บิตของเรา

ตัวอย่าง (x = "01:30:00") NOTE.- "/" แสดงความคิดเห็นถึงจุดสิ้นสุดของบรรทัด

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


0

Ruby, 75 ไบต์

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

ฉันรู้สึกว่าต้องใช้วิธีที่สั้นกว่าในการแปลงเวลาเป็นวินาที แต่นี่คือทั้งหมดที่ฉันคิดได้


0

Python ขนาด 45 ไบต์

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

มาพร้อมกับ512/675ปัจจัยด้วยตัวเองแล้วเห็นคนอื่นทำแบบเดียวกัน



0

PHP, 47 46 43 ไบต์

ใช้การเข้ารหัส IBM-850

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

ทำงานแบบนี้:

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

การปรับแต่ง

  • บันทึกเป็นไบต์โดยใช้การเข้ารหัส IBM-850
  • บันทึก 3 ไบต์โดยใช้ $argn
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.