Що таке бінарний час?


14

Що таке бінарний час?

Усі знають, що нормальний час. Він знаходиться вгорі праворуч (або де б ви не помістили) свого екрана. Але питання, яке люди, здається, рідко задають собі таке: Який бінарний час?

Бінарний час

Бінарний час (True Binary Time) працює, попередньо читаючи найзначніший біт (MSB) числа. Якщо це число 0, виражений час до полудня. Якщо це число 1, час, виражений після полудня. Наступний шматочок розбиває на половину дня перший шматочок, виражений на ще дві рівні половини, цього разу 6 годин. Наступний біт розбивається на 3 години, наступні 90 хвилин тощо. Стають такі часи, як 12:00:00, де, здається, не повинно бути жодного 1.

Я можу зрозуміти лише цю дивну систему синхронізації, тому мені потрібна програма для перетворення на цю для мене. Але так як двійкові числа - База-2, а 2 - невелике число, ваша програма повинна бути якомога коротшою.

Вимоги

  • Ваша програма повинна приймати час (як 24-годинний час) як введення та виведення відповідного двійкового номера часу.
  • Вихідне число повинно мати 16-бітну точність (число повинно бути 16 цифр).
  • Ви не можете використовувати вбудований, який робить все це перетворення за вас.
  • Ви повинні підлогу, якщо його потрібно закруглити.

Правила

Випробування

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]? Нам не подобається обмеження формату введення.
Leaky Nun

2
Як це 09:57:30зробити 0110110000000000?
Leaky Nun

2
16 біт можуть представляти лише 65536 значень. За день йде 86400 секунд. Як ми повинні представляти все, що не відповідає бинарному представленню?
PurkkaKoodari

Чи можемо ми повернути результат у списку з 16 чисел?
Adám

@ Adám Так, можна.
Джордж Гібсон

Відповіді:


1

MATL , 15 байт

YOtk-KWW*k16&YB

Використовує вбудований для перетворення рядка, що представляє час, до серійного номера дати / часу, що дозволено викликом.

Спробуйте в Інтернеті!

Пояснення

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(дурний мене).

Введення-виведення

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

Чи можете ви виправдати « а потім підлогу »?
Пітер Тейлор

@PeterTaylor Що робити замість цього?
Лина монашка

4
Зачекайте, поки специфікація не буде розменена перед публікацією відповіді.
Пітер Тейлор

@PeterTaylor Правильний спосіб округлення очевидний 10:33:06.
Адам

@ Adám, не дуже, тому що це дає однаковий вихід із підлогою та навколо до найближчого.
Пітер Тейлор

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 @

Спробуйте в Інтернеті

Безумовно

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

@ Adám це дуже гольф, я використовував різні методи, ніж стандартний, щоб скоротити сценарій і навіть спробував інший метод. У мене просто було випадкове пробіл, введене під час вирішення моєї відповіді на кодгольф (лише один зайвий). Я хотів покласти туди лінію, але вирішив поставити її після WHILE. Вилучення простору і цікаво, чи дійсно ви прихильнили мене до цього єдиного додаткового простору
t-clausen.dk

@ Adám, і якщо ви дивитесь на другий метод, це не гольф (крім кількості персонажів), оскільки це не моя фактична відповідь. Просто інший більш обчислювальний метод її вирішення
t-clausen.dk

3
Ні, я не виступав. Ймовірно, хтось має принцип, який не має права відповідати на всі відповіді, розміщені до ОП, роз'яснює невирішені питання щодо правил. Усі, окрім найновішої відповіді, мають рівно один зворотний результат. (Це був, мабуть, Пітер Тейлор, тому що він останній був тут безпосередньо перед цим постом, і він скаржився на це.) Ви можете це бачити, коли отримуєте достатню кількість представників. Ось, трохи!
Adám

2

JavaScript (ES6), 72 76 байт

Редагувати 4 байти зберегти thx @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)
Ніл

Downvote без коментаря не крутий, upvoted
t-clausen.dk

@Neil дуже дякую! І з .map ще 1 байт збережено
edc65

Гм, мені було цікаво, куди ти збираєшся отримати 0 за карту ...
Ніл

1

APL (Діалог) , 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лямбда

  • b суфікс позначає двійкові

Пояснення

ПРИМІТКА. - читати зліва направо, оцінювати справа наліво

Читається як: 48 крапель від двійкового подання підлоги 512 ділиться на 675 і множиться на 60 скалярFromVector на цілі числа, подані з розщеплень у початковій рядку ":"

Оцінка:

":"\:x розбиває рядок x (неявний аргумент лямбда) на символ ":" (Q використовує "" для позначення char)

"I"$x кинути рядок (и) x to int (s) -> годин, хвилин, секунд

60/:x використовує базу 60 для обчислення одного значення з послідовності входів -> загальна секунда

(512%675)*x обчислює відношення 512%675(% ділиться) і множує секунди. 512% 675 - це спрощена форма дробу (totalSecondsPerDay% 64K)

_ x позначає підлогу поплавця x

0b\:x обчислює двійкове представлення x (64 біт)

48_ x опустити спочатку 48 біт, тому у нас є 16-бітове представлення

Приклад (x = "01:30:00"). ПРИМІТКА.- "/" вказує коментар до кінця рядка

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


0

Рубін, 75 байт

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

Я відчуваю, що повинен бути коротший метод перетворення часу на секунди, але це все, що я міг придумати.


0

Пітон, 45 байт

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

Я сам підійшов до 512/675фактора, потім побачив, як інші робили це так само.


0

C, 91 байт

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 байт

Використовує кодування 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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.