หมุนภาพศิลปะ ASCII


17

จากตัวละคร ASCII ทั้งหมดนั้นง่ายที่จะบอกว่าบางคนในกลุ่มนั้นเป็นกลุ่มที่มีการหมุนของตัวละครพื้นฐานเดียวกัน ตัวอย่างเช่นV > ^ <. สิ่งนี้ทำให้สามารถสร้างงานศิลปะ ASCII ที่สามารถหมุนได้ทวีคูณ 90 องศาและยังคงเป็นศิลปะ ASCII

ความท้าทาย

เป้าหมายของคุณคือเล่นกอล์ฟโปรแกรมที่ยอมรับศิลปะ ASCII และจำนวนองศาเพื่อหมุนจาก STDIN และพิมพ์ศิลปะ ASCII ที่หมุนแล้วไปยัง STDOUT

ในบรรทัดแรกของการป้อนข้อมูลโปรแกรมของคุณจะได้รับตัวเลข N ตัวเลขนี้แสดงถึงความกว้างและความสูงของรูปแบบ ASCII

จากนั้นคุณจะได้รับ N บรรทัดจำนวน N อักขระมากขึ้นอย่างแน่นอนแต่ละบรรทัด (ขึ้นบรรทัดใหม่จะไม่นับในจำนวนนี้) ขนาดของศิลปะมักจะเป็นสี่เหลี่ยมจัตุรัสแม้ว่ามันอาจจะมีช่องว่างภายในในรูปแบบของช่องว่างเพื่อให้มันเป็นสี่เหลี่ยม

จากนั้นคุณจะได้รับหนึ่งหมายเลขเพิ่มเติมในบรรทัดสุดท้าย: 90, 180, หรือ 270 ซึ่งแสดงถึงจำนวนองศาของภาพที่หมุนตามเข็มนาฬิกา

หมายเหตุ: รูปภาพที่ป้อนจะมีเฉพาะอักขระที่สามารถหมุนได้ตามจำนวนที่ถูกต้อง หากอินพุตไม่ตรงกับข้อกำหนดเหล่านี้อย่างแน่นอนไม่จำเป็นต้องมีพฤติกรรมที่เฉพาะเจาะจง

โปรแกรมของคุณควรพิมพ์ตัวอักษร N บรรทัด N ตัวโดยมีบรรทัดใหม่หลังจากแต่ละบรรทัด รูปภาพควรหมุนเพื่อให้อักขระแต่ละตัวในต้นฉบับถูกแทนที่ด้วยเวอร์ชันที่หมุนแล้วและถูกย้ายไปยังตำแหน่งที่ถูกต้องในรูปภาพ

ตัวอย่าง (ไม่ใช่ศิลปะ ASCII ที่สวยงามมาก)

อินพุต

5
<- ||
|  |V
+->+ 
   |O
<--+ 
90

เอาท์พุต

^ +-^
| | |
| V  
+-+--
 O <-

(การหมุน 90 และ 270 จะไม่ดูดีมากเพราะตัวละครไม่ใช่สี่เหลี่ยม)

อินพุต

6
+ /\ +
| \ \|
(  \/|
 \   )
I \ / 
:) V $
180

เอาท์พุต

$ ^ (:
 / \ I
(   \ 
|/\  )
|\ \ |
+ \/ +

อักขระที่รองรับที่จำเป็น

สำหรับการหมุนทั้งหมด (90, 180 และ 270) โปรแกรมควรสามารถหมุนได้:

  • ช่องว่าง+, @, XและOที่ไม่เคยเปลี่ยน
  • V > < ^
  • | -และ\ /(หมุน 180 พวกเขายังคงเหมือนเดิม)

สำหรับการหมุน 180 องศาต้องสนับสนุนอักขระเพิ่มเติมเหล่านี้

  • I N Z % : 0 = S ~ $ # ซึ่งอยู่เหมือนกัน
  • P d, ( ), [ ], { }, M Wและ9 6

ตัวอย่างแรกของคุณมีตัวพิมพ์เล็กvซึ่งไม่ใช่ตัวอักษรที่รองรับ Vผมถือว่ามันหมายถึงการเป็นตัวพิมพ์ใหญ่ นอกจากนี้บรรทัดสุดท้ายที่อยู่ในนั้นไม่ได้ถูกเสริมให้มีความยาว 5 ตัวอักษร
Ilmari Karonen

@IlmariKaronen จับได้ดี ตอนนี้ได้รับการแก้ไขแล้ว
PhiNotPi

P d, ( ), [ ], { }, M W, and 9 6จะสามารถหัน90ºหรือ270º?
ajax333221

ไม่ได้ศิลปะจะมีเพียงตัวอักษรที่กำหนดให้สามารถหมุนจำนวนที่ถูกต้องได้ อักขระรายการกระสุนสองตัวสุดท้ายสามารถหมุนได้180ºเท่านั้น โปรแกรมของคุณจะไม่ถูกขอให้หมุนด้วยจำนวนอื่น ๆ
PhiNotPi

คำตอบ:


4

GolfScript, 79 75 73 67 ตัวอักษร

n%(;)~90/{-1%zip{{.'V<^>P(d)[{]}M9W6/\/\|-|'4/\+{.}%n+.@?)=}%}%}*n*

