ลด Ascii art


10

ความท้าทายนี้เป็นcut'n วางจากขยายศิลปะ ASCIIแต่ตรงกันข้ามโดยใช้PetSCIIตามครึ่งบล็อกตัวอักษร:

string=" ▝▘▀▗▐▚▜▖▞▌▛▄▟▙█"

ดังนั้นเป้าหมายคือการลด1/2ยื่นascii-ศิลปะตัวอย่างจากสตริง:

 OOOOOO  OOOOOO  OOOOOO  OOOOOOO      OOOOOO   OOOOOO  OO      OOOOOOO 
OO      OO    OO OO   OO OO          OO       OO    OO OO      OO      
OO      OO    OO OO   OO OOOOO       OO   OOO OO    OO OO      OOOOO   
OO      OO    OO OO   OO OO          OO    OO OO    OO OO      OO      
 OOOOOO  OOOOOO  OOOOOO  OOOOOOO      OOOOOO   OOOOOO  OOOOOOO OO      

คุณต้องแสดงผล:

 ▟▀▀▘▟▀▀▙▐▛▀▙▐▛▀▀  ▗▛▀▀ ▟▀▀▙▐▌  ▐▛▀▀ 
 █   █  █▐▌ █▐▛▀   ▐▌ ▜▌█  █▐▌  ▐▛▀  
 ▝▀▀▘▝▀▀▘▝▀▀▘▝▀▀▀   ▀▀▀ ▝▀▀▘▝▀▀▀▝▘   

(หรือแม้กระทั่ง:

▗▛▀▀▗▛▀▜▖█▀▜▖█▀▀▘  ▟▀▀▘▗▛▀▜▖█   █▀▀▘ 
▐▌  ▐▌ ▐▌█ ▐▌█▀▘   █ ▝█▐▌ ▐▌█   █▀▘  
 ▀▀▀ ▀▀▀ ▀▀▀ ▀▀▀▘  ▝▀▀▘ ▀▀▀ ▀▀▀▘▀    

;-)

หรือที่ไหนท่อ:

wget -O - https://codegolf.stackexchange.com/q/19123/9424 |
    sed -ne '/<pre><code>/,/<\/code><\/pre>/{//{/\//q};s/<pre><code>//;p}'
   ('l2v2l6v2'+  'e1l1v3l2'+
 'v3e1v7e1v7e1v7e1l2v6e1l4v5'+
'e1l6v4e1l8v3e1l7l3v2e1l9l3v1')
 .replace(/[lve]\d/g,function
   (c){return Array(-~c[1]).
      join({l:' ',v:'Love'
         ,e:'\n'}[c[0
             ]])})

สามารถให้:

▗▟█████▙▟█████▄
▜█████████████▛▘
 ▝▀███▙▛█████▀ 
    ▝▀▜██▀▘

ตัวอย่างบางส่วน:

ตัวอย่าง asciiReduce

ด้วยกฎเดียวกัน (โดยประมาณ):

  • อินพุตจาก STDIN หรือไฟล์
  • แต่ละตัวอักษรยื่นจะต้องมีการแสดงเพียงช่องว่างจะต้องพักที่ว่างเปล่า
  • นี่คือเช่นกันดังนั้นคะแนนต่ำสุดชนะ คะแนนคำนวณเป็น:
    • +1โดยตัวอักษรจะถูกนับเป็นตัวอักษรไม่ได้อยู่ในไบต์เช่น: s=' ▝▘▀▗▐▚▜▖▞▌▛▄▟▙█'นับ20ตัวอักษรไม่52 !
    • -10 สำหรับคำอธิบาย;
    • +20 สำหรับการใช้เครื่องมือฟอนต์หรือไลบรารีภายนอก

ดังนั้นเพื่อชี้แจง: ภาพอินพุตถูกแบ่งออกเป็นสี่เหลี่ยม 2x2 และแต่ละแผนที่บนตัวละครตัวเดียว?
ปีเตอร์เทย์เลอร์

1
-0.5 สำหรับการเพิ่มโบนัสแปลก ๆ (นิยามคำอธิบาย) - หลังจากการปัดเศษยังเป็น upvote นอกจากนี้นี่คือความท้าทายของโค้ดและไม่ใช่โค้ดกอล์ฟ
Howard

