Jaki jest czas binarny?
Wszyscy wiedzą, jaki jest normalny czas. Jest tam w prawym górnym rogu (lub gdziekolwiek go umieścisz) na ekranie. Ale pytanie, które ludzie rzadko zadają sobie, brzmi: co to jest czas binarny ?
Czas binarny
Czas binarny (True Binary Time) działa, czytając najpierw najbardziej znaczący bit (MSB) z liczby. Jeśli ta liczba jest 0
, wyrażony czas jest przed południem. Jeśli ta liczba to 1
, wyrażony czas jest po południu. Następny bit dzieli połowę dnia, gdy pierwszy bit jest wyrażony w dwóch kolejnych równych połówkach, tym razem 6 godzin. Następujący bit dzieli się na 3 godziny, następne 90 minut i tak dalej. Czasy takie jak 12:00:00
tam, gdzie wydaje się, że nie powinno tak być, stają się 1
.
Rozumiem tylko ten dziwny system pomiaru czasu, dlatego potrzebuję programu, który by go przekonwertował. Ale ponieważ liczby binarne to Base-2, a 2 to mała liczba, twój program musi być jak najkrótszy.
Wymagania
- Twój program powinien zająć trochę czasu (tak jak 24 godziny) jako dane wejściowe i wyjściowe odpowiadającej im liczby binarnej.
- Numer wyjściowy powinien mieć 16-bitową dokładność (liczba powinna składać się z 16 cyfr).
- Nie możesz użyć wbudowanego, który wykonuje całą konwersję za Ciebie.
- Powinieneś podłogę, jeśli trzeba ją zaokrąglić.
Zasady
Przypadki testowe
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
Punktacja
Aby wygrać, jak wspomniałem wcześniej, musisz mieć najmniej bajtów.
Zgłoszenia
Aby upewnić się, że twoja odpowiedź się pojawi, zacznij od nagłówka, korzystając z następującego szablonu Markdown:
# Language Name, N bytes
gdzie N
jest rozmiar twojego zgłoszenia. Jeśli poprawić swój wynik, to może zachować stare porachunki w nagłówku, uderzając je przez. Na przykład:
# Ruby, <s>104</s> <s>101</s> 96 bytes
Jeśli chcesz umieścić w nagłówku wiele liczb (np. Ponieważ twój wynik to suma dwóch plików lub chcesz osobno wymienić kary za flagi tłumacza), upewnij się, że rzeczywisty wynik jest ostatnią liczbą w nagłówku:
# Perl, 43 + 2 (-p flag) = 45 bytes
Możesz także ustawić nazwę języka jako link, który pojawi się we fragmencie tabeli wyników:
# [><>](http://esolangs.org/wiki/Fish), 121 bytes
Tabela liderów
Oto fragment kodu, który pozwala wygenerować zarówno zwykłą tabelę wyników, jak i przegląd zwycięzców według języka.
/* Configuration */
var QUESTION_ID = 81057; // Obtain this from the url
// It will be like https://XYZ.stackexchange.com/questions/QUESTION_ID/... on any question page
var ANSWER_FILTER = "!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe";
var COMMENT_FILTER = "!)Q2B_A2kjfAiU78X(md6BoYk";
var OVERRIDE_USER = 53406; // This should be the user ID of the challenge author.
/* App */
var answers = [], answers_hash, answer_ids, answer_page = 1, more_answers = true, comment_page;
function answersUrl(index) {
return "https://api.stackexchange.com/2.2/questions/" + QUESTION_ID + "/answers?page=" + index + "&pagesize=100&order=desc&sort=creation&site=codegolf&filter=" + ANSWER_FILTER;
}
function commentUrl(index, answers) {
return "https://api.stackexchange.com/2.2/answers/" + answers.join(';') + "/comments?page=" + index + "&pagesize=100&order=desc&sort=creation&site=codegolf&filter=" + COMMENT_FILTER;
}
function getAnswers() {
jQuery.ajax({
url: answersUrl(answer_page++),
method: "get",
dataType: "jsonp",
crossDomain: true,
success: function (data) {
answers.push.apply(answers, data.items);
answers_hash = [];
answer_ids = [];
data.items.forEach(function(a) {
a.comments = [];
var id = +a.share_link.match(/\d+/);
answer_ids.push(id);
answers_hash[id] = a;
});
if (!data.has_more) more_answers = false;
comment_page = 1;
getComments();
}
});
}
function getComments() {
jQuery.ajax({
url: commentUrl(comment_page++, answer_ids),
method: "get",
dataType: "jsonp",
crossDomain: true,
success: function (data) {
data.items.forEach(function(c) {
if (c.owner.user_id === OVERRIDE_USER)
answers_hash[c.post_id].comments.push(c);
});
if (data.has_more) getComments();
else if (more_answers) getAnswers();
else process();
}
});
}
getAnswers();
var SCORE_REG = /<h\d>\s*([^\n,]*[^\s,]),.*?(\d+)(?=[^\n\d<>]*(?:<(?:s>[^\n<>]*<\/s>|[^\n<>]+>)[^\n\d<>]*)*<\/h\d>)/;
var OVERRIDE_REG = /^Override\s*header:\s*/i;
function getAuthorName(a) {
return a.owner.display_name;
}
function process() {
var valid = [];
answers.forEach(function(a) {
var body = a.body;
a.comments.forEach(function(c) {
if(OVERRIDE_REG.test(c.body))
body = '<h1>' + c.body.replace(OVERRIDE_REG, '') + '</h1>';
});
var match = body.match(SCORE_REG);
if (match)
valid.push({
user: getAuthorName(a),
size: +match[2],
language: match[1],
link: a.share_link,
});
});
valid.sort(function (a, b) {
var aB = a.size,
bB = b.size;
return aB - bB
});
var languages = {};
var place = 1;
var lastSize = null;
var lastPlace = 1;
valid.forEach(function (a) {
if (a.size != lastSize)
lastPlace = place;
lastSize = a.size;
++place;
var answer = jQuery("#answer-template").html();
answer = answer.replace("{{PLACE}}", lastPlace + ".")
.replace("{{NAME}}", a.user)
.replace("{{LANGUAGE}}", a.language)
.replace("{{SIZE}}", a.size)
.replace("{{LINK}}", a.link);
answer = jQuery(answer);
jQuery("#answers").append(answer);
var lang = a.language;
if (/<a/.test(lang)) lang = jQuery(lang).text();
languages[lang] = languages[lang] || {lang: a.language, user: a.user, size: a.size, link: a.link};
});
var langs = [];
for (var lang in languages)
if (languages.hasOwnProperty(lang))
langs.push(languages[lang]);
langs.sort(function (a, b) {
if (a.lang > b.lang) return 1;
if (a.lang < b.lang) return -1;
return 0;
});
for (var i = 0; i < langs.length; ++i)
{
var language = jQuery("#language-template").html();
var lang = langs[i];
language = language.replace("{{LANGUAGE}}", lang.lang)
.replace("{{NAME}}", lang.user)
.replace("{{SIZE}}", lang.size)
.replace("{{LINK}}", lang.link);
language = jQuery(language);
jQuery("#languages").append(language);
}
}
body { text-align: left !important}
#answer-list {
padding: 10px;
width: 290px;
float: left;
}
#language-list {
padding: 10px;
width: 290px;
float: left;
}
table thead {
font-weight: bold;
}
table td {
padding: 5px;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<link rel="stylesheet" type="text/css" href="//cdn.sstatic.net/codegolf/all.css?v=83c949450c8b">
<div id="answer-list">
<h2>Leaderboard</h2>
<table class="answer-list">
<thead>
<tr><td></td><td>Author</td><td>Language</td><td>Size</td></tr>
</thead>
<tbody id="answers">
</tbody>
</table>
</div>
<div id="language-list">
<h2>Winners by Language</h2>
<table class="language-list">
<thead>
<tr><td>Language</td><td>User</td><td>Score</td></tr>
</thead>
<tbody id="languages">
</tbody>
</table>
</div>
<table style="display: none">
<tbody id="answer-template">
<tr><td>{{PLACE}}</td><td>{{NAME}}</td><td>{{LANGUAGE}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr>
</tbody>
</table>
<table style="display: none">
<tbody id="language-template">
<tr><td>{{LANGUAGE}}</td><td>{{NAME}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr>
</tbody>
</table>
[hour, minute, second]
? Nie lubimy ograniczać formatu wejściowego.09:57:30
się0110110000000000
?Odpowiedzi:
MATL , 15 bajtów
Używa wbudowanego do konwertowania ciągu reprezentującego czas na szeregową datę / godzinę, co jest dozwolone przez wyzwanie.
Wypróbuj online!
Wyjaśnienie
źródło
CJam, 20 bajtów
Zestaw testowy.
Wyjaśnienie
Wykorzystuje fakt, że 65536 (2 16 ) powyżej 86400 (liczba sekund w ciągu dnia) upraszcza się do 512 w stosunku do 675.
źródło
Pyth,
3127 bajtówZestaw testowy.
Konwertuje dane wejściowe na liczbę sekund, które pomnożono przez współczynnik
2^16 / 24*60*60
, a następnie piętro i przekonwertuj na 16-bitowy plik binarny.Zaoszczędzono 4 bajty, upraszczając
65536/86400
do512/675
(głupie mnie).Wejście wyjście
źródło
10:33:06
.TSQL (sqlserver 2012), 103 bajty
Wypróbuj online
Nie golfił
TSQL (sqlserver 2012),
119106 bajtówZawiera także inną wersję bez zmiennej @x, ale była ona o kilka bajtów dłuższa. W tym wersja bez golfa dla zainteresowanych:
źródło
JavaScript (ES6), 72
76bajtówEdytuj 4 bajty, zapisz thx @Neil
Nadal niejasne co do zaokrąglenia.Ten zostaje obcięty i jest w porządku.Test
źródło
t=>([h,m,s]=t.split`:`,(+h+m/60+s/3600)*8192/3|65536).toString(2).slice(1)
oszczędza 2 bajty, alereduce
idzie o jeden bajt dalej:t=>(t.split`:`.reduce((n,m)=>+m+n*60)*512/675|65536).toString(2).slice(1)
APL (Dyalog) ,
2421 bajtówZasady zostały teraz wyjaśnione.
Monity o czas w postaci listy 3-elementowej.
Edycja: Zaktualizowano (
⌈
→⌊
), aby dopasować nowy wynik dla 10:33:06.Wypróbuj online!
⎕
monit o wprowadzenie60⊥
ocenić w podstawie 60675÷⍨
podzielić przez 675512×
pomnóż przez 512⌊
piętro(
…)⊤
Przekonwertuj na (mnemonic: odwrócona baza jest anty-bazowa) na następujący system liczbowy:16/2
replikacja 2 szesnaście razy (tj. 16-bitowy plik binarny)źródło
P, 32 bajty
Test
Aby zmniejszyć bałagan na wyświetlaczu, zakładam niewielką modyfikację pierwotnego wyrażenia, które nadaje nazwę
t
lambdziePrzyrostek b wskazuje na binarny
Wyjaśnienie
UWAGA. - czytaj od lewej do prawej, ocenia od prawej do lewej
Odczytuje jako: 48 upuszczenie z binarnej reprezentacji piętra 512 podzielonych przez 675 i pomnożonych przez 60 scalarFromVector przez liczbę całkowitą rzutowaną z podziałów na oryginalny ciąg „:”
Ocena:
":"\:x
dzieli ciąg x (niejawny argument lambda) na znak „:” (Q używa znaku „” do oznaczenia znaku)"I"$x
Rzuć ciąg (y) x na int (s) -> godziny, minuty, sekundy60/:x
używa podstawy 60 do obliczenia pojedynczej wartości z sekwencji liczb całkowitych -> sekund łącznie(512%675)*x
oblicza stosunek512%675
(% jest dzieleniem) i mnoży sekundy. 512% 675 to uproszczona forma ułamka (totalSecondsPerDay% 64K)_ x
wskazuje podłogę pływaka x0b\:x
oblicza binarną reprezentację x (64 bity)48_ x
upuszczamy pierwsze 48 bitów, więc mamy naszą reprezentację 16 bitówPrzykład (x = „01:30:00”). UWAGA. - „/” oznacza komentarz do końca wiersza
":"\:"01:30:00" /-> ("01";"30";"00") "I"$ /-> 1 30 0 60/: /-> 5400 (512%675)* /-> 4096.0 _ /-> 4096 0b\: /-> 0000000000000000000000000000000000000000000000000001000000000000b 48_ /-> 0001000000000000b
źródło
Rubinowy, 75 bajtów
Wydaje mi się, że musi istnieć krótsza metoda przeliczania czasu na sekundy, ale to wszystko, co mogłem wymyślić.
źródło
Python, 45 bajtów
Wpadłem na ten
512/675
czynnik, a potem zobaczyłem, że inni zrobili to samo.źródło
C, 91 bajtów
źródło
PHP,
474643 bajtówWykorzystuje kodowanie IBM-850.
Uruchom tak:
Poprawki
$argn
źródło