Уменьшить искусство Ascii


10

Эта задача представляет собой вырезанную пасту из Enlarge ASCII art , но ее можно изменить , используя PetSCII на основе половинного блока символов:

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

Таким образом, цель состоит в том, чтобы уменьшить 1/2 помощью . Например, из строки:

 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      

Вы должны сделать:

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

(или даже:

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

;-)

или где трубопровод:

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

мог бы дать:

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

Некоторые образцы:

образец asciiReduce

С (примерно) такими же правилами:

  • Ввод из STDIN или файла
  • Каждый подчиненный символ должен быть представлен, только пробелы должны оставаться пустыми .
  • Это тоже , так что выиграл самый низкий балл. Оценка рассчитывается как:
    • +1по символам, для подсчета в символах, а не в байтах, т.е.: s=' ▝▘▀▗▐▚▜▖▞▌▛▄▟▙█'считать 20 символов, а не 52 !!
    • -10 для объяснения;
    • +20 для использования внешнего инструмента шрифта или библиотеки.

Итак, чтобы уточнить: входное изображение делится на квадраты 2x2, и каждый отображается на один символ?
Питер Тейлор

1
-0,5 для добавления странных бонусов (определить объяснение) - после округления все еще повышающий голос. Кроме того, это вызов кода, а не код-гольф.
Говард

Большинство из этих символов не отображается правильно в моем браузере. :(
Виктор Стафуса

Под моим Linux я использую, xterm -xrm 'XTerm*renderFont:false' &чтобы открыть окно консоли, способное отобразить это правильно.
Ф. Хаури

Ответы:


4

GolfScript (90 символов)

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

Многое из этого идет на обработку рваных массивов. Неприятный тестовый кейс:

xx
xxx
xxx
xx
x

содержит 3 разных сетки 2х2, и только в одной из 4 ячеек содержится какой-либо персонаж.

Что еще хуже, zipтранспонирование для разделения столбцов на пары дает одинаковый результат для ["xx" "xxx"]zipи ["xxx" "xx"]zip. Поэтому я начинаю с дополнения, чтобы убедиться, что все строки имеют одинаковую четную длину и что имеется четное количество строк.

Обратите внимание, что эта программа предполагает, что интерпретатор будет обрабатывать «█» как строку длиной 48, хотя согласно инструкциям в вопросе я считаю это 16 символами плюс разделители.

Я проверил это в меру своих возможностей, но не могу найти моноширинный шрифт, который на самом деле правильно отображает эти символы.


Ваш код, кажется, провалился во втором тесте, с сердцем ... Но приятно! +1 как ты 1й!
Ф. Хаури

1
Хм. Я не склонен использовать zipрваные массивы, и я весьма удивлен тем, что он делает, например ["##" "###"]. Я собираюсь переосмыслить свой подход.
Питер Тейлор

Freemono, Unifont, Code2000 и Fixedsys Excelsior все правильно отображают эти символы.
Прим

@primo, Unifont далеко не моноширинно для этих персонажей. Fixedsys Excelsior тоже не совсем корректен, но достаточно близок.
Питер Тейлор

Да! теперь у вас есть это! Небольшое замечание: в конце вывода есть две пустые строки. Это не нарушает никаких правил! (Примечание: оценка немного изменилась, вы можете сэкономить 10 очков ;-)
Ф. Хаури


0

Баш (203 символа)

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

или

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 символов)

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

или

#!/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";
}
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.