Haben Sie Tipps zum Code-Golfen in 05AB1E , einer von Adnan erstellten Golfsprache ?
Ihre Tipps sollten zumindest etwas spezifisch für 05AB1E sein.
Bitte posten Sie einen Tipp pro Antwort.
Haben Sie Tipps zum Code-Golfen in 05AB1E , einer von Adnan erstellten Golfsprache ?
Ihre Tipps sollten zumindest etwas spezifisch für 05AB1E sein.
Bitte posten Sie einen Tipp pro Antwort.
Antworten:
Da es nicht Teil des Wikis auf den GitHub-Seiten von 05AB1E war (ich denke, das sollte es), werde ich es hier nur hinzufügen, damit ich es selbst besser verstehe.
Wie benutzt man das Wörterbuch?
05AB1E hat die folgende words.ex-Wörterbuchdatei, die alle ihm bekannten Wörter enthält. Aber wie greifen wir auf die Wörter in diesem Wörterbuch zu? Nehmen wir das Wort
"testing"
als Beispiel:"testing"
finden Sie in Zeile 1453 der Wörterbuchdatei. Da die ersten beiden Zeilen keine Wörter sind und wir das mit 0 indizierte Wort benötigen, subtrahieren wir 3.Nun haben wir also den index (
1450
), aber wie benutzt man ihn?Wir öffnen und starten einen komprimierten String mit
“
† . Wir schauen uns dann die zweite Spalte der Datei info.txt an . (So€
ist 00;‚
ist 01; usw.)Im Falle
"testing"
dieser Mittelî
(14) und»
(50).Der komprimierte String für
"testing"
lautet daher:“
Online ausprobieren. Wie bei fast allen 05AB1E-Codeteilen ist das Nachziehen“
optional, wenn Sie nicht auf die Zeichenfolge zugreifen. In diesem Fall funktioniert es also auch ohne .Einige Dinge zu beachten:
Alle Zeichen, die keinen Index in der Datei info.txt haben, können unverändert verwendet werden. Dies kann hilfreich sein, wenn Sie ein hinzufügen,
s
um anstelle eines einzelnen Wortes einen Plural auszugeben, oder um Satzzeichen wie,.?!
zum Beispiel zu verwenden.ÿ
(String-Interpolation) kann auch verwendet werden, wenn Sie Werte aus dem Stapel in den String einfügen möchten.HINWEIS: Jedes lose Zeichen, das keinen Index in der Datei info.txt enthält, zählt als ein Wort für die folgenden Komprimierungstypen.
† Es gibt verschiedene Arten von komprimierten Zeichenfolgen, die Sie verwenden können:
'
: Nimm ein einzelnes komprimiertes Wort wie es ist (kein Trailing'
erforderlich) -'î»
: "testing"„
: Nimmt zwei komprimierte Wörter mit Leerzeichen-Begrenzer auf (kein Nachstellen„
erforderlich) -„î»î»
: "testing testing"…
: Nimmt drei komprimierte Wörter mit Leerzeichen-Begrenzer auf (kein Nachstellen…
erforderlich) -…î»î»î»
: "testing testing testing"“
: Nimm den komprimierten String mit Leerzeichen -“î»î»“
: "testing testing"’
: Nimm den komprimierten String wie er ist ohne implizite Leerzeichen -’î»î»’
: "testingtesting"”
: Nimm die komprimierte Zeichenkette in Groß- und Kleinschreibung mit Leerzeichen -”î»î»”
: "Testing Testing"‘
: Nimm den komprimierten String in Großbuchstaben mit Leerzeichen -‘î»î»‘
: "TESTING TESTING"Hier ein nützliches Programm, um die komprimierte Zeichenfolge basierend auf einer durch Leerzeichen getrennten Eingabe von Wörtern abzurufen:
Probieren Sie es online aus.
Dieses Programm wird:
lAð«Ã#
) auf oder setzen Sie die Wörter in eine Liste, wenn nur ein einzelnes Wort eingegeben wurde (¸˜
).vyU
)"€...ï"Dâvy
Hat dann eine innere Schleife über jedes komprimierte Wort aus dem Wörterbuch ( ), die es als 05AB1E-Programm ("“ÿ“".V
) auszuführen versuchtXlQiy?1#
Bei einem Eingang wäre
good bye world
der Ausgang also“‚¿Þ¡‚ï“
. Probieren Sie es online aus.ANMERKUNG: Damit dieser Generator funktioniert, müssen Sie immer noch nachsehen, ob das Wort im Wörterbuch vorhanden ist, und Sonderzeichen oder mehrere Wörter werden ignoriert. Es werden nur die Wörter gefunden, die im Wörterbuch genau gleich sind.
Hier ein Beispiel, wo ich
…Ÿ™‚ï!
für die Zeichenfolge "Hallo Welt!" und’‚¿Þ¡ ÿ ‚ï!’
für die Zeichenfolge "Auf Wiedersehen, Welt!". Beachten Sie, wie Leerzeichen und Ausrufezeichen unverändert verwendet werden, da die Datei info.txt keine Indizes enthält. Außerdem wirdÿ
das "grausame" Element eingefügt, das sich oben im Stapel befand und das leider nicht Teil des Wörterbuchs war (das jedoch mithilfe der im folgenden Abschnitt beschriebenen Methode komprimiert wurde).Wie komprimiere ich Strings, die nicht im Wörterbuch enthalten sind?
Obwohl die words.ex-Wörterbuchdatei ziemlich groß ist (um genau zu sein 10.000 Wörter), kann es vorkommen, dass Sie ein Wort benötigen, das nicht Teil davon ist, oder eine Zeichenfolge, die einfach nur Kauderwelsch ist. Gibt es also eine Möglichkeit, diese ebenfalls zu komprimieren?
Es gibt mit Sicherheit
.•
eine komprimierte Base-255-Zeichenfolge, die auf dem Alphabet basiert. HINWEIS: Diese Methode kann nur für Zeichen in Kleinbuchstaben und Leerzeichen verwendet werden.Hier ist ein nützliches Programm zum Konvertieren eines Wortes / einer Zeichenfolge in die komprimierte, auf Basis des Alphabets 255 erstellte Zeichenfolge:
Probieren Sie es online aus. .
Was dieses Programm oben macht, ist:
vAyk})>
: Nehmen Sie die 1-indizierten Alphabet-Indizes der einzelnen Buchstaben der Eingabe, wobei Leerzeichen zu Index 0 werden27β
: Konvertieren Sie diese Indizes von Basis 27 in eine einzelne Zahl255B
: Konvertieren Sie diese Nummer mit der eigenen Codepage von 05AB1E in Base-255".•ÿ•"
:.•
Fügt•
vor diese komprimierte Zeichenfolge ein führendes und ein nachfolgendes einHier ist ein Beispiel Antwort , wo @Kaldo verwendet
.•zíΘ•
das Wort „Gans“ zu komprimieren.Wie komprimiere ich große ganze Zahlen?
Nehmen wir an, wir wollen eine sehr große Zahl für etwas verwenden, aber sie kann nicht wirklich durch Leistungsberechnungen ermittelt werden. Nehmen wir zum Beispiel an, wir möchten
18238098189071058293
aus irgendeinem Grund auf die große Ganzzahl zugreifen .In diesem Fall können wir sowohl eine führende als auch eine nachfolgende
•
Zahl verwenden, um eine Zahl im Format zu komprimieren[1-9][0-9]+
.Die obige Beispielnummer wird
•15Y₁Ò'Θpc•
. Probieren Sie es online aus. Wie bei der komprimierten Wörterbuchzeichenfolge kann auch hier das nachfolgende•
optional entfernt werden .Wenn die Ganzzahl klein genug ist, so dass nur 2 komprimierte Zeichen verwendet werden müssen, können wir sie optional verwenden
Ž
. In diesem Fall benötigen wir kein nachfolgendes Byte, um sie zu schließen, und die Ganzzahl wird statt in 4 in 3 Bytes komprimiert Beispiel: Die Ganzzahl13562
würde zu führen•rl•
, aber da sie nur zwei Zeichen verwendet, kann esŽrl
stattdessen sein.Zahlen im Bereich
[101, 355]
können auch mitƵ
einem zusätzlichen Zeichen aus der Codepage von 05AB1E in 2 Byte komprimiert werden . So kann zum BeispielƵ–
für die ganze Zahl verwendet werden250
. Hier eine Übersicht aller verfügbaren Nummern. Diese Zeichen werden von Base-255 in Base-10 konvertiert und dann wird 101 hinzugefügt (da die Zahlen im Bereich[0,100]
bereits 1 oder 2 Byte umfassen).Wie sind diese
15Y₁Ò'Θpc
undrl
erstellt? Ganz einfach, die Nummer wird mit der eigenen Codepage von 05AB1E in Base-255 konvertiert. Sie können also das folgende Programm verwenden, um eine komprimierte Zahl abzurufen, für die es dann verwendetƵ.
wirdŽ..
, oder•...•
abhängig von der Größe der komprimierten Ganzzahl:Probieren Sie es online aus.
Hier ist ein Beispiel Antwort , wo @Emigna verwendet
•3Èñ•
für die ganze Zahl246060
.Wie komprimiere ich Integer-Listen?
Manchmal möchten Sie eine ganze Liste von ganzen Zahlen anstelle einer einzelnen Zahl komprimieren. Nehmen wir zum Beispiel an, wir wollen die Liste
[5,93,17,83,4,44,32,19,4,45,83,90,0,14,3,17,17,81]
aus irgendeinem Grund. In diesem Fall können wir stattdessen Folgendes verwenden:•4βŸ{©£MG]q‡dZΘp•94в
Probieren Sie es online aus.Hier ein nützliches Programm, um sowohl diese komprimierte Zahl als auch die Basis zu generieren, in die wir konvertieren möchten:
Probieren Sie es online aus.
Was dieses Programm oben macht, ist:
Z>
: Erhalte die maximale Anzahl + 1 der Eingabeliste (©
: und speichere sie im Register)β
: Konvertiert die Eingabeliste von der Basismax+1
in eine einzelne Zahl255B
: Komprimiere diese einzelne Zahl (wie oben beschrieben)®s"•ÿ•ÿв"
: Gibt das Ergebnis in folgendem Format zurück: führende•
, komprimierte Zahl•
, max + 1, abschließendeв
Hier eine Beispielantwort, mit der ich
•4Œ”dóŒfÝŸĀTUÕáOyÖOÀÁàu¼6¹₆Žr‡_›y³eß₂©ǝ²ƶ"SAÎAñ'¡û†Ø(•91в
die Liste komprimiere[85,30,29,39,28,37,33,88,31,40,34,89,35,41,32,90,36,38,42,43,44,60,45,61,46,62,47,63,48,64,49,65,81,50,66,51,67,52,68,53,69,86,54,70,87,55,71,56,72,82,57,73,79,80,58,74,59,75,76,77,78,83,84]
.PS: Bei dieser Antwort
•6j|eDEJÞó(ÍêΓλùÄÞKüzHÇ-ø`JδŠ₂+Öηôî®À8†6/ðÎ6ùøΓ°ÓĆ;ˆ©Ā•2ô
handelt es sich um eine gleichgroße Alternative (57), da alle Zahlen genau zweistellig sind. In einigen Fällen (insbesondere bei kleinen Listen) kann dies eine kürzere Alternative sein.Integer-Komprimierung vs Integer-Listenkomprimierung:
Mit diesen beiden kann es in beide Richtungen gehen. Manchmal ist eine komprimierte Liste kürzer, manchmal eine komprimierte Ganzzahl, manchmal ist eine völlig andere Alternative kürzer. Setzen Sie also immer Ihr eigenes Urteilsvermögen und Ihre Fähigkeiten ein, um die Dinge möglicherweise weiter zu verbessern, anstatt sich vollständig auf die oben genannten Generatoren zu verlassen. Hier einige Beispiele:
[44, 59]
( verwendet in dieser Antwort von @Emigna ):•A–•60в
beträgt 7 Bytes (generiert vom Generator für komprimierte Ganzzahllisten)•H|•2ô
oder•H|•2ä
oder hartcodiert44 59‚
sind alle 6 BytesŽH|2ô
oderŽH|2ä
sind beide 5 Bytes„,;Ç
wäre mit 4 Bytes die beste Option (Codepunkte der Zeichen ',' und ';')[2,4,6,0]
( verwendet in dieser Antwort von @Emigna ):•3ā•7в
beträgt 6 Bytes (generiert vom Generator für komprimierte Ganzzahllisten)Ž3ā7в
ist 5 BytesŽ9¦S
wäre mit 4 Bytes die beste Option (komprimierte Ganzzahl 2460 auf eine Liste von Ziffern)10101001100101001
( verwendet in meiner Antwort ):•a½₄Ƶ6®í•
ist 9 Bytes (generiert durch komprimierten Large Integer Generator)•1∊}•2вJ
ist 8 Bytes (generiert durch komprimierten Integer-Listengenerator mit hinzugefügtem Join)•1∊}•b
mit 6 Bytes wäre die beste Option (komprimierte Integer-Liste, mit einem zu binären statt2в
, die implizit verbindet)[85,30,29,39,28,37,33,88,31,40,34,89,35,41,32,90,36,38,42,43,44,60,45,61,46,62,47,63,48,64,49,65,81,50,66,51,67,52,68,53,69,86,54,70,87,55,71,56,72,82,57,73,79,80,58,74,59,75,76,77,78,83,84]
( verwendet in meiner Antwort ):•4Œ”dóŒfÝŸĀTUÕáOyÖOÀÁàu¼6¹₆Žr‡_›y³eß₂©ǝ²ƶ"SAÎAñ'¡û†Ø(•91в
ist 57 Bytes (generiert durch komprimierten Integer-Listengenerator)•6j|eDEJÞó(ÍêΓλùÄÞKüzHÇ-ø
JδŠ₂ + Öηôî®À8 † 6 / ðÎ6ùøΓ ° ÓĆ; ˆ © Ā • 2ô` ist ebenfalls 57 Byte (komprimierte Ganzzahl, aufgeteilt in Teile der Größe 2)•Bšā¿ÑáζΔÕæ₅"®GÙ₂®°ƶío"§óÏ4¸bćÔ!₃ùZFúÐìŸ ,λ₂ϦP(Ì•65в₂+
ist jedoch 2 Bytes kürzer, komprimiert die Liste mit jedem Wert 26 niedriger und addiert diesen anschließend mit `₂ + ` . Dieser Trick, später einen Einzelbyte-Wert hinzuzufügen, kann ziemlich oft verwendet werden, um Bytes in komprimierten Listen zu speichern.quelle
Implizite Eingabe
In den Tagen, als 05AB1E veröffentlicht wurde, waren implizite Eingaben ziemlich neu und ausgefallen. Heutzutage scheint es notwendig zu sein, den Überblick über andere Wettbewerbssprachen (wie Jelly, MATL, Pyth usw.) zu behalten.
Wenn Sie beispielsweise zwei Zahlen hinzufügen möchten, können Sie Folgendes tun
II+
:Teste es hier
Mit impliziten Eingaben können wir uns jedoch auf nur 1 Byte verkürzen, und zwar
+
:Teste es hier
Dies geschieht nur, wenn die Länge des Stapels kleiner ist als die des Bedieners. Ein letztes Beispiel ist
3+
. Die Arität des+
Operators ist 2, während sich nur 1 Element im Stapel befindet:Teste es hier
quelle
Teilstrings
£
ist der Befehl zum Aufnehmen der erstenb
Zeichen eines Stringsa
.Ex:
"hello_world"5£
->
"hello"
Wenn
b
es sich jedoch um eine Liste von Indizes handelt, wird der String stattdessen in Teile (bis zu) dieser Größen aufgeteilt.Ex:
"hello_world"5L£
->
['h', 'el', 'lo_', 'worl', 'd']
quelle
Vordefinierte Variablen
Sie sind in 05AB1E etwas versteckt. Hier ist eine Liste aller vordefinierten Variablen:
¾
, drückt,0
wenn die Zählervariable vor diesem Befehl nicht geändert wird.X
, drückt,1
wenn die Variable X vor diesem Befehl nicht mit geändert wirdU
.Y
, drückt,2
wenn die Variable Y vor diesem Befehl nicht mit geändert wirdV
.®
, drückt,-1
wenn das Register vor diesem Befehl nicht mit geändert wird©
.¯
, drückt[]
(leeres Array), wenn vor diesem Befehl nichts zum global_array hinzugefügt wird.¸
, drückt[""]
auf einen leeren Stapel, wenn keine Eingabe erfolgt. (Vielen Dank, dass Sie @Emigna gefunden haben.)quelle
¾
drückt 0 => das ist ungefähr so nicht-mnemonisch wie es nur geht¾
Drückt eine Zählervariable, die mit 0 initialisiert wird. Wenn Sie nur 0 drücken möchten, ist 0 natürlich natürlicher, aber wenn Sie drücken möchten5,0,7
,5¾7
sind 2 Bytes kürzer als5 0 7
.¾
war damals so.75
, und ich habe Pyth einmal damit geschlagen . Diese neumodischen Golfsprachen haben keine Ahnung von Mnemonics ...print(3 / 4)
in Python 2 gibt mir0
.M
drückt-Inf
.Verwenden der Leinwand (
Λ
oder.Λ
)Da es nicht Teil der Dokumentation war und @Adnan derzeit etwas zu beschäftigt ist, um es zu schreiben, habe ich um Erlaubnis gebeten, es hier vorerst als Tipp hinzuzufügen.
Mit der Canvas-Funktion (
Λ
oder.Λ
) können Sie ASCII-Linien auf dem Bildschirm zeichnen. Es hat drei erforderliche Parameter:[0,7]
für die Richtungen, für die wir eine oder mehrere verwenden können. Es gibt auch einige spezielle Optionen, die ein bestimmtes Zeichen erfordern (dazu später mehr).Die Richtungsziffern entsprechen
[0,7]
den folgenden Richtungen:Einige Beispiele, in denen 05AB1E verwendet wird:
Machen wir etwas Ähnliches wie das letzte, nehmen wir also an, dass wir die Canvas-
Λ
Funktion mit den folgenden drei Parametern verwenden:[3,3,5,5,7,7,9,9]
!@#
[0,2,4,6]
Dies ergibt die folgende Ausgabe:
Probieren Sie es online aus.
Wie funktioniert es? Nun, hier sind die Schritte mit diesen Eingaben oben:
3
Zeichen (!@#
) nach oben (Richtung0
)3-1
Zeichen (!@
) nach rechts (Richtung2
)5-1
Zeichen (#!@#
) nach unten (Richtung4
)5-1
Zeichen (!@#!
) nach links (Richtung6
)7-1
Zeichen (@#!@#!
) nach oben (Richtung0
)7-1
Zeichen (@#!@#!
) nach rechts (Richtung2
)9-1
Zeichen (@#!@#!@#
) nach unten (Richtung4
)9-1
Zeichen (!@#!@#!@
) nach links (Richtung6
)Sie
-1
sind da, weil sich die Linien überlappen. Die ersten beiden Schritte sind also:Und
Welche Kombination ist:
Einige kleine Anmerkungen:
[0,7]
stehen einige spezielle Optionen zur Verfügung, die sich grundsätzlich in eine bestimmte Richtungsfolge übersetzen lassen.+
('+
inline) übersetzt in das Muster04402662
, das+
mit Armen der angegebenen Länge ein -cross erzeugt . Sehen Sie es in Aktion.×
('×
inline) übersetzt in das Muster15513773
, dasX
mit Armen der angegebenen Länge ein -cross erzeugt . Sehen Sie es in Aktion.8
kehrt zu dem Ursprung zurück, von dem aus wir zu zeichnen begonnen haben. Sehen Sie es in Aktion und sehen Sie den Unterschied ohne8
.Λ
Befehl wird sofort ausgegeben und.Λ
führt zu einer Zeichenfolge, die auf den Stapel verschoben wird. Sie kann weiterhin wiederverwendet, geändert und nach Belieben verwendet werden . Einige Beispiele:quelle
+×8
habe ich mir ja den Quellcode angeschaut.Pop oder get
Wie in anderen Stack-basierten Sprachen, 05AB1E Funktionen in der Regel Pop (konsumieren) ihre Eingänge vom Stapel und schieben ihre Ausgaben auf den Stapel.
Einige Funktionen erhalten ihre Eingaben jedoch vom Stapel, ohne sie zu verbrauchen. Ein Beispiel ist die
head
Funktion,¬
die das erste Element aus der Eingabeliste erzeugt. Sehen Sie ein Beispiel - Programm hier:¬+
. Dies fügt die erste Nummer der Eingabeliste zu jeder Nummer dieser Liste hinzu.Informationen dazu , welche Funktionen angezeigt und welche abgerufen werden, finden Sie in der entsprechenden Spalte in der Funktionsinformationsdatei .
quelle
Bedingungen und Schleifen
Schleifen und Bedingungen erhalten am Ende eines Programms automatisch schließende Klammern, sodass Sie sie nur dann in den Code einfügen müssen, wenn Sie etwas außerhalb der Schleife / Bedingung benötigen.
Zum Beispiel benötigt dieses (ungolfed) Programm, das eine Liste der ersten
n
Primzahlen erstellt, keine schließenden Klammern.[¹¾Q#NpiNˆ¼
Aber wenn wir eine Operation an der resultierenden Liste ausführen möchten, zum Beispiel Delta-Operationen, müssen wir zuerst die Schleife schließen.
[¹¾Q#NpiNˆ¼]¯¥
quelle
Kleine 05AB1E Golf - Tipps
Wird dies mit kleinen Golftipps erweitern, die ich auf dem Weg gelernt habe. (Gerade erst angefangen 05AB1E persönlich.)
D
(duplizieren) undÐ
(dreifach) in Kombination mits
(tauschen) undŠ
(dreifach tauschena,b,c
nachc,a,b
) sind normalerweise kürzer als die Verwendung von©
(in global_variable speichern ) und®
( global_variable verschieben ) in Schleifen. Dies sparte ein Byte in meiner Antwort sowie zwei in meiner Antwort .½
(wenn 1, dann erhöhe counter_variable um 1) ist am Ende von a nicht notwendigµ
(während counter_variable ! = a, do ...), da dies implizit geschieht ( speichere ein Byte in meiner Antwort )..B
Teilt sich implizit auf neue Zeilen. Dies war in meiner Antwort nützlich, als wir nach einer Alternative für¡
(split) suchten, während noch leere Elemente vorhanden waren (HINWEIS: Die Lösung in der verknüpften Antwort funktioniert nicht, wenn Elemente nach dem Teilen nachgestellte Leerzeichen enthalten.) hinzugefügt werden, um zu teilen, aber in Zukunft leere Zeilen zu behalten.SÖ
(Welche der Ziffern der Eingabe-Ganzzahl kann die Eingabe-Ganzzahl gleichmäßig teilen) enthält die Zahl selbst für die Ziffern0
(anstelle von Fehlern durch Teilen durch Null).1053
Dies führt[1,1053,0,1]
zum Beispiel zu (1053 ist teilbar durch 1 und 3; ist nicht teilbar durch 5; und ergibt einen Fehler bei der Division durch Null für 0). Dies war in meiner Antwort ziemlich nützlich, indem ich die Macht der Liste übernahm, da1
in 05AB1E nur wahr ist und alles andere falsch.SÖP
Das Ergebnis von truthy (1
) bedeutet daher, dass eine Eingabe-Ganzzahl durch jede ihrer Ziffern gleichmäßig teilbar ist.û
einen gegebenen String gesehen habe (palindromize), war ich überrascht, dass kein is_palindrome eingebaut ist. Später wurde mir jedoch klar, dass nur 2 Bytes benötigt werden, um dies zu erreichenÂQ
(woÂ
ist Bifurkate, was kurz fürDR
: Duplicate & Reverse Copy ist; undQ
um zu überprüfen, ob die beiden obersten Werte auf dem Stapel gleich sind).Ds*
(duplizieren, tauschen, multiplizieren, um als logisches UND zu fungieren) vs.}ʒ
(ersten Filter schließen, erneut filtern) tun, wenn Sie zwei Filter verwenden. Zum Beispiel: In dieser Herausforderung müssen wir alle vierstelligen Zahlen auflisten, die mindestens eine enthalten0
und eine Ziffernsumme von haben9
. Wenn Sie einen Bereich verwenden, wird[1000,10000]
die Anzahl der vier Stellen abgedeckt, aber dann bleiben Ihnen zwei weitere Filter übrig. Anfangs habe ich₄4°ŸʒD0åsSO9Q*
(14 Bytes) verwendet, aber durch die Verwendung von zwei Filtern kann ein Byte gespeichert werden:₄4°Ÿʒ0å}ʒSO9Q
(13 Bytes). (Was später von @Grimy auf₄4°ŸεW°ö9Q
(10 Bytes) golfen wurde.)0
als Füllzeichen zip möchten , können Sie verwenden0ζ
. Ein Problem dabei ist jedoch, dass der Füllstoff0
zu einer Zeichenfolge"0"
wird. Wenn Sie also später versuchen, mit gemischten Zeichenfolgen und ganzen Zahlen zu sortieren, wird dies höchstwahrscheinlich nicht das gewünschte Ergebnis liefern. Hier ist ein Beispiel dafür , wie es um die RV - Innen Listen sortieren wird:0ζ€{
. Dies kann durch Zugabe eine explizite Umwandlung zu int (festgelegt wirdï
) nach dem Reißverschluss, und nur dann sort:0ζï€{
. Wenn Sie jedoch die¾
as-Konstante0
mit dem Zip-Füller verwenden, bleibt diese während des Reißverschlusses eine Ganzzahl anstelle einer Zeichenfolge. Also¾ζ€{
wird hier ein Byte gespeichert. Dieser Tipp wurde von @ Mr.Xcoder zur Verfügung gestellt , um ein Byte in meiner Antwort zu speichern .€SO
. Kürzer ist jedoch die Verwendung1ö
, die automatisch vektorisiert. Dieser Tipp wurde von @Grimy bereitgestellt , um hier ein Byte (und hier 2 Byte ) zu speichern .2‹
. Die Verwendung von!
(Fakultät) führt jedoch auch nur zu 1 (wahr) für0
und1
, und jeder andere Wert führt zu etwas Höherem (und damit zu Falschem, da nur1
in 05AB1E wahr ist). Dieser Tipp wurde von @Grimy bereitgestellt , um hier ein Byte zu speichern .quelle
Automatische Vektorisierung
Beachten Sie, dass einige Operatoren in 05AB1E auf Arrays automatisch vektorisieren. Zum Beispiel der Code
5L3+
, der in den folgenden Pseudocode zerlegt wird:würde werden:
Wenn es nicht automatisch vektorisiert, können Sie auch den
€
Operator verwenden. Es benötigt einen einzelnen Zeichenbefehl und führt diesen (monadischen) Operator für jedes Element aus. Ein Beispiel für die Aufteilung der einzelnen Elemente ist der folgende Code ( versuchen Sie es hier ):Während der normale
S
Operator jedes Element im Array aufteilt und in ein einzelnes Array zerlegt ( versuchen Sie es hier ).quelle
ñ
vorangestellten Wert vonn
(dem Index) zusammen. tio.run/nexus/05ab1e#@2/iw2XiE2Tio81ldHjj//8AReihenfolge der Eingänge
Die Reihenfolge, in der Sie Eingaben vornehmen, kann sich drastisch auf Ihren Code auswirken. Wenn Sie häufig
s
den oberen Bereich des Stapels mit dem nächsthöheren auf dem Stapel tauschen, denken Sie nicht richtig über das Problem nach. Versuchen Sie, Eingaben neu zu ordnen, und prüfen Sie, ob Sie die Notwendigkeit eines Austauschs beseitigen können, indem Sie die Eingaben entweder im Voraus austauschen, sie früher zum Stapel hinzufügen oder sie irgendwo duplizieren. Das offensichtlichste I & O kann die am wenigsten erfolgreiche 05AB1E-Antwort sein.quelle
05AB1E ASCII-Art Golf
Der folgende Code hilft dabei, ASCII-Kunst mithilfe einer benutzerdefinierten Basiskonvertierung in 05AB1E umzuwandeln.
Probieren Sie es online aus.
Dies wird erreicht durch:
0-9A-Za-z
in dieser Reihenfolge zu, wobei jedes einzelne Zeichen ein eigenes Zuordnungszeichen erhält, bis jedes ersetzt wurde.•<compressed_integer>•“<sorted_distinct_characters>“ÅвJ
.Hiermit
“
können Sie auch String-Anführungszeichen komprimieren"
. dasÅв
wird diese Zeichenfolge verwenden basen wandeln die erzeugte ganzzahlige die Zeichenfolge als individuelle Base; undJ
fügt alle diese Zeichen zu einer einzigen Zeichenfolge zusammen, die implizit ausgegeben wird.Akzeptiert Muster mit bis zu 62 eindeutigen Zeichen, gut für ASCII-Kunst.
Je weniger eindeutige Zeichen vorhanden sind, desto besser ist die Komprimierung.
Beispielausgabe für Zeichnen des digitalen XNOR-Zeitdiagramms (214 Byte, 9 eindeutige Zeichen):
Wäre:
05AB1E , 106 Bytes
Probieren Sie es online aus.
(106/214) * 100 = 49,53% der Größe der ursprünglichen ASCII-Zeichenfolge.
Dies entspricht der Anzahl der Bytes, die ich für diese Herausforderung in 05AB1E (Legacy) tatsächlich eingereicht habe .
Code Erklärung:
HINWEIS: Code wird absolut nicht gespielt. Es ist schnell geschrieben, um ASCII-Grafiken in die effizienteste Komprimierung umzuwandeln, daher ist es ziemlich hässlich und lang.
quelle
<str><compr_int><int>вèJ
anstelle von Ihrem<compr_int><int>BžLR<str>‡
; und“
statt"
als String-Anführungszeichen verwenden, so"
kann ein Teil der Eingabe sein.Strings und Ints sind gleiche Typen
Nicht jedermanns Sache, aber es funktioniert.
Betrachten Sie die folgenden zwei Programme:
Beide ergeben 9 . Das liegt daran, dass jeder Wert zuerst ausgewertet wird (mit
ast.literal_eval
). Aus diesem Grund können wir alle Zeichenfolgenmanipulationsoperatoren für Ints und alle Int-Manipulationsoperatoren für Zeichenfolgen ausführen.Zum Beispiel
12345û
palindromizes die Zahl12345
, was zu123454321
. Danach können wir die regulären Berechnungen für diese Nummer durchführen.Dies würde ergeben: 123404321 .
quelle
Versteckte Schleifen und Iteratoren
05AB1E hat die folgenden normalen Schleifen und Iteratoren:
F
, das durch 0 .. n-1 iteriert .G
, das durch 1 .. n-1 iteriert .ƒ
, das durch 0 iteriert .. n .v
, das über jedes Element s [0], s [1], .., s [n] iteriert .ʒ
Dies ist keine Schleife, sondern ein Filter-by- Befehl. Wir missbrauchen diesen Befehl, weil er unbeabsichtigt die einzelnen Elemente durchläuft.Mit diesen Schleifen können wir die folgenden versteckten Schleifen ableiten :
gF
können Siev
auch einenN
-index verwenden, der verwendet werden kann.vy -> ʒ
Austausch ist etwas kniffliger:y
In solchen Schleifen ist das Aufrufen nicht möglich.quelle
[
,µ
undε
auch Teil der normalen Schleifen / Iterationen?y
ist mit einigen von diesen jetzt möglich.