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.

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.


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


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

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";
}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.