Saya mencoba melakukan beberapa pemrograman dinamis berdasarkan jumlah karakter dalam sebuah kalimat. Huruf alfabet Inggris manakah yang paling banyak menghasilkan piksel pada layar?
Saya mencoba melakukan beberapa pemrograman dinamis berdasarkan jumlah karakter dalam sebuah kalimat. Huruf alfabet Inggris manakah yang paling banyak menghasilkan piksel pada layar?
Jawaban:
Hmm, mari kita lihat:
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
cccccccccccccccccccccccccccccccccccccccc
ddddddddddddddddddddddddddddddddddddddd
eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee
ffffffffffffffffffffffffffffffffffff
gggggggggggggggggggggggggg
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii
jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj
kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk
lllllllllllllllllllllllllllllllllllllll
mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm
nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn
oooooooooooooooooooooooooooooooooooooooo
ppppppppppppppppppppppppppppppppppppppp
qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq
rrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr
ssssssssssssssssssssssssssssssssssssssss
tttttttttttttttttttttttttttttttttttttt
uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy
zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD
EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG
HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH
IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII
JJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ
KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK
LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL
MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ
RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR
SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS
TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT
UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU
Vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY
ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
W menang.
Tentu saja, ini adalah eksperimen empiris yang konyol. Tidak ada jawaban tunggal untuk surat mana yang terlebar. Itu tergantung pada font. Jadi, Anda harus melakukan percobaan empiris yang serupa untuk mencari tahu jawaban bagi lingkungan Anda. Tetapi faktanya, sebagian besar font mengikuti konvensi yang sama, dan huruf kapital W akan menjadi yang terluas.
Inti dengan lebar karakter ini dalam bentuk rasio (W = 100) ditangkap di sini menggunakan font contoh khusus ini:
https://gist.github.com/imaurer/d330e68e70180c985b380f25e195b90c
Lebih jauh ke jawaban Ned Batchelder yang praktis dan praktis, karena saya datang ke sini bertanya-tanya tentang angka:
000000000000000000000000000000000000000000
1111111111111111111111111111111111111111
2222222222222222222222222222222222222222
33333333333333333333333333333333333333
4444444444444444444444444444444444444444
5555555555555555555555555555555555555555
6666666666666666666666666666666666666666666666666666666666
77777777777777777777777777777777777777777777
888888888888888888888888888888888888888888
9999999999999999999999999999999999999999
font-family: Arial, 'Helvetica Neue', Helvetica, sans-serif;
font-size: 15px;
Oh, Apple itu, selalu berusaha menjadi sedikit berbeda ....
font-variant-numeric
: angka proporsional memungkinkan lebar yang berbeda, baik dalam mesin terbang dan spasi, sedangkan angka tabular harus mengikuti aturan yang sama dengan font monospace.
Bagaimana dengan solusi terprogram?
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';
Modal "M" secara konvensional adalah yang terluas.
Bergantung pada platform Anda, mungkin ada cara untuk "getWidth" dari fungsi string atau DrawText () dengan properti width.
Saya akan membuat algortime sederhana yang menggunakan font yang dibutuhkan dan kemudian berlari melalui alfabet dan menyimpannya dalam konfigurasi kecil atau hanya menghitungnya pada inisialisasi sebagai loop dari A ke Z bukankah itu sulit.
Itu juga tergantung pada font. Saya melakukan ini 1 atau 2 tahun yang lalu dengan Memproses dan Helvetica dan itu adalah ILJTYFVCPAXUZKHSEDORGNBQMW dalam urutan peningkatan piksel. Idenya adalah untuk menggambar teks pada kanvas dengan font yang Anda lihat, menghitung piksel, lalu mengurutkan dengan HashMap atau Kamus.
Tentu saja, ini mungkin tidak secara langsung relevan dengan penggunaan Anda karena ini menghitung area piksel daripada hanya lebar. Mungkin sedikit berlebihan juga.
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 di Chrome - W menang .
Solusi untuk menghitung lebar font sedikit seperti solusi yang diposting oleh xxx diposting oleh Alex Michael di blog-nya (yang lucu menghubungkan saya di sini).
Ringkasan:
Posting Asli: http://alexmic.net/letter-pixel-count/
Kode:
# -*- 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()
Itu akan tergantung pada font. Saya akan membuat program kecil dalam bahasa pemrograman yang paling nyaman bagi Anda, di mana Anda menggambar setiap huruf alfabet ke dalam bitmap berukuran m kali. Inisialisasi setiap piksel dengan warna putih. Kemudian hitung jumlah piksel putih setelah Anda menggambar setiap huruf dan simpan nomor itu. Angka tertinggi yang Anda temukan adalah yang Anda cari.
EDIT: Jika Anda sebenarnya hanya tertarik pada mana yang mengambil persegi panjang terbesar (tapi sepertinya Anda benar-benar setelah itu, bukan piksel), Anda dapat menggunakan berbagai panggilan API untuk menemukan ukuran, tetapi itu tergantung pada bahasa pemrograman Anda. Di Java, misalnya, Anda akan menggunakan kelas FontMetrics.
Saya tahu jawaban yang diterima di sini adalah W, W adalah untuk MENANG.
Namun, dalam hal ini, W juga untuk Lebar. Studi kasus yang digunakan menggunakan uji lebar sederhana untuk memeriksa piksel, tetapi hanya lebar, bukan jumlah piksel total. Sebagai contoh penghitung yang mudah, jawaban yang diterima mengasumsikan bahwa O dan Q mengambil jumlah piksel yang sama, namun mereka hanya mengambil jumlah ruang yang sama.
Dengan demikian, W memakan banyak ruang . Tapi, apakah semua piksel itu sudah retak?
Mari kita dapatkan beberapa data empiris. Saya membuat gambar imgur dari B, M, dan W. berikut. Saya kemudian menganalisis jumlah pikselnya (lihat di bawah), berikut hasilnya:
B: 114 piksel
M: 150 piksel
W: 157 piksel
Inilah cara saya memasukkan mereka ke dalam kanvas dan menganalisis data piksel mentah dari gambar.
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>
Ingin tahu mesin terbang terpanjang nyata , bukan hanya menebak?
Dan saya tidak hanya berbicara tentang huruf, angka, dan simbol umum (!, @ Dan sebagainya). Maksudku mesin terbang terpanjang di semua 32.834 karakter UTF-16.
Jadi saya mulai dengan jawaban oleh @NK yang memiliki solusi terprogram untuk itu, dan membuat sedikit modifikasi untuk itu:
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';
Setelah menjalankan ini dan menunggu (dan menunggu), ia memberikan output ௌ won
.
Dan begitulah, karakter terpanjang di UTF-32! Perhatikan bahwa pada beberapa font mesin terbang terpanjang adalah ﷽, tetapi font lain (terutama yang monospace) tumpang tindih karakter, seperti font yang programnya ambil akun program.