ほとんどのピクセルを占める英語のアルファベットの文字はどれですか?


181

文の文字数に基づいて動的プログラミングを実行しようとしています。画面で最も多くのピクセルを占める英語のアルファベットの文字はどれですか。


16
ほとんどすべてのピクセル?一番広い?一番高い?どのフォント?指定できますか?
グレゴールブラント

6
使用するフォントに依存しませんか?
Roberto Aloi

どのフォント?小文字、大文字?
ロケットロニー

6
あなたが「最も多くのピクセルを占める」ものを求めているので、それは本当にフォントに依存します。
Gurzo

6
従来の組版の知識は、大文字の場合はMまたはW、小文字の場合はmです。フォントに依存しますが、これはほとんどの場合問題なく動作します。
tripleee

回答:


726

うーん、見てみましょう:

aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb

cccccccccccccccccccccccccccccccccccccccc

dddddddddddddddddddddddddddddddddddddddd

eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee

ffffffffffffffffffffffffffffffffffffffff

gggggggggggggggggggggggggggggggggggggggg

hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh

iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii

jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj

kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk

llllllllllllllllllllllllllllllllllllllllll

mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm

nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn

oooooooooooooooooooooooooooooooooooooooo

pppppppppppppppppppppppppppppppppppppppppp

qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq

rrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr

sssssssssssssssssssssssssssssssssssssssss

tttttttttttttttttttttttttttttttttttttttt

uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu

vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv

wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww

xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy

zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz

AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA

BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB

CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC

DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD

EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE

FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF

GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG

HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH

IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII

JJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ

KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK

LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL

MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM

NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN

OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO

PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP

QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ

RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR

SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS

TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT

UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU

VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV

WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY

ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

Wが勝つ。

もちろん、これはばかげた経験的な実験です。どの文字が最も幅が広いかに対する単一の答えはありません。フォントによって異なります。したがって、環境に対する答えを理解するには、同様の経験的実験を行う必要があります。しかし、実際には、ほとんどのフォントは同じ規則に従っており、大文字のWが最も広くなります。

これらの文字幅を比率形式(W = 100)で示す要点は、この特定のサンプルフォントを使用してここでキャプチャされます。

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


157
モノスペースでは、誰もが勝つ
Colin Hebert

2
興味深いことに、ChromeのMacBookの「Arial Black」では、小文字のmが最も広く、わずかにマージンがあります。
アールジェンキンス

15
これはどうですか........................................ WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW @ W @ W @ W @ @@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ %%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%% .......................... ......................................... @が勝つと思います!!
John Henckel

19
したがって、Wは実際に Mを逆さまにしたものではありません
ユリシーズアルベス

3
この回答の素晴らしさだけで賛成投票してください!
タンコム

122

数字について疑問に思ってここに来たので、Ned Batchelderの驚くほど実用的な答えに加えて:

0000000000000000000000000000000000000000

1111111111111111111111111111111111111111

2222222222222222222222222222222222222222

3333333333333333333333333333333333333333

4444444444444444444444444444444444444444

5555555555555555555555555555555555555555

6666666666666666666666666666666666666666

7777777777777777777777777777777777777777

8888888888888888888888888888888888888888

9999999999999999999999999999999999999999


7
私はこの情報を疑って、「1」は確かに他の数字よりも狭いと思いました。しかし、私がチェックしたフォントでは、すべての桁が同じ幅です。それはフォントデザインの選択だと思います。
jfritz42 2012年

6
少なくとも私にとっては(UbuntuのFirefoxでこの投稿を表示)、1は他よりも幅が狭く、他はすべて同じ幅です。
MestreLion 2013

@MestreLion:どのフォントを使用していますか?顔、サイズ、および太字や斜体などの修飾子。
Earl Jenkins

2
@LukeTaylor-なぜそうなのか! font-family: Arial, 'Helvetica Neue', Helvetica, sans-serif; font-size: 15px; ああ、あのAppleはいつも少しずつ違うようにしようとしている...
Earl Jenkins

1
これは実際に依存しfont-variant-numericます。プロポーショナル数字はグリフとスペーシングの両方で異なる幅を許可しますが、表形式の数字は等幅フォントと同様の規則に従う必要があります。
マシューウィルコックソン

21

プログラム的なソリューションはどうですか?

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」は同じピクセル数です。ほとんどの答えは「W」と言うので、MとWが同じであり、勝つことを示す方が良いです。ちなみにとてもいい答えです。
Talespin_Kit



5

プラットフォームによっては、文字列またはDrawText()関数から、幅プロパティを使用して何らかの方法で「getWidth」を行う方法がある場合があります。

必要なフォントを利用し、alfabetを実行して小さな構成に保存するか、初期化時にAからZへのループがそれほど難しくないように計算する単純なアルゴリズムを作成します。


5

フォントにも依存します。私はこれを1、2年前にProcessingと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;
}


3

xxxによって投稿されたソリューションのようにフォントの幅を計算するためのソリューションは、Alex Michaelによって彼のブログに投稿されました(おもしろいことに私をここにリンクしました)。

概要:

  • Helveticaの場合、上位3文字は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

フォントによって異なります。私はあなたが最も使いやすいプログラミング言語で小さなプログラムを作成し、アルファベットの各文字をm倍のサイズのビットマップに描画します。各ピクセルを白で初期化します。次に、各文字を描いた後に白いピクセルの数を数え、その数を保存します。あなたが見つける最も高い数はあなたが探しているものです。

編集:実際にどれが最大の長方形を占めるかだけに興味がある場合(ただし、実際にはピクセルではなく、その後にあるように見えます)、さまざまなAPI呼び出しを使用してサイズを見つけることができますが、それはプログラミング言語。たとえばJavaでは、FontMetricsクラスを使用します。


1

ここで受け入れられた答えはWですが、WはWINです。

ただし、この場合、Wは幅も表します。使用したケーススタディでは、単純な幅テストを使用してピクセルを調べましたが、これは幅のみであり、合計ピクセル数ではありません。簡単な反例として、受け入れられた答えは、OとQが同じ量のピクセルを占めるが、それらは同じ量のスペースしか占めないと仮定しています。

したがって、Wが最も多くのスペースを占めます。しかし、それはすべてのピクセルに分解されているのでしょうか?

いくつかの経験的データを取得しましょう。次の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>


1

推測するだけでなく、実際に最も長いグリフを知りたいですか?
また、文字、数字、一般的な記号(!、@など)だけを話しているのではありません。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で最も長い文字です!一部のフォントでは最長のグリフがisですが、他のフォント(特に等幅フォント)は、プログラムがプログラムで使用するフォントと同様に、文字と重なります。


-1

フォントによって異なります。たとえば、ゼロをクロスすると、通常のゼロよりかなり多くかかります。

しかし、推測が許せば、XまたはBを使用します。


これは質問の答えにはなりません。それはカップルの推測を与えるだけです。答えは、ちなみにitです。
匿名
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.