Reduce el arte Ascii

10

Este desafío es un corte y pegado del arte Ampliar ASCII , pero se invierte , utilizando caracteres de medio bloque basados ​​en PetSCII :

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

Por lo tanto, el objetivo es reducir 1/2presentando . Para muestra, de la cadena:

 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      

tienes que renderizar:

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

(o incluso:

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

;-)

o donde la tubería:

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

podria dar:

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

Algunas muestras:

Reducir muestra

Con (aproximadamente) las mismas reglas:

  • Entrada de STDIN o archivo
  • Cada carácter enviado debe estar representado, solo los espacios en blanco deben estar vacíos .
  • Este también es el , por lo que gana el puntaje más bajo. La puntuación se calcula como:
    • +1por caracteres, para ser contados en caracteres, no en bytes, es decir: ¡ s=' ▝▘▀▗▐▚▜▖▞▌▛▄▟▙█'contar 20 caracteres, no 52 !
    • -10 para explicacion;
    • +20 para uso de herramienta de fuente externa o biblioteca.
F. Hauri
fuente
Entonces, para aclarar: ¿la imagen de entrada se divide en cuadrados de 2x2 y cada uno se asigna a un carácter?
Peter Taylor
1
-0.5 por agregar bonos extraños (definir explicación) - después de redondear todavía un voto a favor. Además, esto es código-desafío y no código-golf.
Howard
La mayoría de estos caracteres no se muestran correctamente en mi navegador. :(
Victor Stafusa
Debajo de Linux, uso xterm -xrm 'XTerm*renderFont:false' &para abrir una ventana de consola capaz de mostrar esto correctamente.
F. Hauri

Respuestas:

4

GolfScript (90 caracteres)

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

Mucho de esto va al manejo de matrices irregulares. Caso de prueba desagradable:

xx
xxx
xxx
xx
x

contiene 3 cuadrículas 2x2 diferentes con solo una de las 4 celdas que contienen cualquier carácter.

Para empeorar las cosas, la ziptransposición para cortar las columnas en pares da la misma salida para ["xx" "xxx"]zipy ["xxx" "xx"]zip. Por lo tanto, comienzo rellenando para garantizar que todas las líneas tengan la misma longitud par y que haya un número par de líneas.

Tenga en cuenta que este programa asume que el intérprete tratará "▗▖▄▝▐▞▟▘▚▌▙▀▜▛█" como una cadena de longitud 48, aunque según las instrucciones de la pregunta lo cuento como 16 caracteres más delimitadores.

He probado esto lo mejor que he podido, pero no puedo encontrar una fuente monoespacio que realmente represente esos caracteres correctamente.

Peter Taylor
fuente
Su código parece fallar en la segunda prueba, con el corazón ... ¡Pero bueno! ¡+1 como eres el primero!
F. Hauri
1
Hmm No suelo usarlos zipen matrices irregulares, y estoy bastante sorprendido por lo que parece hacer, por ejemplo ["##" "###"]. Voy a tener que repensar mi enfoque.
Peter Taylor
Freemono, Unifont, Code2000 y Fixedsys Excelsior representan estos caracteres correctamente.
primo
@primo, Unifont no está ni cerca del monoespacio en esos personajes. Fixedsys Excelsior tampoco es del todo correcto, pero está lo suficientemente cerca.
Peter Taylor
¡Si! ahora lo tienes! Pequeña observación: hay dos líneas vacías al final de la salida. ¡Esto no rompe ninguna regla! (Nota: la puntuación ha cambiado un poco, puede ahorrar 10 puntos ;-)
F. 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}}

Pruébalo en línea!

bb94
fuente
Arreglado mi solución.
bb94
1
143 caracteres
Jo King
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

o

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

o

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