จัดเรียงอักขระตามความมืด


38

โปรแกรมของคุณจะต้องใส่ตัวอักษรเป็นบรรทัดดังนี้:

@+.0

และส่งออกอักขระที่เรียงลำดับตามความมืดเช่นนี้:

.+0@

ที่ต้องการ:

  • คุณต้องใช้แบบอักษรแบบโมโนสเปซสำหรับการตรวจจับความมืด

  • คุณต้องค้นหาว่าแต่ละพิกเซลมีอักขระกี่ตัว คุณต้องวาดตัวละครและจำนวนพิกเซลเช่นคุณไม่สามารถใส่จำนวนพิกเซลฮาร์ดโค้ดได้

    • ตามกฎที่เป็นรูปธรรมมากขึ้น: หากคุณเปลี่ยนแบบอักษรโปรแกรมของคุณควรทำงาน นอกจากนี้โปรแกรมของคุณควรสามารถเปลี่ยนแบบอักษรโดยเพียงแค่เปลี่ยนตัวแปรหรือค่าหรือสตริงในรหัส
  • หากคุณใช้การลดรอยหยักคุณต้องนับพิกเซลเป็นเปอร์เซ็นต์ของพิกเซลสีดำทั้งหมด ตัวอย่างเช่นrgb(32, 32, 32)พิกเซลจะนับเป็น 1/8 ของพิกเซลแบบเต็ม ไม่ต้องสนใจกฎนี้หากตัวละครของคุณไม่ได้ถูกลดรอยหยัก

  • หลังจากนับพิกเซลคุณต้องจัดเรียงอักขระตามจำนวนพิกเซลและส่งออกตามลำดับ

  • นี่คือดังนั้นโค้ดที่สั้นที่สุดเป็นไบต์จะเป็นผู้ชนะ


7
น่าแปลกที่นี่เหมาะสำหรับเกม RPG.se!
corsiKa

1
อะไรที่ไม่มีการแก้ไขสำหรับการแสดงแกมม่าในการคำนวณความมืด?
Ilmari Karonen

6
เราสามารถใช้แบบอักษรสีขาวได้ไหม? ถ้าเป็นเช่นนั้นฉันคิดว่าฉันมีสิ่งนี้ห่อ
Paul

คำตอบ:


22

Mathematica, 112 110 108 ไบต์

เรื่องนี้ยังคงสามารถตีกอล์ฟต่อไปได้ ถือว่าสตริงอยู่ในตัวแปร s

และตอนนี้ใช้ไวยากรณ์ที่ถูกต้องเพื่อจัดเรียงหนึ่งรายการโดยรายการอื่น
กรณีการทดสอบที่โชคดี -> "โอ้ใช่นั่นใช้งานได้" -> Facepalm
ขอบคุณ David Carraher ที่มีดวงตาที่แหลมคม

อัปเดต:แทนที่ OCR A ด้วย Menlo เพราะฉันรู้ว่าใน OSX OCR A ชื่อตระกูลแบบอักษรนั้นแท้จริงแล้ว OCR A Std ดังนั้นฉันจึงเรียงลำดับฟอนต์เริ่มต้นแทนที่จะเป็นข้อตกลงที่แท้จริง Menlo ยังมีการนับจำนวนครั้งเดียวกันด้วยจำนวนไบต์เดียวกันดังนั้นจึงไม่มีกำไรหรือขาดทุนสุทธิ

ฉันวางการส่งออก CDF ที่โฮสต์ของโน้ตบุ๊คดังนั้นคุณสามารถดูรหัสได้หากคุณต้องการ ฉันยังคงหาวิธีเพิ่มความสามารถในการโต้ตอบกับ CDF ที่โฮสต์บนเว็บดังนั้นในตอนนี้มันคงที่

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

เอาต์พุตสำหรับs = FromCharacterCode /@ Range[33, 135];ด้วย "Courier"

ป้อนคำอธิบายรูปภาพที่นี่

เอาท์พุทเหมือนกัน แต่ด้วย FontFamily "Monospace":

ป้อนคำอธิบายรูปภาพที่นี่