ตัวอักษรเหล่านี้ส่วนใหญ่ไม่ได้แสดงผลอย่างถูกต้องในเบราว์เซอร์ของฉัน :(
Victor Stafusa

ภายใต้ linux ของฉันฉันใช้xterm -xrm 'XTerm*renderFont:false' &เพื่อเปิดหน้าต่างคอนโซลที่สามารถแสดงสิ่งนี้ได้อย่างถูกต้อง
F. Hauri

คำตอบ:


4

GolfScript (90 ตัวอักษร)

n/.,1&[""]*+.{,}%$-1=.1&+{1$,-´' '*+}+%2/{zip 2/{~+0\{32=!1$++}/" ▗▝▐▖▄▞▟▘▚▀▜▌▙▛█"3/=}%n}%

ส่วนใหญ่จะเป็นการจัดการกับอาร์เรย์ที่ขาดการใช้งาน กรณีทดสอบที่น่ารังเกียจ:

xx
xxx
xxx
xx
x

มี 2x2 กริดที่ต่างกัน 3 เซลล์โดยมีเพียงหนึ่งใน 4 เซลล์ที่มีอักขระใด ๆ เลย

เพื่อให้สิ่งที่แย่กว่านั้นคือzipการขนย้ายไปสับคอลัมน์ที่เป็นคู่จะช่วยให้การส่งออกเดียวกันสำหรับและ["xx" "xxx"]zip ["xxx" "xx"]zipฉันจึงเริ่มต้นด้วยการขยายเพื่อให้แน่ใจว่าทุกเส้นมีความยาวเท่ากันและมีจำนวนเส้นเท่ากัน

โปรดทราบว่าโปรแกรมนี้อนุมานว่าล่ามจะถือว่า "▗▖▄▝▐▞▟▘▚▌▙▀▜▛█" เป็นสตริงที่มีความยาว 48 ถึงแม้ว่าตามคำแนะนำในคำถามฉันจะนับเป็น 16 ตัวอักษร บวกตัวคั่น

ฉันได้ทดสอบสิ่งนี้อย่างสุดความสามารถของฉัน แต่ฉันไม่สามารถหาแบบอักษร monospace ที่ทำให้ตัวละครเหล่านั้นถูกต้อง


รหัสของคุณดูเหมือนจะล้มเหลวในการทดสอบครั้งที่สองด้วยใจ ... แต่ก็ดี! +1 ในฐานะที่คุณเป็นที่ 1!
F. Hauri

1
อืมมม ฉันไม่ได้มีแนวโน้มที่จะใช้ในอาร์เรย์มอมแมมและฉันประหลาดใจมากโดยสิ่งที่ดูเหมือนว่าจะทำในเช่นzip ["##" "###"]ฉันจะต้องทบทวนวิธีการของฉันใหม่
Peter Taylor

Freemono, Unifont, Code2000 และ Fixedsys Excelsior ทำให้ตัวละครเหล่านี้ถูกต้อง
primo

@primo, Unifont ไม่มีที่ไหนใกล้ monospaced กับตัวละครเหล่านั้น Fixedsys Excelsior นั้นยังไม่ถูกต้อง แต่ก็ใกล้พอ
ปีเตอร์เทย์เลอร์

ใช่ ตอนนี้คุณมีมัน! หมายเหตุเล็กน้อย: มีสองบรรทัดว่างที่ท้ายเอาต์พุต สิ่งนี้จะไม่ผิดกฎใด ๆ ! (หมายเหตุ: การให้คะแนนมีการเปลี่ยนแปลงเล็กน้อยคุณอาจประหยัดได้ 10 คะแนน ;-)
F. Hauri


0

Bash (203 ตัวอักษร)

#!/bin/bash
r=" ▝▘▀▗▐▚▜▖▞▌▛▄▟▙█";while IFS= read -r m;do IFS= read -r n;for((l=${#m}>${#n}?${#m}:${#n},i=0; i<l; i+=2)){
printf -ve %-2s "${n:i:2}" "${m:i:2}";e=${e//[^ ]/1};o+=${r:2#${e// /0}:1};};echo "$o";o=;done

หรือ

r=" ▝▘▀▗▐▚▜▖▞▌▛▄▟▙█"
while IFS= read -r m; do
    IFS= read -r n
    for ((l=${#m}>${#n}?${#m}:${#n},i=0; i<l; i+=2)) {
        printf -ve %-2s "${n:i:2}" "${m:i:2}"
        e=${e//[^ ]/1}
        o+=${r:2#${e// /0}:1}
    }
    echo "$o"
    o=
done

0

Perl (268 ตัวอักษร)

#!/usr/bin/perl -CS
use utf8;my $r=" ▝▘▀▗▐▚▜▖▞▌▛▄▟▙█";while(@v=split"",<>){@w=split"",<>;foreach my $i(0..$#v/2){($a,$b,$c,$d)=qw|0 0 0 0|;$a=1if$w[$i*2]=~/\S/;$b=1if$w[$i*2+1]=~/\S/;$c=1if$v[$i*2]=~/\S/;$d=1if$v[$i*2+1]=~/\S/;print substr($r,ord pack("b8",$d.$c.$b.$a),1);};print "\n";};

หรือ

#!/usr/bin/perl -CS
use utf8;
my $r = " ▝▘▀▗▐▚▜▖▞▌▛▄▟▙█";
while ( @v = split "", <> ) {
    @w = split "", <>;
    foreach my $i ( 0 .. $#v / 2 ) {
        ( $a, $b, $c, $d ) = qw|0 0 0 0|;
        $a = 1 if $w[ $i * 2 ] =~ /\S/;
        $b = 1 if $w[ $i * 2 + 1 ] =~ /\S/;
        $c = 1 if $v[ $i * 2 ] =~ /\S/;
        $d = 1 if $v[ $i * 2 + 1 ] =~ /\S/;
        print substr( $r, ord pack( "b8", $d . $c . $b . $a ), 1 );
    }
    print "\n";
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.