Wörter visualisieren

20

Gehen Sie bei einem Wort, das nur aus Kleinbuchstaben besteht, wie folgt vor:

  1. Ermitteln Sie für jeden Buchstaben die Primfaktorisierung seiner Position im Alphabet.
  2. Zeichnen Sie für jeden Primfaktor p einen Diamanten mit der Seitenlänge p und stecken Sie den Buchstaben in die Mitte des Diamanten.
  3. Der größte Diamant befindet sich in der Mitte, nachfolgende kleinere Diamanten (vom größten zum kleinsten) wechseln sich ab und gehen nach unten oder oben.

Hinweis: Verwenden Sie für den Buchstaben a eine Seitenlänge von 1.

Beispiel: kat

  • c : 3 = 3
  • a : 1 = 1
  • t : 20 = 5 · 2 · 2

Das Diagramm:

                 .
                . .
               . t .
                . .
                 .
                 .
                . .
   .           .   .
  . .         .     .
 .   .   .   .       .
.  c  . .a. .    t    .
 .   .   .   .       .
  . .         .     .
   .           .   .
                . .
                 .
                 .
                . .
               . t .
                . .
                 .

Beispiel: Hund

  • d : 4 = 2 · 2
  • o : 15 = 5 · 3
  • g : 7 = 7

Diagramm:

                         .
                        . .
           .           .   .
          . .         .     .
         .   .       .       .
  .     .     .     .         .
 . .   .       .   .           .
. d . .    o    . .      g      .
 . .   .       .   .           .
  .     .     .     .         .
  .      .   .       .       .
 . .      . .         .     .
. d .      .           .   .
 . .       .            . .
  .       . .            .
         .   .
        .  o  .
         .   .
          . .
           .

-20% Bonus, wenn Ihr Programm eine Textdatei mit dem Namen "[your-word] .txt" ausgibt. Geben Sie dann ein reales Wort (oder eine Phrase, die aus Kleinbuchstaben ohne Leerzeichen besteht) mit mindestens 20 Buchstaben ein, und fügen Sie die Ausgabe zwischen a <pre>und a </pre>in Ihre Antwort ein.

Geokavel
quelle
Ihre Beispiele scheinen Diamanten der Größe p + 1 Punkte zu verwenden ...
Jaykul
3
@ Jaykul Gute Frage. Die Seitenlänge wird durch die Anzahl der Abstände zwischen den Punkten bestimmt.
Geokavel

Antworten:

8

Matlab, 466 393 - 20% = 314,4 Bytes

Golfed: (Könnte noch ein paar Bytes einsparen, auch wegen @ AndreasDeaks Hilfe!)

function q(W);function z=g(l,c);[x,y]=ndgrid(abs(-l:l));z=0*y;z(~x&~y)=c;z(x+y==l)=46;end;w=W-96;n=numel(w);R=n*26;C=1;A=zeros(2*R);for k=1:n;f=sort(factor(w(k)));C=C+max(f)+1;d=-1;r=R;for F=fliplr(f);v=-F:F;while norm(A(r+v,v+C));r=r+d;end;A(r+v,v+C)=g(F,W(k));d=-d;end;C=C+max(f);end;A=A(find(sum(A,2)),find(sum(A)));f=fopen([W,'.txt'],'w');for k=1:size(A,1);fprintf(f,[A(k,:),'\n']);end;end

Es sollte auch in Octave (OpenSource) funktionieren, aber nur mit vielen Warnungen. Verwenden Sie diese Version, wenn Sie es in Oktave versuchen möchten (Ausgabe auf Konsole anstelle von Datei):

function q(W);function z=g(l,c);[x,y]=ndgrid(abs(-l:l));z=0*y;z(~x&~y)=c;z(x+y==l)=46;end;w=W-96;n=numel(w);R=n*26;C=1;A=zeros(2*R);for k=1:n;f=sort(factor(w(k)));C=C+max(f)+1;d=-1;r=R;for F=fliplr(f);v=-F:F;while norm(A(r+v,v+C));r=r+d;end;A(r+v,v+C)=g(F,W(k));d=-d;end;C=C+max(f);end;A=A(find(sum(A,2)),find(sum(A)));disp([A,'']);end

Ungolfed und erklärte:

function q(W)
function z=g(l,c) %get a square matrix for one prime factor
[x,y]=ndgrid(abs(-l:l));
z=0*y;
z(~x&~y)=c;    %character in the middle
z(x+y==l)=46;  %dots
end;
w=W-96;                %convert word to the corresponding indices                  
n=numel(w);
R=n*26;                %keeps track of the main row 
C=1;                   %keeps track of the current column
A=zeros(2*R);          %make a 'canvas' matrix that is way to big 
for k=1:n;
    f=sort(factor(w(k)));          %get all the factors of current character
    C=C+max(f)+1;                  %update current column
    d=-1;                          %search direction
    r=R;
    for F=fliplr(f);              
        v=-F:F;
        while norm(A(r+v,v+C));    %go up or down until there is enough space to write the prime factor
            r=r+d;
        end;
        A(r+v,v+C)=g(F,W(k));     %insert all the prime factors
        d=-d;
    end;
    C=C+max(f);
end;
A=A(find(sum(A,2)),find(sum(A))); %truncate all the unneccessary padding
f=fopen([W,'.txt'],'w');     %write to file
for k=1:size(A,1);
    fprintf(f,[A(k,:),'\n']);
end;

end

