Huruf alfabet Inggris mana yang paling banyak mengandung piksel?


181

Saya mencoba melakukan beberapa pemrograman dinamis berdasarkan jumlah karakter dalam sebuah kalimat. Huruf alfabet Inggris manakah yang paling banyak menghasilkan piksel pada layar?


16
kebanyakan piksel? Terluas? Tertinggi? Font yang mana? Bisakah Anda menentukan?
Gregor Brandt

6
Bukankah itu tergantung pada font yang digunakan?
Roberto Aloi

Font yang mana? Huruf kecil, atas?
Rocket Ronnie

6
Ini benar-benar tergantung pada font karena Anda meminta yang "memakan banyak piksel".
Gurzo

6
Kearifan penyusunan huruf tradisional adalah M atau W untuk huruf besar dan m untuk huruf kecil. Tergantung font, tetapi ini bisa diterima di sebagian besar kasus.
tripleee

Jawaban:


726

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


157
Dalam monospace, semua orang menang
Colin Hebert

2
Menariknya, dalam 'Arial Black' di MacBook saya di Chrome, huruf kecil m adalah yang terluas, dengan selisih kecil.
Earl Jenkins

15
Bagaimana dengan ini ........................................ WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW @@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ %%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%% %% .......................... ......................................... jadi saya pikir @ menang !!
John Henckel

19
Jadi W sebenarnya bukan M. terbalik. Saya salah selama ini!
Ulysses Alves

3
Suara positif hanya karena kedahsyatan jawaban ini!
Tanckom

122

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


7
Saya meragukan info ini, berpikir '1' pasti akan lebih sempit daripada angka lainnya. Namun dalam font yang saya periksa, semua digit memiliki lebar yang sama. Saya kira itu pilihan desain font.
jfritz42

6
Setidaknya bagi saya (melihat posting ini di Firefox di Ubuntu), 1 lebih sempit dari yang lain, dan yang lainnya sama lebarnya.
MestreLion

@MestreLion: Font apa yang Anda gunakan? Wajah, ukuran, dan pengubah apa pun, seperti huruf tebal atau miring.
Earl Jenkins

2
@LukeTaylor - Kenapa begitu! font-family: Arial, 'Helvetica Neue', Helvetica, sans-serif; font-size: 15px; Oh, Apple itu, selalu berusaha menjadi sedikit berbeda ....
Earl Jenkins

1
Ini sebenarnya tergantung pada 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.
Matthew Willcockson

21

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';


Baik "M" dan "W" memiliki jumlah piksel yang sama. Karena sebagian besar jawaban mengatakan "W" lebih baik menunjukkan M dan W sama dan menang. By the way jawaban yang sangat bagus.
Talespin_Kit


14

Saya percaya surat itu Wadalah yang terluas.


5

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.


5

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;
}


3

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:

  • Untuk Helvetica, tiga huruf teratas adalah: M (2493 piksel), W (2414) dan B (1909).
  • Untuk satu set font yang dikirimkan bersama Mac-nya, hasilnya kurang lebih sama: M (2217.51 ​​± 945.19), W (2139.06 ± 945.29) dan B (1841.38 ± 685.26).

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()

1

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.


1

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>


1

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.


-1

Itu tergantung pada font. Menyilang nol misalnya membutuhkan lebih dari satu yang biasa.

Tetapi jika seseorang bisa menebak, saya akan pergi dengan X atau B.


Ini tidak menjawab pertanyaan. Itu hanya memberi beberapa tebakan. Jawabannya, omong-omong, itu ௌ.
Anonim
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.