Kurangi seni Ascii

10

Tantangan ini adalah cut'n paste dari Enlarge ASCII art , tetapi dibalik , menggunakan karakter setengah blok PetSCII yang berbasis :

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

Jadi tujuannya adalah mengurangi dengan 1/2mengajukan . Untuk sampel, dari string:

 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      

Anda harus membuat:

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

(atau bahkan:

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

;-)

atau di mana perpipaan:

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
             ]])})

bisa memberi:

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

Beberapa sampel:

sampel asciiReduce

Dengan (kurang-lebih) aturan yang sama:

  • Masukan dari STDIN atau file
  • Setiap karakter yang dikirim harus diwakili, hanya spasi putih yang harus tetap kosong .
  • Ini juga , jadi skor terendah menang. Skor dihitung sebagai:
    • +1dengan karakter, untuk dihitung dalam karakter, bukan dalam byte yaitu: s=' ▝▘▀▗▐▚▜▖▞▌▛▄▟▙█'menghitung 20 karakter, bukan 52 !!
    • -10 untuk penjelasan;
    • +20 untuk penggunaan alat font eksternal atau pustaka.
F. Hauri
sumber
Jadi untuk memperjelas: gambar input dibagi menjadi kotak 2x2 dan masing-masing peta menjadi satu karakter?
Peter Taylor
1
-0,5 untuk menambahkan bonus aneh (mendefinisikan penjelasan) - setelah pembulatan masih upvote. Ini juga kode-tantangan dan bukan kode-golf.
Howard
Sebagian besar karakter ini tidak ditampilkan dengan benar di browser saya. :(
Victor Stafusa
Di linux saya, saya menggunakan xterm -xrm 'XTerm*renderFont:false' & untuk membuka jendela konsol yang dapat menampilkan ini dengan benar.
F. Hauri

Jawaban:

4

GolfScript (90 karakter)

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

Banyak dari ini digunakan untuk menangani array yang tidak rata. Kasus uji buruk:

xx
xxx
xxx
xx
x

berisi 3 kotak 2x2 berbeda dengan hanya satu dari 4 sel yang mengandung karakter apa saja.

Lebih buruk lagi, ziptransposisi untuk memotong kolom menjadi pasangan memberikan hasil yang sama untuk ["xx" "xxx"]zipdan ["xxx" "xx"]zip. Karena itu saya mulai dengan melakukan padding out untuk memastikan bahwa semua garis memiliki panjang genap yang sama, dan bahwa ada sejumlah garis yang genap.

Perhatikan bahwa program ini mengasumsikan bahwa penerjemah akan memperlakukan "▗▖▄▝▐▞▟▘▚▌▙▀▜▛█" sebagai string dengan panjang 48, meskipun sesuai instruksi dalam pertanyaan saya menghitungnya sebagai 16 karakter ditambah pembatas.

Saya telah menguji ini dengan kemampuan terbaik saya, tetapi saya tidak dapat menemukan font monospace yang benar-benar menerjemahkan karakter-karakter tersebut dengan benar.

Peter Taylor
sumber
Kode Anda tampaknya gagal pada tes kedua, dengan hati ... Tapi bagus! Beri +1 sebagai yang pertama!
F. Hauri
1
Hmm. Saya tidak cenderung menggunakan ziparray yang kasar, dan saya cukup terkejut dengan apa yang tampaknya dilakukan pada misalnya ["##" "###"]. Saya harus memikirkan kembali pendekatan saya.
Peter Taylor
Freemono, Unifont, Code2000, dan Fixedsys Excelsior semua membuat karakter ini dengan benar.
Primo
@ primo, Unifont sama sekali tidak monospace pada karakter-karakter itu. Fixedsys Excelsior juga tidak benar, tetapi cukup dekat.
Peter Taylor
Iya! sekarang kamu memilikinya! Sedikit komentar: ada dua baris kosong di akhir output. Ini tidak melanggar aturan apa pun! (Catatan: skor sedikit berubah, Anda dapat menyimpan 10 poin ;-)
F. Hauri
1

Perl 6 , 159 karakter (192 byte)

(|lines.map(*~' '),'')».comb(/../).rotor(2).map:{my@d='  'xx.max(*.elems);say [~] map {"█▛▜▀▙▌▚▘▟▞▐▝▄▖▗ ".comb[:2(.trans([' ',/./]=>~⑩))]},[Z~] .map:{|$_,|@d}}

Cobalah online!

bb94
sumber
Memperbaiki solusi saya.
bb94
1
143 karakter
Jo King
0

Bash (203 karakter)

#!/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

atau

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
F. Hauri
sumber
0

Perl (268 karakter)

#!/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";};

atau

#!/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";
}
F. Hauri
sumber