আমি একটি বাক্যে অক্ষরের সংখ্যার ভিত্তিতে কিছু গতিশীল প্রোগ্রামিং করার চেষ্টা করছি। ইংরেজী বর্ণমালার কোন বর্ণটি পর্দায় সর্বাধিক পিক্সেল গ্রহণ করে?
আমি একটি বাক্যে অক্ষরের সংখ্যার ভিত্তিতে কিছু গতিশীল প্রোগ্রামিং করার চেষ্টা করছি। ইংরেজী বর্ণমালার কোন বর্ণটি পর্দায় সর্বাধিক পিক্সেল গ্রহণ করে?
উত্তর:
হুম, দেখা যাক:
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
জেতে
অবশ্যই এটি একটি নির্বোধ অভিজ্ঞতা অভিজ্ঞতা is কোন চিঠিটি প্রশস্ত তার কোনও একক উত্তর নেই। এটি ফন্টের উপর নির্ভর করে। সুতরাং আপনার পরিবেশটির উত্তর বের করার জন্য আপনাকে অনুরূপ অভিজ্ঞতামূলক পরীক্ষা করতে হবে। তবে আসল বিষয়টি হল, বেশিরভাগ হরফ একই কনভেনশনগুলি অনুসরণ করে এবং মূলধন ডব্লিউ আরও প্রশস্ত হবে।
অনুপাত আকারে এই অক্ষরের প্রস্থের সংক্ষিপ্তসার (ডাব্লু = 100) এই বিশেষ উদাহরণ ফন্ট ব্যবহার করে এখানে ধরা হয়েছে:
https://gist.github.com/imaurer/d330e68e70180c985b380f25e195b90c
নেড ব্যাচেল্ডারের দুর্দান্ত ব্যবহারিক উত্তরের আরও কারণ, আমি এখানে অঙ্কগুলি নিয়ে ভাবছিলাম came
0000000000000000000000000000000000000000
1111111111111111111111111111111111111111
2222222222222222222222222222222222222222
3333333333333333333333333333333333333333
4444444444444444444444444444444444444444
5555555555555555555555555555555555555555
6666666666666666666666666666666666666666
7777777777777777777777777777777777777777
8888888888888888888888888888888888888888
9999999999999999999999999999999999999999
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';
মূলধন "এম" প্রচলিতভাবে আরও প্রশস্ত।
আপনার প্ল্যাটফর্মের উপর নির্ভর করে কোনও স্ট্রিং থেকে ড্রইটেক্সট () ফাংশন থেকে কোনওভাবে প্রস্থের সম্পত্তি সহ "গেটউইথ" যাওয়ার উপায় থাকতে পারে।
আমি একটি সাধারণ অ্যালগর্মটাইম তৈরি করব যা প্রয়োজনীয় ফন্টটি ব্যবহার করে এবং তারপরে বর্ণমালার মধ্য দিয়ে দৌড়ে একটি ছোট কনফিগারেশনে সংরক্ষণ করে বা এডি থেকে জেড পর্যন্ত লুপ হিসাবে আদিতে এটি গণনা করা যে শক্ত নয়।
এটি ফন্টের উপরও নির্ভর করে। আমি 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;
}
ক্রোমে আড়িয়াল 30px - ডব্লিউ জিতেছে ।
এক্সএক্সএক্স পোস্ট করা সমাধানের মতো ফন্টের প্রস্থের গণনা করার জন্য একটি সমাধান অ্যালেক্স মাইকেল তার ব্লগে পোস্ট করেছিলেন (যা আমাকে এখানে যথেষ্ট সংযুক্ত করেছে)।
সারসংক্ষেপ:
আসল পোস্ট: 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()
এটি ফন্টের উপর নির্ভর করবে। আমি এমন একটি প্রোগ্রামিং ভাষায় একটি ছোট প্রোগ্রাম তৈরি করব যা আপনি সবচেয়ে স্বাচ্ছন্দ্যযুক্ত, যেখানে আপনি বর্ণমালার প্রতিটি অক্ষরকে একটি সময়ের আকারের বিটম্যাপে আঁকেন। প্রতিটি পিক্সেল সাদা দিয়ে শুরু করুন। তারপরে প্রতিটি অক্ষর আঁকার পরে সাদা পিক্সেলের সংখ্যাটি গণনা করুন এবং সেই নম্বরটি সংরক্ষণ করুন। আপনি সর্বাধিক সংখ্যাটি সন্ধান করছেন এটিই আপনি সন্ধান করছেন।
সম্পাদনা: আপনি যদি সত্যিই আগ্রহী হন যে কোনওটি সবচেয়ে বড় আয়তক্ষেত্রটি গ্রহণ করে (তবে দেখে মনে হচ্ছে আপনি সত্যিই এর পরে রয়েছেন, পিক্সেল নয়) তবে আকারটি খুঁজতে আপনি বিভিন্ন এপিআই কলগুলি ব্যবহার করতে পারেন তবে এটি নির্ভর করে আপনার প্রোগ্রামিং ভাষা। জাভাতে, উদাহরণস্বরূপ, আপনি ফন্টমেট্রিক্স ক্লাসটি ব্যবহার করবেন।
আমি জানি যে এখানে গৃহীত উত্তর হ'ল ডাব্লু, ডাব্লু WIN এর জন্য।
তবে, এক্ষেত্রে ডাব্লু প্রস্থের পক্ষেও। কেস স্টাডি পিক্সেল পরীক্ষা করার জন্য একটি সাধারণ প্রস্থের পরীক্ষা নিযুক্ত করেছিল, তবে এটি কেবল প্রস্থ ছিল, মোট পিক্সেল গণনা নয়। একটি সহজ পাল্টা উদাহরণ হিসাবে, গৃহীত উত্তরটি ধরে নেওয়া হয় যে ও এবং কিউ একই পরিমাণ পিক্সেল গ্রহণ করে, তবুও তারা কেবল একই পরিমাণে স্থান নেয়।
সুতরাং, ডব্লিউ সবচেয়ে লাগে স্থান । তবে, এটি কি সমস্ত পিক্সেল হয়ে গেছে?
আসুন কিছু পরীক্ষামূলক ডেটা নেওয়া যাক। আমি নিম্নলিখিত বি, এম এবং ডাব্লু থেকে ইমগুর চিত্রগুলি তৈরি করেছিলাম তারপরে আমি তাদের পিক্সেল গণনাটি বিশ্লেষণ করেছি (নীচে দেখুন), এখানে ফলাফলগুলি:
বি: 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>
আসল দীর্ঘতম গ্লাইফটি জানতে চান , কেবল অনুমান করা নয়?
এবং আমি কেবল বর্ণগুলি, অঙ্কগুলি এবং সাধারণ চিহ্নগুলি (!, @ এবং আরও কিছু) নিয়ে কথা বলছি না। আমি ইউটিএফ -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
।
এবং সেখানে আপনার এটি রয়েছে, ইউটিএফ -32-র দীর্ঘতম চরিত্র! নোট করুন যে কোনও ফন্টে দীর্ঘতম গ্লাইফটি ﷽, তবে অন্যান্য ফন্টগুলি (বিশেষত মনসস্পেসগুলি) অক্ষরগুলিকে ওভারল্যাপ করে, প্রোগ্রামটি যে প্রোগ্রামটির ফন্ট হিসাবে বিবেচিত হয়।