Tôi đang cố gắng thực hiện một số chương trình động dựa trên số lượng ký tự trong một câu. Chữ cái nào trong bảng chữ cái tiếng Anh chiếm nhiều pixel nhất trên màn hình?
Tôi đang cố gắng thực hiện một số chương trình động dựa trên số lượng ký tự trong một câu. Chữ cái nào trong bảng chữ cái tiếng Anh chiếm nhiều pixel nhất trên màn hình?
Câu trả lời:
Hmm, hãy xem:
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
ccccccccccccccccccccccccccccccccccccccccccc
ddddddddddddddddddddddddddddddddddddd
eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee
fffffffffffffffffffffffffffffffffffffffff
gggggggggggggggggggggggggggggggggggggggg
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii
jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj
kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk
lllllllllllllllllllllllllllllllllllll
mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm
nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn
oooooooooooooooooooooooooooooooooooooooo
pppppppppppppppppppppppppppppppppppppppppppp
qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq
rrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr
ssssssssssssssssssssssssssssssssssssssss
tttttttttttttttttttttttttttttttttttttttttttt
uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy
zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
BBBBBBBBBBBBBBBBBB
CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
DDDĐDĐDĐDĐD
EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG
HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH
IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII
JJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ
KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK
LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL
MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ
RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR
SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS
TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT
UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU
VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV
WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY
Zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz
W thắng.
Tất nhiên, đây là một thí nghiệm thực nghiệm ngớ ngẩn. Không có câu trả lời duy nhất cho lá thư nào rộng nhất. Nó phụ thuộc vào phông chữ. Vì vậy, bạn sẽ phải làm một thí nghiệm thực nghiệm tương tự để tìm ra câu trả lời cho môi trường của bạn. Nhưng thực tế là, hầu hết các phông chữ đều tuân theo các quy ước giống nhau và chữ W viết hoa sẽ rộng nhất.
Gist với các độ rộng ký tự này ở dạng tỷ lệ (W = 100) được chụp ở đây bằng phông chữ ví dụ cụ thể này:
https://gist.github.com/imaurer/d330e68e70180c985b380f25e195b90c
Hơn nữa với câu trả lời thực tế khủng khiếp của Ned Batchelder, bởi vì tôi đến đây tự hỏi về các chữ số:
000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111
2222222222222222222222222222222222222222222222
333333333333333333333333333333333333333333
444444444444444444444444444444444444444444
555555555555555555555555555555555555555555
666666666666666666666666666666666666666666666
77777777777777777777777777777777777777777777
888888888888888888888888888888888888888888
9999999999999999999999999999999999999999999
font-family: Arial, 'Helvetica Neue', Helvetica, sans-serif;
font-size: 15px;
Ôi, Apple đó, luôn cố gắng trở nên khác biệt một chút ....
font-variant-numeric
: các số tỷ lệ cho phép các độ rộng khác nhau, cả trong glyph và khoảng cách, trong khi các số dạng bảng phải tuân theo các quy tắc tương tự như các phông chữ đơn cách.
Làm thế nào về một giải pháp lập trình?
var capsIndex = 65;
var smallIndex = 97
var div = document.createElement('div');
div.style.float = 'left';
document.body.appendChild(div);
var highestWidth = 0;
var elem;
for(var i = capsIndex; i < capsIndex + 26; i++) {
div.innerText = String.fromCharCode(i);
var computedWidth = window.getComputedStyle(div, null).getPropertyValue("width");
if(highestWidth < parseFloat(computedWidth)) {
highestWidth = parseFloat(computedWidth);
elem = String.fromCharCode(i);
}
}
for(var i = smallIndex; i < smallIndex + 26; i++) {
div.innerText = String.fromCharCode(i);
var computedWidth = window.getComputedStyle(div, null).getPropertyValue("width");
if(highestWidth < parseFloat(computedWidth)) {
highestWidth = parseFloat(computedWidth);
elem = String.fromCharCode(i);
}
}
div.innerHTML = '<b>' + elem + '</b>' + ' won';
Vốn "M" theo quy ước là rộng nhất.
Tùy thuộc vào nền tảng của bạn, có thể có một cách để "getWidth" từ một chuỗi hoặc hàm DrawText () bằng cách nào đó với thuộc tính chiều rộng.
Tôi sẽ tạo ra một thuật toán đơn giản sử dụng phông chữ cần thiết và sau đó chạy qua alf.us và lưu nó trong một cấu hình nhỏ hoặc chỉ tính toán nó khi khởi tạo như một vòng lặp từ A đến Z không khó lắm.
Nó cũng phụ thuộc vào phông chữ. Tôi đã làm điều này 1 hoặc 2 năm trước với Xử lý và Helvetica và đó là ILJTYFVCPAXUZKHSEDORGNBQMW theo thứ tự tăng pixel. Ý tưởng là vẽ văn bản trên một khung vẽ với phông chữ bạn đang xem, đếm các pixel, sau đó sắp xếp với HashMap hoặc Từ điển.
Tất nhiên, điều này có thể không liên quan trực tiếp đến việc sử dụng của bạn vì điều này sẽ tính toán diện tích pixel thay vì chỉ chiều rộng. Có thể là một chút quá mức quá.
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;
}
Arial 30px trong Chrome - W thắng .
Một giải pháp để tính toán độ rộng của phông chữ giống như giải pháp được đăng bởi xxx đã được Alex Michael đăng trên blog của anh ấy (điều đó đủ vui để liên kết tôi ở đây).
Tóm lược:
Bài đăng gốc: http://alexmic.net/letter-pixel-count/
Mã số:
# -*- coding: utf-8 -*-
from __future__ import division
import os
from collections import defaultdict
from math import sqrt
from PIL import Image, ImageDraw, ImageFont
# Make a lowercase + uppercase alphabet.
alphabet = 'abcdefghijklmnopqrstuvwxyz'
alphabet += ''.join(map(str.upper, alphabet))
def draw_letter(letter, font, save=True):
img = Image.new('RGB', (100, 100), 'white')
draw = ImageDraw.Draw(img)
draw.text((0,0), letter, font=font, fill='#000000')
if save:
img.save("imgs/{}.png".format(letter), 'PNG')
return img
def count_black_pixels(img):
pixels = list(img.getdata())
return len(filter(lambda rgb: sum(rgb) == 0, pixels))
def available_fonts():
fontdir = '/Users/alex/Desktop/English'
for root, dirs, filenames in os.walk(fontdir):
for name in filenames:
path = os.path.join(root, name)
try:
yield ImageFont.truetype(path, 100)
except IOError:
pass
def letter_statistics(counts):
for letter, counts in sorted(counts.iteritems()):
n = len(counts)
mean = sum(counts) / n
sd = sqrt(sum((x - mean) ** 2 for x in counts) / n)
yield letter, mean, sd
def main():
counts = defaultdict(list)
for letter in alphabet:
for font in available_fonts():
img = draw_letter(letter, font, save=False)
count = count_black_pixels(img)
counts[letter].append(count)
for letter, mean, sd in letter_statistics(counts):
print u"{0}: {1:.2f} ± {2:.2f}".format(letter, mean, sd)
if __name__ == '__main__':
main()
Nó sẽ phụ thuộc vào phông chữ. Tôi sẽ tạo một chương trình nhỏ bằng ngôn ngữ lập trình mà bạn thấy thoải mái nhất, nơi bạn vẽ từng chữ cái trong bảng chữ cái thành một bitmap cỡ m lần. Khởi tạo từng pixel với màu trắng. Sau đó đếm số pixel trắng sau khi bạn vẽ từng chữ cái và lưu số đó. Số lượng cao nhất bạn tìm thấy là số bạn đang tìm kiếm.
EDIT: Nếu bạn thực sự chỉ quan tâm đến cái nào chiếm hình chữ nhật lớn nhất (nhưng có vẻ như bạn thực sự sau đó, không phải pixel), bạn có thể sử dụng các lệnh gọi API khác nhau để tìm kích thước, nhưng điều đó phụ thuộc vào ngôn ngữ lập trình của bạn. Ví dụ, trong Java, bạn sẽ sử dụng lớp FontMetrics.
Tôi biết câu trả lời được chấp nhận ở đây là W, W là dành cho THẮNG.
Tuy nhiên, trong trường hợp này, W cũng dành cho Width. Nghiên cứu trường hợp đã sử dụng một thử nghiệm chiều rộng đơn giản để kiểm tra pixel, nhưng đó chỉ là chiều rộng, không phải tổng số pixel. Là một ví dụ dễ truy cập, câu trả lời được chấp nhận giả định rằng O và Q chiếm cùng một lượng pixel, tuy nhiên chúng chỉ chiếm cùng một dung lượng.
Do đó, W chiếm nhiều không gian nhất . Nhưng, đó có phải là tất cả các pixel mà nó bị bẻ khóa không?
Hãy lấy một số dữ liệu thực nghiệm. Tôi đã tạo hình ảnh imgur từ B, M và W. sau đây. Tôi đã phân tích số pixel của họ (xem bên dưới), đây là kết quả:
B: 114 pixel
M: 150 pixel
W: 157 pixel
Đây là cách tôi cho chúng vào khung vẽ và phân tích dữ liệu pixel thô từ hình ảnh.
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>
Bạn muốn biết glyph thực sự dài nhất, không chỉ là đoán?
Và tôi không chỉ nói về các chữ cái, chữ số và ký hiệu phổ biến (!, @ V.v.). Ý tôi là glyph dài nhất trong tất cả 32.834 ký tự của UTF-16.
Vì vậy, tôi bắt đầu với câu trả lời của @NK có giải pháp lập trình cho nó và thực hiện một số sửa đổi nhỏ cho nó:
var capsIndex = 65;
var smallIndex = 97;
var div = document.createElement('div');
div.style.float = 'left';
document.body.appendChild(div);
var highestWidth = 0;
var elem;
for(var i = capsIndex; i < 32834; i++) {
div.innerText = String.fromCharCode(i);
var computedWidth = window.getComputedStyle(div, null).getPropertyValue("width");
if(highestWidth < parseFloat(computedWidth)) {
highestWidth = parseFloat(computedWidth);
elem = String.fromCharCode(i);
}
}
div.innerHTML = '<b>' + elem + '</b>' + ' won';
Sau khi chạy này và chờ đợi (và chờ đợi), nó cho đầu ra ௌ won
.
Và bạn có nó, nhân vật dài nhất trong UTF-32! Lưu ý rằng trên một số phông chữ, glyph dài nhất là ﷽, nhưng các phông chữ khác (đặc biệt là các phông chữ đơn cách) chồng lấp các ký tự, như với phông chữ mà chương trình chiếm tài khoản chương trình.