Ascii sanatını azaltın


10

Bu zorluk olduğunu yapıştırmak cut'n gelen büyüt ASCII sanatı , ama tersine kullanarak, PetSCII bazlı yarım blok karakter:

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

Yani amaç tarafından azaltmaktır 1/2submited . Dizeden örnek için:

 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      

render etmelisin:

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

(ya da:

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

;-)

veya boru tesisatı:

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

verebilirdim:

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

Bazı örnekler:

asciiReduce örneği

Aynı kurallarla:

  • STDIN veya dosyadan giriş
  • Gönderilen her karakter temsil edilmelidir, sadece boşluklar boş kalmalıdır .
  • Bu da , bu yüzden en düşük puanı kazanmak. Puan şu şekilde hesaplanır:
    • +1karakterlerle, karakterlerle sayılmak , bayt cinsinden değil yani: 20 karakter s=' ▝▘▀▗▐▚▜▖▞▌▛▄▟▙█'saymak , 52 değil !
    • -10 açıklama için;
    • +20 harici yazı tipi aracı veya kitaplığının kullanımı için.

Netleştirmek için: giriş görüntüsü 2x2 kareye bölünür ve her biri bir karaktere eşlenir?
Peter Taylor

1
Garip bonuslar eklemek için -0.5 (açıklamayı tanımlayın) - hala bir oylama yuvarladıktan sonra. Ayrıca bu daha sonra kod meydan okuma ve kod golf değil.
Howard

Bu karakterlerin çoğu tarayıcımda doğru oluşturulmuyor. :(
Victor Stafusa

Linux'umun altında xterm -xrm 'XTerm*renderFont:false' &bunu düzgün görüntüleyebilen bir konsol penceresi açmak için kullanıyorum .
F. Hauri

Yanıtlar:


4

GolfScript (90 karakter)

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

Bunların çoğu düzensiz dizileri ele almaya gider. Kötü test durumda:

xx
xxx
xxx
xx
x

herhangi bir karakter içeren 4 hücreden sadece bir tanesiyle 3 farklı 2x2 ızgara içerir.

Kötü şeyler yapmak için, zipikili gruplara sütunları kesmek için aktarılması aynı çıktıyı verir için ["xx" "xxx"]zipve ["xxx" "xx"]zip. Bu nedenle, tüm çizgilerin eşit uzunlukta olmasını ve çift sayıda çizginin olmasını sağlamak için dolgu ile başladım.

Bu program, yorumlayıcının "▗▖▄▝▐▞▟▘▚▌▙▀▜▛█" uzunluğuna 48 dizesi olarak davranacağını varsaydığını unutmayın, ancak sorudaki talimatlara göre 16 karakter olarak sayıyorum artı sınırlayıcılar.

Bunu yeteneğimin en iyi şekilde test ettim, ancak bu karakterleri doğru bir şekilde işleyen bir tek aralıklı yazı tipi bulamıyorum.


Kodun ikinci testte kalpten başarısız görünüyor ... Ama güzel! 1. olduğunuzda +1!
F. Hauri

1
Hmm. zipDüzensiz diziler üzerinde kullanma eğiliminde değilim ve örneğin üzerinde yaptığı gibi oldukça şaşırdım ["##" "###"]. Yaklaşımımı yeniden düşünmem gerekecek.
Peter Taylor

Freemono, Unifont, Code2000 ve Fixedsys Excelsior bu karakterleri doğru şekilde işler.
primo

@primo, Unifont bu karakterler üzerinde tek boşluklu bir yerde değil. Fixedsys Excelsior da oldukça doğru değil, ama yeterince yakın.
Peter Taylor

Evet! şimdi sende var! Küçük açıklama: Çıktının sonunda iki boş satır var. Bu herhangi bir kuralı bozmaz! (Not: Puanlama biraz değişti, 10 puan kaydedebilirsiniz ;-)
F.Hauri


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

veya

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

veya

#!/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";
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.