¿Qué letra del alfabeto inglés ocupa la mayoría de los píxeles?

181

Estoy tratando de hacer una programación dinámica basada en el número de caracteres en una oración. ¿Qué letra del alfabeto inglés ocupa la mayor cantidad de píxeles en la pantalla?

keruilin
fuente
16
la mayoría de los píxeles sobre todos? Más ancho? Más alto? Cual fuente? Se puede especificar?
Gregor Brandt
66
¿Eso no depende de la fuente utilizada?
Roberto Aloi
Cual fuente? Minúscula, superior?
Rocket Ronnie
66
Realmente depende de la fuente, ya que está solicitando la que "ocupa la mayor cantidad de píxeles".
Gurzo
66
La sabiduría tipográfica tradicional es M o W para mayúsculas ym para minúsculas. Depende de la fuente, pero esto funciona aceptablemente en la mayoría de los casos.
tripleee

Respuestas:

726

Hmm, veamos:

aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb

cccccccccccccccccccccccccccccccccccccccc

dddddddddddddddddddddddddddddddddddddddd

eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee

ffffffffffffffffffffffffffffffffffffffff

gggggggggggggggggggggggggggggggggggggggg

hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh

iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii

jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj

kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk

llllllllllllllllllllllllllllllllllllllll

mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm

nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn

oooooooooooooooooooooooooooooooooooooooo

pppppppppppppppppppppppppppppppppppppppp

qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq

rrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr

ssssssssssssssssssssssssssssssssssssssss

tttttttttttttttttttttttttttttttttttttttt

uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu

vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv

wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww

xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz

AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA

BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB

CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC

DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD

EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE

FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF

GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG

HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH

IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII

JJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ

KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK

LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL

MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM

NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN

OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO

PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP

QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ

RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR

SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS

TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT

UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU

VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV

WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

W gana.

Por supuesto, este es un experimento empírico tonto. No hay una respuesta única a qué letra es más ancha. Depende de la fuente. Entonces tendrá que hacer un experimento empírico similar para encontrar la respuesta para su entorno. Pero el hecho es que la mayoría de las fuentes siguen las mismas convenciones, y la W mayúscula será la más amplia.

Gist con estos anchos de caracteres en forma de relación (W = 100) capturado aquí usando esta fuente de ejemplo particular:

https://gist.github.com/imaurer/d330e68e70180c985b380f25e195b90c

Ned Batchelder
fuente
157
En el monoespacio, todos ganan
Colin Hebert
2
Curiosamente, en 'Arial Black' en mi MacBook en Chrome, m minúscula es la más ancha, por un pequeño margen.
Earl Jenkins
15
¿Qué tal esto ........................................ WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW @@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ %%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%% .......................... ......................................... así que creo que el @ gana !!
John Henckel
19
Así que W es, en realidad , no un revés M. me he equivocado todos estos años!
Ulises Alves
3
¡Vota simplemente por la genialidad de esta respuesta!
Tanckom
122

Además de la respuesta increíblemente práctica de Ned Batchelder, porque vine aquí preguntándome acerca de los dígitos:

0000000000000000000000000000000000000000

1111111111111111111111111111111111111111

2222222222222222222222222222222222222222

3333333333333333333333333333333333333333

4444444444444444444444444444444444444444

5555555555555555555555555555555555555555

6666666666666666666666666666666666666666

7777777777777777777777777777777777777777

8888888888888888888888888888888888888888

9999999999999999999999999999999999999999

Earl Jenkins
fuente
77
Dudaba esta información, pensando que un '1' seguramente sería más estrecho que otros dígitos. Pero en las fuentes que he verificado, todos los dígitos tienen el mismo ancho. Supongo que es una elección de diseño de fuente.
jfritz42
66
Al menos para mí (viendo esta publicación en Firefox en Ubuntu), 1 es más estrecho que otros, y otros son todos del mismo ancho.
MestreLion
@MestreLion: ¿Qué fuente estás usando? Cara, tamaño y cualquier modificador, como negrita o cursiva.
Earl Jenkins
2
@LukeTaylor - ¡Por qué es así! font-family: Arial, 'Helvetica Neue', Helvetica, sans-serif; font-size: 15px; Oh, esa Apple, siempre tratando de ser un poco diferente ...
Earl Jenkins
1
Esto realmente depende de font-variant-numeric: los números proporcionales permiten diferentes anchos, tanto en el glifo como en el espaciado, mientras que los números tabulares deben seguir reglas similares a las fuentes monoespaciadas.
Matthew Willcockson el
21

¿Qué tal una solución programática?

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

