Riduci Ascii art


10

Questa sfida è una copia incisa di Enlarge ASCII art , ma invertita , usando caratteri a mezzo blocco basati su PetSCII :

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

Quindi l'obiettivo è di ridurre del 1/2submited . Per esempio, dalla stringa:

 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      

devi rendere:

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

(o anche:

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

;-)

o dove tubazioni:

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

potrebbe dare:

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

Alcuni esempi:

campione asciiReduce

Con (circa) stesse regole:

  • Input da STDIN o file
  • Ogni carattere inviato deve essere rappresentato, solo gli spazi bianchi devono rimanere vuoti .
  • Anche questo è , quindi vince il punteggio più basso. Il punteggio è calcolato come:
    • +1in caratteri, da conteggiare in caratteri, non in byte, ovvero: s=' ▝▘▀▗▐▚▜▖▞▌▛▄▟▙█'contare 20 caratteri, non 52 !!
    • -10 per spiegazione;
    • +20 per l'uso di uno strumento o libreria di font esterni.

Quindi, per chiarire: l'immagine di input è divisa in quadrati 2x2 e ogni mappa su un carattere?
Peter Taylor,

1
-0,5 per l'aggiunta di strani bonus (definire la spiegazione) - dopo aver arrotondato ancora un voto. Anche questo è quindi code-challenge e non code-golf.
Howard,

La maggior parte di questi caratteri non viene visualizzata correttamente nel mio browser. :(
Victor Stafusa,

Sotto il mio Linux, utilizzo xterm -xrm 'XTerm*renderFont:false' &per aprire una finestra della console in grado di visualizzarlo correttamente.
F. Hauri,

Risposte:


4

GolfScript (90 caratteri)

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

Gran parte di questo va nella gestione di array irregolari. Brutto test case:

xx
xxx
xxx
xx
x

contiene 3 diverse griglie 2x2 con solo una delle 4 celle contenenti qualsiasi carattere.

A peggiorare le cose, la ziptrasposizione per tagliare le colonne in coppie fornisce lo stesso output per ["xx" "xxx"]zipe ["xxx" "xx"]zip. Comincio quindi con il riempimento per garantire che tutte le linee abbiano la stessa lunghezza uniforme e che ci sia un numero pari di linee.

Si noti che questo programma presuppone che l'interprete tratterà "▗▖▄▝▐▞▟▘▚▌▙▀▜▛█" come una stringa di lunghezza 48, anche se come da istruzioni nella domanda lo sto contando come 16 caratteri più delimitatori.

Ho provato questo al meglio delle mie capacità, ma non riesco a trovare un carattere monospaziale che renda effettivamente quei caratteri correttamente.


Il tuo codice sembra fallire al secondo test, con il cuore ... Ma bello! +1 come il primo!
F. Hauri,

1
Hmm. Non tendo a usarlo zipsu array irregolari e sono piuttosto sorpreso da ciò che sembra fare ad es ["##" "###"]. Dovrò ripensare il mio approccio.
Peter Taylor,

Freemono, Unifont, Code2000 e Fixedsys Excelsior rendono tutti questi caratteri correttamente.
primo

@primo, Unifont non è da nessuna parte quasi monospazio su quei personaggi. Anche Fixedsys Excelsior non è del tutto corretto, ma è abbastanza vicino.
Peter Taylor,

Sì! ora ce l'hai! Piccola osservazione: ci sono due righe vuote alla fine dell'output. Questo non infrange alcuna regola! (Nota: il punteggio è leggermente cambiato, puoi risparmiare 10 punti ;-)
F. Hauri,

1

Perl 6 , 159 caratteri (192 byte)

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

Provalo online!


Risolto il problema con la mia soluzione.
bb94,


0

Bash (203 caratteri)

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

0

Perl (268 caratteri)

#!/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";
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.