การลบรอยหยัก ASCII art


33

พื้นหลัง

ศิลปะ ASCII คือการฝึกฝนการสร้างภาพโดยใช้ข้อความ ASCII เพื่อสร้างรูปร่าง

นามแฝงคือเอฟเฟกต์ที่สร้างขึ้นโดย "พิกเซล" ขนาดใหญ่ของ ASCII art ซึ่งเป็นขนาดของตัวอักษร ภาพจะปิดกั้นและมองเห็นได้ยาก Anti-aliasing จะลบเอฟเฟกต์นี้โดยสร้างการไล่ระดับสีและทำให้ขอบแข็งของ ASCII อ่อนลง

ความท้าทาย

ความท้าทายของคุณคือการเขียนโปรแกรมที่สั้นที่สุดเท่าที่จะเป็นไปได้ซึ่งเป็นส่วนหนึ่งของ ASCII art และจะแสดงผลเวอร์ชันที่ต่อต้านนามแฝง

การต่อต้านนามแฝงประเภทใด

ศิลปะ 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)

ก่อนอื่นจะมีอินพุตสองบรรทัด (ถึง STDIN), หมายเลข H ตามด้วยหมายเลข W จากนั้นจะมีบรรทัด H ของอักขระ W แต่ละตัว (ยกเว้นบรรทัดใหม่) บรรทัดต่อไปนี้จะเป็นศิลปะ ASCII ที่ต้องมีการต่อต้านนามแฝง นี่คือตัวอย่างการป้อนข้อมูล (ไม่ใช่ความสวยงาม แต่เป็นการทดสอบ):

7
9
  888888 
 888888  
999 98  7
 666666  
  666666 
   6666  
    6    

เอาท์พุท (และตัวอย่างศิลปะต่อต้านนามแฝง)

โปรแกรมของคุณควรส่งออกไปยัง STDOUT art 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
Ed James

คำตอบ:


8

Ruby, 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...h3) G=[];h.times{G<<gets}สามารถเขียนได้เช่นG=readlinesเดียวกับในรหัส C # ของคุณ 4) หลังจากขั้นตอนที่ 3 ตัวแปรชั่วโมงจะกลายเป็นไร้ประโยชน์ชั่วโมงและ 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_i5) ในกรณีนี้andสามารถเขียนเป็น&&ซึ่งไม่ต้องการช่องว่างรอบ ๆ 6) คุณมีสิ่งพิเศษ; และคุณนับบรรทัดใหม่เมื่อสิ้นสุดไฟล์ซึ่งไม่จำเป็น นี่หมายถึง 214 ตัวอักษร: ideone.com/CiW0l
จัดการ

ว้าวขอบคุณ! ผมรู้ว่ามีการปรับปรุงที่จะทำอยู่ แต่ไม่เคยคิดว่ามีที่หลาย ๆ ฉันได้ลองH=0..gets.to_iเมื่อฉันเขียนโค้ด แต่ดูเหมือนจะไม่ทำงาน (เห็นได้ชัดว่ามันต้องเป็นเพราะเหตุผลอื่น)
Cristian Lupascu

1
ยังคงเป็นสองจุดที่คุณสามารถลดลงอย่างน้อย 7 ตัวอักษร: 1) คุณสามารถใช้mapแทนeach2) แทนz=->... def z...end
Howard

@Howard ขอบคุณฉันได้ใช้mapแทนการeachเปลี่ยนแปลง อย่างไรก็ตามสำหรับแลมบ์ดาไวยากรณ์ฉันคิดว่ามันจะต้องใช้วิธีการที่จะต้องzอยู่ในรูปแบบz.call(args)แทนที่จะเป็นz(args)ดังนั้นจึงเป็นการเพิ่มจำนวนเล็กน้อยให้กับจำนวนอักขระ โปรดแจ้งให้เราทราบหากฉันทำอะไรหาย
Cristian Lupascu

@ วิธีไม่เป็นไรฉันเพิ่งค้นพบสิ่งที่ฉันหายไป ฉันจะปรับปรุงการใช้แลมบ์ดา[]การใช้งาน
Cristian Lupascu

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;}

ungolfed:

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

Python 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 tuples ที่มีอักขระและอักขระล้อมรอบสี่ตัวจากนั้นค้นหาอักขระผลลัพธ์โดยใช้การจัดทำดัชนีสตริง


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 มันก็ไม่ได้ทำงานเพราะไฟล์ที่บันทึกไว้ในการทดสอบของฉันมีหน้าต่างสไตล์ \r\nEOL ฉันปรับปรุงรหัสของฉันที่จะทำงานร่วมกับ \nEOL
Fausak Rusty

ตกลงดูเหมือนว่าจะทำงานตอนนี้
PhiNotPi

2

Python, 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

C # 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)));}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.