โปรดทราบว่าผลลัพธ์สุดท้ายจะแสดงเป็นแบบอักษรภายในของ MM ไม่ใช่ในแบบอักษรที่เรียงลำดับ ดังนั้นคุณจะเห็นความแตกต่างในแบบอักษรที่เลือกสะท้อนในการจัดเรียง อย่างไรก็ตามลิงค์ CDF จะแสดงทั้งสองรายการสำหรับผู้ที่สมบูรณ์แบบ

รหัสไม่ได้รับการตอบกลับ:

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

1
ตรวจสอบข้อมูลนี้:"" <> (FromCharacterCode /@ Range[33, 135])
DavidC

ตระกูลเริ่มต้นหรือไม่สเปคที่ต้องการ "โปรแกรมของคุณควรสามารถเปลี่ยนฟอนต์ด้วยการเปลี่ยนตัวแปร" เนื่องจากค่า anti-aliasing เป็นไปได้ที่จะได้รับสิ่งผิดปกติ แต่ฉันจะได้ดูแบบเต็มรูปแบบอีกครั้งและดูว่ามีอะไรผิดปกติหรือไม่
Jonathan Van Matre

1
ช่างเป็นภาษาที่ยอดเยี่ยมมาก! เพิ่งค้นพบเกี่ยวกับความพยายามด้านภาษาการเขียนโปรแกรมใหม่โดย Wolfram ในวันอื่น ๆ รอคอยที่จะ
the0ther

1
คุณสามารถบันทึกสองไบต์ด้วยการเปลี่ยนอักขระ [] เป็น Characters @ และ Reverse [] เป็น Reverse @
Michael Stern

2
ฉันไม่ต้องการที่จะโพสต์คำตอบที่คล้ายกัน แต่ผมพยายามที่ตัวเองและมันขึ้นมาสั้นStringJoin@SortBy[Characters@"@+.0",ImageData@Binarize@Rasterize@Style[#,FontFamily->"Monospace"]~Total~2&]
หวด

25

Bash + ImageMagick: 164 147 148 ตัวอักษร

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[@]}"

วิ่งตัวอย่าง:

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

ตัวคั่นถูกแทรกระหว่างกลุ่มสีเทา อักขระที่มีระดับสีเทาเหมือนกันจะไม่ถูกแยกออก:

bash-4.1$ echo -n 'abcdefghijklmnopqrstuvwxyz' | bash graysort.sh
i cl jortz esv ax u df bgnpq y hk w m

+1 สำหรับการเรียงลำดับโดยใช้ดัชนี bash array แทนsort
Digital Trauma

9

QBasic ขนาด 259 ไบต์

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

ฉันทำมันเพื่อความสนุกดังนั้นจึงไม่สอดคล้องกับกฎในทางเทคนิคในทางเดียว ไม่ใช้รายการตัวละคร แต่พิมพ์ตัวอักษรทั้งหมดจาก 32-255 และใช้ตัวนั้นแทน หากคุณต้องการดูเวอร์ชันที่สอดคล้องกับกฎนี้จริงๆโปรดบอกฉัน

นอกจากนี้ยังล้มเหลวทางเทคนิคอื่น: "นอกจากนี้โปรแกรมของคุณควรสามารถเปลี่ยนแบบอักษรโดยเพียงแค่เปลี่ยนตัวแปรหรือค่าหรือสตริงในรหัส" ไม่มีวิธีง่ายๆในการทำเช่นนี้จากภายใน QBasic อย่างไรก็ตามโปรแกรมจะทำงานได้ดีกับเพจรหัสที่คุณเลือก

สุดท้ายนี้ฉันสามารถบีบตัวละครไม่กี่ตัว (ส่วนใหญ่เป็นพื้นที่ว่างที่ QBasic IDE แทรกได้ดี) แต่อาจไม่คุ้มค่าเพราะคำตอบนี้ไม่มีโอกาสชนะเลย

QBasic เรียงอักขระตามความมืด


บวกหนึ่งสำหรับการทำมันเพื่อความสนุก!
Jonathan Van Matre

8

Javascript + Canvas และเบราว์เซอร์ DOM ( 280 237 235 ไบต์)

อัปเดตเวอร์ชันที่มี suggetions จาก Fors และแปรงสีฟันในความคิดเห็น:

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

รุ่นที่อ่านเพิ่มเติมได้:

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

สามารถเล่นกอล์ฟได้มากกว่านี้

ฉันยังใหม่กับไซต์นี้ดังนั้นฉันจึงไม่แน่ใจว่าวิธีอ่านข้อมูลตอบรับ Javascript ตามปกติแล้ว sผมถือว่าการป้อนข้อมูลที่มีอยู่ในชื่อตัวแปร หากไม่เป็นไรฉันจะอัปเดตคำตอบและจำนวนถ่าน

JSFiddle รุ่นที่อัปเดตแล้ว

JSFiddle ของรุ่นแรก


ฉันชอบมันมาก แต่มีการปรับปรุงที่เป็นไปได้มากมายที่นี่ ตัวแปรcและsไม่จำเป็น ( a=document.createElement('canvas').getContext('2d')และy+=a.getImageData(0,0,30,30).data[i]) องค์ประกอบไม่จำเป็นต้องต่อท้ายการเริ่มต้นเป็นศูนย์ของyสามารถรวมกับที่ของi( i=y=0) การเพิ่มโพสต์ของiสามารถรวมกับการเพิ่มของy( for(...;y+=...[i++]);) และแบบอักษร โมนาโกเว้นระยะโมโนและมีชื่อสั้นกว่า Courier
Fors

ขอบคุณ! ฉันยังไม่เป็นนักกอล์ฟที่มีประสบการณ์ ฉันได้รวมไว้ในรหัสตอนนี้
waxwing

Javascript คำตอบที่นี่ปกติอ่านอินพุตผ่านprompt(); แต่นี่ก็ใช้ได้เช่นกัน
Kartik

คุณสามารถลบy=i=0;และเปลี่ยนไปa.fillText(x,0,20) a.fillText(x,y=i=0,20)
แปรงสีฟัน

ขอบคุณเพิ่มที่เช่นกัน! ตัวละครสองตัวเป็นตัวละครสองตัว!
waxwing

3

PHP, 298 ตัวอักษร

ฉันได้เพิ่มตัวแบ่งบรรทัดสองสามเพื่อให้คุณสามารถเห็นได้ในทุกความน่าเกลียด:

<?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);

