Reduzieren Sie Ascii art

10

Diese Herausforderung ist eine Paste Cut'n aus Vergrößern ASCII - Art , sondern umgekehrt , mit PETSCII basierten Halbblock Zeichen:

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

Das Ziel ist es also, durch 1/2eingereichte ASCII zu reduzieren . Zum Beispiel aus der Zeichenfolge:

 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      

Sie müssen rendern:

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

(oder auch:

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

;-);

oder wo Rohrleitungen:

wget -O - /codegolf//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
             ]])})

könnte geben:

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

Einige Beispiele:

asciiReduce sample

Mit (ungefähr) gleichen Regeln:

  • Eingabe von STDIN oder Datei
  • Jedes eingereichte Zeichen muss dargestellt werden, nur Leerzeichen müssen leer bleiben .
  • Dies ist auch , also gewinnt die niedrigste Punktzahl. Die Punktzahl wird berechnet als:
    • +1von Zeichen, wird gezählt in Zeichen, nicht in Bytes dh: s=' ▝▘▀▗▐▚▜▖▞▌▛▄▟▙█'Zählen 20 Zeichen, nicht 52 !!
    • -10 zur Erklärung;
    • +20 zur Verwendung eines externen Schriftwerkzeugs oder einer externen Bibliothek.
F. Hauri
quelle
Zur Verdeutlichung: Das Eingabebild ist in 2x2 Quadrate unterteilt und jedes auf ein Zeichen abgebildet?
Peter Taylor
1
-0,5 für das Hinzufügen seltsamer Boni (Erklärung definieren) - nach dem Runden noch eine Gegenstimme. Auch dies ist dann Code-Challenge und nicht Code-Golf.
Howard
Die meisten dieser Zeichen werden in meinem Browser nicht korrekt wiedergegeben. :(
Victor Stafusa
Unter meinem Linux xterm -xrm 'XTerm*renderFont:false' &öffne ich ein Konsolenfenster, in dem dies richtig angezeigt werden kann.
F. Hauri

Antworten:

4

GolfScript (90 Zeichen)

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

Ein Großteil davon entfällt auf den Umgang mit zerlumpten Arrays. Böser Testfall:

xx
xxx
xxx
xx
x

enthält 3 verschiedene 2x2-Gitter, wobei nur eine der 4 Zellen überhaupt ein Zeichen enthält.

Um die Sache noch schlimmer zu machen, liefert diezip Transposition, um die Spalten in Paare zu zerlegen, die gleiche Ausgabe für ["xx" "xxx"]zipund ["xxx" "xx"]zip. Ich beginne daher mit dem Auffüllen, um sicherzustellen, dass alle Zeilen die gleiche gerade Länge haben und dass es eine gerade Anzahl von Zeilen gibt.

Beachten Sie, dass dieses Programm davon ausgeht, dass der Interpreter "▗▖▄▝▐▞▟▘▚▌▙▀▜▛█" als Zeichenfolge mit der Länge 48 behandelt, obwohl ich es gemäß den Anweisungen in der Frage als 16 Zeichen zähle plus Trennzeichen.

Ich habe dies nach besten Kräften getestet, aber ich kann keine Monospace-Schriftart finden, die diese Zeichen tatsächlich korrekt wiedergibt.

Peter Taylor
quelle
Ihr Code scheint beim zweiten Test mit dem Herzen fehlgeschlagen zu sein ... Aber schön! +1 als du der 1. bist!
F. Hauri
1
Hmm. Ich neige nicht dazu, zipauf zerlumpten Arrays zu verwenden, und ich bin ziemlich überrascht, was es auf z ["##" "###"]. Ich werde meinen Ansatz überdenken müssen.
Peter Taylor
Freemono, Unifont, Code2000 und Fixedsys Excelsior rendern diese Zeichen korrekt.
Primo
@primo, Unifont ist bei diesen Charakteren bei weitem nicht monospaced. Fixedsys Excelsior ist auch nicht ganz richtig, aber es ist nah genug.
Peter Taylor
Ja! jetzt hast du es! Kleine Bemerkung: Am Ende der Ausgabe befinden sich zwei leere Zeilen. Dies verstößt nicht gegen eine Regel! (Hinweis: Die Wertung ist etwas geändert, Sie können 10 Punkte sparen ;-)
F. Hauri
1

Perl 6 , 159 Zeichen (192 Bytes)

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

Probieren Sie es online aus!

bb94
quelle
Meine Lösung wurde behoben.
bb94
1
143 Zeichen
Jo King
0

Bash (203 Zeichen)

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

oder

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

Perl (268 Zeichen)

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

oder

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