C ++, 926 Bytes
#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;}
Dies ist nicht elegant, nimmt aber nicht viel Speicher für große n in Anspruch. Darüber hinaus gibt es (mit ziemlicher Sicherheit) ungefähr 20 Charaktere, die weiter golfen werden können, aber ich kann es nicht mehr ertragen, es mir anzusehen.
Kurze Erklärung:
Dies teilt die Linien in den Spiralen in zwei Typen auf: die mit ****** in der Mitte und die mit \ s \ s \ s \ s in der Mitte. Dann ist klar, dass jede Zeile aus mehreren "*", der Mitte und einigen "*" besteht. Es ist einfach herauszufinden, wie viele von jeder Sache genau sind, wenn Sie sich das Muster lange genug ansehen. Das Knifflige war, die Mitte der Spirale zu drucken, die ich im Grunde genommen mit einer Bedingung hart codiert habe. Dies erwies sich als nützlich, da die Zeilen *** und \ s \ s \ s dort ungerade / gerade wechseln.
Tests:
Input: 55
(Ich finde die Großen sehen am coolsten aus)
Ausgabe:
*************************************************** *****
*
*************************************************** *** *
* * *
* ************************************************** * *
* * * * *
* * ********************************************* * * *
* * * * * * *
* * * ***************************************** * * * *
* * * * * * * * *
* * * * ************************************* * * * * *
* * * * * * * * * * *
* * * * * ********************************* * * * * * *
* * * * * * * * * * * * *
* * * * * * ***************************** * * * * * *
* * * * * * * * * * * * * * *
* * * * * * * ************************* * * * * * * *
* * * * * * * * * * * * * * * *
* * * * * * * * ********************* * * * * * * * *
* * * * * * * * * * * * * * * * * *
* * * * * * * * * **************** * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * *
* * * * * * * * * * ************ * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * * * *
* * * * * * * * * * * ******** * * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * * * * *
* * * * * * * * * * * * ***** * * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * {- Mein Programm fügt hier übrigens ein Leerzeichen hinzu
* * * * * * * * * * * * * *** * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * * * * * * *
* * * * * * * * * * * * ******* * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * * * * *
* * * * * * * * * * * ********** * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * * *
* * * * * * * * * * ************** * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * *
* * * * * * * * * ******************* * * * * * * * *
* * * * * * * * * * * * * * * * *
* * * * * * * * *********************** * * * * * * *
* * * * * * * * * * * * * * * *
* * * * * * * *************************** * * * * * *
* * * * * * * * * * * * * *
* * * * * * ******************************* * * * * * *
* * * * * * * * * * * *
* * * * * *********************************** * * * * *
* * * * * * * * * *
* * * * *************************************** * * * *
* * * * * * * *
* * * ******************************************* * * *
* * * * * *
* * ************************************************** *
* * * *
* ************************************************** ** *
* *
*************************************************** *****
Eingang: 3
Ausgabe:
***
*
* *
***
Hinweis: Ich bin kein Informatiker / CS-Student und kann nicht nachweisen, dass dies O (log n) -Speicher belegt. Ich kann nur anhand der Links in der Frage herausfinden, was zu tun ist. Ich wäre dankbar, wenn jemand bestätigen / ablehnen könnte, ob diese Antwort gültig ist. Meine Logik für die Gültigkeit dieser Antwort ist, dass sie niemals eine Variable der Größe basierend auf n außer der Eingabe selbst speichert. Stattdessen berechnet eine for-Schleife, die n-mal ausgeführt wird, ganzzahlige Werte basierend auf n. Es gibt unabhängig von der Eingabe die gleiche Anzahl dieser Werte.
Anmerkung 2: Dies funktioniert bei n = 1 nicht, da ich mit der Mitte umgehe. Dies lässt sich leicht mit Bedingungen beheben. Wenn sich also jemand innerhalb einiger Zeichen meiner Antwort befindet, werde ich das Problem beheben.
Spiel damit auf ideone.
n
in O (1) speichern.