如何使用程序从行的中间用 8 个不同的代码填充 128 个框
How to fill 128 boxes with 8 different code from mid of the row using program
我要用不同的编号填满128个方框。颜色。
假设我有 8 种颜色来填充这些框,请检查下面的视觉表示以获得预期的输出。
我已经尝试使用 Javascript,但没有得到预期的结果,
window.onload = function() {
var res = ''
, order = {}
, levels = {'#': 'red', '&': '#009688', 'O': '#FF9800', '@': '#FFEB3B', '%': '#9C27B0', '*': '#2196F3', '^': '#00BCD4', '-': '#FF9800'}
, symbols = Object.keys(levels)
, totalLevels = symbols.length;
for (i=0; i < 128; i++) { order[i+1] = ' '; }
var ids = '';
for (v=1; v <= 8; v++) {
var level = v;
var times = Math.ceil(128/level);
ids += 'Level ' + level + ' (Times: '+ times + ') : ';
console.log(times);
for (i=1; i <= times; i++) {
var idx = i * (times-1);
if (idx <= 128) {
order[idx] = symbols[level-1];
ids += (idx-1) + ', ';
}
}
ids += '<br />';
}
var row1 = '<td> </td>'
, row2 = '<td class="header red">Symbol</td>'
Object.entries(order).map(function(item, i) {
var symbol = item[1]
, color = symbol != ' ' ? levels[symbol] : '';
row1 += '<td style="font-weight: bold;">'+ item[0] + '</td>';
row2 += '<td style="'+ (color != '' ? 'background: '+ color +'; font-weight: bold; color: #fff;' : '') +'">'+ symbol + '</td>';
});
// Color bar
bar = '<div id="color-bar">';
Object.entries(levels).map(function(item, i) {
bar += '<div class="code" style="background: '+ item[1] +'">'+ item[0] +'</div>';
});
bar += '<div>'+ ids + '</div>';
bar += '</div>';
document.getElementById('result').innerHTML = bar +'<table><tr>' + row1 + '</tr><tr>' + row2 + '</tr></table>';
}
table {
margin-top: 20%;
}
td {
padding: 10px;
text-align: center;
min-width: 100px;
min-height: 100px;
border-bottom: 1px dotted #ccc;
border-right: 1px dotted #ccc;
}
.header {
background: #eee;
font-weight: bold;
}
.red {
background: #f33;
font-weight: bold;
}
#color-bar {
width: 100%;
position: fixed;
top: 10px;
}
#color-bar .code {
width: 10%;
text-align: center;
padding: 15px;
font-weight: bold;
display: inline-block;
}
<div id="result"></div>
貌似逻辑不对!,如有错误请指正。谢谢,
我只是在深入寻找逻辑。任何编程语言都适合我。 (C/C++,Python,PHP,JAVA,Javascript,甚至 shell 脚本!)
此公式与您的描述不符:
Math.ceil(128/level);
因为你描述的是二的幂 (64, 32, ...),但这里你得到的结果类似于 128/3 = 43。
虽然不是 精确 匹配(请参阅我在问题下方的评论),但您可以计算数字的二进制表示形式中尾随零的数量,并从零开始计数(所以 0..127):
decimal
7-bit binary
# trailing zeroes
color
0
0000000
7
red
1
0000001
0
gray
2
0000010
1
purple
3
0000011
0
gray
4
0000100
2
orange
...
...
...
...
8
0001000
3
cyan
...
...
...
...
16
0010000
4
yellow
...
...
...
...
32
0100000
5
blue
...
...
...
...
64
1000000
6
green
...
...
...
...
127
1111111
0
gray
128
0000000
7
red
那么算法可以是位校验算法:
let colors = ["gray", "purple", "orange", "cyan", "yellow", "blue", "green", "red"];
let container = document.getElementById("content");
for (let i = 0; i <= 128; i++) {
let zeroes = Math.min(7, 31 - Math.clz32(i ^(i-1)));
let color = colors[zeroes];
let div = document.createElement("div");
div.textContent = i;
div.style.background = color;
container.appendChild(div);
}
#content div {
width: 50px;
height: 20px;
border: 1px solid;
margin: 3px;
text-align: center;
color: white;
}
<div id="content"></div>
公式解释
公式为Math.min(7, 31 - Math.clz32(i ^(i-1)))
.
i ^ (i-1)
给出当所有二进制 1 位仅保留最低有效位而所有其他位都变为零时的值。
Math.clz32
是一个鲜为人知的函数,它计算给定数字的前导零(32 位二进制)。
- 从 31 中减去它得到 尾随 个零的数量。
Math.min(7, ...)
我们想要得到一个介于 0 和 7 之间的数字(尾随零)。这最后一步避免了超出范围的值(我们会得到 0)。
我要用不同的编号填满128个方框。颜色。
假设我有 8 种颜色来填充这些框,请检查下面的视觉表示以获得预期的输出。
我已经尝试使用 Javascript,但没有得到预期的结果,
window.onload = function() {
var res = ''
, order = {}
, levels = {'#': 'red', '&': '#009688', 'O': '#FF9800', '@': '#FFEB3B', '%': '#9C27B0', '*': '#2196F3', '^': '#00BCD4', '-': '#FF9800'}
, symbols = Object.keys(levels)
, totalLevels = symbols.length;
for (i=0; i < 128; i++) { order[i+1] = ' '; }
var ids = '';
for (v=1; v <= 8; v++) {
var level = v;
var times = Math.ceil(128/level);
ids += 'Level ' + level + ' (Times: '+ times + ') : ';
console.log(times);
for (i=1; i <= times; i++) {
var idx = i * (times-1);
if (idx <= 128) {
order[idx] = symbols[level-1];
ids += (idx-1) + ', ';
}
}
ids += '<br />';
}
var row1 = '<td> </td>'
, row2 = '<td class="header red">Symbol</td>'
Object.entries(order).map(function(item, i) {
var symbol = item[1]
, color = symbol != ' ' ? levels[symbol] : '';
row1 += '<td style="font-weight: bold;">'+ item[0] + '</td>';
row2 += '<td style="'+ (color != '' ? 'background: '+ color +'; font-weight: bold; color: #fff;' : '') +'">'+ symbol + '</td>';
});
// Color bar
bar = '<div id="color-bar">';
Object.entries(levels).map(function(item, i) {
bar += '<div class="code" style="background: '+ item[1] +'">'+ item[0] +'</div>';
});
bar += '<div>'+ ids + '</div>';
bar += '</div>';
document.getElementById('result').innerHTML = bar +'<table><tr>' + row1 + '</tr><tr>' + row2 + '</tr></table>';
}
table {
margin-top: 20%;
}
td {
padding: 10px;
text-align: center;
min-width: 100px;
min-height: 100px;
border-bottom: 1px dotted #ccc;
border-right: 1px dotted #ccc;
}
.header {
background: #eee;
font-weight: bold;
}
.red {
background: #f33;
font-weight: bold;
}
#color-bar {
width: 100%;
position: fixed;
top: 10px;
}
#color-bar .code {
width: 10%;
text-align: center;
padding: 15px;
font-weight: bold;
display: inline-block;
}
<div id="result"></div>
貌似逻辑不对!,如有错误请指正。谢谢,
我只是在深入寻找逻辑。任何编程语言都适合我。 (C/C++,Python,PHP,JAVA,Javascript,甚至 shell 脚本!)
此公式与您的描述不符:
Math.ceil(128/level);
因为你描述的是二的幂 (64, 32, ...),但这里你得到的结果类似于 128/3 = 43。
虽然不是 精确 匹配(请参阅我在问题下方的评论),但您可以计算数字的二进制表示形式中尾随零的数量,并从零开始计数(所以 0..127):
decimal | 7-bit binary | # trailing zeroes | color |
---|---|---|---|
0 | 0000000 | 7 | red |
1 | 0000001 | 0 | gray |
2 | 0000010 | 1 | purple |
3 | 0000011 | 0 | gray |
4 | 0000100 | 2 | orange |
... | ... | ... | ... |
8 | 0001000 | 3 | cyan |
... | ... | ... | ... |
16 | 0010000 | 4 | yellow |
... | ... | ... | ... |
32 | 0100000 | 5 | blue |
... | ... | ... | ... |
64 | 1000000 | 6 | green |
... | ... | ... | ... |
127 | 1111111 | 0 | gray |
128 | 0000000 | 7 | red |
那么算法可以是位校验算法:
let colors = ["gray", "purple", "orange", "cyan", "yellow", "blue", "green", "red"];
let container = document.getElementById("content");
for (let i = 0; i <= 128; i++) {
let zeroes = Math.min(7, 31 - Math.clz32(i ^(i-1)));
let color = colors[zeroes];
let div = document.createElement("div");
div.textContent = i;
div.style.background = color;
container.appendChild(div);
}
#content div {
width: 50px;
height: 20px;
border: 1px solid;
margin: 3px;
text-align: center;
color: white;
}
<div id="content"></div>
公式解释
公式为Math.min(7, 31 - Math.clz32(i ^(i-1)))
.
i ^ (i-1)
给出当所有二进制 1 位仅保留最低有效位而所有其他位都变为零时的值。Math.clz32
是一个鲜为人知的函数,它计算给定数字的前导零(32 位二进制)。- 从 31 中减去它得到 尾随 个零的数量。
Math.min(7, ...)
我们想要得到一个介于 0 和 7 之间的数字(尾随零)。这最后一步避免了超出范围的值(我们会得到 0)。