Zeichnen der Peano-Kurve


13

Einführung

In der Geometrie ist die Peano-Kurve das erste Beispiel für eine raumfüllende Kurve, die 1890 von Giuseppe Peano entdeckt wurde. Die Peano-Kurve ist eine surjektive, kontinuierliche Funktion vom Einheitsintervall bis zum Einheitsquadrat, jedoch nicht injektiv. Peano wurde von einem früheren Ergebnis von Georg Cantor motiviert, dass diese beiden Mengen die gleiche Kardinalität haben. Aufgrund dieses Beispiels verwenden einige Autoren den Ausdruck "Peano-Kurve", um sich allgemeiner auf jede raumfüllende Kurve zu beziehen.

Herausforderung

Das Programm nimmt eine Eingabe, die eine Ganzzahl ist n, und gibt eine Zeichnung aus, die die nIteration der Peano-Kurve darstellt, beginnend mit der im linken Teil dieses Bildes gezeigten Seite 2: Drei Iterationen der Peano-Kurve

Eingang

Eine Ganzzahl n, die die Iterationsnummer der Peano-Kurve angibt. Optionale, zusätzliche Eingaben werden im Abschnitt Boni beschrieben.

Ausgabe

Eine Zeichnung der nIteration der Peano-Kurve. Die Zeichnung kann sowohl eine ASCII-Grafik als auch eine "echte" Zeichnung sein, je nachdem, was am einfachsten oder am kürzesten ist.

Regeln

  • Die Ein- und Ausgabe kann in jedem beliebigen Format erfolgen (wählen Sie das für Ihre Sprache / Lösung am besten geeignete Format).
  • Es müssen keine negativen Werte oder ungültige Eingaben verarbeitet werden
  • Es ist entweder ein vollständiges Programm oder eine Funktion zulässig.
  • Fügen Sie nach Möglichkeit einen Link zu einer Online-Testumgebung hinzu, damit andere Benutzer Ihren Code ausprobieren können!
  • Standardlücken sind verboten.
  • Dies ist daher gelten alle üblichen Golfregeln, und der kürzeste Code (in Byte) gewinnt.

Boni

Da dies kein Spaziergang im Park sein sollte (zumindest in den meisten Sprachen, die mir einfallen), werden Bonuspunkte für Folgendes vergeben:

  • -100 Bytes, wenn Ihr Code ein GIF der Konstruktion der Peano-Kurven bis erzeugt n.
  • -100 Byte, wenn Ihr Code eine raumfüllende Kurve für eine rechteckige Form zeichnet (die Peano-Kurve funktioniert natürlich nur für Quadrate). Sie können davon ausgehen, dass die Eingabe dann die Form annimmt, n l win nder sie dieselbe Bedeutung wie zuvor hat (die Nummer der Iteration), aber wo lund win der Länge und Breite des Rechtecks, in dem die Kurve gezeichnet werden soll. Wenn l == w, wird dies zur regulären Peano-Kurve.

Negative Bewertungen sind erlaubt (aber möglich ...).

Bearbeiten

Bitte beziehen Sie die Ausgabe Ihres Programms in die Lösung für ein n == 3 (l == w == 1).


1
Willkommen bei PPCG :) Dies sieht auf den ersten Blick nach einer schönen ersten Herausforderung aus. Obwohl es sich vertraut anfühlt, war die Herausforderung, an die ich denken könnte, eine ASCII-Kunst. Beachten Sie jedoch, dass wir von Boni dringend abraten und dass es Golf-Sprachen geben wird, die dies in weniger als 100 Bytes erreichen können. Und vor allem brauchen Sie ein Gewinnkriterium. Angesichts der Tatsache, dass Ihre Boni Bytes von der Punktzahl einer Lösung abziehen, vermute ich, dass dies Code-Golf sein soll .
Shaggy

4
Ja, ich denke nicht, dass die Boni eine gute Idee sind, zumal es mindestens zwei animationsfähige ASCII-art-fokussierte Golflangs gibt
ASCII-only

2
Ach ja auch wofür würde nwenn verwendet lund wsind auch Eingänge ??????????? Und wäre die Peano-Kurve ein Sonderfall - es ist nicht die einzige raumfüllende Kurve, so dass einige Algorithmen sie möglicherweise als Sonderfall verwenden müssen
ASCII-

2
Auch, was jemand aus macht eine triviale raumfüllenden Kurve stoppt (nur im Zickzack hin und her) für nicht-quadratische Abmessungen
ASCII-only

7
Boni im Codegolf sind eine der am meisten vereinbarten Dinge, die beim Schreiben von Herausforderungen vermieden werden sollten. Ich schlage vor, Sie entfernen sie und entscheiden, welche die kanonische Version der Herausforderung sein soll.
Lirtosiast

Antworten:


6

Mathematica, Punktzahl 60 - 100 - 100 = -140

