문장의 문자 수를 기반으로 일부 동적 프로그래밍을 시도하고 있습니다. 영어 알파벳 중 어떤 문자가 화면에서 가장 많은 픽셀을 차지합니까?
문장의 문자 수를 기반으로 일부 동적 프로그래밍을 시도하고 있습니다. 영어 알파벳 중 어떤 문자가 화면에서 가장 많은 픽셀을 차지합니까?
답변:
흠, 보자 :
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
cccccccccccccccccccccccccccccccccccccccccc
dddddddddddddddddddddddddddddddddddddddddd
eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee
ffffffffffffffffffffffffffffffffffffffffffffff
gggggggggggggggggggggggggggggggggggggggggg
ㅋㅋㅋ ㅋㅋㅋ ㅋㅋㅋ
iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii
jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj
kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk
lllllllllllllllllllllllllllllllllllllllllllll
mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm
nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn
oooooooooooooooooooooooooooooooooooooooo
pppppppppppppppppppppppppppppppppppppppppppp
qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq
rrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr
ssssssssssssssssssssssssssssssssssssssss
ttttttttttttttttttttttttttttttttttttttttttt
uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy
zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD
EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG
HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH
IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII
JJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ
KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK
LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL
MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ
RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR
SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS
TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT
UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU
VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV
WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY
ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
승.
물론 이것은 어리석은 실험적 실험입니다. 어떤 문자가 가장 넓은 지에 대한 답은 없습니다. 글꼴에 따라 다릅니다. 따라서 환경에 대한 해답을 찾으려면 비슷한 실험적 실험을 수행해야합니다. 그러나 사실 대부분의 글꼴은 동일한 규칙을 따르며 대문자 W가 가장 넓습니다.
이 특정 예제 글꼴을 사용하여 여기에 캡처 된 비율 형식 (W = 100)으로 이러한 문자 너비가있는 요지 :
https://gist.github.com/imaurer/d330e68e70180c985b380f25e195b90c
Ned Batchelder의 놀랍도록 실용적인 대답에 더해, 나는 여기에 숫자에 대해 궁금해했기 때문에 :
0000000000000000000000000000000000000000
1111111111111111111111111111111111111111
2222222222222222222222222222222222222222
3333333333333333333333333333333333333333333
4444444444444444444444444444444444444444444
5555555555555555555555555555555555555555
6666666666666666666666666666666666666666666
7777777777777777777777777777777777777777777
8888888888888888888888888888888888888888
99999999999999999999999999999999999999999999
font-family: Arial, 'Helvetica Neue', Helvetica, sans-serif;
font-size: 15px;
오, 그 애플은 항상 조금 달라 지려고 노력하고 있습니다.
font-variant-numeric
표 숫자는 고정 폭 글꼴과 비슷한 규칙을 따라야하는 동안 비례 숫자는 그리와의 간격 모두에서 서로 다른 폭을 허용 :.
프로그래밍 솔루션은 어떻습니까?
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';
대문자 "M"은 일반적으로 가장 넓습니다.
또한 글꼴에 따라 다릅니다. 나는 1-2 년 전에 Processing and 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;
}
xxx가 게시 한 솔루션과 비슷한 글꼴 너비를 계산하는 솔루션은 Alex Michael이 자신의 블로그에 게시했습니다 (재미있게 여기에 나를 연결했습니다).
요약:
원본 게시물 : http://alexmic.net/letter-pixel-count/
암호:
# -*- 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()
글꼴에 따라 다릅니다. 가장 편한 프로그래밍 언어로 작은 프로그램을 만들고 알파벳의 각 문자를 m 크기의 비트 맵으로 그립니다. 각 픽셀을 흰색으로 초기화하십시오. 그런 다음 각 문자를 그린 후 흰색 픽셀 수를 세어 해당 숫자를 저장하십시오. 가장 높은 숫자는 찾고있는 숫자입니다.
편집 : 실제로 가장 큰 사각형을 차지하는 것에 관심이 있다면 (픽셀이 아닌 실제로 그 뒤에있는 것처럼 보입니다) 다양한 API 호출을 사용하여 크기를 찾을 수 있지만 그 크기에 따라 다릅니다. 프로그래밍 언어. 예를 들어 Java에서는 FontMetrics 클래스를 사용합니다.
여기에 허용 된 답변이 W이고 W는 WIN이라는 것을 알고 있습니다.
그러나이 경우 W도 너비입니다. 이 사례 연구에서는 간단한 너비 테스트를 사용하여 픽셀을 검사했지만 총 픽셀 수가 아니라 너비 만 사용했습니다. 쉬운 예로써, 받아 들여진 대답은 O와 Q가 같은 양의 픽셀을 차지한다고 가정하지만 같은 양의 공간 만 차지한다고 가정합니다.
따라서 W는 가장 많은 공간을 차지합니다 . 그러나, 그것이 깨지는 모든 픽셀입니까?
경험적 데이터를 얻자. 다음 B, M 및 W에서 이미지 이미지를 만든 다음 픽셀 수를 분석했습니다 (아래 참조). 결과는 다음과 같습니다.
B : 114 픽셀
M : 150 픽셀
W : 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>
알고 싶어 진짜 긴 글리프, 단지 추측하지?
그리고 나는 문자, 숫자 및 공통 기호 (!, @ 등)에 대해서만 이야기하는 것이 아닙니다. UTF-16의 32,834 자 모두에서 가장 긴 글리프를 의미합니다.
그래서 나는 프로그래밍 방식의 솔루션을 가진 @NK의 대답으로 시작하여 약간 수정했습니다.
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';
이것을 실행하고 기다렸다가 기다린 후에 출력을 제공합니다 ௌ won
.
그리고 UTF-32에서 가장 긴 문자가 있습니다! 일부 글꼴에서는 가장 긴 글리프가 ﷽이지만 다른 글꼴 (특히 모노 스페이스 글꼴)은 프로그램이 프로그램에서 사용하는 글꼴과 마찬가지로 문자와 겹칩니다.