Какая буква английского алфавита занимает больше всего пикселей? - PullRequest
164 голосов
/ 16 октября 2010

Я пытаюсь выполнить динамическое программирование, основанное на количестве символов в предложении. Какая буква английского алфавита занимает больше всего пикселей на экране?

Ответы [ 12 ]

666 голосов
/ 16 октября 2010

Хм, давайте посмотрим:

1002 * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa 1004 * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb 1006 * cccccccccccccccccccccccccccccccccccccccc 1008 * dddddddddddddddddddddddddddddddddddddddd 1010 * eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee 1012 * ffffffffffffffffffffffffffffffffffffffff

gggggggggggggggggggggggggggggggggggggggg

1 016 * hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh

iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii

jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj * тысяча двадцать-один * * тысяча двадцать два * kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk

llllllllllllllllllllllllllllllllllllllll * тысяча двадцать-пять * * 1 026 * mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm

1028 * nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn 1030 * oooooooooooooooooooooooooooooooooooooooo 1032 * pppppppppppppppppppppppppppppppppppppppp 1034 * qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq 1036 * rrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr * Тысяча тридцать-восемь * ssssssssssssssssssssssssssssssssssssssss

tttttttttttttttttttttttttttttttttttttttt

* +1042 * uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu

vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv

* тысяча сорок шесть * wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww * тысячи сорок-восемь * xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx * тысяча сорок-девять *

yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy

zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz

1054 * AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 1056 * BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB 1058 * CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC 1060 * DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD 1062 * EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE 1064 * FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 1066* GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG 1068 * HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH 1070 * IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII 1072 * JJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ 1074 * KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK

LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL

* тысяча семьдесят-восемь * MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM * тысяча семьдесят девять *

NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN * тысяча восемьдесят-один * * тысяча восемьдесят-дв * OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO

1 084 * PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP * тысяча восемьдесят-пять * * тысяча восемьдесят шесть * QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ * +1087 *

RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR

SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS * тысяче девяносто-один *

TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT * +1093 *

UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU * +1095 * * +1096 * VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV * +1097 *

WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW * +1099 *

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY

ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

W побед.

Конечно, это глупый эмпирический эксперимент.Нет единого ответа, какое письмо является самым широким.Это зависит от шрифта.Таким образом, вам придется провести аналогичный эмпирический эксперимент, чтобы выяснить ответ для вашей среды.Но дело в том, что большинство шрифтов придерживаются одних и тех же соглашений, и заглавная буква W будет самой широкой.

103 голосов
/ 15 февраля 2012

В дополнение к удивительно практичному ответу Неда Батчелдера, потому что я пришел сюда с вопросом о цифрах:

0000000000000000000000000000000000000000

1111111111111111111111111111111111111111

2222222222222222222222222222222222222222

3333333333333333333333333333333333333333

4444444444444444444444444444444444444444

5555555555555555555555555555555555555555

6666666666666666666666666666666666666666

7777777777777777777777777777777777777777

8888888888888888888888888888888888888888

9999999999999999999999999999999999999999

18 голосов
/ 26 ноября 2015

Как насчет программного решения?

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';
14 голосов
/ 16 октября 2010

Я считаю, что буква W самая широкая.

12 голосов
/ 16 октября 2010

Капитал "М" условно самый широкий.

5 голосов
/ 08 ноября 2012

Это также зависит от шрифта.Я сделал это 1 или 2 года назад с Processing и Helvetica, и это ILJTYFVCPAXUZKHSEDORGNBQMW в порядке увеличения пикселей.Идея состоит в том, чтобы нарисовать текст на холсте шрифтом, который вы просматриваете, сосчитать пиксели, а затем отсортировать с помощью HashMap или Dictionary.

Конечно, это может не иметь прямого отношения к вашему использованию, так каквычисляет площадь пикселя, а не только ширину.Может быть, немного излишним.

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;
}
5 голосов
/ 16 октября 2010

В зависимости от вашей платформы, может быть способ "getWidth" из строки или функции DrawText () с помощью свойства width.

Я бы сделал простой алгоритм, который использовал необходимый шрифт, а затем пробежал по алфавиту и сохранил его в небольшом конфиге или просто рассчитал его при инициализации, поскольку цикл от А до Я не так уж сложен.

5 голосов
/ 16 октября 2010

Arial 30px в Chrome - W выигрывает .

3 голосов
/ 08 июля 2014

Решение для расчета ширины шрифтов, похожее на решение, опубликованное xxx, было размещено Алексом Майклом в его блоге (который, как ни странно, связал меня здесь).

Резюме:

  • Для Helvetica верхние три буквы: M (2493 пикселя), W (2414) и B (1909).
  • Для набора шрифтов, поставляемых с его Macрезультаты более или менее одинаковы: M (2217,51 ± 945,19), W (2139,06 945,29) и B (1841,38 ± 685,26).

Исходное сообщение: 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()
1 голос
/ 17 ноября 2017

Я знаю, что принятый ответ здесь - W, W - для WIN.

Однако, в этом случае, W также для Width.В данном примере использовался простой тест ширины для проверки пикселей, но это была только ширина, а не общее количество пикселей.В качестве простого встречного примера принятый ответ предполагает, что 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>
...