Zmniejsz sztukę Ascii

10

To wyzwanie jest cut'n wklej od Powiększ ASCII sztuki , ale odwrócony , używając PetSCII oparte pół-bloków znaków:

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

Więc celem jest zmniejszenie przez 1/2zgłoszone . Na przykład z ciągu:

 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      

musisz renderować:

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

(lub nawet:

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

;-)

lub gdzie orurowanie:

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

mógłby dać:

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

Niektóre próbki:

Próbka asciiReduce

Z (przybliżonymi) tymi samymi zasadami:

  • Dane wejściowe ze STDIN lub pliku
  • Każdy przesłany znak musi być reprezentowany, tylko białe znaki muszą pozostać puste .
  • To także , więc wygrywa najniższy wynik. Wynik obliczany jest jako:
    • +1według znaków, należy liczyć w znakach, a nie w bajtach, tj .: s=' ▝▘▀▗▐▚▜▖▞▌▛▄▟▙█'policz 20 znaków, a nie 52 !!
    • -10 dla wyjaśnienia;
    • +20 do korzystania z zewnętrznego narzędzia czcionek lub biblioteki.
F. Hauri
źródło
Aby wyjaśnić: obraz wejściowy jest podzielony na 2x2 kwadraty, a każda mapa na jedną postać?
Peter Taylor
1
-0,5 za dodanie dziwnych bonusów (zdefiniuj wyjaśnienie) - po zaokrągleniu wciąż głosuje pozytywnie. Jest to także wyzwanie kodowe, a nie golfowe.
Howard
Większość tych znaków nie wyświetla się poprawnie w mojej przeglądarce. :(
Victor Stafusa,
Pod moim linuksem używam xterm -xrm 'XTerm*renderFont:false' &do otwierania okna konsoli, w którym można to poprawnie wyświetlić.
F. Hauri

Odpowiedzi:

4

GolfScript (90 znaków)

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

Wiele z tego dotyczy manipulacji tablicami poszarpanymi. Paskudny przypadek testowy:

xx
xxx
xxx
xx
x

zawiera 3 różne siatki 2x2 z tylko jedną z 4 komórek zawierających w ogóle dowolny znak.

Co gorsza, ziptranspozycja podzielenia kolumn na pary daje taki sam wynik dla ["xx" "xxx"]zipi ["xxx" "xx"]zip. Dlatego zaczynam od wypełnienia, aby upewnić się, że wszystkie linie mają tę samą parzystą długość i że jest parzysta liczba linii.

Zauważ, że ten program zakłada, że ​​interpreter będzie traktował „▗▖▄▝▐▞▟▘▚▌▙▀▜▛█” jako ciąg o długości 48, mimo że zgodnie z instrukcjami w pytaniu liczę go jako 16 znaków plus ograniczniki.

Przetestowałem to najlepiej, jak potrafiłem, ale nie mogę znaleźć czcionki o jednolitej przestrzeni, która właściwie renderuje te znaki.

Peter Taylor
źródło
Twój kod wydaje się zawodzić przy drugim teście, z sercem ... Ale miło! Daj +1 jako pierwszy!
F. Hauri
1
Hmm Nie mam tendencji do używania zipna poszarpanych tablicach i jestem dość zaskoczony tym, co wydaje się robić na np ["##" "###"]. Będę musiał przemyśleć moje podejście.
Peter Taylor
Freemono, Unifont, Code2000 i Fixedsys Excelsior wszystkie poprawnie renderują te znaki.
primo
@primo, Unifont nie jest wcale monospac na tych postaciach. Fixedsys Excelsior też nie jest całkiem poprawny, ale jest wystarczająco blisko.
Peter Taylor
Tak! teraz masz to! Mała uwaga: na końcu wyjścia znajdują się dwie puste linie. To nie łamie żadnej zasady! (Uwaga: punktacja jest nieco zmieniona, możesz zaoszczędzić 10 punktów ;-)
F. Hauri
1

Perl 6 , 159 znaków (192 bajty)

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

Wypróbuj online!

bb94
źródło
Naprawiłem moje rozwiązanie.
bb94
1
143 znaki
Jo King
0

Bash (203 znaków)

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

lub

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
źródło
0

Perl (268 znaków)

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

lub

#!/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
źródło