C ++, 926 bayt
#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;}
Bu zarif değil, ama büyük n için fazla bellek gerektirmiyor. Dahası, daha fazla golf oynayabilen (neredeyse kesinlikle) yaklaşık 20 karakter var, ama artık ona bakamıyorum.
Kısa Açıklama:
Bu, spirallerdeki çizgileri iki türe böler: ortada ******, ortada \ s \ s \ s \ s \ s olanlar. Daha sonra her satırın birkaç "*", orta ve bir "*" işaretinden oluştuğu açıktır. Eğer desene yeterince uzun süre bakarsanız, her şeyin kaçının basit olduğunu anlamak. Zor olan şey, temel olarak bir koşullu kullanarak kodladığım spiralin merkezini basmaktı. Bu yararlı oldu çünkü *** ve \ s \ s \ s hatları garip / hatta orada değişir.
Testler:
Girdi: 55
(Bence büyük olanlar havalı görünüyor)
Çıktı:
************************************************** *****
*
************************************************** *** *
* * *
* ************************************************* * *
* * * * *
* * ********************************************* * * *
* * * * * * *
* * * ***************************************** * * * *
* * * * * * * * *
* * * * ************************************* * * * * *
* * * * * * * * * * *
* * * * * ********************************* * * * * * *
* * * * * * * * * * * * *
* * * * * * ***************************** * * * * * * *
* * * * * * * * * * * * * * *
* * * * * * ************************* * * * * * * * *
* * * * * * * * * * * * * * * * * *
* * * * * * * ********************* * * * * * * * * *
* * * * * * * * * * * * * * * * * * * *
* * * * * * * * ***************** * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * * * *
* * * * * * * * * * ************* * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * * * * * *
* * * * * * * * * * * ********* * * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * * * * * * * *
* * * * * * * * * * * ***** * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * {- programım buraya bir boşluk ekler btw
* * * * * * * * * * * * * * * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * * * * * * * * *
* * * * * * * * * * * * ******* * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * * * * * * *
* * * * * * * * * * * *********** * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * * * * *
* * * * * * * * * * *************** * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * * *
* * * * * * * * ******************* * * * * * * * * *
* * * * * * * * * * * * * * * * * * *
* * * * * * * *********************** * * * * * * * *
* * * * * * * * * * * * * * * * *
* * * * * * *************************** * * * * * * *
* * * * * * * * * * * * * *
* * * * * * ******************************* * * * * * *
* * * * * * * * * * * *
* * * * * *********************************** * * * * *
* * * * * * * * * *
* * * * *************************************** * * * *
* * * * * * * *
* * * ******************************************* * * *
* * * * * *
* * *********************************************** * *
* * * *
* ************************************************* ** *
* *
************************************************** *****
Giriş: 3
Çıktı:
***
*
* *
***
Not: Bilgisayar bilimcisi / CS öğrencisi değilim ve bunun O (log n) belleği kullandığını nasıl kanıtlayacağımı bilmiyorum. Sadece sorudaki bağlantılara dayanarak ne yapacağımı öğrenebilirim. Birisi bu cevabın geçerli olup olmadığını onaylayabilir / reddedebilirse minnettar olurum. Bu yanıtın geçerliliği için mantığım, girişin kendisi dışında n'ye dayalı hiçbir boyut değişkeni asla saklamamasıdır. Bunun yerine, n kez çalışan bir for döngüsü n'ye dayalı tamsayı değerleri hesaplar. Girdi ne olursa olsun bu değerlerin aynı sayısı vardır.
Not2: Orta ile baş etme yöntemim nedeniyle bu n = 1 için işe yaramıyor. Bu, koşullarla düzeltilmesi kolay olurdu, bu yüzden herhangi bir kişi cevabımın birkaç karakterinden biri varsa, düzelteceğim;)
Onunla ideone üzerinde oyna.
n
O (1) belleğe kaydedilemez.