Зменшити мистецтво Ассі


10

Це завдання є cut'n паста з Збільшити ASCII мистецтва , але зворотна , використовуючи 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 для використання зовнішнього інструмента шрифту або бібліотеки.

Отже, щоб уточнити: вхідне зображення поділено на 2х2 квадрати, і кожне відображення на один символ?
Пітер Тейлор

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 різні сітки 2x2 із лише однією з 4 комірок, що містять будь-який символ.

Що ще гірше, zipперенесення для подрібнення стовпців на пари дає однаковий результат для ["xx" "xxx"]zipі ["xxx" "xx"]zip. Тому я починаю з прокладки, щоб гарантувати, що всі лінії однакової рівної довжини і що є рівномірна кількість рядків.

Зауважте, що ця програма передбачає, що інтерпретатор буде розглядати "▗▖▄▝▐▞▟▘▚▌▙▀▜▛█" як рядок довжиною 48, хоча, згідно з інструкціями у питанні, я рахую це як 16 символів плюс роздільники.

Я перевірив це якнайкраще, але не можу знайти шрифт монопростіру, який фактично відображає ці символи правильно.


Ваш код здається невдалим на другому тесті серцем ... Але приємно! +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.