Zeichen nach Dunkelheit sortieren

38

Ihr Programm muss als Eingabe eine Zeichenzeile wie folgt verwenden:

@+.0

Und geben Sie die Zeichen sortiert nach ihrer Dunkelheit wie folgt aus:

.+0@

Bedarf:

  • Sie müssen für die Dunkelheitserkennung eine Schriftart mit einem Leerzeichen verwenden.

  • Sie müssen herausfinden, wie viele Pixel jedes Zeichen einnimmt. Sie müssen das Zeichen tatsächlich zeichnen und die Pixel zählen, dh Sie können nicht nur Pixelmengen fest codieren.

    • Als konkretere Regel: Wenn Sie die Schriftarten gewechselt haben, sollte Ihr Programm weiterhin funktionieren. Darüber hinaus sollte Ihr Programm in der Lage sein, Schriftarten zu wechseln, indem Sie einfach eine Variable, einen Wert oder eine Zeichenfolge im Code ändern.
  • Wenn Sie Antialiasing verwenden, müssen Sie Pixel als Prozentsätze eines vollständig schwarzen Pixels zählen. Beispielsweise zählt ein rgb(32, 32, 32)Pixel als 1/8 eines vollen Pixels. Ignorieren Sie diese Regel, wenn Ihre Charaktere nicht voreingenommen sind.

  • Nach dem Zählen der Pixel müssen Sie die Zeichen nach der Anzahl der Pixel sortieren und in der angegebenen Reihenfolge ausgeben.

  • Das ist , also gewinnt der kürzeste Code in Bytes.

Türknauf
quelle
7
Seltsamerweise ist dies auch für RPG.se geeignet!
CorsiKa
1
Was, keine Korrektur für Display-Gamma in der Dunkelberechnung?
Ilmari Karonen
6
Können wir eine weiße Schrift verwenden? Wenn ja, denke ich, habe ich diese eingepackt.
Paul

Antworten:

22

Mathematica, 112 110 108 Bytes

Dies kann wahrscheinlich noch weiter golfen werden. Angenommen, die Zeichenfolge befindet sich in der Variablen s.

Und verwendet jetzt eine korrekte Syntax, um eine Liste nach einer anderen Liste zu sortieren.
Glückliche Testfälle -> "Oh ja, das funktioniert" -> Facepalm
Danke für die scharfen Augen, David Carraher.

Update: OCR A wurde durch Menlo ersetzt, da mir auf OSX klar wurde, dass der Name der OCR A-Schriftfamilie tatsächlich OCR A Std ist. Also sortierte ich eine Standardschriftart anstatt der eigentlichen. Menlo ist mit der gleichen Byteanzahl auch monospaced, also kein Nettogewinn oder -verlust.

Ich habe einen gehosteten CDF-Export des Notebooks eingerichtet , damit Sie den Code bei Bedarf in Aktion sehen können. Ich überlege noch, wie ich web-gehosteten CDFs etwas Interaktivität hinzufügen kann, es ist also vorerst nur statisch.