Das angeforderte Wort: (Und hier als Datei: (viel herauszoomen ) : supercalifragilisticexpialidocious.txt )

                       . . .                   
                      . . . . . .                  
                     . . . . . .                 
                    . . . . . .                
                   . . . . . .               
                  . . . . . .              
                 . . . . . .             
                . . . . . .            
               . . . . . .           
              . . . . . . .          
             . . . . . . . .         
            . . . . . . . . . t. . . . .        
           . . . . . . . . . . . . . . . . . . . . . . . . .       
          . . . . . . . r. . l. . r. . . . l. . . . . x. . . . l. . . . .      
         . . . . . p. . . . . . . . . . . . . . . . . . . p. . . . . . . . .     
        . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .    
       . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .   
      . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  
     . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
    . s .. u .. p .. e .. r .. c ..a .. l .. i .. f .. r ..a .. g .. i .. l .. i .. s. ... t ... i ... c ... e ... x ... p ... i ... a ... l ... i ... d ... o ... c ... i ... o ... u ... s .
     . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
      . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  
       . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .   
        . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .    
         . . . . . p. . . . . . . . . . . . . . . . . . . . . . . . . . . . . p. . . . . . . . d. . . . . . . . .     
          . . . . . . . . . l. . . . f. . . . . . . . l. . . . . . . . . x. . . . . . l. . . . . . . . . . . . .      
           . . . . . r. . . . ich . . . . r. . . ich . . . . ich . . . . . . ich . . . . . ich . . . . ich . . . . . ich . . . . . .       
            . . . . . . . . . . . . . . . . . . . . t. . . . . . . . . . . . . . . . . . .        
             . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . o. . . . o. . . . .         
              . . . . . p. . . . . . . . . . . . . p. . . . . . . . . . . .          
               . . . u. . . . . . x. . . . . . . . u. . .           
                . . . . . . . . . . . . . . . .            
                 . . . . . . . . . . .             
                  . . . . . . . .              
                   . . . . . .               
                    . . . . . .                
                     . . . . . .                 
                      . . . . . .                  
                       . . .                   
fehlerhaft
quelle
Wäre es nicht A=A(find(sum(A,2)),find(sum(A)));ausreichend, die Polsterung in einem Schritt zu entfernen?
Andras Deak
Ich habe tatsächlich perfekte Ergebnisse erzielt, als ich den ausgegebenen Text zwischen zwei <pre>Tags eingefügt habe . Warum versuchst du das nicht?
Geokavel
Bist du sicher, dass du brauchst sort(factor())? MATLAB's factorscheinen schon sortiert zu sein. Und Sie können eine Variable für definieren max(f), da Sie anscheinend dieselbe Menge zweimal verwenden.
Andras Deak
1
@geokavel Ich glaube, Sie sehen es anders herum :) Aus [der Bibel] (de.wikipedia.org): MATLAB -> "Erstveröffentlichung - 1984", GNU Octave -> Erstveröffentlichung - 1988. Wie Ist es so, dass Mathworks das Kopieren von kommerziellen Produkten bis in kleinste Details zulässt? Oder wenn Sie nur meinten, warum es immer noch rentabel ist: Ich bin mir sicher, dass die verfügbaren MATLAB-Toolboxen und -Funktionen Octave überwältigen (obwohl die Syntax von Octave manchmal umfangreicher ist! ) Ganz zu schweigen von der Geschwindigkeit (glaube ich)
Andras Deak
1
@geokavel Es ist, wie AndrasDeak sagte: Octave ist ein Klon von Matlab, aber leider kein perfekter, da die Entwickler auch versucht haben, die Sprache zu verbessern. Hier eine leicht modifizierte Version, die auch im Online-Interpreter funktioniert
flawr
6

Funktion , nicht konkurrierend, 29199 Bytes

Ich habe diese Herausforderung genossen, weil sie das schmerzhafte Fehlen einiger sehr nützlicher Bibliotheksfunktionen hervorhob. Ich werde all diese Funktionen hier (und in der Byteanzahl) aufnehmen, weil ich sie geschrieben habe, nachdem diese Herausforderung veröffentlicht wurde.

Vollständige Quelle in einer einzigen Datei

Erläuterung

Wie immer erzielen Sie ein besseres Rendering, indem Sie es javascript:(function(){$('pre,code').css({lineHeight:5/4});})()in Ihrer Browserkonsole ausführen .

ɹ Rückwärts

Wie Sie vielleicht wissen oder nicht wissen, verfügt Funciton über eine Bibliothek voller Funktionen für Listen , die Werte sind, die in einer einzelnen Ganzzahl codiert sind, sowie eine separate Bibliothek für Sequenzen mit verzögerter Auswertung , in denen Lambda-Ausdrücke (anonyme Funktionen) verwendet werden um faul zu sein. Natürlich gibt es auch eine Bibliothek für String-Handling-Funktionen.

Für diese Herausforderung benötigte ich eine Funktion zum Umkehren eines Strings und eine Funktion zum Umkehren einer verzögert bewerteten Sequenz. Überraschenderweise hatte ich nur eine für Listen - genau die, die ich nicht brauchte. Hier sind also die umgekehrten Funktionen für Lazy Sequences ( ɹ) und für Strings ( ):

              ╓───╖             ╔════╗ ┌────╖        ╓───╖
              ║ ɹ ║             ║ 21 ╟─┤ >> ╟──┐     ║ ⇄ ║
              ╙─┬─╜             ╚════╝ ╘═╤══╝  │     ╙─┬─╜      ┌──┐
          ┌─────┴─────┐                ┌─┴─╖   ├───────┴────────┤  │
        ┌─┴─╖ ┌───╖   │                │ ⇄ ║   │   ╔════╗ ┌───╖ │  │
      ┌─┤   ╟─┤ ɹ ╟─┐ │                ╘═╤═╝   │   ║ −1 ╟─┤ ≠ ╟─┴┐ │
      │ └─┬─╜ ╘═══╝ │ │                ┌─┴─╖ ┌─┴─╖ ╚════╝ ╘═╤═╝  │ │
      │   │   ┌───╖ │ │                │ ‼ ╟─┤ ? ╟──────────┤    │ │
      │   └───┤ ʬ ╟─┘ │                ╘═╤═╝ ╘═╤═╝  ╔═══╗ ┌─┴─╖  │ │
      │       ╘═╤═╝   │                ┌─┴─╖ ╔═══╗  ║ 0 ╟─┤ ≠ ╟──┘ │
      │ ╔═══╗ ┌─┴─╖   │              ┌─┤ ʃ ╟─╢ 1 ║  ╚═╤═╝ ╘═══╝    │
      └─╢ 0 ╟─┤ ? ╟───┘              │ ╘═╤═╝ ╚═══╝    │            │
        ╚═══╝ ╘═╤═╝                  │   └────────────┘            │
                │                    └─────────────────────────────┘