รหัสนี้ใช้แบบอักษร GD ที่มาพร้อมกับ PHP อาร์กิวเมนต์ที่สองของการimagechar()เลือกแบบอักษร (ตัวเลขจาก 1 ถึง 5 ถูกต้อง)

ตัวอย่าง:

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

หากคุณแทรกรหัสด้านบนที่แสดงด้านบนคุณจะสามารถระบุรายการอักขระในเว็บเบราว์เซอร์ของคุณ

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

1
หากคุณใช้imagecreatetruecolorคุณสามารถปล่อยการจัดสรรแรกและใช้ชื่อฟังก์ชันโดยตรงในวินาทีสำหรับ -11 แทน[] array()และforeach($a as$v)ทำงานได้ดี
Einacio

3

GTB

นี่คือรหัสที่จะเป็นรหัสที่ยากที่สุดที่สองที่ฉันเคยเขียนสำหรับเครื่องคิดเลข ไม่มีค่าพิกเซลตายตัวจริง ๆ แล้วมันจะวาดข้อความบนกราฟและวนซ้ำเพื่อนับแต่ละพิกเซล

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

อินพุต

,O.i

เอาท์พุต

.,iO

หากได้ผลก็เป็นคำตอบที่ดีที่สุด GTB คืออะไร
ตำหนิ

@slater ทำไมคุณไม่คลิกที่ลิงก์และค้นหา
Timtech

ขอบคุณสำหรับการชี้ให้เห็นว่าชื่อโพสต์ของคุณเป็นลิงค์
ตำหนิ

2
โดเมนที่จะได้รับซอฟแวร์ที่จำเป็นในการถอดรหัสคอมไพเลอร์ของคุณจะตาย ตายที่นี่ด้วย ฉันแปลโค้ดด้วยมือเพื่อความสนุกในการทดสอบ แต่ดูเหมือนว่าคุณได้เปิด 10 parens และปิดเพียงอันเดียวดังนั้นฉันไม่แน่ใจว่าจะแก้ไขได้อย่างไร คอมไพเลอร์ในหัวของฉันพูดว่า: "Error :: ตัวระบุที่ไม่ตรงกัน" :)
Jonathan Van Matre