c=Characters@s;Last/@Sort[Transpose@{Total[1-#&/@ImageData@Rasterize@Style[#,FontFamily->"Menlo"],3]&/@c,c}]

Ausgabe für s = FromCharacterCode /@ Range[33, 135];mit "Courier"

Bildbeschreibung hier eingeben

Ausgabe für dasselbe, aber mit FontFamily "Monospace":

Bildbeschreibung hier eingeben

Beachten Sie, dass die Endergebnisse in der internen Schriftart von MM und nicht in der zu sortierenden Schriftart angezeigt werden. Daher sehen Sie die Unterschiede in der ausgewählten Schriftart, die sich in der Sortierung widerspiegeln. Der CDF-Link zeigt jedoch beides für die Vervollständiger.

Ungolfed-Code:

s = FromCharacterCode /@ Range[33, 135];
c = Characters@s;
Last /@ Sort[
    Transpose@{Total[1 - # & /@ 
        ImageData@Rasterize@Style[#, FontFamily -> "Menlo"], 3] & /@ c, c}]
Jonathan Van Matre
quelle
1
Auf diese Eingabe prüfen:"" <> (FromCharacterCode /@ Range[33, 135])
DavidC
Standardfamilie oder nicht, die erforderlichen Spezifikationen "Ihr Programm sollte in der Lage sein, Zeichensätze durch einfaches Ändern einer Variablen zu wechseln". Aufgrund der Anti-Aliasing-Werte kann es vorkommen, dass einige Sortierungen falsch aussehen, aber ich werde den gesamten Bereich erneut prüfen und feststellen, ob etwas nicht stimmt.
Jonathan Van Matre
1
Was für eine tolle Sprache! Ich habe mich neulich über die neue Programmiersprache von Wolfram informiert und freue mich darauf.
07.03.14
1
Sie können zwei Bytes speichern, indem Sie Characters [] in Characters @ und Reverse [] in Reverse @ ändern.
Michael Stern
2
Ich möchte keine ähnliche Antwort posten, aber ich habe es selbst versucht und es wurde kürzerStringJoin@SortBy[Characters@"@+.0",ImageData@Binarize@Rasterize@Style[#,FontFamily->"Monospace"]~Total~2&]
swish
25

Bash + ImageMagick: 164 147 148 Zeichen

while read -n1 c
do
o=`convert -size 20x15 xc: +antialias -font cour.ttf -draw "text 0,10 '$c'" xpm:-`
o=${o//[^ ]}
a[${#o}]+=$c
done
echo "${a[@]}"

Probelauf:

bash-4.1$ echo -n '@+.0' | bash graysort.sh
. + 0 @

Trennzeichen werden zwischen Graugruppen eingefügt. Zeichen mit identischer Graustufe werden nicht getrennt:

bash-4.1$ echo -n 'abcdefghijklmnopqrstuvwxyz' | bash graysort.sh
i cl jortz esv ax u df bgnpq y hk w m
Mann bei der Arbeit
quelle
+1 für die Sortierung mit Bash-Array-Indizes anstelle vonsort
Digital Trauma
9

QBasic, 259 Bytes

SCREEN 1
DIM a(255)
FOR i = 32 TO 255
    CLS
    PRINT CHR$(i);
    FOR p = 0 TO 64
        a(i) = a(i) + POINT(p MOD 8, p \ 8)
    NEXT p
NEXT i
FOR p = 0 TO 96
    FOR i = 32 TO 255
        IF a(i) = p THEN PRINT CHR$(i);
    NEXT i
NEXT p

Ich habe das aus Spaß gemacht, daher entspricht es in gewisser Weise nicht den Regeln. Es wird keine Liste von Zeichen benötigt, sondern es werden alle Zeichen von 32 bis 255 gedruckt und stattdessen verwendet. Wenn Sie wirklich eine Version sehen möchten, die dieser Regel entspricht, teilen Sie mir dies bitte mit.

Es fällt auch eine andere technische Besonderheit aus: "Darüber hinaus sollte Ihr Programm in der Lage sein, Schriftarten zu wechseln, indem Sie einfach eine Variable, einen Wert oder eine Zeichenfolge im Code ändern." Es gibt keine einfache Möglichkeit, dies aus QBasic heraus zu tun. Das Programm funktioniert natürlich mit jeder Codepage Ihrer Wahl.

Schließlich könnte ich ein paar Zeichen wegpressen (meistens Leerzeichen, die die QBasic IDE hilfreich einfügt), aber es lohnt sich wahrscheinlich nicht, da diese Antwort ohnehin keine Gewinnchance hat.

QBasic sortiert die Zeichen nach Dunkelheit

nitro2k01
quelle
Plus eins, um es zum Spaß zu machen!
Jonathan Van Matre
8

Javascript + Canvas und Browser-DOM ( 280 237 235 Bytes)

Aktualisierte Version mit Vorschlägen von Fors und Zahnbürste in Kommentaren:

function m(x){a=document.createElement('canvas').getContext('2d');a.font='9px Monaco';a.fillText(x,y=i=0,20);for(;i<3600;)y+=a.getImageData(0,0,30,30).data[i++];return y}alert(s.split('').sort(function(a,b){return m(a)-m(b)}).join(''))

Mehr lesbare Version:

// Scoring function - Calculates darkness for single character
function m(x) {
    a = document.createElement('canvas').getContext('2d');
    a.font = '9px Monaco';
    a.fillText(x, y = i = 0, 20);
    for (; i < 3600;) y += a.getImageData(0, 0, 30, 30).data[i++];
    return y
}
// Assume input is in variable s and alert as output. Comparison function now expression.
alert(s.split('').sort(function (a, b) {
    return m(a) - m(b)
}).join(''))

Kann vielleicht mehr golfen werden.

Ich bin neu auf dieser Website, daher bin ich mir nicht sicher, wie Eingaben normalerweise für Javascript-Antworten gelesen werden. Ich gehe davon aus, dass die Eingabe in einer Variablen namens enthalten ist s. Wenn dies nicht in Ordnung ist, aktualisiere ich die Antwort und die Zeichenanzahl.

JSFiddle der aktualisierten Version.

JSFiddle der ersten Version .

Seidenschwanz
quelle
Es gefällt mir sehr gut, aber hier gibt es viele mögliche Verbesserungen. Die Variablen cund ssind unnötig ( a=document.createElement('canvas').getContext('2d')und y+=a.getImageData(0,0,30,30).data[i]), das Element muss nicht angehängt werden, die Nullinitialisierung von ykann mit der von i( i=y=0) kombiniert werden , das Nachinkrement von ikann mit dem Hinzufügen von y( for(...;y+=...[i++]);) und der Schriftart kombiniert werden Monaco ist einzeilig und hat einen kürzeren Namen als Courier.
Fors
Vielen Dank! Ich bin noch kein erfahrener Golfer, daher helfen Ihre Kommentare sehr. Ich habe sie jetzt in den Code aufgenommen.
Seidenschwanz
Javascript Antworten hier lesen normalerweise die Eingabe durch prompt(); aber das ist auch in ordnung.
Kartik
Sie können entfernen y=i=0;und ändern a.fillText(x,0,20)zu a.fillText(x,y=i=0,20).
Zahnbürste
Danke, fügte hinzu, dass auch! Zwei Zeichen sind zwei Zeichen!
Seidenschwanz
3

PHP, 298 Zeichen

Ich habe ein paar Zeilenumbrüche hinzugefügt, damit Sie es in seiner ganzen Scheußlichkeit sehen können:

<?php
$s=@$_GET[s];$a=array();$v=imagecreate(16,16);$f='imagecolorallocate';
$f($v,0,0,0);for($i=0;$i<strlen($s);$i++){$c=$f($v,$i,0,1);
imagechar($v,5,2,$n=0,$s[$i],$c);for($y=16;$y--;)
for($x=16;$x--;)$n+=($c==imagecolorat($v,$x,$y));
$a[]=ord($s[$i])+($n<<8);}sort($a);foreach($a as $v)echo chr($v);

Dieser Code verwendet die in PHP integrierten GD-Schriftarten. Das zweite Argument von imagechar()wählt die Schriftart aus (Zahlen von 1 bis 5 sind gültig).

Beispiel:

Input:  !@#$%^&*-=WEIX,./'
Output: '-.,^=!/*IE%X#$&@W

Wenn Sie über den oben gezeigten Code Folgendes einfügen, können Sie die Liste der Zeichen in Ihrem Webbrowser bereitstellen.

<?php
define("FONT_SIZE",5);
if(@$_SERVER['PATH_INFO']=='/a.png') {
  $s = $_GET['s'];
  $im = imagecreate(strlen($s)*(FONT_SIZE+4)+4,FONT_SIZE+12);
  imagecolorallocate($im,255,255,128);
  $c = imagecolorallocate($im,0,0,0);
  imagestring($im,FONT_SIZE,2,0,$s,$c);
  header("Content-Type: image/png");
  imagepng($im);
  imagedestroy($im);
  exit();
}
$me = $_SERVER['PHP_SELF'];
$t1 = $img = "";
if ($t1=htmlspecialchars(@$_GET['s'])) {
  $t2=urlencode($_GET['s']);
  $img="<p><img src=\"$me/a.png?s=$t2\" /></p>";
}
echo <<<END_HTML
<html>
<body>
$img
<form action="$me" method="get">
<input type="text" name="s" size="40" value="$t1" />
<input type="submit" value="Go" />
</form>
END_HTML;
if(!isset($_GET['s'])) exit();
?>
zimperliches Ossifrage
quelle
1
Wenn Sie verwenden imagecreatetruecolor, können Sie die erste Zuordnung löschen und den Funktionsnamen direkt in der zweiten für -11 verwenden. []statt array(). und foreach($a as$v)funktioniert auch
Einacio
3

AGB

Dies ist der zweithärteste Code, den ich je für einen Taschenrechner geschrieben habe. Es gibt keine fest codierten Pixelwerte, sondern zeichnet den Text in eine Grafik und durchläuft eine Schleife, um jedes Pixel zu zählen.

0→I`_%I<l?_T;1,1,s;_,I,1
C;pT;{0,1,2,3,4,5},{0,1,2}→L1(I
0→I%I<l?_T;1,C;L1(I)>L1,I

Eingang

,O.i

Ausgabe

.,iO
Timtech
quelle
Wenn dies funktioniert, ist es die bisher beste Antwort. Was ist GTB?
Slater
@slater Warum klickst du nicht auf den Link und findest es heraus?
Timtech
Vielen Dank für den Hinweis, dass Ihr Beitragstitel tatsächlich ein Link ist.
Slater
2
Die Domain, um die zum Entschlüsseln Ihres Compilers erforderliche Software zu erhalten, ist nicht mehr verfügbar . Auch hier tot . Ich habe den Code aus Spaß am Ausprobieren von Hand übersetzt, aber Sie haben anscheinend 10 Parens geöffnet und nur einen geschlossen, daher bin ich mir nicht sicher, wie ich das beheben soll. Der Compiler in meinem Kopf sagt: "Error :: unmatched identifier" :)
Jonathan Van Matre
1
@ JonathanVanMatre Mach dir keine Sorgen; TI-84 schließt sie automatisch für Sie.
Timtech
3

Java - 468 450 444

public static void main(String[]a){class c implements Comparable<c>{char d;c(char e){d=e;}public int compareTo(c o){return e(d)>e(o.d)?1:-1;}int e(char f){int a=0,x,y;BufferedImage img=new BufferedImage(99,99,1);img.getGraphics().drawString(""+f,9,80);for(y=0;y<99;y++)for(x=0;x<99;x++)a+=img.getRGB(x,y);return a;}}c[]s=new c[a[0].length()];int i=0;for(char d:a[0].toCharArray())s[i++]=new c(d);Arrays.sort(s);for(c d:s)System.out.print(d.d);}

@+.0abcdefghijklmnopqrstuvwxyz -> .irl+jcvtfxyzsuonkheaqpdb0wgm@

Ungolfed:

    public static void main(String[] a) {
    a = new String[]{"@+.0abcdefghijklmnopqrstuvwxyz"};
    class c implements Comparable<c> {
        char    d;

        c(char e) {
            d = e;
        }

        @Override
        public int compareTo(c o) {
            return e(d) > e(o.d)? 1 : -1;
        }

        int e(char f) {
            int a = 0, x, y;
            BufferedImage img = new BufferedImage(99, 99, 1);
            img.getGraphics().drawString("" + f, 9, 80);
            for (y = 0; y < 99; y++)
                for (x = 0; x < 99; x++)
                    a += img.getRGB(x, y);
            return a;
        }
    }
    c[] s = new c[a[0].length()];
    int i = 0;
    for (char d : a[0].toCharArray())
        s[i++] = new c(d);
    Arrays.sort(s);
    for (c d : s)
        System.out.print(d.d);
}
Mark Jeronimus
quelle
Tipp: Vermeiden Sie nach Möglichkeit öffentliche oder private Modifikatoren. das spart unnötige bytes
masterX244
habe das alles vergessen
Mark Jeronimus
@MarkJeronimus Das war die Art und Weise, wie ich es angehen wollte, aber ich wollte versuchen, FontRenderingContext zu verwenden.
Magic Octopus Urn
3

Nachschrift, 381

Hier ist etwas ganz anderes, nur zum Spaß. Da die meisten Schriften ohnehin Vektoren sind, ist das 'Zählen von Pixeln' ein wenig seltsam, nicht wahr? Das Berechnen der Glyphenformfläche ist zwar korrekt, aber nicht so einfach. Eine Alternative ist das Scannen eines Rechtecks ​​und das Zählen von "Treffern", wenn sich ein Punkt innerhalb einer Glyphenform befindet. Postscript verfügt über Operatoren für diese Art von Prüfungen. Das Scannen und Testen von Insideness ist jedoch nur eine seltsame Methode zum Zählen von Pixeln.

(%stdin)(r)file token pop/Courier 99 selectfont[1 index length{0}repeat]0 1 99{0 1 99{0 1 5 index length 1 sub{newpath 9 19 moveto 3 copy 7 index exch 1 getinterval false charpath infill{3 index exch 2 copy get 1 add put}{pop}ifelse}for pop}for pop}for 0 1 99 dup mul{0 1 3 index length 1 sub{dup 3 index exch get 2 index eq{3 index exch 1 getinterval print}{pop}ifelse}for pop}for

.

(%stdin) (r) file token pop
/Courier 99 selectfont
%/DejaVuSansMono 99 selectfont
%/UbuntuMono-Regular 99 selectfont
[ 1 index length {0} repeat ]   % str []
0 1 99 {
    0 1 99 {
        0 1 5 index length 1 sub {
            newpath 
            9 19 moveto
            3 copy              % str [] n m i n m i
            7 index exch        % str [] n m i n m str i
            1 getinterval       % str [] n m i n m s
            false charpath      % str [] n m i n m
            infill              % str [] n m i bool
            {3 index exch 2 copy get 1 add put} {pop} ifelse
        } for
        pop
    } for
    pop
} for
% un-comment next line to print number of 'hits' for each glyph
%
% dup {=} forall
%
% next is 'lazy sort'
0 1 99 dup mul {                % str [] i
    0 1 3 index length 1 sub {  % str [] i j
        dup 3 index exch        % str [] i j [] j
        get 2 index eq          % str [] i j bool
        {3 index exch 1 getinterval print} {pop} ifelse
    } for
    pop
} for
()=

Und hier sind die Ergebnisse für 3 verschiedene Schriftarten (Auswahl, die oben nicht kommentiert werden kann):

$ echo '(.-?@AByz01)' | gs -q -dBATCH d.ps
.-?1z0yA@B
$ echo '(.-?@AByz01)' | gs -q -dBATCH d.ps
.-?z1yA0B@
$ echo '(.-?@AByz01)' | gs -q -dBATCH d.ps
.-?1zyA0B@
user2846289
quelle
Pixel zählen ... Pixelkreuzungen zählen ... Tomate ... Tomahto ...
Jonathan Van Matre
2

Perl (mit GD) (159)

use GD;sub i{$i=new GD'Image 5,8;$B=colorExact$i 9,9,9;colorExact$i 0,0,0;char$i gdTinyFont,0,0,@_,1;$_=unpack"B*",wbmp$i 0;y/0//c}print+sort{i($a)-i($b)}@ARGV

Verwendung:

> perl dark.pl 1 2 3 @ # . , : ~ $ M i I s S
.,~:i13Is2S$M@#

bearbeiten: auf 159 Zeichen gekürzt

chinesischer Perl Goth
quelle
2

Java, 584

Wow ... Dies war keine gute Sprache, um dies zu tun.

import java.awt.geom.*;import java.util.*;class F{static void n(final String f,List<Character> s){Collections.sort(s,new Comparator<Character>(){public int compare(Character a,Character b){return d(f,""+a) - d(f,""+b);}});}static int d(String f,String s){int i=0;PathIterator p=new java.awt.Font(f,0,12).createGlyphVector(((java.awt.Graphics2D)new java.awt.image.BufferedImage(8,8,2).getGraphics()).getFontRenderContext(),s).getGlyphOutline(0).getPathIterator(AffineTransform.getRotateInstance(0.0, 0.0));while(!p.isDone()){i+=p.currentSegment(new double[99])/2;p.next();}return i;}}

Verwendung:

import java.awt.geom.*;
import java.util.*;
public class F {
    public static void main(String[]args){
        List<Character> s = new ArrayList<Character>(0);
        s.add('@');
        s.add('+');
        s.add('.');
        s.add('0');
        n("Calibri", s);
        System.out.println(s);
    }
    static void n(final String f,List<Character> s){
        Collections.sort(s,new Comparator<Character>(){
            public int compare(Character a,Character b){
                return d(f,""+a) - d(f,""+b);
            }
        });
    }

    static int d(String f,String s){
        int i=0;
        PathIterator p=new java.awt.Font(f,0,12).createGlyphVector(((java.awt.Graphics2D)new java.awt.image.BufferedImage(8,8,2).getGraphics()).getFontRenderContext(),s).getGlyphOutline(0).getPathIterator(AffineTransform.getRotateInstance(0.0, 0.0));
        while(!p.isDone()){
            i+=p.currentSegment(new double[99])/2;
            p.next();
        }
        return i;
    }
}

Dieses Setup führt zu:

[., +, 0, @]

Die einzige Zeile, die hier erklärt werden muss:

PathIterator p=new java.awt.Font(f,0,12).createGlyphVector(((java.awt.Graphics2D)new java.awt.image.BufferedImage(8,8,2).getGraphics()).getFontRenderContext(),s).getGlyphOutline(0).getPathIterator(AffineTransform.getRotateInstance(0.0, 0.0));
  • Initialisieren Sie das 12pt-Schriftartobjekt mit der übergebenen Schriftart.
  • Erstellen Sie ein neues BufferedImage-Objekt, um ein Graphics2D-Objekt zu erstellen, das mit einem GraphicsContext verknüpft ist.
  • Ruft den Schriftart-Rendering-Kontext des 2D-Grafikkontexts für die Zeichenfolge s ab.
  • Holen Sie sich das erste Glyphe (nur Glyphe) in der Zeichenfolge.
  • Holen Sie sich den Pfad-Iterator (Liste der Punkte).

Dann bringt dieses letzte Stück es zusammen ...

while(!p.isDone()){
    i+=p.currentSegment(new double[99])/2;
    p.next();
}

Durchlaufen Sie alle Punkte und addieren Sie die Anzahl der Punkte. Diese Dichteinformation wird an den Komparator zurückgegeben und zum Sortieren verwendet.

Magische Kraken-Urne
quelle
1

R, 195 Zeichen

A=strsplit(scan(,""),"")[[1]];cat(A[order(sapply(A,function(x){png('a',a='none',fa='monospace');frame();text(0,0,x);dev.off();sum(apply(png::readPNG('a'),c(1,2),function(x)any(x!=1)))}))],sep="")

Mit Kommentaren eingerückt:

A=strsplit(scan(,""),"")[[1]] #Take characters as strings and split into single chars
cat(A[order(sapply(A,function(x){ #Apply the following function to each char and order accordingly
                 png('a',a='none',fa='monospace'); #Open empty png without antialiasing and with monospace font
                 frame(); #create empty plot
                 text(0,0,x); #add the char as text to the plot
                 dev.off(); #close png device
                 sum(apply(png::readPNG('a'), #read it back as rbga 3d matrix
                           c(1,2), #check every layer (R, G, B, A)
                           function(x)any(x!=1))) #if any are not 1, send TRUE
                 }))], #Sum all TRUEs
    sep="") #Prints to output

Beispiel:

> A=strsplit(scan(,""),"")[[1]];cat(A[order(sapply(A,function(x){png('a',a='none',fa='monospace');frame();text(0,0,x);dev.off();sum(apply(png::readPNG('a'),c(1,2),function(x)any(x!=1)))}))],sep="")
1: @+.0
2: 
Read 1 item
.+0@
> A=strsplit(scan(,""),"")[[1]];cat(A[order(sapply(A,function(x){png('a',a='none',fa='monospace');frame();text(0,0,x);dev.off();sum(apply(png::readPNG('a'),c(1,2),function(x)any(x!=1)))}))],sep="")
1: 1234567890
2: 
Read 1 item
1723450689

Da die Schriftarten in R-Plots plattformabhängig sind, kann ich nicht garantieren, dass sie auf einem PC funktionieren, aber auf einem Mac (OS X 10.7.5, R 2.14.2).

Plannapus
quelle
1

SmileBASIC, 179 176 173 Bytes

INPUT S$DIM Q$[0],A[0],Z[0]WHILE""<S$C$=POP(S$)GCLS
PUSH Q$,C$
GPUTCHR.,0,C$
GSAVE.,0,8,8,A,0S=0FOR I=0TO 63S=S+A[I]NEXT
PUSH Z,S
WEND
RSORT Z,Q$
WHILE LEN(Q$)?POP(Q$);
WEND

Verwendet die aktuell geladene Schriftart. Schriften können mit geladen werden LOAD"GRPF:filename".

Mehr lesbarer Code:

INPUT STRING$
DIM CHARS$[0],PIXELS[0],SIZES[0]
WHILE STRING$>""
 CHAR$=POP(STRING$)
 PUSH CHARS$,CHAR$
 GCLS
 GPUTCHR 0,0,CHAR$
 GSAVE 0,0,8,8,PIXELS
 SIZE=0
 FOR I=0 TO 63
  INC SIZE,PIXELS[I]
 NEXT
 PUSH SIZES,SIZE
WEND
RSORT SIZES,CHARS$
WHILE LEN(CHARS$)
 PRINT POP(CHARS$);
WEND
12Me21
quelle
0

PHP - 485

Demo:

$ php pcg-23362.php "@+.0"
.+0@

Code:

<?php $f='x.ttf';$d=array();foreach(str_split($argv[1]) as$_){$B=imagettfbbox(50,0,$f,$_);$w=abs($B[4]-$B[0]);$h=abs($B[5]-$B[1]);$im=imagecreate($w,$h);imagecolorallocate($im,255,255,255);imagettftext($im,50,0,0,$h-$B[1],imagecolorallocate($im,0,0,0),$f,$_);$b=$w*$h;for($x=0;$x<$w;$x++)for($y=0;$y<$h;$y++){$z=imagecolorsforindex($im,imagecolorat($im,$x,$y));$color=$z['red']*$z['green']*$z['blue'];$b-=$color/0x1000000;}$d[$_]=$b / ($w * $h);}asort($d);echo implode(array_keys($d));
TimWolla
quelle
Hey, schick mir eine Kopie von X.TTF ... die kürzeste Schriftart, die ich habe, ist OCR A. ;-D
Jonathan Van Matre
0

Python + Freetype-py: 147

import sys,freetype as F;f=F.Face('m.ttf');f.set_char_size(99);print(sorted([(f.load_char(c)or sum(f.glyph.bitmap.buffer),c)for c in raw_input()]))
Mathieu Rodic
quelle