Die Lazy-Sequenzen, die man verwendet ʬ, dh "ein Element an das Ende einer Lazy-Sequenz anhängen". Die Zeichenfolge verwendet man ʃ(Teilzeichenfolge) und (Zeichenfolge verketten).

Primzahlen

Obwohl ich die Primfaktorisierung hätte durchführen können, indem ich nur versucht hätte, n durch alle Faktoren in der richtigen Reihenfolge zu teilen , entschied ich mich für eine Bibliotheksfunktion, die Primzahlen generiert. Die folgende Funktion verwendet eine Ganzzahl n und implementiert das Eratosthenes-Sieb , um alle Primzahlen bis n zu generieren . Dies geschieht als verzögerte Sequenz, sodass nur so viele Primzahlen generiert werden, wie Sie tatsächlich auswerten.

                                       ╓───╖
                                       ║ Ṗ ║
                                 ╔═══╗ ╙─┬─╜
                                 ║ 0 ║ ┌─┴─╖
                                 ╚═╤═╝ │ ♭ ║
                          ╔═══╗ ┌──┴─╖ ╘═╤═╝
                          ║ 2 ╟─┤ Ṗp ╟───┘
                          ╚═══╝ ╘══╤═╝
    ┌──────────────┐               │
    │              ├─────────────────────────────────────────┐
    │            ┌─┴─╖                                       │
    │          ┌─┤ · ╟────────────────────────────┐   ╓┬───╖ │
    │          │ ╘═╤═╝                            ├───╫┘Ṗp ╟─┤
    │          │   │           ╔═══╗ ┌────╖     ┌─┴─╖ ╙─┬──╜ │
    │          │   │           ║ 1 ╟─┤ >> ╟─────┤ · ╟───┴─┐  │
    │          │   │  ┌───╖    ╚═══╝ ╘══╤═╝     ╘═╤═╝     │  │
    │          │ ┌─┴──┤ ♯ ╟─────┐    ┌──┴─╖ ┌───╖ │       │  │
    │          │ │    ╘═══╝ ┌─┐ │ ┌──┤ Ṗp ╟─┤ ♭ ╟─┴─┐     │  │
    │          │ │          ├─┘ └─┤  ╘══╤═╝ ╘═══╝ ┌─┘     │  │
    │          │ │        ╔═╧═╕ ┌─┴─╖ ┌─┴─╖     ┌─┴─╖     │  │
    │          │ └────────╢   ├─┤ · ╟─┤ ? ╟─────┤ · ╟─┐   │  │
    │          │ ┌───╖    ╚═╤═╛ ╘═╤═╝ ╘═╤═╝     ╘═╤═╝ │   │  │
    │        ┌─┴─┤ ♭ ╟─┐ ┌──┴─╖   │   ┌─┴─╖       │   │   │  │
    │        │   ╘═══╝ └─┤ Ṗp ╟───┘ ┌─┤ ? ╟───────┘   │   │  │
    │ ┌───╖  │  ╔════╗   ╘══╤═╝     │ ╘═╤═╝           │   │  │
  ┌─┴─┤ ÷ ╟──┘  ║ −1 ║   ┌──┴─╖   ╔═╧═╗ │            ┌┴┐  │  │
  │   ╘═╤═╝     ╚══╤═╝ ┌─┤ >> ╟─┐ ║ 0 ║              └┬┘  │  │
  │   ┌─┴─╖ ┌────╖ │   │ ╘════╝ │ ╚═══╝               │   │  │
  │   │ × ╟─┤ << ╟─┘ ┌─┴─┐    ╔═╧═╗                   │   │  │
  │   ╘═╤═╝ ╘══╤═╝  ┌┴┐ ┌┴┐   ║ 1 ╟───────────────────┴─┐ │  │
  └─────┘     ┌┴┐   └┬┘ └┬┘   ╚═══╝                     ├─┘  │
              └┬┘    │   └──────────────────────────────┘    │
             ┌─┴─╖ ┌─┴──╖                                    │
             │ ÷ ╟─┤ << ╟─┐                                  │
             ╘═╤═╝ ╘════╝ ├──────────────────────────────────┘
              ┌┴┐         │
              └┬┘         │
      ╔════╗ ┌─┴──╖       │
      ║ −1 ╟─┤ << ╟───────┘
      ╚════╝ ╘════╝

Die Hilfsfunktion Ṗpübernimmt:

  • Ein laufender Zähler, der immer weiter dekrementiert, bis er 0 erreicht.

  • Das Sieb, bei dem für jede Zahl ein Bit gesetzt ist, von dem bereits bekannt ist, dass es keine Primzahl ist. Anfänglich repräsentiert das niedrigstwertige Bit die Zahl 2, aber wir verschieben dies mit jeder Iteration nach rechts.

  • Eine Zahl n, die angibt, welche Zahl durch das niedrigste Bit des Siebs dargestellt wird. Dies wird mit jeder Iteration erhöht.

Wenn das niedrigste Bit des Siebs bei jeder Iteration 0 ist, haben wir eine Primzahl n gefunden . Wir verwenden dann die bereits unter Füllen der Zeilen, Spalten und Diagonalen eines NxN-Gitters beschriebene Formel , um jedes n- te Bit im Sieb zu setzen, bevor wir zur nächsten Iteration übergehen .

