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;}
Це не елегантно, але воно не займає багато пам’яті для великих росіян. Крім того, є (майже напевно) близько 20 персонажів, які можна продовжити гольфу, але я не можу більше дивитися на це.
Коротке пояснення:
Це розбиває лінії спіралей на два типи: ті, у яких ****** посередині, і лінії з \ s \ s \ s \ s \ s посередині. Тоді зрозуміло, що кожен рядок складається з декількох "*" s, середини та деяких "*". Зрозуміти, скільки саме кожної речі є простим, якщо дивитися на шаблон досить довго. Хитра річ була надрукувати центр спіралі, яку я в основному важко кодував, використовуючи умовний. Це виявилося корисним, оскільки перемикання ліній *** і \ s \ s \ s є непарними / парними.
Тести:
Вхід: 55
(Я думаю, що великі виглядають круто)
Вихід:
**************************************************** *****
*
**************************************************** *** *
* * *
* *************************************************** * *
* * * * *
* * *********************************************** * * *
* * * * * * *
* * * ******************************************* * * * *
* * * * * * * * *
* * * * ************************************* * * * * *
* * * * * * * * * * * *
* * * * * ********************************* * * * * * *
* * * * * * * * * * * * *
* * * * * * ***************************** * * * * * * *
* * * * * * * * * * * * * * *
* * * * * * * ************************* * * * * * * * *
* * * * * * * * * * * * * * * * * *
* * * * * * * * ********************* * * * * * * * * *
* * * * * * * * * * * * * * * * * * * *
* * * * * * * * * ***************** * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * * * *
* * * * * * * * * * ************* * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * * * * * *
* * * * * * * * * * * ********* * * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * * * * * * * *
* * * * * * * * * * * * ***** * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * {- моя програма додає пробіл тут btw
* * * * * * * * * * * * * *** * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * * * * * * * * *
* * * * * * * * * * * * ******* * * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * * * * * * *
* * * * * * * * * * * *********** * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * * * * *
* * * * * * * * * * *************** * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * * *
* * * * * * * * * ******************* * * * * * * * * *
* * * * * * * * * * * * * * * * * *
* * * * * * * * *********************** * * * * * * * *
* * * * * * * * * * * * * * * * *
* * * * * * * *************************** * * * * * * *
* * * * * * * * * * * * * *
* * * * * * ******************************* * * * * * *
* * * * * * * * * * * *
* * * * * ************************************* * * * * *
* * * * * * * * * *
* * * * ***************************************** * * * *
* * * * * * * *
* * * ********************************************* * * *
* * * * * *
* * ************************************************* * *
* * * *
* *************************************************** ** *
* *
**************************************************** *****
Вхід: 3
Вихід:
***
*
* *
***
Примітка: Я не є вченим-інформатиком / студентом CS, і не знаю, як довести, що для цього використовується O (log n) пам'ять. Я можу лише розробити, що робити на основі посилань у питанні. Буду вдячний, якщо хтось міг би підтвердити / заперечити, якщо ця відповідь справедлива. Моя логіка дійсності цієї відповіді полягає в тому, що вона ніколи не зберігає змінну розміру на основі n, крім самого введення. Натомість цикл for, який працює n разів, обчислює цілі значення на основі n. Існує однакова кількість цих значень незалежно від введених даних.
Примітка2: Це не працює при n = 1 через мій метод роботи з серединою. Це було б легко виправити за допомогою умовних умов, тому якщо хтось знаходиться в межах декількох символів моєї відповіді, я це виправлю;)
Пограйте з ним на ideone.
n
у пам'яті O (1).