मैं एक वाक्य में वर्णों की संख्या के आधार पर कुछ गतिशील प्रोग्रामिंग करने की कोशिश कर रहा हूं। अंग्रेजी वर्णमाला का कौन-सा अक्षर स्क्रीन पर सबसे अधिक पिक्सेल लेता है?
मैं एक वाक्य में वर्णों की संख्या के आधार पर कुछ गतिशील प्रोग्रामिंग करने की कोशिश कर रहा हूं। अंग्रेजी वर्णमाला का कौन-सा अक्षर स्क्रीन पर सबसे अधिक पिक्सेल लेता है?
जवाबों:
हम्म, चलो देखते हैं:
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
cccccccccccccccccccccccccccccccccccccccc
dddddddddddddddddddddddddddddddddddddddd
eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee
ffffffffffffffffffffffffffffffffffffffff
gggggggggggggggggggggggggggggggggggggggg
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii
jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj
kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk
llllllllllllllllllllllllllllllllllllllll
mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm
nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn
oooooooooooooooooooooooooooooooooooooooo
pppppppppppppppppppppppppppppppppppppppp
qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq
rrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr
ssssssssssssssssssssssssssssssssssssssss
tttttttttttttttttttttttttttttttttttttttt
uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy
zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD
EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG
HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH
IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII
JJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ
KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK
LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL
MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ
RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR
SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS
TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT
UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU
VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV
WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY
ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
डब्ल्यू जीतता है।
बेशक, यह एक मूर्खतापूर्ण अनुभवजन्य प्रयोग है। इस बात का एक भी जवाब नहीं है कि कौन सा अक्षर सबसे चौड़ा है। यह फॉन्ट पर निर्भर करता है। तो आपको अपने पर्यावरण के उत्तर का पता लगाने के लिए एक समान अनुभवजन्य प्रयोग करना होगा। लेकिन तथ्य यह है कि अधिकांश फोंट समान सम्मेलनों का पालन करते हैं, और पूंजी डब्ल्यू सबसे व्यापक होगी।
इन वर्ण चौड़ाई के साथ एक अनुपात रूप में Wist (W = 100) इस विशेष उदाहरण फ़ॉन्ट का उपयोग करते हुए यहाँ कैप्चर किया गया:
https://gist.github.com/imaurer/d330e68e70180c985b380f25e195b90c
नेड बाथेल्डर के अजीब व्यावहारिक जवाब के आगे, क्योंकि मैं यहां अंकों के बारे में सोच रहा था:
0000000000000000000000000000000000000000
1111111111111111111111111111111111111111
2222222222222222222222222222222222222222
3333333333333333333333333333333333333333
4444444444444444444444444444444444444444
5555555555555555555555555555555555555555
6666666666666666666666666666666666666666
7777777777777777777777777777777777777777
8888888888888888888888888888888888888888
9999999999999999999999999999999999999999
font-family: Arial, 'Helvetica Neue', Helvetica, sans-serif;
font-size: 15px;
ओह, कि Apple, हमेशा थोड़ा अलग होने की कोशिश कर रहा है ....
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';
राजधानी "एम" पारंपरिक रूप से सबसे चौड़ा है।
आपके प्लेटफ़ॉर्म के आधार पर, किसी स्ट्रिंग या ड्राटक्स्ट () से किसी प्रकार की चौड़ाई वाली संपत्ति से "getWidth" करने का एक तरीका हो सकता है।
मैं एक साधारण algortime बनाऊँगा जो आवश्यक फ़ॉन्ट का उपयोग करता है और फिर alfabet के माध्यम से चलता है और इसे एक छोटे से विन्यास में संग्रहीत करता है या इसे A से Z isnt कि हार्ड से लूप के रूप में आरंभीकरण पर गणना करता है।
यह फॉन्ट पर भी निर्भर करता है। मैंने यह 1 या 2 साल पहले प्रसंस्करण और हेल्वेटिका के साथ किया था और यह पिक्सल बढ़ाने के क्रम में ILJTYFVCPAXUZKHSEDORGNBQMW है। विचार कैनवास पर पाठ को आकर्षित करने के लिए है जिसे आप देख रहे हैं, पिक्सेल की गणना करें, फिर हैशपॉप या शब्दकोश के साथ क्रमबद्ध करें।
बेशक, यह सीधे तौर पर आपके उपयोग से संबंधित नहीं हो सकता है क्योंकि यह केवल चौड़ाई के बजाय पिक्सेल क्षेत्र की गणना करता है। थोड़ा ओवरकिल भी हो सकता है।
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;
}
क्रोम में एरियल 30 पीएक्स - डब्ल्यू जीतता है ।
फॉक्स की चौड़ाई की गणना करने के लिए एक समाधान जैसे कि xxx द्वारा पोस्ट किए गए समाधान को एलेक्स माइकल ने अपने ब्लॉग पर पोस्ट किया था (जो कि मजेदार रूप से मुझे यहां लिंक किया गया था)।
सारांश:
मूल पोस्ट: 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()
यह फ़ॉन्ट पर निर्भर करेगा। मैं एक प्रोग्रामिंग भाषा में एक छोटा सा कार्यक्रम बनाऊंगा जिसमें आप सबसे अधिक आरामदायक होंगे, जहां आप वर्णमाला के प्रत्येक अक्षर को एक बार मी बिटमैप में आकर्षित करते हैं। सफेद के साथ प्रत्येक पिक्सेल को इनिशियलाइज़ करें। प्रत्येक अक्षर को खींचने के बाद सफेद पिक्सेल की संख्या गिनें और उस नंबर को सेव करें। आपके द्वारा खोजा जा रहा सबसे अधिक संख्या है।
संपादित करें: यदि आप वास्तव में रुचि रखते हैं जिसमें कोई सबसे बड़ा आयत लेता है (लेकिन ऐसा लगता है कि आप वास्तव में उसके बाद हैं, न कि पिक्सेल), तो आप आकार खोजने के लिए विभिन्न एपीआई कॉल का उपयोग कर सकते हैं, लेकिन यह निर्भर करता है आपकी प्रोग्रामिंग भाषा उदाहरण के लिए, जावा में, आप FontMetrics क्लास का उपयोग करेंगे।
मुझे पता है कि यहां स्वीकृत उत्तर डब्ल्यू, डब्ल्यू विन के लिए है।
हालांकि, इस मामले में, डब्ल्यू भी चौड़ाई के लिए है। पिक्सेल का परीक्षण करने के लिए केस स्टडी का उपयोग एक सरल चौड़ाई परीक्षण में किया गया था, लेकिन यह केवल चौड़ाई थी, कुल पिक्सेल गणना नहीं। एक आसान काउंटर उदाहरण के रूप में, स्वीकृत उत्तर मानता है कि O और Q समान मात्रा में पिक्सेल लेते हैं, फिर भी वे केवल उतनी ही जगह लेते हैं।
इस प्रकार, डब्ल्यू सबसे अधिक स्थान लेता है । लेकिन, क्या यह उन सभी पिक्सल्स है, जो क्रैक हो रहे हैं?
आइए कुछ अनुभवजन्य डेटा प्राप्त करें। मैंने निम्नलिखित बी, एम और डब्ल्यू से imgur छवियां बनाईं। मैंने उनके पिक्सेल गणना का विश्लेषण किया (नीचे देखें), यहां परिणाम हैं:
बी: 114 पिक्सेल
एम: 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>
सिर्फ अनुमान लगाने से नहीं, असली सबसे लंबे ग्लिफ़ को जानना चाहते हैं ?
और मैं केवल अक्षरों, अंकों और सामान्य प्रतीकों (, @, और इसी तरह) के बारे में बात नहीं कर रहा हूं। मेरा मतलब है कि 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 में सबसे लंबा चरित्र! ध्यान दें कि कुछ फोंट पर सबसे लंबा ग्लिफ़ but है, लेकिन अन्य फोंट (विशेष रूप से मोनोस्पेस) पात्रों को ओवरलैप करते हैं, जैसा कि उस फ़ॉन्ट के साथ होता है जो प्रोग्राम प्रोग्राम खाता लेता है।