Primfaktorisierung

                             ╓───╖
                             ║ Ḟ ║
                             ╙─┬─╜
                       ┌───────┴──────┐
                       │ ┌───╖ ┌────╖ │
                       └─┤ Ṗ ╟─┤ Ḟp ╟─┘
                         ╘═══╝ ╘═╤══╝
                                 │
               ┌────────────────────────────────────────────┐
               │                                     ╓┬───╖ │
       ┌───────┴─┐     ┌───────────────────────┐   ┌─╫┘Ḟp ╟─┘
       │ ╔═══╗ ┌─┴─╖ ┌─┴─╖ ┌───┐ ┌────╖      ┌─┴─╖ │ ╙────╜
       │ ║ 0 ╟─┤   ╟─┤ · ╟─┘┌┐ └─┤ Ḟp ╟──┐ ┌─┤ · ╟─┴──┐
       │ ╚═══╝ └─┬─╜ ╘═╤═╝  └┤   ╘═╤══╝  ├─┘ ╘═╤═╝    │
       │       ┌─┴─┐ ┌─┴─╖ ╔═╧═╕ ┌─┴─╖ ┌─┴─╖ ┌─┴──╖ ┌─┴─╖
       │       │   └─┤ · ╟─╢   ├─┤ ? ╟─┤ · ╟─┤ ÷% ╟─┤ · ╟─┐
       │       │     ╘═╤═╝ ╚═╤═╛ ╘═╤═╝ ╘═╤═╝ ╘═╤══╝ ╘═╤═╝ │
       │       │    ┌──┴─╖   │   ┌─┴─╖ ┌─┴─╖   └──────┘   │
       │       │    │ Ḟp ╟───┘ ┌─┤ ? ╟─┤ ≤ ║              │
       │     ┌─┴─╖  ╘══╤═╝     │ ╘═╤═╝ ╘═╤═╝              │
       └─────┤ · ╟─────┘     ╔═╧═╗ │   ╔═╧═╗              │
             ╘═╤═╝           ║ 0 ║     ║ 2 ║              │
               │             ╚═══╝     ╚═══╝              │
               └──────────────────────────────────────────┘

Das ist ziemlich einfach. Durchlaufen Sie einfach die Primzahlen bis n und sehen Sie, welche n teilen . Wenn man n dividiert , muss man daran denken, mit derselben Primzahl weiterzumachen , damit wir sie mehrmals zurückgeben, wenn sie n mehrmals dividiert . Dies gibt die leere Sequenz für eine beliebige Zahl unter 2 zurück.

Erzeugen Sie einen Diamanten

Diese Funktion generiert einen einzelnen Diamanten mit einem bestimmten Zeichen und einem bestimmten Radius. Es wird nur das Zeichen verwendet, um es in der Mitte des Diamanten zu platzieren.

                                   ┌───╖
             ┌─────────────────────┤ ♯ ╟───────────┬─────────┐
             │ ┌───╖ ╔═══╗   ┌───┐ ╘═══╝           │         │
             └─┤ ♫ ╟─╢ 0 ║   │ ┌─┴─╖               │         │
               ╘═╤═╝ ╚═══╝   │ │ ʭ ╟───┐           │         │
               ┌─┴─╖   ┌─────┘ ╘═╤═╝   │           │         │
               │ ɱ ╟───┤ ┌───╖ ┌─┴─╖ ╔═══╗   ╓───╖ │         │
               ╘═╤═╝   └─┤ ɹ ╟─┤ ʓ ╟─╢ 1 ║ ┌─╢ ◇ ╟─┤         │
                 │ ╔═══╗ ╘═══╝ ╘═══╝ ╚═══╝ │ ╙───╜ │         │
                 │ ║ 0 ║                   │     ┌─┴─╖       │
                 │ ╚═╤═╝                   │     │ ♭ ║       │
               ╔═╧═╕ │   ╔════╗            │     ╘═╤═╝       │
           ┌───╢   ├─┘ ┌─╢ 21 ║          ┌─┴─╖   ┌─┴─╖     ┌─┴─┐
           │   ╚═╤═╛   │ ╚════╝ ┌────────┤ · ╟───┤ · ╟─┐ ┌─┴─╖ │
           │   ┌─┴─╖ ┌─┴──╖ ┌───┘        ╘═╤═╝   ╘═╤═╝ ├─┤ = ║ │
           │ ┌─┤ ‼ ╟─┤ >> ║ │              │     ┌─┴─╖ │ ╘═╤═╝ │
           │ │ ╘═══╝ ╘═╤══╝ │              │   ┌─┤ ? ╟─┘   │   │
           │ │   ┌───╖ │ ┌──┘              │   │ ╘═╤═╝     │   │
           │ └─┬─┤ ⇄ ╟─┘ │     ┌─────┐     │   │ ┌─┴─╖     │   │
           │   │ ╘═══╝ ┌─┴─╖ ┌─┴─╖ ┌─┴─╖ ┌─┴─╖ └─┤ · ╟──┬──┘   │
           │   └───────┤ · ╟─┤ ? ╟─┤ · ╟─┤ ‼ ║   ╘═╤═╝  │      │
           │           ╘═╤═╝ ╘═╤═╝ ╘═╤═╝ ╘═╤═╝   ┌─┴─╖  │      │
           │             └─────┘     └─┬───┘ ┌───┤ … ║  │      │
           │               ┌─────┐     │     │   ╘═╤═╝  │      │
           │            ╔══╧═╗ ┌─┴─╖ ┌─┴─╖ ┌─┴─╖ ╔═╧══╗ │      │
           │            ║ 32 ║ │ … ╟─┤ ‼ ╟─┤ ‼ ║ ║ 32 ║ │      │
           │            ╚════╝ ╘═╤═╝ ╘═══╝ ╘═╤═╝ ╚════╝ │      │
           │                   ┌─┴─╖       ╔═╧══╗       │      │
           │               ┌───┤ − ╟───┬─┐ ║ 46 ║       │      │
           │             ┌─┴─╖ ╘═══╝   │ │ ╚════╝       │      │
           └─────────────┤ · ╟─────────┘ └──────────────┘      │
                         ╘═╤═╝                                 │
                           └───────────────────────────────────┘

Dies macht starken Gebrauch von faulen Sequenzen. So funktioniert das:

  • Generieren Sie die Folge von ganzen Zahlen von 0 bis einschließlich r .

  • Generieren Sie für jede solche ganze Zahl α eine Zeichenfolge, die aus ( r - α ) Leerzeichen ( ), gefolgt von einem Punkt und α Leerzeichen besteht - es sei denn, α = r . In diesem Fall wird ein Leerzeichen weniger generiert und der Buchstabe angehängt. Wir haben jetzt das obere linke Viertel des Diamanten.

  • Fügen Sie an jede dieser Zeichenfolgen eine weitere Kopie derselben Zeichenfolge an, wobei Sie jedoch die Zeichen umkehren ( ) und dann das erste Zeichen entfernen ( >> 21). Wir haben jetzt die obere Hälfte des Diamanten.

  • Nehmen Sie diese Sequenz und hängen Sie dieselbe Sequenz an, jedoch in umgekehrter Reihenfolge ( ɹ) und mit dem ersten entfernten Element ( ʓ). Wir haben jetzt den ganzen Diamanten.

