Антизгладжування ASCII ст


33

Фон

Мистецтво ASCII - це практика створення зображень, використовуючи текст ASCII для формування фігур.

Згладжування - це ефект, створений великими «пікселями» мистецтва ASCII, розміром із символів. Зображення стає блокуючим і важко помітним. Антизгладжування знімає цей ефект, створюючи градієнт і пом’якшуючи жорсткі краї мистецтва ASCII.

Змагання

Ваше завдання полягає в тому, щоб написати найкоротшу можливу програму, яка займе частинку мистецтва ASCII і виведе версію, яка була анти-псевдонім.

Що це за анти-згладжування?

Все мистецтво ASCII буде складатися з двох типів символів: Пробіли та пробіли. Для кожного непробільного символу ваша програма повинна визначити, чи перебуває він у такому положенні, де його потрібно антиаліас. Якщо це так, то вам потрібно замінити його правильним символом. Якщо ні, то персонаж залишається таким же.

Звідки ви знаєте, чи потрібно персонажу бути анти-псевдонімом? Відповідь залежить від символів, які знаходяться безпосередньо вгорі, внизу, ліворуч та праворуч від символу ( не діагоналі ). Ось діаграма, коли потрібно згладжування, де ?і xможе стояти будь-який символ, що не має пробілів.

 x? ->  d?
 ?      ? 


?x  -> ?b 
 ?      ? 

 ?      ? 
?x  -> ?F 


 ?      ? 
 x? ->  Y?



 x  ->  ;   Note: This character has been changed from _ to ;
 ?      ? 

 ?      ? 
 x  ->  V 



?x  -> ?> 



 x? ->  <?



 x  ->  @ 

Введення даних (та приклад попереднього згладжування ASCII art)

По-перше, буде два рядки введення (до STDIN), число H, а потім число W. Потім буде H рядків з точністю W символів кожен (виключаючи новий рядок). Ці наступні рядки стануть мистецтвом ASCII, яке потрібно антизадачно. Ось приклад введення (не красивий, але тестовий):

7
9
  888888 
 888888  
999 98  7
 666666  
  666666 
   6666  
    6    

Вихідні дані (і приклад антизаданого мистецтва)

Ваша програма повинна виводити STDOUT на ASCII мистецтво (тих же розмірів), яке було анти-псевдонімом. Ось вихід для вищевказаного входу. Зауважте, як символи кордону трактуються як пробіли, що межують.

  d8888> 
 d8888F  
<99 98  @
 Y6666b  
  Y6666> 
   Y66F  
    V    

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

Ще один приклад

Вхідні дані

12
18
   xx  xxx  xxx   
  xxxx  xxx  xxx  
 xxxxxx  xxx  xxx 
xxx  xxx  xxx  xxx
xxxx xxx  xxx  xxx
 xxxxxx  xxx  xxx 
  xxxx  xxx  xxx  
x  xx  xxx  xxx  x
xx    xxx  xxx  xx
xxx  xxx  xxx  xxx
xxxx  xxx  xxx  xx
xxxxx  xxx  xxx  x

Вихідні дані

   db  <xb  <xb   
  dxxb  Yxb  Yxb  
 dxxxxb  Yxb  Yxb 
dxx  xxb  xxb  xxb
Yxxb xxF  xxF  xxF
 YxxxxF  dxF  dxF 
  YxxF  dxF  dxF  
;  YF  dxF  dxF  ;
xb    dxF  dxF  dx
xxb  <xF  <xF  <xx
xxxb  Yxb  Yxb  Yx
Yxxx>  Yx>  Yx>  V

Правила, обмеження та примітки

Ваша програма повинна бути написана лише символами для друку ASCII, щоб ми могли робити мистецтво з програм. Крім цього, застосовуються стандартні правила коду-гольфу.


Оскільки відповідей поки немає, я змінив один символ у діаграмі протизшивання. _стала ;тому, що вона працює краще.
PhiNotPi

Це може бути моїм улюбленим кодом питання про гольф усіх часів. Працюю як 4 різні дивовижні рішення.
captncraig

Хоча я розгублений. Ви кажете, що діагоналі не враховуються, але всі ваші діаграми містять знаки питання, що заповнюють діагоналі. З того, що я бачу в прикладах, може бути безпечним лише дивитися в сторони, але я плутаюся? Чи мають значення діагоналі?
captncraig

