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.
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:
'“? lAð«Ã#¸˜ vyU "€‚ƒ„…†‡ˆ‰Š‹ŒŽ•–—™š›œžŸ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîï" Dâ vy"“ÿ“".V XlQi y?1#] '“,
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).
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:
vAyk})> 27β 255B ".•ÿ•"
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.
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 Ganzzahl 13562
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 werden 250
. 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
und rl
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:
101 355Ÿså i 101-255B"Ƶÿ" ë 255B Dg2Qi "Žÿ" ë "•ÿ•"
Hier ist ein Beispiel Antwort , wo @Emigna verwendet •3Èñ•
für die ganze Zahl 246060
.
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:
Z>© β 255B ®s"•ÿ•ÿв"
Was dieses Programm oben macht, ist:
Z>
: Erhalte die maximale Anzahl + 1 der Eingabeliste ( ©
: und speichere sie im Register)β
: Konvertiert die Eingabeliste von der Basis max+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 hartcodiert 44 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 statt 2в
, 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.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+
:
I # Input_1.
I # Input_2.
+ # Add them up.
Mit impliziten Eingaben können wir uns jedoch auf nur 1 Byte verkürzen, und zwar +
:
+ # Take two numbers implicitly and add them up.
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:
3 # Push the number 3 on top of the stack.
+ # Request implicit input and add to the 3.
£
ist der Befehl zum Aufnehmen der ersten b
Zeichen eines Strings a
.
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']
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 wird U
.Y
, drückt, 2
wenn die Variable Y vor diesem Befehl nicht mit geändert wird V
.®
, 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.)¾
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öchten 5,0,7
, 5¾7
sind 2 Bytes kürzer als 5 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 mir 0
.
M
drückt -Inf
.
Λ
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:
7 0 1
↖ ↑ ↗
6 ← X → 2
↙ ↓ ↘
5 4 3
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:
!@#!@#!
# @
@ #!@ #
! @ # !
# ! ! @
@ @ #
!#@!# !
@
@!#@!#@!#
Wie funktioniert es? Nun, hier sind die Schritte mit diesen Eingaben oben:
3
Zeichen ( !@#
) nach oben (Richtung 0
)3-1
Zeichen ( !@
) nach rechts (Richtung 2
)5-1
Zeichen ( #!@#
) nach unten (Richtung 4
)5-1
Zeichen ( !@#!
) nach links (Richtung 6
)7-1
Zeichen ( @#!@#!
) nach oben (Richtung 0
)7-1
Zeichen ( @#!@#!
) nach rechts (Richtung 2
)9-1
Zeichen ( @#!@#!@#
) nach unten (Richtung 4
)9-1
Zeichen ( !@#!@#!@
) nach links (Richtung 6
)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 Muster 04402662
, das +
mit Armen der angegebenen Länge ein -cross erzeugt . Sehen Sie es in Aktion.×
( '×
inline) übersetzt in das Muster 15513773
, das X
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:
+×8
habe ich mir ja den Quellcode angeschaut.
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 .
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ˆ¼]¯¥
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 mit s
(tauschen) und Š
(dreifach tauschen a,b,c
nach c,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 Ziffern 0
(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, da 1
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ür DR
: Duplicate & Reverse Copy ist; und Q
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 enthalten 0
und eine Ziffernsumme von haben 9
. 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 verwenden 0ζ
. Ein Problem dabei ist jedoch, dass der Füllstoff 0
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-Konstante 0
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 Verwendung 1ö
, 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ür 0
und 1
, und jeder andere Wert führt zu etwas Höherem (und damit zu Falschem, da nur 1
in 05AB1E wahr ist). Dieser Tipp wurde von @Grimy bereitgestellt , um hier ein Byte zu speichern .Beachten Sie, dass einige Operatoren in 05AB1E auf Arrays automatisch vektorisieren. Zum Beispiel der Code 5L3+
, der in den folgenden Pseudocode zerlegt wird:
[1, 2, 3, 4, 5] + 3
würde werden:
[4, 5, 6, 7, 8]
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 ):
€S
Während der normale S
Operator jedes Element im Array aufteilt und in ein einzelnes Array zerlegt ( versuchen Sie es hier ).
ñ
vorangestellten Wert von n
(dem Index) zusammen. tio.run/nexus/05ab1e#@2/iw2XiE2Tio81ldHjj//8A
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.
Der folgende Code hilft dabei, ASCII-Kunst mithilfe einer benutzerdefinierten Basiskonvertierung in 05AB1E umzuwandeln.
|»©ÐÙSDŠ¢øΣθ}R€н¬®sÅ?iD2£RDŠKsì}J©žLR‡®gö₅B®s"•ÿ•“ÿ“ÅвJ"
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; und J
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):
┌─┐ ┌─┐ ┌─────┐ ┌─┐ ┌─┐ ┌───┐
A ──┘ └─┘ └─┘ └─┘ └─┘ └─┘ └──
┌───┐ ┌───┐ ┌─┐ ┌─────┐ ┌─┐ ┌─┐
B ┘ └─┘ └─┘ └─┘ └───┘ └─┘ └
┌─────┐ ┌─┐ ┌─┐ ┌───┐
X ──┘ └───┘ └───┘ └───┘ └────
Wäre:
•I£.µ*:]ó±øqaµb₄ΘYQmœ¹µû₄p´ζÂĆ_5ŠKÑ×ðòË|₄#¹¶úôÂ-Í|¯ε¼É₂ïδ&é–9»ÞFò1î×HÃBjý2ĆÉ≠FYÂÂèC j‘£Å₅Œ•“─ └┘┐┌
XBA“ÅвJ
(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 .
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.
|» # Take multi-line input
© # Store it in the register to reuse later
ÐÙS # Only leave unique characters (as list)
DŠ¢ø # Map it with the count for each of those characters
Σθ}R # Sort it based on that count (highest to lowest)
€н # Remove the count again, so the sorted characters remain
¬®sÅ?i # If the input starts with the most occurring character:
D2£RDŠKsì} # Swap the first two characters in the list
J© # Join everything together, and store it in the register to reuse later
žLR‡ # Map each character to [0-9A-Za-z]
®gö # Get the amount of unique characters, and convert it to that Base
₅B # And then convert that to Base-255
®s # Push the string and swap so the compressed integer is at the top again
"•ÿ•“ÿ“ÅвJ" # Insert it in the correct output format
# `•<compressed_integer>•“<sorted_distinct_characters>“ÅвJ`
"•ÿ•" # (after which the result is output implicitly with trailing newline)
<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.
Nicht jedermanns Sache, aber es funktioniert.
Betrachten Sie die folgenden zwei Programme:
4 5+
"4""5"+
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 Zahl 12345
, was zu 123454321
. Danach können wir die regulären Berechnungen für diese Nummer durchführen.
12345û50000-
Dies würde ergeben: 123404321 .
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 Sie v
auch einen N
-index verwenden, der verwendet werden kann.vy -> ʒ
Austausch ist etwas kniffliger:
y
In solchen Schleifen ist das Aufrufen nicht möglich.[
, µ
und ε
auch Teil der normalen Schleifen / Iterationen?
y
ist mit einigen von diesen jetzt möglich.