Jetzt haben wir die Saiten, aus denen der Diamant besteht, aber wir brauchen ein bisschen mehr Informationen. Wir müssen wissen, wo sich die vertikale Mitte des Diamanten befindet. Anfangs ist dies natürlich r , aber sobald wir andere Diamanten oben und unten angehängt haben, müssen wir die Position des „mittleren“ Diamanten verfolgen, damit wir die anderen Diamantenstapel richtig vertikal ausrichten können . Gleiches gilt für die horizontale Ausdehnung des Diamanten (dies ist erforderlich, wenn Diamanten oben und unten angebracht werden). Ich beschloss auch, den Brief im Auge zu behalten. Ich brauche das, weil die Funktion (auf die wir im nächsten Abschnitt eingehen) sonst vier Parameter haben müsste, aber Funciton nur drei zulässt.

                             ┌─────────────────┐
                             │  ╓───╖          │
                             ├──╢ ◆ ╟──┐       │
                             │  ╙───╜  │       │
                             │   ┌─────┴───┐   │
                           ┌─┴─╖ │ ┌───╖ ┌─┴─╖ │
                         ┌─┤ · ╟─┴─┤ › ╟─┤ › ║ │
                         │ ╘═╤═╝   ╘═╤═╝ ╘═╤═╝ │
                         │ ┌─┴─╖     │   ┌─┴─╖ │
                         │ │ ◇ ╟─────────┤ › ╟─┘
                         │ ╘═╤═╝         ╘═══╝
                         └───┘

Wir verwenden die Listen-API ( fügen Elemente am Anfang einer Liste hinzu), um eine Struktur zu erstellen, die [ x , y , c , q ] enthält, wobei x die x-Koordinate der horizontalen Mitte des Diamanten ist, y die y- Koordinate der Grundlinie, c ist der Buchstabe und q ist die faule Folge von Zeichenfolgen. In dieser Struktur werden ab sofort alle Zwischenstufen enthalten sein.

Diamanten senkrecht anhängen

Diese Funktion verwendet einen vorhandenen Diamantstapel, einen Radius und einen Booleschen Wert, der angibt, ob der neue Diamant oben (true) oder unten (false) hinzugefügt werden soll.

                 ┌─────────────────────────────────────────────────┐
               ┌─┴─╖         ┌───────────────────────────┐ ┌───╖ ┌─┴─╖
           ┌───┤ · ╟─────────┘ ╔═══╗ ┌───────────────┐   ├─┤ ‹ ╟─┤ ‹ ║
           │   ╘═╤═╝           ║ 1 ║ │ ╓───╖         │   │ ╘═╤═╝ ╘═╤═╝
           │     │             ╚═╤═╝ └─╢ ⬗ ╟─┐       │ ┌─┴─╖ │   ┌─┴─╖
           │     │ ┌───╖ ┌───╖ ┌─┴──╖  ╙─┬─╜ │       └─┤ · ╟─┘ ┌─┤ ‹ ╟─┐
           │   ┌─┴─┤ + ╟─┤ ♯ ╟─┤ << ║    │   │         ╘═╤═╝   │ ╘═══╝ │
           │   │   ╘═╤═╝ ╘═══╝ ╘═╤══╝    │ ┌─┴─╖         │     │       │
           │   │   ┌─┴─╖         └───────┴─┤ · ╟───┐   ┌─┴─╖   │       │
           │   └───┤ ? ╟─┐                 ╘═╤═╝ ┌─┴───┤ · ╟─┐ │       │
           │       ╘═╤═╝ ├───────────────────┘   │     ╘═╤═╝ │ │       │
           │ ┌───╖ ┌─┴─╖ │               ┌─────┐ │ ┌───╖ │   │ │       │
           └─┤ › ╟─┤ › ║ │       ┌───╖ ┌─┴─╖   │ └─┤ − ╟─┘   │ │       │
             ╘═╤═╝ ╘═╤═╝ │     ┌─┤ ‼ ╟─┤ ‼ ║   │   ╘═╤═╝     │ │       │
               │   ┌─┴─╖ │     │ ╘═╤═╝ ╘═╤═╝ ┌─┴─╖ ┌─┴─╖     │ │       │
               ┌───┤ · ╟─┘     │ ┌─┴─╖   ├───┤ · ╟─┤ … ║     │ │       │
     ┌───┐     │   ╘═╤═╝       └─┤ · ╟───┘   ╘═╤═╝ ╘═╤═╝     │ │       │
     │ ┌─┴─╖ ┌─┴─╖ ┌─┴─╖         ╘═╤═╝         │  ╔══╧═╗     │ │       │
     │ │ ʭ ╟─┤ ? ╟─┤ › ╟─┐ ╔═══╗ ╔═╧═╕         │  ║ 32 ║     │ │       │
     │ ╘═╤═╝ ╘═╤═╝ ╘═══╝ │ ║ 0 ╟─╢   ├─────────┘  ╚════╝     │ │       │
     │ ┌─┘   ┌─┴─╖       │ ╚═══╝ ╚═╤═╛                       │ │       │
     │ └─┬───┤ ʭ ╟─┐   ┌─┴─╖     ┌─┴─╖                       │ │       │
     │ ┌─┴─╖ ╘═══╝ ├───┤ · ╟─────┤ ɱ ║                       │ │       │
     └─┤ · ╟───────┘   ╘═╤═╝     ╘═╤═╝                       │ │       │
       ╘═╤═╝             │       ┌─┴─╖                       │ │       │
         │               └─────┬─┤ ◇ ╟───────────────────────┘ │       │
         │                     │ ╘═══╝                       ┌─┴─╖     │
         │                     └─────────────────────────────┤ · ╟─────┘
         │                                                   ╘═╤═╝
         └─────────────────────────────────────────────────────┘

