旋转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 2012年

@IlmariKaronen好收获。现在已修复。
PhiNotPi 2012年

P d, ( ), [ ], { }, M W, and 9 6可以旋转90º或270º吗?
ajax333221 2012年

不,美术作品将仅包含指定为能够旋转正确数量的字符。最后两个项目符号列表字符只能旋转180º。您的程序将不会被要求将它们旋转任何其他数量。
PhiNotPi 2012年

Answers:


4

GolfScript,79 75 73 67个字符

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

看起来我和Peter Taylor的解决方案正在经历一定程度的融合。无论如何,看起来我现在仍然还有几个字符。:-)感谢(和+1)Peter和copy,感谢我无耻地偷来的想法。

该代码完全忽略了第一行给出的大小,因为它是多余的信息。它甚至应该处理具有非正方形尺寸的输入,但这在很大程度上取决于所有输入线被填充为相同的长度。试图旋转字符Pd()[]{}MW9,或690度或270度可能会产生意想不到输出; 未显式重新映射的所有其他字符将保持不变。

附言 这是我原来的79个字符的解决方案:

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

收敛?:PI很喜欢您的技巧,无需重复(很多)字符即可进行查找,但是它与我避免使用if的技巧并不兼容。
彼得·泰勒

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

javascript(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 2012年

@ ajax333221将多行粘贴到警报框中仅在Chrome中有效,这是我第一次注意到。还要确保您没有复制最终换行符。
复制

4

Golfscript(80 79 78 77 76字符)

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

注意输入无效输入允许的“不确定行为”会产生一些奇怪的输出,因为占位符(ASCII外部)用于某些未定义旋转90度的字符。例如,(将映射到代码点160,在ISO-8859-1和Unicode中,代码点是一个不间断的空间。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.