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, кроме самого ввода. Вместо этого цикл for, который выполняется n раз, вычисляет целочисленные значения на основе n. Количество этих значений одинаковое, независимо от ввода.
Примечание 2: Это не работает для n = 1 из-за моего метода работы с серединой. Это было бы легко исправить с помощью условных выражений, поэтому, если кто-то находится в пределах нескольких символов от моего ответа, я исправлю это;)
Поиграй с этим на ideone.
n
в O (1) памяти.