İkili Zaman Nedir?


14

İkili Zaman Nedir?

Herkes normal zamanın ne olduğunu biliyor. Ekranınızın sağ üst köşesinde (veya nereye koyarsanız koyun) orada. Ancak insanların nadiren kendilerine sordukları bir soru şudur: İkili zaman nedir?

İkili Zaman

İkili Zaman (Gerçek İkili Zaman), önce sayının en önemli bitini (MSB) okuyarak çalışır. Bu sayı ise 0, ifade edilen zaman öğleden önce olur. Bu sayı ise 1, ifade edilen zaman öğleden sonradır. Bir sonraki bit, ilk bitin ifade ettiği günün yarısını, bu 6 saatlik bu sefer iki eşit yarıya böler. Aşağıdaki bit 3 saate, sonraki 90 dakikaya vb. Zamanın 12:00:00, her ikisinin de olmaması gerektiği gibi, olması 1.

Sadece bu garip zamanlama sistemini anlayabiliyorum, bu yüzden benim için buna dönüştürecek bir programa ihtiyacım var. Ancak ikili sayılar Base-2 ve 2 küçük bir sayı olduğu için programınız mümkün olduğunca kısa olmalıdır.

Gereksinimler

  • Programınızın giriş olarak bir zaman alması (24 saatlik zaman olarak) ve ilgili ikili zaman numarasını çıkarması gerekir.
  • Çıkış numarası 16 bit hassasiyete sahip olmalıdır (sayı 16 basamak uzunluğunda olmalıdır).
  • Tüm bu dönüşümü sizin için yapan bir yerleşik yapı kullanamazsınız.
  • Yuvarlatılması gerekiyorsa döşemelisiniz.

kurallar

Test Durumları

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

puanlama

Kazanmak için, daha önce de belirttiğim gibi, en az bayta sahip olmalısınız.

gönderimler

Yanıtınızın göründüğünden emin olmak için lütfen aşağıdaki Markdown şablonunu kullanarak yanıtınızı bir başlıkla başlatın:

# Language Name, N bytes

Ngönderiminizin büyüklüğü nerede . Puanınızı artırmak varsa, olabilir onları içinden vurarak, başlığa eski hesapları tutmak. Örneğin:

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

Başlığınıza birden fazla sayı eklemek istiyorsanız (örneğin, puanınız iki dosyanın toplamı olduğu veya yorumlayıcı bayrak cezalarını ayrı olarak listelemek istediğiniz için), gerçek puanın başlıktaki son sayı olduğundan emin olun :

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

Dil adını, daha sonra skor tablosu snippet'inde görünecek bir bağlantı da yapabilirsiniz:

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

Liderler Sıralaması

İşte hem düzenli bir skor tablosu hem de kazananları dile göre gözden geçirmek için bir Yığın Parçacığı.


3
Olarak girebilir miyim [hour, minute, second]? Giriş formatını kısıtlamayı sevmiyoruz.
Leaky Nun

2
Nasıl mu 09:57:30yapmak 0110110000000000?
Leaky Nun

2
16 bit yalnızca 65536 değeri temsil edebilir. Günde 86400 saniye vardır. İkili bir gösterimle tam olarak eşleşmeyen bir şeyi nasıl temsil etmeliyiz?
PurkkaKoodari

Sonucu 16 numaradan oluşan bir liste olarak döndürebilir miyiz?
Adám

@ Adám Evet, yapabilirsiniz.
George Gibson

Yanıtlar:


1

MATL , 15 bayt

YOtk-KWW*k16&YB

Zamanı temsil eden bir dizeyi, meydan okuma tarafından izin verilen bir seri tarih / saat numarasına dönüştürmek için bir yerleşik kullanır.

Çevrimiçi deneyin!

açıklama

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 bayt

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

Test odası.

açıklama

86400'ün üzerinde 65536'nın (2 16 ) (bir gün içindeki saniye sayısı) 675'in üzerinde 512'ye basitleştirilmesi gerçeğini kullanır .

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 bayt

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

Test odası.

Girdiyi geçilen saniye sayısına dönüştürür, çarpanı ile çarpar 2^16 / 24*60*60ve sonra da katlar ve 16-bit ikiliye dönüştürür.

Basitleştirerek 4 bayt Kaydedilen 65536/86400içine 512/675(aptal bana).

Giriş çıkış

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

" Ve sonra zemini " haklı çıkarabilir misiniz ?
Peter Taylor

@PeterTaylor Bunun yerine ne yapmalıyım?
Leaky Nun

4
Yanıt göndermeden önce teknik özelliklerin belirsizleşmesini bekleyin.
Peter Taylor

@PeterTaylor Yuvarlamanın doğru yolu tarafından belirgindir 10:33:06.
ADAM

@ Adám, tam olarak değil, çünkü bu, zemin ve en yakın yuvarlama ile aynı çıktıyı verir.
Peter Taylor

3

TSQL (sqlserver 2012), 103 bayt

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

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

Çevrimiçi deneyin

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 @

(2012 sqlserver) TSQL, 119 106 bayt

