Sie können ein Programm oder eine Funktion schreiben , das eine empfängt ungeradee positive ganze Zahl n
ist , wo n >= 3
, entweder als ein Funktionsargument, Befehlszeilenargumente oder auf STDIN (oder gleichwertig für Ihr System) und druckt auf STDOUT (oder System - Äquivalent) eine ASCII - Spirale , das nach innen dreht im Uhrzeigersinn , wo der obere Rand genau n
Zeichen lang. Der erste rechte Rand sollte n+1
offensichtlich Zeichen lang sein. Zum Beispiel,
Eingang:
11
Ausgabe:
***********
*
********* *
* * *
* ***** * *
* * * * *
* * * * * *
* * *** * *
* * * *
* ******* *
* *
***********
Die Fänge:
- Ihr Programm darf nicht mehr als
O(log n)
Speicher verwenden . - Ihr Programm druckt möglicherweise nur die Zeichen
*
(ASCII 42),(ASCII 32),
<CR>
(ASCII 13) und<LF>
(ASCII 10). - Ihr Programm muss die Zeichenfolge drucken und darf sie nicht von der Funktion zurückgeben.
- Die Big-O Beschränkung ist nur auf Speicher , gibt es keine Einschränkungen für Laufzeit .
- Ein abschließender Zeilenumbruch ist optional.
- Wenn Ihre Sprache keine großen Integer-Typen unterstützt, müssen Sie keine höheren als die unterstützten unterstützen, aber Sie können dies möglicherweise nicht als Trick verwenden, um zu sagen: "Oh, nun, ich muss nicht über X unterstützen, also ich kann nur jedes Mal ein riesiges Array auf die maximale Größe bringen "
Standardlücken sind wie gewohnt verboten.
n
in O (1) speichern.n
nimmtlog n
Bits. Wien
größer wird, nimmt auch den Raum speichern benötigt. Wollen Sie dies vielleicht mit einer begrenzten Anzahl von Variablen tun?n
?Antworten:
C
125121 BytesGolf Version Dies hat keine Variable
k
. Die Variablek
wird in der ungolfed-Version nur verwendet, um die Lesbarkeit zu verbessern. Auchfor
Loop-Bedingungen werden neu geordnet und ein unnötiger Satz{}
entfernt. Ein weiterer Satz von{}
kann entfernt werden, indem Sieputs("")
in die Klammern derj
Schleife in der Initialisierungsposition migrieren. Dies würde jedoch bedeuten, dass am Anfang der Ausgabe eine neue Zeile eingefügt wird, sodass ich dies nicht getan habe.Druckt eine
n
breite durchn+1
hohe Spirale wie im Beispiel.Erläuterung
Im Wesentlichen halbieren I den Wert von
n
(Abrunden) , und führen zwei Schleifen: eine äußere einei
von-n/2-1
bisn/2+1
die Zeilen drucken (i=0
unterdrückt wird , so erhalten wirn+1
Zeilen) und einer innerenj
aus (-n/2
zun/2
verwenden wir die Zeichen zu drucken.)expression & 1
Streifen zu drucken , und die Bedingungj*j<i*i
, um zu entscheiden, ob vertikale oder horizontale Streifen gedruckt werden sollen (vertikal an den Seiten, an denen die absolute Größei
größer ist, und horizontal oben und unten.) Eine Anpassung+n
ist erforderlich, um die korrekte Terminierung zu unterstützen, je nachdem, obn/2
ungerade oder ungerade sogar.k
ist normalerweise 1 und bietet eine Anpassung für die Tatsache, dass die absoluten Wertei
von 1 bis reichen,n/2+1
während die absoluten Wertej
von 0 bis reichenn/2
. Wennk
immer 1 wäre, würden wir konzentrische Rechtecke erhalten, die jedoch bei 0 invertiert werdeni==j&i<=0
sodass eine diagonale Reihe von Zellen invertiert wird und die Spirale entsteht.im Testprogramm ungolfed
Ausgabe
quelle
C 118 Bytes
Code vor dem endgültigen Golfen:
Die Schlüsselbeobachtung ist, dass das Muster fast eine Reihe konzentrischer Quadrate ist. Mit ein paar leichten Falten:
y = x + 1
Diagonale bis zur Mitte der Form invertiert werden.Im Übrigen durchläuft der Code einfach alle Positionen, berechnet die Chebyshev-Entfernung vom Zentrum für jede Position und gibt eines der beiden Zeichen aus, je nachdem, ob die Entfernung gerade oder ungerade ist. Und eine neue Zeile für die letzte Position jeder Zeile ausgeben.
Da es nur wenige skalare Variablen gibt und die Zeichen einzeln ausgegeben werden, ist die Speichernutzung offensichtlich konstant.
quelle
p
denke ich, dass Sie meta.codegolf.stackexchange.com/q/4939/15599 verpassen . Ich bin mir auch nicht sicher, ob ich globale Variablen deklarieren soll, wenn ich eine Funktion übergebe. Offensichtlich wäre meine Antwort 4 Bytes kürzer, wenn ich das täte. Ich habe einen Meta-Post gestartet. Meta.codegolf.stackexchange.com/q/5532/15599p
.C ++, 926 Bytes
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:
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.
quelle
n
. Ein typisches Beispiel, das die Anforderung nicht erfüllt, ist eine Art Zeichenfolge / Puffer / Array, die eine vollständige Ausgabezeile enthält.n=1
, da ich ein solches spezielles Gehäuse nicht interessant finde.Haskell, 151 Bytes
Anwendungsbeispiel:
Dank Haskells Faulheit läuft dies in ständiger Erinnerung. Es nutzt den offensichtlichen Ansatz, Looping , dh über
y
undx
und die Wahl zwischen*
undje nach
x
bzw.y
ist gerade oder ungeraden/2
ist gerade oder ungeradequelle
Common Lisp - 346
Iterative Lösung mit konstanter Speichernutzung. Die oben genannten macht starken Gebrauch von
#n=
und#n#
Reader-Variablen. Obwohl es direktere Ansätze gibt, habe ich hier mit einer rekursiven Funktion begonnen und sie modifiziert, um eine Rekursion mitgoto
Anweisungen zu simulieren : Dies ist wahrscheinlich nicht lesbar.Ausgabe für alle Eingabewerte von 0 bis 59 .
Ursprüngliche rekursive Version mit Debugging-Informationen
(Anmerkung:
terpri
bedeutetnewline
)Beispielsweise:
Siehe auch diese Paste mit allen Ergebnissen von 0 bis 59 (nicht dasselbe wie oben, diese ist ausführlicher).
Iterative Version mit Debugging-Informationen
quelle
n
aufrufen und der Aufrufstapel entsprechend wächst. In diesem Fall können wir jedoch die Rekursion mit zwei Schleifen simulieren: einer mitn
abnehmender und einer mitd
zunehmender (bis n <= 3) ) und eine weitere mit einemd
Abfall auf Null. Ich habe momentan nicht viel Zeit, um daran zu arbeiten, aber ich werde versuchen, die Antwort entsprechend zu aktualisieren. Übrigens gibt es direktere Möglichkeiten, die Spirale zu drucken, aber es hat Spaß gemacht, sie rekursiv zu definieren.CJam, 72 Bytes
Dies ist eine ziemlich direkte Konvertierung meiner C-Lösung in CJam. Nicht so kurz, wie Sie es normalerweise von einer CJam-Lösung erwarten würden, aber diese leidet wirklich unter der Speicherbeschränkung. Die allgemeinen Vorteile des Aufbaus von Ergebnissen auf dem Stapel, der am Ende automatisch ausgegeben wird, und der Verwendung von ausgefallenen Listen- / Zeichenfolgenoperationen gehen alle aus dem Fenster. Dadurch wird die Lösung zeichenweise generiert und ausgegeben. Der Stack enthält zur Laufzeit nur wenige Ganzzahlen und ist am Ende leer.
Auch wenn die Verwendung einer Golfsprache nicht besonders gut ist, ist sie doch erheblich kürzer als der C-Code, nur weil die Notation kompakter ist.
Erläuterung:
quelle