Dies ist auch ziemlich einfach; verwenden , um die Struktur zu entpacken; Verwenden Sie , um den neuen Diamanten zu generieren. Verwenden Sie ɱ(map), um am Anfang und am Ende jeder Zeichenfolge in der neuen Raute Leerzeichen einzufügen, sodass alle die gleiche Breite haben. hänge ( ʭ) die neuen Zeichenfolgen an die alten (wenn unten) oder die alten an die neuen (wenn oben) an; und schließlich verwenden , um die Struktur zu konstruieren, die alle neuen Werte enthält. Insbesondere wenn wir an den unteren Rand anhängen, ändert sich y nicht, aber wenn wir an den oberen Rand anhängen, muss y um ♯(r << 1)( r ist der Radius des neuen Diamanten) erhöht werden .

⑥ Verketten Sie die Stapel horizontal

Dies ist die größte Funktion von allen. Ich werde nicht leugnen, dass es ziemlich umständlich war, dies richtig zu machen. Es werden zwei Stapel benötigt, die unter Beachtung der korrekten vertikalen Ausrichtung horizontal verkettet werden.

                           ┌──────────────────────────────────┬───────────────────────┐
                           │     ┌──────────────────┐       ┌─┴─╖                   ┌─┴─╖
                           │     │    ┌───────────┐ └───────┤ · ╟───┬───────────────┤ · ╟─────────────┐
                           │     │  ┌─┴─╖         │         ╘═╤═╝   │               ╘═╤═╝             │
                           │     │  │ ‹ ╟───┐     │         ┌─┴─╖ ┌─┴─╖               │               │
                           │     │  ╘═╤═╝ ┌─┴─╖   └─────────┤ · ╟─┤ · ╟─────────┐     │               │
                           │     │    ├─┐ │ ‹ ╟───┐         ╘═╤═╝ ╘═╤═╝         │     │               │
                           │     │    └─┘ ╘═╤═╝ ┌─┴─╖ ╓───╖ ┌─┴─╖   │           │     │               │
                           │     │          │   │ ‹ ╟─╢ ❖ ╟─┤ ‹ ║   │           │     │               │
                           │     │          │   ╘═╤═╝ ╙───╜ ╘═╤═╝ ┌─┴─╖ ┌─┐     │     │               │
                           │     │          │     │           └───┤ ‹ ║ └─┤     │     │               │
                           │     │          │     │               ╘═╤═╝ ┌─┴─╖   │     │               │
                           │     │          │     │                 └───┤ ‹ ║   │     │               │
                           │     │          │     └─────────────────┐   ╘═╤═╝   │     │               │
                           │     │          │                     ┌─┴─╖ ┌─┴─╖ ┌─┴─╖ ┌─┴─╖             │
                           │     │          │      ┌──────────────┤ · ╟─┤ · ╟─┤ · ╟─┤ · ╟──────┐      │
                           │     │          └──────┤              ╘═╤═╝ ╘═╤═╝ ╘═╤═╝ ╘═╤═╝      │      │
                           │   ┌─┴─╖             ┌─┴─╖            ┌─┴─╖   │     │     │        │      │
                           │ ┌─┤ · ╟─────────────┤ · ╟────────────┤ · ╟───┘     │     │        │      │
                           │ │ ╘═╤═╝             ╘═╤═╝            ╘═╤═╝         │     │        │      │
                           │ │   │                 │         ┌────╖ │         ┌─┴─╖   │        │      │
       ╔═══╗ ┌────╖        │ │   │                 │       ┌─┤ << ╟─┴─────────┤ · ╟─┐ │        │      │
       ║ 1 ╟─┤ << ╟────────┘ │   │                 │       │ ╘═╤══╝           ╘═╤═╝ │ │        │      │
       ╚═══╝ ╘═╤══╝ ╔════╗   │   │               ┌─┴─╖     │ ┌─┴─╖              │   │ │     ┌──┴──┐   │
             ┌─┴─╖  ║ 32 ╟─┐ │   │ ┌─────────────┤ · ╟───┐ │ │ ♯ ║              │   │ │   ┌─┴─╖ ┌─┴─╖ │
             │ ♯ ║  ╚════╝ │ │   └─┤ ┌───╖       ╘═╤═╝   │ │ ╘═╤═╝ ┌───╖ ╔════╗ │   │ │ ┌─┤ ? ╟─┤ < ║ │
             ╘═╤═╝   ┌───╖ │ │     └─┤ − ╟─────────┴─┐   │ │   └───┤ … ╟─╢ 32 ║ │   │ │ │ ╘═╤═╝ ╘═╤═╝ │
               └─────┤ … ╟─┘ │       ╘═╤═╝         ┌─┴─╖ │ └───┐   ╘═╤═╝ ╚════╝ │   │ │ │ ┌─┴─╖   ├───┘
                     ╘═╤═╝   │ ┌───╖ ┌─┴─╖ ┌───────┤ · ╟─┴─┐ ╔═╧═╗ ┌─┴─╖ ┌──────┘   │ │ └─┤ · ╟───┘
                       │   ┌─┴─┤ ʭ ╟─┤ ȶ ║ │ ┌───╖ ╘═╤═╝   │ ║ 1 ║ │ ⁞ ║ │ ┌────────┘ │   ╘═╤═╝
                     ┌─┴─╖ │   ╘═╤═╝ ╘═╤═╝ └─┤ > ╟───┴─┐   │ ╚═══╝ ╘═╤═╝ │ │   ┌──────┘     └────┐
                     │ ⁞ ║ │   ┌─┴─╖ ┌─┴─╖   ╘═╤═╝     │ ┌─┴─╖ ┌───╖ │   │ │ ┌─┴─╖ ┌───╖ ┌───╖ ┌─┴─╖
                     ╘═╤═╝ └───┤ ? ╟─┤ · ╟─────┴─┐     │ │ − ╟─┤ ȶ ╟─┴─┐ │ │ │ + ╟─┤ ♯ ╟─┤ › ╟─┤ › ║
                     ┌─┴─╖     ╘═╤═╝ ╘═╤═╝       │     │ ╘═╤═╝ ╘═╤═╝   │ │ │ ╘═╤═╝ ╘═══╝ ╘═╤═╝ ╘═╤═╝