1
@JanathanVanMatre ไม่ต้องกังวล TI-84 จะปิดโดยอัตโนมัติสำหรับคุณ
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);
}

เคล็ดลับ: หลีกเลี่ยงการดัดแปลงสาธารณะหรือส่วนตัวเท่าที่จะทำได้ ที่ช่วยประหยัดไบต์ที่ไม่จำเป็น
masterX244

ลืมทุกอย่างเกี่ยวกับเรื่องนั้น
Mark Jeronimus

@ MarkJeronimus นี่เป็นวิธีที่ฉันจะแก้ไขปัญหาได้ แต่ฉันต้องการลองใช้ FontRenderingContext
Magic Octopus Urn

3

Postscript, 381

นี่คือสิ่งที่แตกต่างอย่างสิ้นเชิงเพื่อความสนุกสนาน เนื่องจากแบบอักษรส่วนใหญ่เป็นแบบเวกเตอร์ 'การนับพิกเซล' จึงแปลกเล็กน้อยใช่ไหม การคำนวณพื้นที่รูปร่าง glyph ในขณะที่เป็นวิธีที่ถูกต้องนั้นไม่ใช่เรื่องง่าย อีกทางเลือกหนึ่งสามารถสแกนสี่เหลี่ยมผืนผ้าและการนับจำนวนการเข้าชมเมื่อจุดอยู่ภายในรูปร่างสัญลักษณ์และ Postscript มีโอเปอเรเตอร์สำหรับการตรวจสอบประเภทนี้ แม้ว่าจริงการสแกนและการทดสอบ insideness เป็นเพียงวิธีแปลก ๆ ในการนับพิกเซล

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

และนี่คือผลลัพธ์ของ 3 แบบอักษรที่แตกต่างกัน (การเลือกซึ่งสามารถยกเลิกความคิดเห็นข้างต้น):

$ 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@

การนับพิกเซล ... นับการแยกพิกเซล ... มะเขือเทศ .... tomahto ....
Jonathan Van Matre

2

Perl (กับ 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

การใช้งาน:

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

แก้ไข: ย่อให้เหลือ 159 ตัวอักษร


2

Java, 584

ว้าว ... นี่ไม่ใช่ภาษาที่ดีที่จะทำ

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

การใช้งาน:

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

ผลลัพธ์การตั้งค่านี้ใน:

[., +, 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));
  • เริ่มต้นวัตถุแบบอักษร 12pt ด้วยแบบอักษรที่ผ่าน
  • สร้าง BufferedImage obejct ใหม่เพื่อสร้างวัตถุ Graphics2D ที่เชื่อมโยงกับ GraphicsContext
  • รับบริบทการแสดงผลแบบอักษรของบริบทกราฟิก 2D สำหรับสตริง s
  • รับสัญลักษณ์แรก (เฉพาะสัญลักษณ์) ในสตริง
  • รับเส้นทางตัววนซ้ำ (รายการคะแนน)

จากนั้นชิ้นสุดท้ายนี้ก็นำมารวมกัน ...

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

โดยวนซ้ำทุกจุดและนับคะแนน ข้อมูลความหนาแน่นนี้จะถูกส่งกลับไปยังตัวเปรียบเทียบและใช้สำหรับการเรียงลำดับ


1

R, 195 ตัวละคร

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="")

เยื้องกับความคิดเห็น:

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

ตัวอย่าง:

> 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

รูปแบบของแบบอักษรในแปลง R ขึ้นอยู่กับแพลตฟอร์มฉันไม่สามารถรับประกันได้ว่าจะทำงานบนพีซีได้ แต่ทำงานบน Mac (OS X 10.7.5, R 2.14.2)


1

SmileBASIC, 179 176 173 ไบต์

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

ใช้แบบอักษรที่โหลดในปัจจุบัน LOAD"GRPF:filename"แบบอักษรที่สามารถจะเต็มไปด้วย

อ่านเพิ่มเติมรหัส:

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

0

PHP - 485

การสาธิต:

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

รหัส:

<?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));

เฮ้ส่งสำเนาของ X.TTF ให้ฉัน ... แบบอักษรที่สั้นที่สุดที่ฉันมีคือ 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()]))
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.