ฉันกำลังพยายามเขียนโปรแกรมแบบไดนามิกตามจำนวนตัวอักษรในประโยค ตัวอักษรภาษาอังกฤษตัวใดที่ใช้พิกเซลมากที่สุดบนหน้าจอ
ฉันกำลังพยายามเขียนโปรแกรมแบบไดนามิกตามจำนวนตัวอักษรในประโยค ตัวอักษรภาษาอังกฤษตัวใดที่ใช้พิกเซลมากที่สุดบนหน้าจอ
คำตอบ:
อืมมาดูกัน:
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
ชนะ W
แน่นอนว่านี่เป็นการทดลองเชิงประจบประแจง ไม่มีคำตอบเดียวสำหรับจดหมายที่กว้างที่สุด มันขึ้นอยู่กับตัวอักษร ดังนั้นคุณจะต้องทำการทดลองเชิงประจักษ์ที่คล้ายกันเพื่อหาคำตอบสำหรับสภาพแวดล้อมของคุณ แต่ความจริงก็คือฟอนต์ส่วนใหญ่ปฏิบัติตามอนุสัญญาเดียวกันและทุน W จะกว้างที่สุด
สรุปส่วนที่มีความกว้างอักขระในรูปแบบอัตราส่วน (W = 100) ที่นี่โดยใช้แบบอักษรตัวอย่างนี้:
https://gist.github.com/imaurer/d330e68e70180c985b380f25e195b90c
เพิ่มเติมจากคำตอบที่ใช้งานได้จริงของ Ned Batchelder เพราะฉันมาที่นี่ด้วยความสงสัยเกี่ยวกับตัวเลข:
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';
ทุน "M" นั้นกว้างที่สุดตามอัตภาพ
ฉันเชื่อว่าจดหมายW
นั้นกว้างที่สุด
ขึ้นอยู่กับแพลตฟอร์มของคุณอาจมีวิธี "getWidth" จากสตริงหรือฟังก์ชัน DrawText () ด้วยคุณสมบัติความกว้าง
ฉันจะทำ algortime ง่าย ๆ ที่ใช้ตัวอักษรที่ต้องการแล้ววิ่งผ่าน alfabet และเก็บไว้ใน config ขนาดเล็กหรือเพียงคำนวณมันในการเริ่มต้นเป็นห่วงจาก A ถึง Z ไม่ยาก
นอกจากนี้ยังขึ้นอยู่กับแบบอักษร ฉันทำสิ่งนี้เมื่อ 1 หรือ 2 ปีก่อนด้วยการประมวลผลและ Helvetica และเป็น ILJTYFVCPAXUZKHSEDORGNBQMW ตามลำดับของพิกเซลที่เพิ่มขึ้น แนวคิดคือการวาดข้อความบนผืนผ้าใบด้วยแบบอักษรที่คุณดูนับจำนวนพิกเซลจากนั้นเรียงลำดับด้วย HashMap หรือพจนานุกรม
แน่นอนว่าสิ่งนี้อาจไม่เกี่ยวข้องโดยตรงกับการใช้งานของคุณเนื่องจากจะคำนวณพื้นที่พิกเซลมากกว่าความกว้าง อาจจะเกินความจำเป็นเล็กน้อยเช่นกัน
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 Arial ใน Chrome - ชนะ W
วิธีแก้ปัญหาในการคำนวณความกว้างของแบบอักษรเช่นเดียวกับโซลูชันที่โพสต์โดย 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()
มันจะขึ้นอยู่กับตัวอักษร ฉันจะสร้างโปรแกรมขนาดเล็กในภาษาการเขียนโปรแกรมที่คุณรู้สึกสะดวกสบายที่สุดโดยที่คุณวาดตัวอักษรแต่ละตัวเป็นบิตแมปขนาดเท่าตัว เริ่มต้นแต่ละพิกเซลด้วยสีขาว จากนั้นนับจำนวนพิกเซลสีขาวหลังจากคุณวาดตัวอักษรแต่ละตัวแล้วบันทึกหมายเลขนั้น จำนวนสูงสุดที่คุณค้นหาคือหมายเลขที่คุณต้องการ
แก้ไข: หากคุณสนใจที่จะใช้สี่เหลี่ยมที่มีขนาดใหญ่ที่สุด (แต่ดูเหมือนว่าหลังจากนั้นไม่ใช่พิกเซล) คุณสามารถใช้การเรียก API ต่าง ๆ เพื่อหาขนาด แต่ขึ้นอยู่กับ ภาษาโปรแกรมของคุณ ตัวอย่างเช่นใน Java คุณจะใช้คลาส FontMetrics
ฉันรู้ว่าคำตอบที่ยอมรับได้คือ W, W สำหรับการชนะ
อย่างไรก็ตามในกรณีนี้ W ใช้สำหรับความกว้างด้วย กรณีศึกษาใช้การทดสอบความกว้างอย่างง่ายเพื่อตรวจสอบพิกเซล แต่เป็นเพียงความกว้างไม่ใช่จำนวนพิกเซลทั้งหมด เป็นตัวอย่างที่เคาน์เตอร์ง่ายคำตอบที่ยอมรับถือว่า O และ Q ใช้จำนวนพิกเซลเท่ากัน แต่ก็ใช้พื้นที่ในปริมาณเท่ากันเท่านั้น
ดังนั้น W จะขึ้นมากที่สุดในพื้นที่ แต่มันคือจำนวนพิกเซลทั้งหมดที่มันแตกหรือเปล่า
มารับข้อมูลเชิงประจักษ์กัน ฉันสร้างภาพ imgur จาก 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>
ต้องการทราบสัญลักษณ์ที่ยาวที่สุดจริงๆ ไม่ใช่แค่เดาใช่ไหม
และฉันไม่เพียง แต่พูดถึงตัวอักษรตัวเลขและสัญลักษณ์ทั่วไป (!, @ และอื่น ๆ ) ฉันหมายถึง glyph ที่ยาวที่สุดใน 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! โปรดทราบว่าในฟอนต์บางตัวอักษรที่ยาวที่สุดคือ﷽ แต่ฟอนต์อื่น ๆ (โดยเฉพาะอย่างยิ่ง monospace) จะทับซ้อนอักขระเช่นเดียวกับฟอนต์ที่โปรแกรมใช้บัญชีโปรแกรม
มันขึ้นอยู่กับตัวอักษร ตัวอย่างเช่นการข้ามศูนย์นั้นใช้เวลามากกว่าศูนย์ปกติ
แต่ถ้ามีใครเดาได้ฉันจะไปกับ X หรือ B