┌────────────────────┤ · ╟───────┴───┐ └─┐     ┌─┴─╖   └───┘   ┌─┴─╖   │ │ └───┘           │     │
│                    ╘═╤═╝         ┌─┴─╖ │   ┌─┤ · ╟───────────┤ · ╟───┘ │                       │
│ ┌────────────────┐   │   ┌───────┤ · ╟─┘   │ ╘═╤═╝           ╘═╤═╝     │                       │
│ │ ╔════╗ ┌───╖ ┌─┴─╖ └───┤ ┌───╖ ╘═╤═╝     │   │               │     ┌─┴───┐                   │
│ │ ║ 32 ╟─┤ ‼ ╟─┤ · ╟───┐ └─┤ ʭ ╟───┘       │   │             ┌─┴─╖ ┌─┴─╖ ┌─┴─╖                 │
│ │ ╚════╝ ╘═╤═╝ ╘═╤═╝   │   ╘═╤═╝     ┌─────┘   │             │ ʭ ╟─┤ · ╟─┤ ? ╟─┐               │
│ │        ┌─┴─╖ ╔═╧═╕ ╔═╧═╕ ┌─┴─╖   ┌─┴─╖       │             ╘═╤═╝ ╘═╤═╝ ╘═╤═╝ │               │
│ │        │ ‼ ╟─╢   ├─╢   ├─┤ ʑ ╟───┤ ʭ ║     ┌─┴─╖             └─────┘     │   │               │
│ │        ╘═╤═╝ ╚═╤═╛ ╚═╤═╛ ╘═╤═╝   ╘═╤═╝ ┌───┤ · ╟─────────────────────────┘   │               │
│ └──────────┘     │   ╔═╧═╗   │       ├───┘   ╘═╤═╝                             │               │
│                  └───╢ 0 ║ ┌─┴─╖   ┌─┴─╖       └───────────────────────────────┘             ┌─┴─╖ ╔═══╗
│                      ╚═══╝ │ ȶ ╟───┤ · ╟─────────────────────────────────────────────────────┤ › ╟─╢ 0 ║
│                            ╘═╤═╝   ╘═╤═╝                                                     ╘═══╝ ╚═══╝
│                            ┌─┴─╖   ┌─┴─╖
│                      ┌─────┤ ? ╟─┐ │ ɕ ║
│                    ┌─┴─╖   ╘═╤═╝ │ ╘═╤═╝
│            ┌───╖ ┌─┤ < ╟───┬─┘   │   │
└────────────┤ ɕ ╟─┤ ╘═══╝ ┌─┴─╖   │   │
             ╘═══╝ └───────┤ · ╟───┘   │
                           ╘═╤═╝       │
                             └─────────┘

So funktioniert das.

  • Generieren Sie zunächst für jeden Stapel eine unendliche Folge ( ) von Zeichenfolgen, von denen jede Leerzeichen ( ) enthält , die der Breite des Stapels entsprechen.

  • Die y- Werte der Stapel geben an, welche und um wie viel „nach unten“ bewegt werden müssen. Stellen Sie die entsprechende Leerzeichenfolge voran und kürzen Sie sie ( ȶ) auf die richtige Länge ( y1 - y2 oder y2 - y1 je nach Bedarf).

  • Bestimmen Sie nun die Länge jeder der Zeichenfolgenfolgen ( ɕ), die uns ihre Höhe angibt. Finde heraus, welcher größer ist.

  • Hänge die unendlichen Raumfolgen an beide Stapel an.

  • Setze sie mit zip ( ʑ) zusammen. Verketten Sie sie ( ) für jedes Zeichenfolgenpaar mit einem zusätzlichen Leerzeichen dazwischen.

  • Dann nutzt ȶdas Ergebnis , dass auf die höchste Höhe zu kürzen. Auf diese Weise müssen wir uns nicht darum kümmern, welcher von ihnen die Polsterung benötigt.

Generieren Sie abschließend die Struktur erneut. Zu diesem Zeitpunkt brauchen wir das Zeichen in den Diamanten nicht mehr und setzen es auf 0. Der x- Wert wird nur summiert und inkrementiert (so dass die Breite des Stapels immer noch berechnet werden kann als ♯(x << 1)). Der y- Wert wird auf den höheren der beiden Werte gesetzt.

Durchlaufen Sie Zeichen in einer Zeichenfolge

Dies ist eine weitere nützliche Funktion, die ich der Bibliothek hinzufügen werde. Wenn Sie eine Zeichenfolge angeben, erhalten Sie eine Lazy-Sequenz, die jeden Zeichencode enthält.

                                        ╓───╖
                                        ║ ↯ ║
                                        ╙─┬─╜
                           ┌──────────────┴────────────────┐
                           │      ┌─┐          ╔═══╗ ┌───╖ │
                           │      └─┤     ┌────╢ 0 ╟─┤ ≠ ╟─┴─┐
                    ┌──────┴─┐ ┌┐ ╔═╧═╕ ┌─┴─╖  ╚═══╝ ╘═╤═╝   │
                    │        ├─┤├─╢   ├─┤ ? ╟──────────┤     │
                    │        │ └┘ ╚═╤═╛ ╘═╤═╝ ╔════╗ ┌─┴─╖   │
                    │ ╔══════╧══╗ ┌─┴─╖   │   ║ −1 ╟─┤ ≠ ╟───┘
                    │ ║ 2097151 ║ │ ↯ ║       ╚════╝ ╘═══╝
                    │ ╚═════════╝ ╘═╤═╝
                    │             ┌─┴──╖ ╔════╗
                    └─────────────┤ >> ╟─╢ 21 ║
                                  ╘════╝ ╚════╝

andWenn Sie einen String mit 2097151 eingeben, wird das erste Zeichen zurückgegeben. >>21 entfernt es. Wir überprüfen sowohl 0 als auch -1 aus einem Grund , der auf der esolangs-Seite erläutert wird . Dies ist für diese Herausforderung nicht relevant, aber ich möchte, dass die Bibliotheksfunktion korrekt ist.

Zeichen in Diamantstapel umwandeln