Ні, діагоналі ніколи не мають значення. Напевно, буде зрозуміліше, якщо я вилучив діаграми з діаграми.
PhiNotPi

Я думаю, що у вашому прикладі може бути помилка друку; Я вважаю, що у правій колонці має бути Ys на внутрішньому краї. Радує, що придумав відповідь на цей, хороший запитання: D
Ед Джеймс

Відповіді:


8

Рубі, 180 168 символів

gets
w=1+gets.to_i
f=*(readlines*"").chars
f.zip(f[1..-1]+s=[" "],s+f,s*w+f,f[w..-1]+s*w){|a,*b|$><<"@;V#{a}>bF#{a}<dY#{a*5}"[a>" "?(b.map{|y|y>" "?1:0}*"").to_i(2):3]}

Ще одна реалізація Ruby, яка використовує zip-підхід. Ви можете побачити другий приклад роботи в Інтернеті .

Редагувати: Використовуючи readlinesзбереження 12 символів.


6

Рубін 275 265 263 261 258 254 244 243 214 212 207

H=0...gets.to_i
W=0...gets.to_i
G=readlines
z=->x,y{(H===y&&W===x&&' '!=G[y][x])?1:0}
H.map{|j|W.map{|i|l=G[j][i]
G[j][i]="@V;#{l}>Fb#{l}<Yd#{l*5}"[z[i+1,j]*8+z[i-1,j]*4+z[i,j+1]*2+z[i,j-1]]if' '!=l}}
puts G

Зразок 1: http://ideone.com/PfNMA

Зразок 2: http://ideone.com/sWijD


1) Парентези навколо визначення діапазону не потрібні. 2) 0..h-1можна записати як 0...h. 3) G=[];h.times{G<<gets}можна записати так G=readlinesсамо, як у вашому C # коді. 4) Після кроку 3. змінна h стає марною, значення h і w використовуються лише один раз, тому h=gets.to_i;w=gets.to_i;H=(0..h-1);W=(0..w-1)можна записати як H=0...gets.to_i;W=0...gets.to_i. 5) У цьому випадку andможна записати як &&, що не потребує пробілів навколо. 6) у вас є зайвий; і ви порахували новий рядок в кінці файлу, які не потрібні. Це означає 214 символів: ideone.com/CiW0l
manatwork

Нічого, дякую! Я знав, що слід вдосконалити, але ніколи не думав, що їх буде багато. Я намагався, H=0..gets.to_iколи писав код, але, схоже, це не спрацювало (очевидно, це було з інших причин).
Крістіан Лупаску

1
Ще два пункти, де можна зменшити щонайменше на 7 знаків: 1) Ви можете використовувати mapзамість each2) z=->...замість def z...end.
Говард

@Howard Спасибі, я застосував mapзамість eachзміни. Однак для синтаксису лямбда я думаю, що це вимагає замість того , щоб звички zбули такою формою , тим самим додаючи трохи до числа символів. Будь ласка, дайте мені знати, якщо я щось пропускаю. z.call(args)z(args)
Крістіан Лупаску

@Howard Nevermind, я щойно дізнався, чого мені не вистачає. Я оновлю, щоб використовувати лямбда []використання.
Крістіан Лупаску

4

Javascript, 410 символів:

function(t){m={"10110":"b","11100":"d","01101":"Y","00111":"F","10100":";","00101":"V","00110":">","01100":"<","00100":"@"},d="join",l="length",t=t.split('\n').splice(2),t=t.map(function(x)x.split('')),f=function(i,j)t[i]?(t[i][j]||' ')==' '?0:1:0;for(o=t[l];o--;){for(p=t[o][l];p--;){y=[f(o+1,p),f(o,p+1),f(o,p),f(o,p-1),f(o-1,p)],t[o][p]=m[y[d]('')]||t[o][p]}}t=t.map(function(x)x[d](''))[d]('\n');return t;}

неозорений:

function(t){
    m={
        "10110":"b",
        "11100":"d",
        "01101":"Y",
        "00111":"F",
        "10100":";",
        "00101":"V",
        "00110":">",
        "01100":"<",
        "00100":"@"
    },
    d="join",
    l="length",
    t=t.split('\n').splice(2),
    t=t.map(function(x) x.split('')),
    f=function(i,j) t[i]?(t[i][j]||' ')==' '?0:1:0;

    for(o=t[l];o--;){
        for(p=t[o][l];p--;){
            y=[f(o+1,p),f(o,p+1),f(o,p),f(o,p-1),f(o-1,p)],

            t[o][p]=m[y[d]('')]||t[o][p]
        }
    }
    t=t.map(function(x)x[d](''))[d]('\n');
    return t;
}

