Die Koch-Schneeflocke (auch als Koch-Stern und Koch-Insel bekannt) ist eine mathematische Kurve und eine der frühesten beschriebenen fraktalen Kurven. Es basiert auf der Kochschen Kurve, die 1904 in einem Artikel mit dem Titel "Auf einer kontinuierlichen Kurve ohne Tangenten, konstruierbar aus elementarer Geometrie" (französischer Originaltitel: "Sur une courbe continue sans tangente, obtenue par une construction géométrique élémentaire") von der schwedische Mathematiker Helge von Koch.
Hier sind einige ASCII-Darstellungen verschiedener Iterationen:
n=1
__
\/
n=2
__/\__
\ /
/_ _\
\/
n=3
__/\__
\ /
__/\__/ \__/\__
\ /
/_ _\
\ /
__/ \__
\ /
/_ __ __ _\
\/ \ / \/
/_ _\
\/
Da die Auflösung der ASCII-Darstellung offensichtlich begrenzt ist, müssen wir die Größe der Schneeflocke für jede Iteration um den Faktor 3 vergrößern, um das zusätzliche Detail zu zeigen.
Schreiben Sie den kürzesten Code, um die Schneeflocke im gleichen Stil für n = 4 auszugeben
Ihr Programm sollte keine Eingaben annehmen.
Ihr Programm sollte die Schneeflocke auf die Konsole schreiben.
quelle
Antworten:
Python, 338 Bytes
Nur ein weiterer Unicode-Exploit
laufen bei ideone
quelle
Python,
650612594574 ZeichenDies funktioniert, indem das Dreieck jedes Mal um den Faktor 3 erweitert wird. Um dies zu tun, müssen wir verfolgen, ob jedes Symbol eine linke oder eine rechte Grenze ist (z. B.
/
hängt die Art der Erweiterung davon ab, auf welcher Seite/
sich das Innere befindet). Wir verwenden verschiedene Symbole für die beiden möglichen Fälle:Die
d
Variable behandelt den Sonderfall, dass die Erweiterung einesa
in der nächsten Zeile in das 3x3-Format erweitert werden muss.quelle
('acEei',r'_/\\ ')
=>('aecEi','_\/\ ')
spart 1 weitere. Vielleicht möchten Sie auch dieunicode.translate()
.MS-DOS-16-Bit-Computercode: 199 Byte
Dekodieren Sie über diese Site , speichern Sie sie als "koch.com" -Datei und führen Sie sie über die WinXP-Eingabeaufforderung aus.
Aktualisieren
Hier ist eine leicht zu lesende Assembler-Version:
quelle
"scAA...w==".decode("base64")
zum Dekodieren in Python2 verwendet werden (funktioniert nicht für Python3)Perl,
176175 BytesDies als separate Antwort zu posten, da eine binäre Quelldatei verwendet wird, die vielleicht ein bisschen betrügerisch ist. Aber wenn man bedenkt, dass es immer noch Perl- Quellcode ist, finde ich es bemerkenswert, dass es die MS-DOS- Maschinencodelösung schlägt !
Quelle als Base64-codiert
Etwas lesbarer
Ersetzen Sie alle Instanzen von
/<[0-9a-f]+>/
durch die relevanten Binärdaten:In dieser Version ist die Schneeflocke folgendermaßen codiert:
Die 8 Bits in jedem Byte sind folgendermaßen aufgeteilt:
R
kodiert eine Reihe von Leerzeichen. Die längste Folge ist 27 Zeichen, sodass alle Folgen in 5 Bits passen.C
codiert eine Folge von Zeichen, die einfach im Literal-Array nachgeschlagen werden. (Früher hatte ich hier etwas verrücktere Codierungen, in denen das Array nur enthalten war/ \ _
, aber der zum Decodieren erforderliche Perl-Code war länger ...)Ich habe das Glück , dass die binären Daten enthalten keine
"
/'
oder\
das würde zu entkommen muß. Das habe ich nicht geplant. Aber selbst wenn dies der Fall wäre, hätte ich wahrscheinlich einfach die Reihenfolge der Elemente im Array ändern können, um dies zu beheben.Es ist erstaunlich, wie einfach diese Lösung im Vergleich zu den Dutzenden anderen Lösungen ist, die ich durchlaufen habe, bevor ich darauf gekommen bin. Ich habe mit vielen verschiedenen bitweisen Codierungen experimentiert, die komplexer sind als diese, und es ist mir nie aufgefallen, dass eine einfachere es wert sein könnte, einfach weil der Perl-Code zum Decodieren kürzer wäre. Ich habe auch versucht, Wiederholungen in den Daten mit variabler Interpolation zu komprimieren (siehe die andere Antwort), aber mit der neuesten Version, die keine Zeichen mehr erhält.
quelle
Python, 284
Mit etwas mehr Leerzeichen:
Die linke Seite ist komprimiert; Die rechte Seite wird von der linken Seite wiedergegeben.
quelle
Perl,
224223 ZeichenEtwas lesbarer
Wie es funktioniert
Eine Erklärung, wie es funktioniert, finden Sie in der anderen Antwort, in der ich dasselbe in binärer Form poste . Es tut mir wirklich leid, dass ich die Koch-Schneeflocke nicht generiere , sondern nur komprimiere ...
Vorherige Versionen
(359) Codiert die gesamte Schneeflocke anstatt nur die linke Hälfte. Leerzeichen wurden in die Bitcodierung einbezogen; noch keine lauflänge Verwendete mehrere interpolierte Variablen plus ein
@_
Array, auf das mit zugegriffen wurdes/\d/$_[$&]/eg
. Zeilenumbrüche wurden als codiert!
.(289) Erste Version, die nur die linke Hälfte der Schneeflocke codierte.
(267) Erste Version, die Lauflängencodierung für die Leerzeichen verwendete.
(266) Wechseln
' '
zu$"
.(224) Radikal unterschiedliche Komprimierung, kodiert als base-64. (Entspricht jetzt der Binärversion .)
(223) Es wurde mir klar, dass ich den Abdruck in die letzte Subst legen und so ein Semikolon speichern kann.
quelle