ดูเหมือนว่าโซลูชันของฉันและPeter Taylorกำลังเผชิญกับการบรรจบกันจำนวนหนึ่ง อย่างไรก็ตามดูเหมือนว่าตอนนี้ฉันยังคงอยู่ไม่กี่ตัวอักษร :-) ขอขอบคุณ (และ +1) ทั้งปีเตอร์และคัดลอกความคิดที่ฉันขโมยมาอย่างไร้ยางอาย

รหัสนี้จะไม่สนใจขนาดที่กำหนดในบรรทัดแรกเนื่องจากเป็นข้อมูลที่ซ้ำซ้อน มันควรจะจัดการกับอินพุตด้วยขนาดที่ไม่เป็นสี่เหลี่ยม แต่มันขึ้นอยู่กับบรรทัดอินพุตทั้งหมดที่มีความยาวเท่ากัน พยายามที่จะหมุนตัวละครP, d, (, ), [, ], {, }, M, W, 9หรือ690 หรือ 270 องศาอาจผลิตการส่งออกที่ไม่คาดคิด; ตัวละครอื่น ๆ ทั้งหมดที่ไม่ได้ทำการแมปใหม่อย่างชัดเจนจะยังคงไม่เปลี่ยนแปลง

ps นี่คือโซลูชัน 79 ถ่านแบบดั้งเดิมของฉัน:

n%(;)~90/:z{-1%zip}*n*z'V<^>/|-\V>^<'{:c;{{.c?~.c=@if}%}*}:s~2z='P([{M96W}])d's

บรรจบกัน? : PI ชอบเคล็ดลับของคุณสำหรับการค้นหาโดยไม่ต้องทำซ้ำตัวละคร (มาก) แต่ดูเหมือนจะไม่เข้ากันได้กับเคล็ดลับของฉันในการหลีกเลี่ยงถ้า
Peter Taylor

5

C, 336 ตัวอักษร

ฉันแน่ใจว่ามีห้องพักสำหรับการปรับปรุง

char*a="<^>V|-|-/\\/\\ppdd(())[[]]{{}}MMWW9966",*p,*q;
n,x,y,r;
z(c){
    return(q=strchr(a,c))?a[(q-a&-4)+(q-a+r&3)]:c;
}
#define A(r)(r&3^3?1-r%4:0)*
f(r){
    return A(r)x+A(~-r)y+(r&2)/2*~-n;
}
main(){
    scanf("%d\n",&n);
    p=q=malloc(n*n+1);
    for(y=n;y--;q+=n)gets(q);
    scanf("%d",&r);
    for(r/=90;++y<n;puts(""))for(x=0;x<n;x++)putchar(z(p[f(r)+n*f(r+1)],r));
}

4

จาวาสคริปต์ (181 ตัวอักษร)

a=prompt(f="V<^>V|-|/\\/P(d)P([{]}[}M9W6M9").split(n="\n");c=a.pop()/90;for(
b=a[0];c--;a=d.split(n))for(e=d=n;e<b*b;++e%b||(d+=n))d+=f[f.indexOf(g=a[b-e
%b][e/b|0])+1||a]||g;alert(d)

ต้องใช้ทุกบรรทัดเพื่อเพิ่มความยาวตามที่กำหนด


คุณช่วยยกตัวอย่างสิ่งที่ฉันต้องใส่ให้ทันทีได้ไหม ฉันพยายามแทนที่บรรทัดด้วย\n, วางปกติคัดลอกและปรับสมดุลช่องว่างให้เป็นบรรทัดแรก / บรรทัดสุดท้ายและไม่สามารถใช้งานได้
ajax333221

@ ajax333221 การวางหลายบรรทัดในกล่องแจ้งเตือนใช้งานได้เฉพาะใน Chrome ฉันเพิ่งสังเกตเห็นเป็นครั้งแรก ตรวจสอบให้แน่ใจว่าคุณไม่ได้คัดลอกบรรทัดใหม่ขั้นสุดท้าย
คัดลอก

4

Golfscript ( 80 79 78 77 76 ตัวอักษร)

n%(;)~90/{zip{-1%{'V<^>V|-|/\/''Pd()[]{}MW96'{.4*}%4/128,+{.}%+.@?)=}%}%}*n*

NB การป้อน "พฤติกรรมที่ไม่ได้กำหนด" ที่ได้รับอนุญาตโดยอินพุตที่ไม่ถูกต้องสามารถสร้างผลลัพธ์ที่น่าสงสัยได้เนื่องจากอักขระตัวแทน (นอก ASCII) ที่ใช้สำหรับอักขระบางตัวที่ไม่ได้กำหนดการหมุน 90 องศา ตัวอย่างเช่น(จะถูกแมปกับรหัสจุด 160 ซึ่งใน ISO-8859-1 และ Unicode เป็นพื้นที่ไม่แตก

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