Diese Funktion nimmt ein einzelnes Zeichen und gibt die Struktur für den vertikalen Stapel zurück, der dieses eine Zeichen darstellt.

                                   ╔════╗
                                   ║ 96 ║  ╓───╖
                                   ╚══╤═╝  ║ ⬖ ║
                        ┌───╖ ┌───╖ ┌─┴─╖  ╙─┬─╜
                    ┌───┤ ɗ ╟─┤ Ḟ ╟─┤ − ║    │
                    │   ╘═╤═╝ ╘═══╝ ╘═╤═╝    │
                    │   ┌─┴─╖         ├──────┘  ┌──┐
                    │   │ ɹ ║         │     ┌───┤  │
                    │   ╘═╤═╝   ┌─────┘     │   │  │
                  ╔═╧═╗ ┌─┴─╖ ┌─┴─╖         │  ┌┴┐ │
                  ║ 1 ╟─┤   ╟─┤ · ╟─────┐ ╔═╧═╕└┬┘ │
                  ╚═══╝ └─┬─╜ ╘═╤═╝   ┌─┴─╢   ├─┘ ┌┴┐
            ┌───────────┐ │     └─┐   │   ╚═╤═╛   └┬┘
          ┌─┴─╖         │ │ ┌───╖ │   └─┐ ╔═╧═╕ ┌──┴─╖ ╔═══╗
    ┌─────┤ · ╟───┐     │ └─┤ ◆ ╟─┘   ┌─┴─╢   ├─┤ << ╟─╢ 1 ║
 ┌──┴─┐   ╘═╤═╝   │     │   ╘═╤═╝     │   ╚═╤═╛ ╘════╝ ╚═╤═╝
 │ ┌──┴─╖ ┌─┴─╖ ╔═╧═╕ ╔═╧═╕ ┌─┴─╖   ┌─┴─╖ ┌─┴─╖        ┌─┴─╖
 │ │ >> ╟─┤ ⬗ ╟─╢   ├─╢   ├─┤ ʩ ╟───┤ · ╟─┤ ʑ ╟────────┤ ⸗ ║
 │ ╘══╤═╝ ╘═╤═╝ ╚═╤═╛ ╚═╤═╛ ╘═╤═╝   ╘═╤═╝ ╘═╤═╝        ╘═╤═╝
 │  ╔═╧═╗  ┌┴┐    │   ╔═╧═╗   │       └─────┘          ╔═╧═╗
 │  ║ 1 ╟─┐└┬┘    └───╢ 0 ║                            ║ 0 ║
 │  ╚═══╝ ├─┘         ╚═══╝                            ╚═══╝
 └────────┘

Diese Funktion ist interessant, da wir die Diamanten abwechselnd unten und oben anbringen mussten. So habe ich es gemacht:

  • Subtrahieren Sie zuerst 96 (so 'a'wird 1), erhalten Sie Primfaktoren ( oben), ɗaddieren Sie das Element 1, wenn die Sequenz leer ist, und kehren Sie dann die Reihenfolge um ( ɹ).

  • Nehmen Sie das erste Element ab und rufen Sie auf, um den Stack zu starten.

  • Verwenden Sie nun , um eine Lazy-Sequenz zu generieren, die nur die Zahlen 0 und 1 auf unbestimmte Zeit abwechselt.

  • Verwenden Sie dazu ʑ(zip) und die verbleibenden Primfaktoren. Verschieben Sie den Primfaktor für jeden Primfaktor um 1 nach links und ordie 0/1 darauf. Wir haben jetzt eine Sequenz, die die Primzahlen und die oberen / unteren Informationen codiert .

  • Zum Schluss verwenden ʩ(nach links falten / aggregieren). Der Anfangswert ist der Stapel, den wir aus dem ersten Element oben generiert haben. Rufen Sie für jeden Wert ν (fügen Sie eine neue Raute hinzu) mit dem vorherigen Stapel, der Primzahl ( ν >> 1) und ob oben oder unten ( ν & 1).

⑨ Hauptprogramm

Hier machen wir die Hauptarbeit.

                       ┌─────┐
                       │   ┌─┴─╖
                       │   │ ⬖ ║
               ╔═══╗ ╔═╧═╕ ╘═╤═╝
               ║ 0 ╟─╢   ├───┘
               ╚═╤═╝ ╚═╤═╛ ┌───╖ ┌───╖ ╔═══╗
                 └─┐   └───┤ ɱ ╟─┤ ↯ ╟─╢   ║
       ┌─────────┐ └─────┐ ╘═╤═╝ ╘═══╝ ╚═══╝
       │       ┌─┴─╖     │ ┌─┴─╖
       │   ┌───┤ · ╟───┐ └─┤   ╟─┐
       │   │   ╘═╤═╝   │   └─┬─╜ │
       │ ┌─┴─╖ ╔═╧═╕ ╔═╧═╕ ┌─┴─╖ │
       │ │ ❖ ╟─╢   ├─╢   ├─┤ ʩ ╟─┘
       │ ╘═╤═╝ ╚═╤═╛ ╚═╤═╛ ╘═╤═╝
       └───┘   ╔═╧═╗   │   ┌─┴─╖ ┌─┐
               ║ 0 ╟───┘ ┌─┤ ‹ ╟─┴─┘
               ╚═══╝     │ ╘═══╝
                       ┌─┴─╖ ┌─┐
                     ┌─┤ ‹ ╟─┴─┘
                     │ ╘═══╝
      ╔════╗ ┌───╖ ┌─┴─╖ ┌─┐
      ║ 10 ╟─┤ ʝ ╟─┤ ‹ ╟─┴─┘
      ╚════╝ ╘═╤═╝ ╘═══╝
               │

Ordnen Sie ( ɱ) zunächst den Zeichen in der Eingabezeichenfolge ( ) zu und verwandeln Sie sie mit in einen Diamantstapel . Nehmen Sie das erste Element davon ab und falten Sie ( ʩ) über den Rest, um sie alle zu verketten ( ). Zum Schluss entpacken Sie die Struktur mit , um zur Zeichenfolgenfolge zu gelangen, und ʝfügen Sie all ( ) mit 10 (der Newline) als Trennzeichen zusammen.

Beispielausgabe

Eingang:

crusaders

Ausgabe (Berechnung dauerte 9 Sekunden; kann wegen Größenbeschränkung nicht hier gepostet werden).

Timwi
quelle