ASCIIアート画像を回転させる


17

すべてのASCII文字のうち、それらの一部が同じ基本文字の回転であるグループを形成していることは簡単にわかります。たとえば、V > ^ <。これにより、90度の倍数で回転できるASCIIアートを構築できる可能性があります。

チャレンジ

あなたの目標は、ASCIIアートと、それをSTDINから回転させる度数を受け入れ、回転したASCIIアートをSTDOUTに印刷するプログラムをゴルフすることです。

入力の最初の行で、プログラムは数値Nを受け取ります。この数値は、ASCIIアートの幅と高さを表します。

その後、それぞれ正確にN文字のN行が追加されます(改行はこの数にはカウントされません)。アートのサイズは常に正方形になりますが、正方形にするためにスペースの形でパディングが含まれることがあります。

最後の行にもう1つ、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文字になるように埋め込まれません。
イルマリカロネン

@IlmariKaronen良いキャッチ。現在修正されています。
PhiNotPi

P d, ( ), [ ], { }, M W, and 9 690度または270度回転させることはできますか?
ajax333221

いいえ、アートには正しい量を回転できるように指定されたキャラクターのみが含まれます。最後の2つの箇条書き文字は、180°だけ回転できます。プログラムは、これらを他の量だけローテーションするよう求められません。
PhiNotPi

回答:


4

GolfScript、79 75 73 67文字

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

私とピーター・テイラーのソリューションは、ある程度の収束を経験しているようです。とにかく、私は今のところまだ数文字先にいるようです。:-) 私が恥知らずに盗まれたアイデアをピーターとコピーの両方に感謝します(そして+1)。

このコードは、冗長な情報であるため、最初の行で指定されたサイズを完全に無視します。正方形以外の寸法の入力も処理する必要がありますが、同じ長さにパディングされるすべての入力行に大きく依存します。回転しようとする文字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

@ ajax333221アラートボックスに複数の行を貼り付けることはChromeでのみ機能します。初めて気付きました。また、最後の改行をコピーしていないことを確認してください。
コピー

4

Golfscript(80 79 78 77 76文字)

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

無効な入力によって許可された「未定義の動作」を入力すると、90度の回転が定義されていない特定の文字に使用されるプレースホルダー文字(ASCII以外)のため、やや奇妙な出力が生成されます。たとえば、(コードポイント160にマップされます。これは、ISO-8859-1およびUnicodeでは、改行しないスペースです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.