Graphics[PeanoCurve@a~Reverse~3~Scale~#2]~Animate~{a,1,#,1}&

Funktion pur. Nimmt nund {l, w}(Breite und Höhe) als Eingabe und gibt eine animierte Grafik als Ausgabe aus. Es wird zunächst eine Peano-Kurve n- ter Ordnung mit erstellt PeanoCurve. Da der Fall l = w immer noch eine Peano-Kurve erzeugen muss, drehen wir den Ausdruck auf Stufe 3 um, ähnlich wie bei der Antwort von DavidC ; für lw geben wir nur Scaledie Kurve zum Rechteck an. Diese Kurve wird immer noch raumfüllend sein und den zweiten Bonus erfüllen. Für den ersten Bonus haben wir es einfach Animateüber alle Größen verteilt. Beachten Sie, dass OP vorschlug, dass sich dies ausreichend von DavidC unterscheidet, um seine eigene Antwort zu rechtfertigen. Das Ergebnis für n = 3, l = w = 1 ist wie folgt:


Sehr schön! (mit der richtigen Orientierung auch)
DavidC

13

GFA Basic 3.51 (Atari ST), 156 134 124 Bytes

Eine manuell bearbeitete Liste im .LST-Format. Alle Zeilen enden mit CR, einschließlich der letzten.

PRO f(n)
DR "MA0,199"
p(n,90)
RET
PRO p(n,a)
I n
n=n-.5
DR "RT",a
p(n,-a)
DR "FD4"
p(n,a)
DR "FD4"
p(n,-a)
DR "LT",a
EN
RET

Erweitert und kommentiert

PROCEDURE f(n)      ! main procedure, taking the number 'n' of iterations
  DRAW "MA0,199"    !   move the pen to absolute position (0, 199)
  p(n,90)           !   initial call to 'p' with 'a' = +90
RETURN              ! end of procedure
PROCEDURE p(n,a)    ! recursive procedure taking 'n' and the angle 'a'
  IF n              !   if 'n' is not equal to 0:
    n=n-0.5         !     subtract 0.5 from 'n'
    DRAW "RT",a     !     right turn of 'a' degrees
    p(n,-a)         !     recursive call with '-a'
    DRAW "FD4"      !     move the pen 4 pixels forward
    p(n,a)          !     recursive call with 'a'
    DRAW "FD4"      !     move the pen 4 pixels forward
    p(n,-a)         !     recursive call with '-a'
    DRAW "LT",a     !     left turn of 'a' degrees
  ENDIF             !   end
RETURN              ! end of procedure

Beispielausgabe

Peano-Gfa


10

Perl 6 , 117 Bytes

{map ->\y{|map {(((++$+y)%2+$++)%3**(y+$^v,*/3...*%3)??$^s[$++%2]!!'│')xx$_*3},<┌ ┐>,$_,<└ ┘>,1},^$_}o*R**3

Probieren Sie es online!

0-indiziert. Gibt ein 2D-Array mit Unicode-Zeichen zurück. Die Grundidee ist, dass für untere Zeilen der Ausdruck

(x + (x+y)%2) % (3 ** trailing_zeros_in_base3(3*(y+1)))

ergibt das Muster

|....||....||....||....||..  % 3
..||....||....||....||....|  % 3
|................||........  % 9
..||....||....||....||....|  % 3
|....||....||....||....||..  % 3
........||................|  % 9
|....||....||....||....||..  % 3
..||....||....||....||....|  % 3
|..........................  % 27

Für obere Zeilen lautet der Ausdruck

(x + (x+y+1)%2) % (3 ** trailing_zeros_in_base3(3*(y+3**n)))

Erläuterung

{ ... }o*R**3  # Feed $_ = 3^n into block

map ->\y{ ... },^$_  # Map y = 0..3^n-1

|map { ... },<┌ ┐>,$_,<└ ┘>,1  # Map pairs (('┌','┐'),3^n) for upper rows
                               # and (('└','┘'),1) for lower rows.
                               # Block takes items as s and v

( ... )xx$_*3  # Evaluate 3^(n+1) times, returning a list

 (++$+y)%2  # (x+y+1)%2 for upper rows, (x+y)%2 for lower rows
(         +$++)  # Add x
                   (y+$^v,*/3...*%3)  # Count trailing zeros of 3*(y+v) in base 3
                3**  # nth power of 3
               %  # Modulo
??$^s[$++%2]  # If there's a remainder yield chars in s alternately
!!'│'         # otherwise yield '│'

6

K (ngn / k) , 37 27 26 Bytes

{+y,(|'y:x,,~>+x),x}/1,&2*

Probieren Sie es online!

gibt eine boolesche Matrix zurück

|'yist syntaxspezifisch für ngn / k. andere Dialekte erfordern ein :, um ein einzelnes Verb monadisch zu machen:|:'y


1
Um die Ausgabe zu
optimieren

3
@ user202729 erledigt - in der Fußzeile, damit die Anzahl der Bytes nicht beeinträchtigt wird
ngn

5

Wolfram Language 83 36 Bytes (möglicherweise -48 Bytes mit Bonus)

Ab Version 11.1 PeanoCurveist ein eingebautes.

Meine ursprüngliche, unbeholfene Einreichung verschwendete viele Bytes auf GeometricTransformationundReflectionTransform.

Diese stark reduzierte Version wurde von Alephalpha vorgeschlagen . Reversewurde benötigt, um die Ausgabe richtig zu orientieren.

Graphics[Reverse/@#&/@PeanoCurve@#]&

Beispiel 36 Bytes

Graphics[Reverse/@#&/@PeanoCurve@#]&[3]

Peano-Kurve


Bonus

Wenn dies für den 100-Punkte-Bonus qualifiziert ist, wiegt es 52 - 100 = -48. Der Code [5]wurde nicht gezählt, nur die reine Funktion.

Table[Graphics[Reverse/@#&/@PeanoCurve@#]&@k{k,#}&[5]

Reihenfolge


Graphics[Reverse/@#&/@PeanoCurve@#]&
alephalpha 18.11.18

Es fühlt sich ein bisschen wie Schummeln an, eine Funktion zu haben, die die Peano-Kurve selbst berechnet, aber ich nehme sie als akzeptierte Antwort, da sie trotzdem ziemlich beeindruckend ist;). @ LegionMammal978 Ich denke, du hast es verdient, deine eigene Antwort zu posten. Ich würde argumentieren, dass es anders genug ist, um zu rechtfertigen, dass es als gewinnende Antwort akzeptiert wird.
Peiffap


4

HTML + SVG + JS, 224 213 Bytes

Die Ausgabe wird horizontal gespiegelt.

n=>document.write(`<svg width=${w=3**n*9} height=${w}><path d="M1 ${(p=(n,z)=>n--&&(p(n,-z,a(a(p(n,-z,d+=z)),p(n,z))),d-=z))(n*2,r=d=x=y=1,a=_=>r+=`L${x+=~-(d&=3)%2*9} ${y+=(2-d)%2*9}`)&&r}"fill=#fff stroke=red>`)

Probieren Sie es online! (druckt das HTML aus)


3

Logo, 89 Bytes

to p:n:a
if:n>0[rt:a
p:n-1 0-:a
fw 5
p:n-1:a
fw 5
p:n-1 0-:a
lt:a]end
to f:n
p:n*2 90
end

Port von @ Arnauld's Atari BASIC Antwort. Gebrauch, so etwas wie dies :

reset
f 3

3

Stax , 19 Bytes

∩▐j>♣←╙~◘∩╗╢\a╘─Ràô

Führen Sie es aus, und debuggen Sie es

Ausgabe für 3:

███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ █
█ ███ ███ █ █ ███ ███ █ █ ███ ███ █ █ ███ ███ █ █ ███
█         █ █         █ █         █ █         █ █    
█ ███ ███ █ █ ███ ███ █ █ ███ ███ █ █ ███ ███ █ █ ███
███ █ █ ███ ███ █ █ ███ ███ █ █ ███ ███ █ █ ███ ███ █
    █ █         █ █         █ █         █ █         █
███ █ █ ███ ███ █ █ ███ ███ █ █ ███ ███ █ █ ███ ███ █
█ ███ ███ ███ ███ ███ ███ ███ ███ █ █ ███ ███ ███ ███
█                                 █ █                
█ ███ ███ ███ ███ ███ ███ ███ ███ █ █ ███ ███ ███ ███
███ █ █ ███ ███ █ █ ███ ███ █ █ ███ ███ █ █ ███ ███ █
    █ █         █ █         █ █         █ █         █
███ █ █ ███ ███ █ █ ███ ███ █ █ ███ ███ █ █ ███ ███ █
█ ███ ███ █ █ ███ ███ █ █ ███ ███ █ █ ███ ███ █ █ ███
█         █ █         █ █         █ █         █ █    
█ ███ ███ █ █ ███ ███ █ █ ███ ███ █ █ ███ ███ █ █ ███
███ ███ ███ ███ █ █ ███ ███ ███ ███ ███ ███ ███ ███ █
                █ █                                 █
███ ███ ███ ███ █ █ ███ ███ ███ ███ ███ ███ ███ ███ █
█ ███ ███ █ █ ███ ███ █ █ ███ ███ █ █ ███ ███ █ █ ███
█         █ █         █ █         █ █         █ █    
█ ███ ███ █ █ ███ ███ █ █ ███ ███ █ █ ███ ███ █ █ ███
███ █ █ ███ ███ █ █ ███ ███ █ █ ███ ███ █ █ ███ ███ █
    █ █         █ █         █ █         █ █         █
███ █ █ ███ ███ █ █ ███ ███ █ █ ███ ███ █ █ ███ ███ █
█ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.