Оригінал, 440 символів:

function (t){m={"10110":"b","11100":"d","01101":"Y","00111":"F","10100":";","00101":"V","00110":">","01100":"<","00100":"@"},s="split",d="join",l="length",t=t[s]('\n').splice(2),t=t.map(function(x) x[s]('')),f=function(i,j)i<0||i>=t[l]?0:(j<0||j>=t[i][l]?0:t[i][j]==' '?0:1);for(o=t[l];o--;){for(p=t[o][l];p--;){y=[f(o+1,p),f(o,p+1),f(o,p),f(o,p-1),f(o-1,p)],h=m[y[d]('')];if(h){t[o][p]=h}}}t=t.map(function(x) x[d](''))[d]('\n');return t;}

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


1
Замінити декларацію м до m={22:"b",28:"d",13:"Y",7:"F",20:";",5:"V",6:">",12:"<",4:"@"}підрядковий потім перетворіть м з parseInt(): m[parseInt(y[d](''),2)]. Це зменшує розмір до 373 символів.
манатура

3

Пітон, 259 символів

H=input()
W=input()+1
I=' '.join(raw_input()for i in' '*H)
for i in range(H):print''.join(map(lambda(s,a,b,c,d):(s*5+'dY<'+s+'bF>'+s+';V@'+' '*16)[16*(s==' ')+8*(a==' ')+4*(b==' ')+2*(c==' ')+(d==' ')],zip(I,I[1:]+' ',' '+I,I[W:]+' '*W,' '*W+I))[i*W:i*W+W-1])

Програма зчитує введення в один рядок I(з пробілами, що розділяють рядки), створює список із 5-кортежів, що містять символ та чотири навколишніх його символи, після чого шукає символ результату за допомогою рядкової індексації.


3

PHP - 359 330 282 268 257 символів

<?php
$i=fgets(STDIN)+0;$w=fgets(STDIN)+1;$s='';$m='@<;d>0b0VY00F000';
for(;$i--;)$s.=fgets(STDIN);
for(;++$i<strlen($s);){
$b=trim($s[$i])?0:15;
foreach(array($i+1,$i+$w,$i-1,$i-$w)as$k=>$x)
$b|=pow(2,$k)*(isset($s[$x])&&trim($s[$x]));
echo $m[$b]?$m[$b]:$s[$i];}

@PhiNotPi Це не спрацювало, оскільки мої локально збережені тестові файли мали EOL у стилі Windows \r\n. Я оновив свій код для роботи з EOL-стилем Unix \n.
Расті Фаусак

Гаразд, це, здається, працює зараз.
PhiNotPi

2

Пітона, 246 241

H=input();W=1+input()
S=' '
o=W*S
F=o+'\n'.join((raw_input()+o)[:W-1]for k in range(H))+o
print ''.join((16*x+'@;<d>b'+2*x+'V'+x+'Y'+x+'F'+3*x)[
16*(x>S)|8*(a>S)|4*(l>S)|2*(r>S)|(b>S)]for
x,a,l,r,b in zip(F[W:-W],F,F[W-1:],F[W+1:],F[2*W:]))

WC і випробування на зразку 2, що відрізняється виведенням розчину Ruby вгорі:

t:~$ wc trans.py && python trans.py < lala2 > o && diff -q o ruby_out2_sample
  2 11 241 trans.py
t:~$

1

С # 591 563

string A(string t){var s=new StringReader(t);var h=int.Parse(s.ReadLine());var w=int.Parse(s.ReadLine());var lines=s.ReadToEnd().Split(new[]{"\r\n"},StringSplitOptions.None).Select(x=>x.ToCharArray()).ToArray();for(var i=0;i<h;i++)for(var j=0;j<w;j++){var c=lines[i][j];if(c==' ')continue;var n=(i>0?(lines[i-1][j]!=' '?1:0):0)+(i<h-1?(lines[i+1][j]!=' '?2:0):0)+(j>0?(lines[i][j-1]!=' '?4:0):0)+(j<w-1?(lines[i][j+1]!=' '?8:0):0);lines[i][j]=new[]{'@','V',';',c,'>','F','b',c,'<','Y','d',c,c,c,c,c}[n];}return string.Join("\r\n",lines.Select(l=>new string(l)));}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.