ASCII 아트 이미지 회전


17

모든 ASCII 문자 중 일부는 동일한 기본 문자의 회전 인 그룹을 형성한다는 것을 쉽게 알 수 있습니다. 예를 들면 다음과 같습니다 V > ^ <. 이를 통해 90 도의 배수로 회전 할 수 있고 여전히 ASCII 아트로 유지 될 수있는 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)에 대해 프로그램은 다음을 회전 할 수 있어야합니다.

  • 공백, +, @, XO어떤 결코 변화
  • 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 690º 또는 270º 회전 할 수 있습니까?
ajax333221

아닙니다. 예술에는 정확한 양을 회전시킬 수있는 문자 만 포함됩니다. 마지막 두 글 머리 기호 목록 문자는 180º 만 회전 할 수 있습니다. 프로그램은 다른 양만큼 회전하도록 요청되지 않습니다.
PhiNotPi

답변:


4

GolfScript, 79 75 73 67 자

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

저와 Peter Taylor의 솔루션이 어느 정도의 수렴을 경험하고있는 것 같습니다. 어쨌든, 나는 지금도 여전히 몇 가지 문자 인 것처럼 보입니다. :-) Peter에게 감사의 말을 전하고 +1하며, 뻔뻔스럽게 도둑 맞은 아이디어에 대해 복사 합니다.

이 코드는 중복 정보이므로 첫 번째 줄에 주어진 크기를 완전히 무시합니다. 정사각형이 아닌 치수의 입력도 처리해야하지만 동일한 길이로 채워지는 모든 입력 라인에 따라 달라집니다. 회전하려고 자 P, d, (, ), [, ], {, }, M, W, 9, 또는 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

자바 스크립트 (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 경고 상자에 여러 줄을 붙여 넣는 것은 Chrome에서만 작동합니다. 처음으로 나타났습니다. 또한 최종 개행을 복사하지 않아야합니다.
복사

4

골프 스크립트 ( 80 79 78 77 76 자)

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

NB 유효하지 않은 입력으로 허용되는 "정의되지 않은 동작"을 입력하면 90도 회전이 정의되지 않은 특정 문자에 사용되는 자리 표시 자 문자 (ASCII 외부)로 인해 다소 이상한 출력이 발생할 수 있습니다. 예를 들어, (ISO-8859-1 및 유니 코드가 비 공백 공간 인 코드 포인트 160에 매핑됩니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.