我正在尝试做一些基于句子中字符数量的动态规划。英语字母表中哪个字母在屏幕上占像素最多?
当前回答
我知道公认的答案是W, W代表胜利。
但是,在本例中,W也表示宽度。案例研究使用了一个简单的宽度测试来检查像素,但它只是宽度,而不是总像素数。作为一个简单的反例,公认的答案假设O和Q占用相同数量的像素,但它们只占用相同数量的空间。
因此,W占的空间最大。但是,这是所有的像素,它被吹捧吗?
让我们来看看一些经验数据。我从下面的B, M和w中创建了imgur图像,然后分析了它们的像素数(见下文),结果如下:
B: 114像素
M: 150像素
女:157像素
以下是我如何将它们放入画布并分析图像中的原始像素数据。
var imgs = { B : "//i.imgur.com/YOuEPOn.png", M : "//i.imgur.com/Aev3ZKQ.png", W : "//i.imgur.com/xSUwE7w.png" }; window.onload = function(){ for(var key in imgs){(function(img,key){ var Out = document.querySelector("#"+key+"Out"); img.crossOrigin = "Anonymous"; img.src=imgs[key]; img.onload = function() { var canvas = document.querySelector('#'+key); (canvas.width = img.width,canvas.height = img.height); var context = canvas.getContext('2d'); context.drawImage(img, 0, 0); var data = context.getImageData(0, 0, img.width, img.height).data; Out.innerHTML = "Total Pixels: " + data.length/4 + "<br>"; var pixelObject = {}; for(var i = 0; i < data.length; i += 4){ var rgba = "rgba("+data[i]+","+data[i+1]+","+data[i+2]+","+data[i+3]+")"; pixelObject[rgba] = pixelObject[rgba] ? pixelObject[rgba]+1 : 1; } Out.innerHTML += "Total Whitespace: " + pixelObject["rgba(255,255,255,255)"] + "<br>"; Out.innerHTML += "Total Pixels In "+ key +": " + ((data.length/4)-pixelObject["rgba(255,255,255,255)"]) + "<br>"; }; })(new Image(),key)} }; <table> <tr> <td> <canvas id="B" width="100%" height="100%"></canvas> </td> <td id="BOut"> </td> </tr> <tr> <td> <canvas id="M" width="100%" height="100%"></canvas> </td> <td id="MOut"> </td> </tr> <tr> <td> <canvas id="W" width="100%" height="100%"></canvas> </td> <td id="WOut"> </td> </tr> </table>
其他回答
大写的“M”通常是最宽的。
接下来是Ned Batchelder非常实用的回答,因为我来这里是想知道数字:
0000000000000000000000000000000000000000
1111111111111111111111111111111111111111
2222222222222222222222222222222222222222
3333333333333333333333333333333333333333
4444444444444444444444444444444444444444
5555555555555555555555555555555555555555
6666666666666666666666666666666666666666
7777777777777777777777777777777777777777
8888888888888888888888888888888888888888
9999999999999999999999999999999999999999
我知道公认的答案是W, W代表胜利。
但是,在本例中,W也表示宽度。案例研究使用了一个简单的宽度测试来检查像素,但它只是宽度,而不是总像素数。作为一个简单的反例,公认的答案假设O和Q占用相同数量的像素,但它们只占用相同数量的空间。
因此,W占的空间最大。但是,这是所有的像素,它被吹捧吗?
让我们来看看一些经验数据。我从下面的B, M和w中创建了imgur图像,然后分析了它们的像素数(见下文),结果如下:
B: 114像素
M: 150像素
女:157像素
以下是我如何将它们放入画布并分析图像中的原始像素数据。
var imgs = { B : "//i.imgur.com/YOuEPOn.png", M : "//i.imgur.com/Aev3ZKQ.png", W : "//i.imgur.com/xSUwE7w.png" }; window.onload = function(){ for(var key in imgs){(function(img,key){ var Out = document.querySelector("#"+key+"Out"); img.crossOrigin = "Anonymous"; img.src=imgs[key]; img.onload = function() { var canvas = document.querySelector('#'+key); (canvas.width = img.width,canvas.height = img.height); var context = canvas.getContext('2d'); context.drawImage(img, 0, 0); var data = context.getImageData(0, 0, img.width, img.height).data; Out.innerHTML = "Total Pixels: " + data.length/4 + "<br>"; var pixelObject = {}; for(var i = 0; i < data.length; i += 4){ var rgba = "rgba("+data[i]+","+data[i+1]+","+data[i+2]+","+data[i+3]+")"; pixelObject[rgba] = pixelObject[rgba] ? pixelObject[rgba]+1 : 1; } Out.innerHTML += "Total Whitespace: " + pixelObject["rgba(255,255,255,255)"] + "<br>"; Out.innerHTML += "Total Pixels In "+ key +": " + ((data.length/4)-pixelObject["rgba(255,255,255,255)"]) + "<br>"; }; })(new Image(),key)} }; <table> <tr> <td> <canvas id="B" width="100%" height="100%"></canvas> </td> <td id="BOut"> </td> </tr> <tr> <td> <canvas id="M" width="100%" height="100%"></canvas> </td> <td id="MOut"> </td> </tr> <tr> <td> <canvas id="W" width="100%" height="100%"></canvas> </td> <td id="WOut"> </td> </tr> </table>
根据您的平台,可能有一种方法从字符串或DrawText()函数中“getWidth”,以某种方式使用width属性。
我会做一个简单的算法时间,利用所需的字体,然后通过alfabet运行,并将其存储在一个小配置或只是计算它在初始化作为一个循环从a到Z并不难。
这也取决于字体。我在1或2年前用Processing和Helvetica做过这个,它是ILJTYFVCPAXUZKHSEDORGNBQMW,按增加像素的顺序。这个想法是用你正在看的字体在画布上绘制文本,计算像素,然后用HashMap或Dictionary排序。
当然,这可能与您的使用没有直接关系,因为它计算像素面积而不仅仅是宽度。可能也有点过头了。
void setup() {
size(30,30);
HashMap hm = new HashMap();
fill(255);
PFont font = loadFont("Helvetica-20.vlw");
textFont(font,20);
textAlign(CENTER);
for (int i=65; i<91; i++) {
background(0);
text(char(i),width/2,height-(textDescent()+textAscent())/2);
loadPixels();
int white=0;
for (int k=0; k<pixels.length; k++) {
white+=red(pixels[k]);
}
hm.put(char(i),white);
}
HashMap sorted = getSortedMap(hm);
String asciiString = new String();
for (Iterator<Map.Entry> i = sorted.entrySet().iterator(); i.hasNext();) {
Map.Entry me = (Map.Entry)i.next();
asciiString += me.getKey();
}
println(asciiString); //the string in ascending pixel order
}
public HashMap getSortedMap(HashMap hmap) {
HashMap map = new LinkedHashMap();
List mapKeys = new ArrayList(hmap.keySet());
List mapValues = new ArrayList(hmap.values());
TreeSet sortedSet = new TreeSet(mapValues);
Object[] sortedArray = sortedSet.toArray();
int size = sortedArray.length;
// a) Ascending sort
for (int i=0; i<size; i++) {
map.put(mapKeys.get(mapValues.indexOf(sortedArray[i])), sortedArray[i]);
}
return map;
}