이진 시간은 무엇입니까?


14

이진 시간은 무엇입니까?

모두가 정상적인 시간이 무엇인지 알고 있습니다. 화면의 오른쪽 상단 (또는 어디에 놓아도)에 있습니다. 그러나 사람들이 거의 묻지 않는 질문은 이것입니다. 이진 시간 은 무엇입니까 ?

이진 시간

이진 시간 (True Binary Time)은 숫자의 최상위 비트 (MSB)를 먼저 읽음으로써 작동합니다. 해당 숫자가 0이면 정오 이전의 시간입니다. 해당 숫자가 1인 경우 정오 이후의 시간입니다. 다음 비트는 하루의 반을 첫 번째 비트가 6 시간의 더 동일한 반으로 나눕니다. 다음 비트는 3 시간, 다음 90 분 등으로 나뉩니다. 12:00:00어느 쪽도 아닌 것처럼 보이는 시간 이 1됩니다.

이 이상한 타이밍 시스템 만 이해할 수 있기 때문에 저를 위해 변환 할 프로그램이 필요합니다. 그러나 이진수는 Base-2이고 2는 작은 숫자이므로 프로그램은 가능한 짧아야합니다.

요구 사항

  • 프로그램은 입력으로 시간 (24 시간)을 가져와 해당 이진 시간 번호를 출력해야합니다.
  • 출력 숫자는 16 비트 정밀도 여야합니다 (숫자는 16 자리 여야합니다).
  • 해당 변환을 모두 수행하는 내장 기능을 사용할 수 없습니다.
  • 반올림해야하는 경우 바닥을 사용해야합니다.

규칙

  • 표준 허점 은 금지되어 있습니다.
  • 프로그램은에 아무 것도 쓰지 않아야합니다 STDERR.

테스트 사례

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

채점

앞서 언급했듯이 이기기 위해서는 바이트 수가 가장 적어야합니다.

제출물

답변이 표시되도록하려면 다음 마크 다운 템플릿을 사용하여 헤드 라인으로 답변을 시작하십시오.

# 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 2016 년

결과를 16 개의 숫자 목록으로 반환 할 수 있습니까?
Adám

@ Adám 예, 가능합니다.
George Gibson

답변:


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[

테스트 스위트.

설명

86400 (하루의 초 수)에서 65536 (2 16 )이 675에서 512로 단순화 된다는 사실을 이용합니다 .

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 비트 이진수로 바꾼 후 변환합니다.

(stupid me) 65536/86400로 단순화 하여 4 바이트를 절약했습니다 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 대신 어떻게해야합니까?
Leaky Nun

4
답변을 게시하기 전에 사양이 명확해질 때까지 기다리십시오.
피터 테일러

@PeterTaylor 올바른 반올림 방법은 10:33:06입니다.
Adám

@ 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 @

(2012 SQLSERVER) TSQL, 119 106 바이트

@x 변수가없는 다른 버전도 포함되었지만 몇 바이트 더 길었습니다. 관심있는 사람들을위한 ungolfed 버전 포함 :

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은 매우 끈적 거리며 표준과 다른 방법을 사용하여 스크립트를 더 짧게 만들고 다른 방법을 시도했습니다. codegolf에 답변을 처리 할 때 실수로 공백이 생겼습니다 (단 하나의 추가). 나는 거기에 줄 바꿈을 넣고 싶었지만 대신 WHILE 뒤에 넣기로 결정했습니다. 공간을 제거하고 그 하나의 추가 공간에 대해 정말로 저를
공언

@ Adám과 두 번째 방법을보고 있다면 실제 답변이 아니기 때문에 골프를 치지 않습니다 (문자 수 제외). 그것을 해결하는 다른 계산법
t-clausen.dk

3
아니, 난 공감하지 않았다. OP가 게시 된 규칙에 대한 명확한 답변을하기 전에 게시 된 모든 답변을 공표하는 원칙을 가진 사람 일 수 있습니다. 가장 최신의 답변을 제외하고는 정확히 하나의 공감대가 있습니다. (피터 테일러 였을 가능성이 높습니다. 그가 그 직전에 마지막에 있었기 때문에 그는 이것에 대해 불평했습니다.) 충분한 담당자가 나올 때 이것을 볼 수 있습니다. 여기 좀 있어요!
Adám

2

자바 스크립트 (ES6), 72 76 바이트

편집하다thx @Neil 저장 4 바이트

반올림에 대해서는 여전히 불분명합니다. 이것은 잘리고 괜찮습니다.

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 바이트를 절약하지만 reduce1 바이트 더갑니다 :t=>(t.split`:`.reduce((n,m)=>+m+n*60)*512/675|65536).toString(2).slice(1)
Neil

의견이없는 공감대는 시원하지 않으며 공감되지 않습니다
t-clausen.dk

@ 닐 정말 감사합니다! 그리고 .map 1로 더 많은 바이트가 절약되었습니다.
edc65

허, 나는 당신이지도에서 0을 어디서 얻었 을까 궁금했다.
Neil

1

APL (Dyalog) , 24 21 바이트

규칙이 명확 해졌습니다.

3 요소 목록으로 시간을 묻습니다.

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

편집 : 업데이트 ( 10:33:06의 새 결과와 일치하도록 ).

온라인으로 사용해보십시오!

 입력 프롬프트

60⊥ Base-60에서 평가

675÷⍨ 675로 나누다

512× 512 곱하기

 바닥

()⊤ 다음의 수 체계로 변환합니다 (니모닉 : 거꾸로 된 거점은 대치가 아닙니다) :

16/2 2 16 회 복제 (즉, 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 접미사는 이진을 나타냅니다

설명

NOTE.- 왼쪽에서 오른쪽으로 읽고 오른쪽에서 왼쪽으로 평가

다음과 같이 읽습니다. 512 나누기의 이진 표현에서 675로 나누고 ":"원래 문자열의 분할에서 캐스트 된 정수에 60 scalarFromVector를 곱한 48 드롭

평가:

":"\:x ":"문자에서 문자열 x (람다의 암시 적 인수)를 분할합니다 (Q는 ""를 사용하여 문자를 나타냄)

"I"$x 문자열 x를 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"). NOTE.- "/"는 줄 끝의 주석을 나타냅니다.

":"\:"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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.