C ++, 926 바이트
#include<iostream>
#include<string>
#include<math.h>
#define S string
using namespace std;S N(S x,int y){S z="";for(int q=0;q<y;q++){z+=x;}return z;}int main(){int n=0,t=0,g=0,fi=1;cin>>n;int t1[]={0,0,n,0};int t2[]={0,n-2,n-2,1};for(int k=0;k<n+1;k++){if((k>(n-2)/2)&&(k<(n+5)/2)){if(g==0){S d,e;if(!((n+1)%4)){cout<<N("* ",t2[0])<<" *"<<N(" *",t2[0])<<endl<<N("* ",(n+1)/2)<<endl<<N("* ",t2[0])<<"***"<<N(" *",t2[0])<<endl;t2[2]=n-8-(n-11);t1[2]=n-4-(n-11);t1[0]--;t2[3]--;t1[3]-=2;}else{cout<<N("* ",t1[0])<<"***"<<N(" *",t2[0])<<endl<<N("* ",(n+1)/2)<<endl<<N("* ",t1[0])<<"* "<<N(" *",t2[0])<<endl;t2[0]--;t1[2]+=2;t2[2]+=6;t1[3]--;t2[1]-=2;t2[3]-=2;}fi=0;}g=5;}else{t=1-t;int*tR;tR=t?t1:t2;cout<<N("* ",tR[0])<<N(t?"*":" ",tR[2])<<N(" *",tR[3])<<endl;if(fi){if(t){t1[0]+=k==0?0:1;t1[2]-=k==0?2:4;t1[3]++;}else{t2[0]++;t2[2]-=4;t2[3]++;}}else{if(t){t1[0]--;t1[2]+=4;t1[3]--;}else{t2[0]--;t2[2]+=4;t2[3]--;}}}}return 0;}
이것은 우아하지 않지만 큰 n에 대해 많은 메모리를 차지하지 않습니다. 더 나아가 골프를 칠 수있는 약 20 개의 캐릭터가 있지만, 더 이상 볼 수는 없습니다.
간단한 설명 :
이것은 나선의 선을 중간에 ******가있는 것과 중간에 \ s \ s \ s \ s \ s가있는 두 가지 유형으로 나눕니다. 그런 다음 각 줄이 여러 개의 "*", 중간 및 "*"로 구성되어 있음이 분명합니다. 패턴을 충분히 오랫동안 본다면 각 항목의 수를 정확히 파악할 수 있습니다. 까다로운 것은 기본적으로 조건부를 사용하여 하드 코딩 된 나선형의 중심을 인쇄하는 것이 었습니다. 이것은 *** 및 \ s \ s \ s 라인 스위치가 홀수 / 짝수이기 때문에 유용합니다.
테스트 :
입력 : 55
(큰 것들이 가장 멋지다고 생각합니다)
산출:
***************************************************** *****
*
***************************************************** *** *
* * *
* ******************************************************* * *
* * * * *
* * *************************************************** * * *
* * * * * * *
* * * ********************************************* * * * *
* * * * * * * * *
* * * * **************************************** * * * * *
* * * * * * * * * * *
* * * * * ************************************ * * * * * *
* * * * * * * * * * * * * *
* * * * * * ***************************** * * * * * * * *
* * * * * * * * * * * * * * * *
* * * * * * * ************************* * * * * * * * * *
* * * * * * * * * * * * * * * * * *
* * * * * * * * ********************* * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * *
* * * * * * * * * * ***************** * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * * * *
* * * * * * * * * * * ************* * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * * * * * *
* * * * * * * * * * * * ********* * * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * * * * * * * *
* * * * * * * * * * * * ***** * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * {-내 프로그램은 여기에 공간을 추가
* * * * * * * * * * * * * * *** * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * * * * * * * * * *
* * * * * * * * * * * * ******* * * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * * * * * * *
* * * * * * * * * * * * *********** * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * * * * *
* * * * * * * * * * * *************** * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * * *
* * * * * * * * * * ******************* * * * * * * * * * *
* * * * * * * * * * * * * * * * * * *
* * * * * * * * *********************** * * * * * * * * *
* * * * * * * * * * * * * * * * *
* * * * * * * *************************** * * * * * * * *
* * * * * * * * * * * * * * *
* * * * * * ******************************* * * * * * * *
* * * * * * * * * * * * *
* * * * * ************************************** * * * * *
* * * * * * * * * *
* * * * ****************************************** * * * *
* * * * * * * *
* * * ************************************************* * * *
* * * * * *
* * ****************************************************** * *
* * * *
* ******************************************************* ** *
* *
***************************************************** *****
입력: 3
산출:
***
*
* *
***
참고 : 저는 컴퓨터 과학자 / CS 학생이 아니며 O (log n) 메모리를 사용한다는 것을 증명하는 방법을 모르겠습니다. 질문의 링크를 기반으로 할 일만 해결할 수 있습니다. 이 답변이 유효한지 누군가가 확인 / 거부 할 수 있다면 감사하겠습니다. 이 답변의 유효성에 대한 나의 논리는 입력 자체를 제외하고 n을 기반으로 한 크기의 변수를 저장하지 않는다는 것입니다. 대신, n 번 실행되는 for 루프는 n을 기준으로 정수 값을 계산합니다. 입력에 관계없이 같은 수의 값이 있습니다.
참고 2 : 중간을 처리하는 방법으로 인해 n = 1에서는 작동하지 않습니다. 이것은 조건부로 쉽게 고칠 수 있으므로 누군가 내 대답의 몇 문자 안에 있으면 고칠 것입니다.)
아이디어를 가지고 놀아보세요.
n
을 O (1) 메모리에 저장할 수 없습니다 .