Reduzir a arte Ascii

10

Esse desafio é uma pasta recortada da arte Ampliar ASCII , mas revertida , usando caracteres de meio bloco baseados em PetSCII :

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

Portanto, o objetivo é reduzir com 1/2 submetido . Por exemplo, da 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      

você precisa renderizar:

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

(ou até:

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

;-)

ou onde a tubulação:

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

poderia dar:

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

Algumas amostras:

amostra asciiReduce

Com (aproximadamente) as mesmas regras:

  • Entrada de STDIN ou arquivo
  • Cada caractere enviado deve ser representado, apenas os espaços em branco precisam permanecer vazios .
  • Isso também é , então a menor pontuação ganha. A pontuação é calculada como:
    • +1por caracteres, para ser contado em caracteres, não em bytes, ou seja: s=' ▝▘▀▗▐▚▜▖▞▌▛▄▟▙█'contar 20 caracteres, não 52 !!
    • -10 para explicação;
    • +20 para uso de ferramenta ou biblioteca de fontes externas.
F. Hauri
fonte
Então, para esclarecer: a imagem de entrada é dividida em quadrados 2x2 e cada um é mapeado em um caractere?
Peter Taylor
11
-0,5 por adicionar bônus estranhos (definir explicação) - depois de arredondar ainda um voto positivo. Além disso, isso é um desafio de código e não um código de golfe.
Howard
A maioria desses caracteres não é renderizada corretamente no meu navegador. :(
Victor Stafusa
No meu Linux, eu uso xterm -xrm 'XTerm*renderFont:false' &para abrir uma janela do console capaz de exibir isso corretamente.
F. Hauri 30/01

Respostas:

4

GolfScript (90 caracteres)

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

Muito disso vai para o tratamento de matrizes irregulares. Caso de teste desagradável:

xx
xxx
xxx
xx
x

contém três grades 2x2 diferentes, com apenas uma das 4 células contendo qualquer caractere.

Para piorar as coisas, a ziptransposição para cortar as colunas em pares fornece a mesma saída para ["xx" "xxx"]zipe ["xxx" "xx"]zip. Portanto, começo preenchendo para garantir que todas as linhas tenham o mesmo comprimento par e que haja um número par de linhas.

Observe que este programa assume que o intérprete tratará "▗▖▄▝▐▞▟▘▚▌▙▀▜▛█" como uma sequência de comprimento 48, mesmo que, de acordo com as instruções da pergunta, eu esteja contando como 16 caracteres mais delimitadores.

Eu testei isso da melhor maneira possível, mas não consigo encontrar uma fonte monoespaçada que realmente renderize esses caracteres corretamente.

Peter Taylor
fonte
Seu código parece falhar no segundo teste, com o coração ... Mas bom! +1 como você é o primeiro!
F. Hauri 29/01
11
Hmm. Eu não costumo usar zipem matrizes irregulares e estou bastante surpreso com o que parece fazer, por exemplo ["##" "###"]. Vou ter que repensar minha abordagem.
Peter Taylor
Freemono, Unifont, Code2000 e Fixedsys Excelsior processam esses caracteres corretamente.
Primo
@primo, Unifont não está nem perto do espaço entre esses personagens. O Fixedsys Excelsior também não está correto, mas está próximo o suficiente.
Peter Taylor
Sim! agora você tem! Pequena observação: existem duas linhas vazias no final da saída. Isso não quebra nenhuma regra! (Nota: pontuação é um pouco mudou, você pode economizar 10 pontos ;-)
F. da Hauri
1

Perl 6 , 159 caracteres (192 bytes)

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

Experimente online!

bb94
fonte
Corrigida minha solução.
BB94
11
143 caracteres
Jo rei
0

Bash (203 caracteres)

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

ou

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
fonte
0

Perl (268 caracteres)

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

ou

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