Ayrıca @x değişkeni olmayan farklı bir sürüm de dahil edildi, ancak birkaç bayt daha uzundu. İlgilenenler için ungolfed sürümü dahil:

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 @

Golf gibi görünmüyor. Çok fazla boşluk kaldıramaz mısınız?
Adám

@ Adav çok goolfed, ben senaryoyu kısaltmak için standarttan farklı yöntemler kullandım ve hatta farklı bir yöntem denedim. Ben sadece kodumu (sadece bir ekstra) benim cevap başa iken yanlışlıkla bir boşluk vardı. Orada bir satır sonu koymak istedim, ama bunun yerine WHILE sonra koymaya karar verdim. Alanın kaldırılması ve bu ekstra alan için beni gerçekten düşürüp düşürmediğinizi merak ediyorum
t-clausen.dk

@ Adám ve ikinci yönteme bakıyorsanız, gerçek cevabım olmadığı için golf (karakter sayısı hariç) değil.
Çözmek için

3
Hayır, aşağı inmedim. Muhtemelen OP'nin olağanüstü kural sorularını netleştirmeden önce gönderilen tüm cevapları aşağıya düşürme prensibi olan biriydi. En yeni yanıtın dışındaki her şeyin tam olarak bir inişi vardır. (Muhtemelen Peter Taylor'dı, çünkü bu görevden hemen önce buradaydı ve bu konuda şikayet ediyordu.) Yeterli temsilci aldığınızda bunu görebilirsiniz. İşte, biraz var!
Adám

2

JavaScript (ES6), 72 76 bayt

Düzenle 4 bytes save thx @Neil

Yuvarlama konusunda hala net değil. Bu kısalır ve sorun değil.

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

Ölçek

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>


bunun neden indirildiğini anlamaya çalışıyorum
t-clausen.dk

t=>([h,m,s]=t.split`:`,(+h+m/60+s/3600)*8192/3|65536).toString(2).slice(1)size 2 bayt kazandırır, ancak reducebir bayt daha gider:t=>(t.split`:`.reduce((n,m)=>+m+n*60)*512/675|65536).toString(2).slice(1)
Neil

Bir yorum yapmadan downvote değil cool, upvoted
t-clausen.dk

@Neil çok teşekkür ederim! Ve .map ile 1 bayt daha kaydedildi
edc65

Ha, harita için 0'ı nereden alacağınızı merak ediyordum ...
Neil

1

APL (Dyalog) , 24 21 bayt

Kurallar şimdi açıklığa kavuşturuldu.

3 elemanlı liste olarak zaman ister.

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

Düzenleme: 10:33:06 için yeni sonuç eşleşecek şekilde güncellendi ( ).

Çevrimiçi deneyin!

 giriş istemi

60⊥ baz değerlendirmek-60

675÷⍨ 675'e böl

512× 512 ile çarp

 zemin

()⊤ Dönüştürmek (anımsatıcı: baş aşağı taban anti-baz) aşağıdaki sayı sistemine:

16/2 16'yı on altı kez çoğaltın (yani 16 bitlik ikili)   


0

Q, 32 Bayt

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

Ölçek

   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
  • Ekran Karışıklık azaltmak için, ben adını veren özgün ifadeye hafif bir değişiklik, farz tlambda

  • b soneki ikiliyi gösterir

açıklama

NOT. - soldan sağa okunur, sağdan sola değerlendirir

Şöyle okur: 512 divideb tabanının 675'e kadar ikili gösteriminden 48 damla ve ":" orijinal dizesindeki bölünmelerden tamsayı dökümü üzerinde 60 scalarFromVector ile çarpılır

Değerlendirme:

":"\:x ":" karakterinde (Q, "" karakteri belirtmek için "" kullanır)

"I"$x yayın dizeleri x - int (s) -> saat, dakika, saniye

60/:x bir ints dizisinden tek bir değeri hesaplamak için taban 60'ı kullanır - toplam saniye

(512%675)*x oranı hesaplar 512%675(% böl) ve saniyeyi çarpar. 512% 675, kesirin basitleştirilmiş şeklidir (totalSecondsPerDay% 64K)

_ x şamandıra tabanını gösterir x

0b\:x x'in (64 bit) ikili temsilini hesaplar

48_ x İlk 48 biti düşürdüğümüzde, 16 bit gösterimimiz var

Örnek (x = "01:30:00"). NOT. - "/" satır sonuna kadar yorumu belirtir

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


0

Ruby, 75 bayt

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

Sanırım zamanı saniyeye çevirmek için daha kısa bir yöntem olmalı, ama aklıma gelen tek şey bu.


0

Python, 45 bayt

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

İle geldi 512/675kendim faktörü, sonra da testere diğerleri bunu aynı yaptılar.


0

C, 91 bayt

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 bayt

IBM-850 kodlamasını kullanır.

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

Şu şekilde çalıştırın:

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

Düzenlemeler

  • IBM-850 kodlaması kullanılarak bir bayt kaydedildi.
  • Kullanarak 3 bayt kaydedildi $argn
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.