NK
fuente
Tanto "M" como "W" tienen el mismo número de píxeles. Como la mayoría de las respuestas dicen "W", es mejor mostrar que M y W son iguales y ganaron. Por cierto muy buena respuesta.
Talespin_Kit
14

Creo que la carta Wes la más amplia.

Tudor
fuente
5

Dependiendo de su plataforma, puede haber una forma de "getWidth" de una cadena o función DrawText () de alguna manera con una propiedad de ancho.

Haría un algoritmo simple que utilizara la fuente necesaria y luego corriera a través del alfabet y lo almacenara en una configuración pequeña o simplemente lo calculara en la inicialización como un ciclo de A a Z no es tan difícil.

BerggreenDK
fuente
5

También depende de la fuente. Lo hice hace 1 o 2 años con Processing y Helvetica y es ILJTYFVCPAXUZKHSEDORGNBQMW en orden de píxeles en aumento. La idea es dibujar el texto en un lienzo con la fuente que está mirando, contar los píxeles y luego ordenarlos con un HashMap o un Diccionario.

Por supuesto, esto podría no estar directamente relacionado con su uso, ya que calcula el área de píxeles en lugar del ancho. Podría ser un poco exagerado también.

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;
}
Kwok Pan Fung
fuente
5

Arial 30px en Chrome - W gana .

Šime Vidas
fuente
3

Alex Michael publicó en su blog una solución para calcular el ancho de las fuentes un poco como la solución publicada por xxx en su blog (que curiosamente me vinculó aquí).

Resumen:

  • Para Helvetica, las tres primeras letras son: M (2493 píxeles), W (2414) y B (1909).
  • Para un conjunto de fuentes que se entregó con su Mac, los resultados son más o menos los mismos: M (2217.51 ​​± 945.19), W (2139.06 ± 945.29) y B (1841.38 ± 685.26).

Publicación original: http://alexmic.net/letter-pixel-count/

Código:

# -*- 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()
javatarz
fuente
1

Dependerá de la fuente. Crearía un pequeño programa en un lenguaje de programación con el que se sienta más cómodo, donde dibuje cada letra del alfabeto en un mapa de bits de tamaño m. Inicialice cada píxel con blanco. Luego cuente el número de píxeles blancos después de haber dibujado cada letra y guarde ese número. El número más alto que encuentre es el que está buscando.

EDITAR: si de hecho solo está interesado en cuál ocupa el rectángulo más grande (pero parece que realmente está después de eso, no los píxeles), puede usar varias llamadas API para encontrar el tamaño, pero eso depende de tu lenguaje de programación En Java, por ejemplo, usaría la clase FontMetrics.

steinar
fuente
1

Sé que la respuesta aceptada aquí es W, W es para WIN.

Sin embargo, en este caso, W también es para Ancho. El estudio de caso utilizado empleó una prueba de ancho simple para examinar los píxeles, pero fue solo el ancho, no el recuento total de píxeles. Como ejemplo de contador fácil, la respuesta aceptada supone que O y Q ocupan la misma cantidad de píxeles, pero solo ocupan la misma cantidad de espacio.

Por lo tanto, W ocupa la mayor parte del espacio . Pero, ¿son todos los píxeles que parece ser?

Obtengamos algunos datos empíricos. Creé imágenes imgur de los siguientes B, M y W. Luego analicé su recuento de píxeles (ver más abajo), aquí están los resultados:

B: 114 píxeles

M: 150 píxeles

W: 157 píxeles

Así es como los introduje en el lienzo y analicé los datos de píxeles sin procesar de las imágenes.

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>

Travis J
fuente
1

¿Quieres saber el glifo más largo real , no solo adivinar?
Y no solo estoy hablando de letras, dígitos y símbolos comunes (!, @, Etc.). Me refiero al glifo más largo de todos los 32.834 caracteres de UTF-16.
Así que comencé con la respuesta de @NK que tenía una solución programática e hice algunas modificaciones leves :

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

Después de ejecutar esto y esperar (y esperar), da la salida ௌ won.
Y ahí lo tienes, ¡el personaje más largo de UTF-32! Tenga en cuenta que en algunas fuentes el glifo más largo es ﷽, pero las otras fuentes (especialmente las monoespaciales) se superponen a los caracteres, al igual que con la fuente que el programa tiene en cuenta.

Anónimo
fuente
-1

Depende de la fuente. El cero cruzado, por ejemplo, ocupa mucho más que uno normal.

Pero si uno pudiera adivinar, iría con X o B.

Torre
fuente
Esto no responde la pregunta. Solo da un par de conjeturas. La respuesta, por cierto, es ௌ.
Anónimo