Réduire l'art ascii

10

Ce défi est un couper-coller de l'art Agrandir ASCII , mais inversé , en utilisant des caractères de demi-bloc basés sur PetSCII :

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

Le but est donc de réduire par l' 1/2 soumis . Par exemple, à partir de la chaîne:

 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      

vous devez rendre:

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

(ou même:

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

;-)

ou lorsque la tuyauterie:

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

pourrait donner:

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

Certains échantillons:

asciiRéduire l'échantillon

Avec (approximativement) les mêmes règles:

  • Entrée depuis STDIN ou fichier
  • Chaque caractère soumis doit être représenté, seuls les espaces blancs doivent rester vides .
  • C'est aussi du , donc le score le plus bas l'emporte. Le score est calculé comme suit:
    • +1par caractères, à compter en caractères, pas en octets, c'est-à-dire: s=' ▝▘▀▗▐▚▜▖▞▌▛▄▟▙█'compter 20 caractères, pas 52 !!
    • -10 pour explication;
    • +20 pour l'utilisation d'un outil ou d'une bibliothèque de polices externes.
F. Hauri
la source
Donc, pour clarifier: l'image d'entrée est divisée en carrés 2x2 et chaque carte sur un caractère?
Peter Taylor
1
-0,5 pour l'ajout de bonus étranges (définissez l'explication) - après avoir arrondi toujours un vote positif. C'est aussi du code-challenge et non du code-golf.
Howard
La plupart de ces caractères ne s'affichent pas correctement dans mon navigateur. :(
Victor Stafusa
Sous mon Linux, j'utilise xterm -xrm 'XTerm*renderFont:false' &pour ouvrir une fenêtre de console capable de l'afficher correctement.
F.Hauri

Réponses:

4

GolfScript (90 caractères)

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

Une grande partie de cela va à la gestion des tableaux en lambeaux. Cas de test méchant:

xx
xxx
xxx
xx
x

contient 3 grilles 2x2 différentes avec une seule des 4 cellules contenant n'importe quel caractère.

Pour aggraver les choses, la ziptransposition pour couper les colonnes en paires donne la même sortie pour ["xx" "xxx"]zipet ["xxx" "xx"]zip. Je commence donc par un remplissage pour m'assurer que toutes les lignes sont de même longueur uniforme et qu'il y a un nombre pair de lignes.

Notez que ce programme suppose que l'interprète traitera "▗▖▄▝▐▞▟▘▚▌▙▀▜▛█" comme une chaîne de longueur 48, même si selon les instructions de la question, je le compte comme 16 caractères plus les délimiteurs.

J'ai testé cela au mieux de mes capacités, mais je ne trouve pas de police monospace qui rend ces caractères correctement.

Peter Taylor
la source
Votre code semble échouer au deuxième test, avec le coeur ... Mais sympa! +1 comme vous êtes le 1er!
F.Hauri
1
Hmm. Je n'ai pas tendance à utiliser zipsur des tableaux en lambeaux, et je suis assez surpris par ce qu'il semble faire, par exemple ["##" "###"]. Je vais devoir repenser mon approche.
Peter Taylor
Freemono, Unifont, Code2000 et Fixedsys Excelsior rendent tous ces caractères correctement.
primo
@primo, Unifont est loin d'être monospace sur ces personnages. Fixedsys Excelsior n'est pas tout à fait correct non plus, mais il est assez proche.
Peter Taylor
Oui! maintenant vous l'avez! Petite remarque: il y a deux lignes vides en fin de sortie. Cela n'enfreint aucune règle! (Remarque: le score est un peu changé, vous pouvez économiser 10 points ;-)
F. Hauri
1

Perl 6 , 159 caractères (192 octets)

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

Essayez-le en ligne!

bb94
la source
Correction de ma solution.
bb94
1
143 caractères
Jo King
0

Bash (203 caractères)

#!/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
la source
0

Perl (268 caractères)

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