Gehen Sie bei einem Wort, das nur aus Kleinbuchstaben besteht, wie folgt vor:
- Ermitteln Sie für jeden Buchstaben die Primfaktorisierung seiner Position im Alphabet.
- Zeichnen Sie für jeden Primfaktor p einen Diamanten mit der Seitenlänge p und stecken Sie den Buchstaben in die Mitte des Diamanten.
- 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.
Antworten:
Matlab,
466393 - 20% = 314,4 BytesGolfed: (Könnte noch ein paar Bytes einsparen, auch wegen @ AndreasDeaks Hilfe!)
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):
Ungolfed und erklärte:
Das angeforderte Wort: (Und hier als Datei: (viel herauszoomen ) : supercalifragilisticexpialidocious.txt )
quelle
A=A(find(sum(A,2)),find(sum(A)));
ausreichend, die Polsterung in einem Schritt zu entfernen?<pre>
Tags eingefügt habe . Warum versuchst du das nicht?sort(factor())
? MATLAB'sfactor
scheinen schon sortiert zu sein. Und Sie können eine Variable für definierenmax(f)
, da Sie anscheinend dieselbe Menge zweimal verwenden.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ärtsWie 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 (⇄
):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).②
Ṗ
PrimzahlenObwohl 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.
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 .
③
Ḟ
PrimfaktorisierungDas 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 DiamantenDiese 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.
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ängenDiese 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.
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 horizontalDies 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.
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 ZeichenfolgeDies 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.
and
Wenn 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 umwandelnDiese Funktion nimmt ein einzelnes Zeichen und gibt die Struktur für den vertikalen Stapel zurück, der dieses eine Zeichen darstellt.
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 undor
die 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.
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:
Ausgabe (Berechnung dauerte 9 Sekunden; kann wegen Größenbeschränkung nicht hier gepostet werden).
quelle