Apa Waktu Binernya?
Semua orang tahu apa waktu yang normal. Itu ada di sana di kanan atas (atau di mana pun Anda meletakkannya) layar Anda. Tapi pertanyaan yang jarang ditanyakan oleh orang kepada diri mereka sendiri adalah ini: Apa waktu binernya ?
Waktu Biner
Binary Time (True Binary Time) bekerja dengan terlebih dahulu membaca bit paling signifikan (MSB) dari nomor tersebut. Jika angka itu 0
, waktu yang dinyatakan sebelum siang. Jika nomor itu 1
, waktu yang dinyatakan adalah setelah tengah hari. Bit berikutnya membagi separuh hari bit pertama diekspresikan menjadi dua bagian yang sama, kali ini 6 jam. Bit berikut dibagi menjadi 3 jam, 90 menit berikutnya, dan seterusnya. Saat-saat seperti 12:00:00
, di mana seharusnya tidak menjadi, menjadi 1
.
Saya hanya dapat memahami sistem pengaturan waktu yang aneh ini, jadi saya perlu sebuah program untuk mengubahnya menjadi untuk saya. Tetapi karena angka-angka biner adalah Basis-2, dan 2 adalah angka kecil, program Anda harus sesingkat mungkin.
Persyaratan
- Program Anda harus mengambil waktu (sebagai 24 jam) sebagai input dan output nomor waktu biner yang sesuai.
- Nomor output harus memiliki presisi 16-bit (panjangnya harus 16 digit).
- Anda tidak dapat menggunakan bawaan yang melakukan semua konversi itu untuk Anda.
- Anda harus lantai jika perlu dibulatkan.
Aturan
- Celah standar dilarang.
- Program Anda seharusnya tidak menulis apa pun
STDERR
.
Uji Kasus
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
Mencetak gol
Untuk menang, seperti yang saya sebutkan sebelumnya, Anda harus memiliki byte paling sedikit.
Pengajuan
Untuk memastikan bahwa jawaban Anda muncul, silakan mulai jawaban Anda dengan tajuk utama, menggunakan templat Penurunan harga berikut:
# Language Name, N bytes
di mana N
ukuran kiriman Anda. Jika Anda meningkatkan skor Anda, Anda dapat menyimpan skor lama di headline, dengan mencoretnya. Contohnya:
# Ruby, <s>104</s> <s>101</s> 96 bytes
Jika Anda ingin memasukkan beberapa angka dalam tajuk Anda (mis. Karena skor Anda adalah jumlah dari dua file atau Anda ingin membuat daftar hukuman penterjemah secara terpisah), pastikan bahwa skor sebenarnya adalah angka terakhir di tajuk:
# Perl, 43 + 2 (-p flag) = 45 bytes
Anda juga dapat membuat tautan nama bahasa yang kemudian akan muncul di cuplikan papan peringkat:
# [><>](http://esolangs.org/wiki/Fish), 121 bytes
Papan peringkat
Berikut ini adalah Stack Snippet untuk menghasilkan leaderboard biasa dan gambaran umum pemenang berdasarkan bahasa.
/* 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]
? Kami tidak suka membatasi format input.09:57:30
membuat0110110000000000
?Jawaban:
MATL , 15 byte
Menggunakan bawaan untuk mengonversi string yang mewakili waktu ke tanggal seri / nomor waktu, yang diizinkan oleh tantangan.
Cobalah online!
Penjelasan
sumber
CJam, 20 byte
Suite uji.
Penjelasan
Menggunakan fakta bahwa 65536 (2 16 ) lebih dari 86400 (jumlah detik dalam sehari) disederhanakan menjadi 512 lebih dari 675.
sumber
Pyth,
3127 byteSuite uji.
Mengubah input menjadi jumlah detik yang berlalu, kalikan dengan faktor
2^16 / 24*60*60
, dan kemudian lantai dan konversikan ke biner 16-bit.Disimpan 4 byte dengan menyederhanakan
65536/86400
menjadi512/675
(bodoh saya).Input output
sumber
10:33:06
.TSQL (sqlserver 2012), 103 byte
Cobalah online
Tidak disatukan
TSQL (sqlserver 2012),
119106 byteJuga termasuk versi yang berbeda tanpa variabel @x, namun beberapa byte lebih lama. Termasuk versi ungolfed bagi mereka yang tertarik:
sumber
JavaScript (ES6), 72
76byteEdit 4 byte, simpan thx @Neil
Masih belum jelas tentang pembulatan.Yang ini terpotong dan tidak apa-apa.Uji
sumber
t=>([h,m,s]=t.split`:`,(+h+m/60+s/3600)*8192/3|65536).toString(2).slice(1)
menghemat 2 byte, tetapireduce
berjalan satu byte lebih jauh:t=>(t.split`:`.reduce((n,m)=>+m+n*60)*512/675|65536).toString(2).slice(1)
APL (Dyalog) ,
2421 bytePeraturan sekarang telah diklarifikasi.
Meminta waktu sebagai daftar 3-elemen.
Edit: Diperbarui (
⌈
→⌊
) untuk mencocokkan hasil baru untuk 10:33:06.Cobalah online!
⎕
meminta input60⊥
mengevaluasi dalam basis-60675÷⍨
bagi dengan 675512×
kalikan dengan 512⌊
lantai(
...)⊤
convert to (mnemonic: basis terbalik adalah anti-basis) sistem angka berikut:16/2
replikasi 2 enam belas kali (yaitu biner 16-bit)sumber
Q, 32 Bytes
Uji
Untuk mengurangi tampilan yang berantakan, saya berasumsi sedikit modifikasi pada ekspresi asli, yang memberi nama
t
pada lambdab suffix mengindikasikan biner
Penjelasan
CATATAN.- baca kiri ke kanan, evaluasi kanan ke kiri
Dibaca sebagai: 48 drop dari representasi biner dari lantai 512 divideb oleh 675 dan dikalikan dengan 60 scalarFromVector melalui bilangan bulat integer dari splits di ":" string asli
Evaluasi:
":"\:x
memisahkan string x (argumen implisit dari lambda) di karakter ":" (Q menggunakan "" untuk menunjukkan karakter)"I"$x
masukkan string x ke int - s> jam, menit, detik60/:x
menggunakan basis 60 untuk menghitung nilai tunggal dari urutan int -> total detik(512%675)*x
menghitung rasio512%675
(% dibagi) dan mengalikan detik. 512% 675 adalah bentuk fraksi yang disederhanakan (totalSecondsPerDay% 64K)_ x
menunjukkan lantai float x0b\:x
menghitung representasi biner x (64 bit)48_ x
drop 48 bit pertama, jadi kami memiliki representasi 16 bit kamiContoh (x = "01:30:00"). CATATAN.- "/" menunjukkan komentar ke akhir baris
":"\:"01:30:00" /-> ("01";"30";"00") "I"$ /-> 1 30 0 60/: /-> 5400 (512%675)* /-> 4096.0 _ /-> 4096 0b\: /-> 0000000000000000000000000000000000000000000000000001000000000000b 48_ /-> 0001000000000000b
sumber
Ruby, 75 byte
Saya merasa harus ada metode yang lebih singkat untuk mengubah waktu menjadi detik, tetapi hanya ini yang bisa saya pikirkan.
sumber
Python, 45 byte
Datang dengan
512/675
faktor saya sendiri, kemudian melihat orang lain melakukan hal yang sama.sumber
C, 91 byte
sumber
PHP,
474643 byteMenggunakan pengkodean IBM-850.
Jalankan seperti ini:
Tweaks
$argn
sumber