Tipps zum Golfen in 05AB1E


Antworten:


20

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, sum 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#] '“,

Probieren Sie es online aus.

Dieses Programm wird:

  1. Nehmen Sie die Eingabe als Kleinbuchstaben, entfernen Sie alle nicht-alphabetischen Zeichen (mit Ausnahme von Leerzeichen) und teilen Sie die Wörter dann durch Leerzeichen ( lAð«Ã#) auf oder setzen Sie die Wörter in eine Liste, wenn nur ein einzelnes Wort eingegeben wurde ( ¸˜).
  2. Schleifen über jedes Wort ( vyU)
  3. "€...ï"DâvyHat dann eine innere Schleife über jedes komprimierte Wort aus dem Wörterbuch ( ), die es als 05AB1E-Programm ( "“ÿ“".V) auszuführen versucht
  4. Und wenn es dem aktuellen Wort entspricht, wird es gedruckt und die innere Schleife wird unterbrochen XlQiy?1#

Bei einem Eingang wäre good bye worldder 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:

vAyk})> 27β 255B ".•ÿ•"

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 werden
  • 27β: Konvertieren Sie diese Indizes von Basis 27 in eine einzelne Zahl
  • 255B: 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 ein

Hier 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 18238098189071058293aus 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 13562würde zu führen •rl•, aber da sie nur zwei Zeichen verwendet, kann es Žrlstattdessen 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₁Ò'Θpcund rlerstellt? 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 "Žÿ" ë "•ÿ•"

Probieren Sie es online aus.

Hier ist ein Beispiel Antwort , wo @Emigna verwendet •3Èñ•für die ganze Zahl 246060.

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:

Z>© β 255B ®s"•ÿ•ÿв"

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 Basis max+1in eine einzelne Zahl
  • 255B: 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 ):

[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
  • Aber in diesem Fall Ž9¦Swä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)
  • Aber in diesem Fall •1∊}•bmit 6 Bytes wäre die beste Option (komprimierte Integer-Liste, mit einem zu binären statt , 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 ):


12

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+:

I    # Input_1.
 I   # Input_2.
  +  # Add them up.

Teste es hier


Mit impliziten Eingaben können wir uns jedoch auf nur 1 Byte verkürzen, und zwar +:

+    # Take two numbers implicitly and add them up.

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:

3    # Push the number 3 on top of the stack.
 +   # Request implicit input and add to the 3.

Teste es hier


8

Teilstrings

£ist der Befehl zum Aufnehmen der ersten bZeichen eines Strings a.
Ex: "hello_world"5£ -> "hello"

Wenn bes 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']


8

Vordefinierte Variablen

Sie sind in 05AB1E etwas versteckt. Hier ist eine Liste aller vordefinierten Variablen:

  • ¾, drückt, 0wenn die Zählervariable vor diesem Befehl nicht geändert wird.
  • X, drückt, 1wenn die Variable X vor diesem Befehl nicht mit geändert wird U.
  • Y, drückt, 2wenn die Variable Y vor diesem Befehl nicht mit geändert wird V.
  • ®, drückt, -1wenn 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.)

24
¾drückt 0 => das ist ungefähr so ​​nicht-mnemonisch wie es nur geht
Fatalize

6
@Fatalize: 0 drückt auch 0. ¾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¾7sind 2 Bytes kürzer als 5 0 7.
Emigna

7
Das ¾war damals so .75, und ich habe Pyth einmal damit geschlagen . Diese neumodischen Golfsprachen haben keine Ahnung von Mnemonics ...
ETHproductions 16.10.16

31
Keine Ahnung wovon ihr alle redet: p. print(3 / 4)in Python 2 gibt mir 0.
Adnan

2
Wenn am Anfang Mdrückt -Inf.
mbomb007

7

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:

  • a Länge: Die Größe der Linie (n). Dies kann eine einzelne Ganzzahl oder eine Liste von Ganzzahlen sein
  • b String: Die Zeichen, die wir anzeigen möchten. Dies kann ein einzelnes Zeichen, eine Zeichenfolge, eine Liste von Zeichen oder eine Liste von Zeichenfolgen sein (in den letzten drei Fällen werden alle einzeln verwendet, einschließlich Umlauf).
  • c Richtung: Die Richtung, in die die Zeichenlinien gezeichnet werden sollen. Im Allgemeinen haben wir die Ziffern[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:

  • a :[3,3,5,5,7,7,9,9]
  • b :!@#
  • c :[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:

  1. Zeichnen 3Zeichen ( !@#) nach oben (Richtung 0)
  2. Zeichnen 3-1Zeichen ( !@) nach rechts (Richtung 2)
  3. Zeichnen 5-1Zeichen ( #!@#) nach unten (Richtung 4)
  4. Zeichnen 5-1Zeichen ( !@#!) nach links (Richtung 6)
  5. Zeichnen 7-1Zeichen ( @#!@#!) nach oben (Richtung 0)
  6. Zeichnen 7-1Zeichen ( @#!@#!) nach rechts (Richtung 2)
  7. Zeichnen 9-1Zeichen ( @#!@#!@#) nach unten (Richtung 4)
  8. Zeichnen 9-1Zeichen ( !@#!@#!@) nach links (Richtung 6)

Sie -1sind da, weil sich die Linien überlappen. Die ersten beiden Schritte sind also:

#
@
!

Und

 !@

Welche Kombination ist:

#!@
@
!

Einige kleine Anmerkungen:


1
Mir war nicht mal bewusst, dass 05AB1E eine Leinwand hat!
MilkyWay90

Wie ... wie hast du das herausgefunden? Quellcode?
Magic Octopus Urn

1
@MagicOctopusUrn Das meiste aus dieser Antwort von @Adnan (PS: seine letzte Antwort ist auch ziemlich gut erklärt ). Für die +×8habe ich mir ja den Quellcode angeschaut.
Kevin Cruijssen

5

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 headFunktion, ¬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 .


@NeilA. Vielen Dank! Link aktualisiert
Luis Mendo

3

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 nPrimzahlen 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ˆ¼]¯¥


3

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 mit s(tauschen) und Š(dreifach tauschen a,b,cnach 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 ).
  • .BTeilt 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.
  • (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). 1053Dies 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 1in 05AB1E nur wahr ist und alles andere falsch. SÖPDas Ergebnis von truthy ( 1) bedeutet daher, dass eine Eingabe-Ganzzahl durch jede ihrer Ziffern gleichmäßig teilbar ist.
  • Nachdem ich û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 Qum zu überprüfen, ob die beiden obersten Werte auf dem Stapel gleich sind).
  • Wenn Sie eine Liste nach mehreren Kriterien filtern möchten, ist es in der Regel günstiger, mehrere lose Filter zu verwenden, als alle in einem zu kombinieren. Denn wenn Sie zwei Filter haben, müssen Sie etwas in der Art von 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 0und 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.)
  • Wenn Sie mit Integer 0als Füllzeichen zip möchten , können Sie verwenden . Ein Problem dabei ist jedoch, dass der Füllstoff 0zu 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 0mit 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 .
  • Wenn Sie die Ziffern mehrerer Zahlen in einer Liste zusammenfassen möchten, können Sie verwenden €SO. Kürzer ist jedoch die Verwendung , die automatisch vektorisiert. Dieser Tipp wurde von @Grimy bereitgestellt , um hier ein Byte (und hier 2 Byte ) zu speichern .
  • Wenn Sie nur mit nicht negativen ganzen Zahlen arbeiten und in einem Filter prüfen möchten, ob es entweder 0 oder 1 ist, können Sie natürlich das Offensichtliche verwenden 2‹. Die Verwendung von !(Fakultät) führt jedoch auch nur zu 1 (wahr) für 0und 1, und jeder andere Wert führt zu etwas Höherem (und damit zu Falschem, da nur 1in 05AB1E wahr ist). Dieser Tipp wurde von @Grimy bereitgestellt , um hier ein Byte zu speichern .

2

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:

[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 SOperator jedes Element im Array aufteilt und in ein einzelnes Array zerlegt ( versuchen Sie es hier ).


Wie ordnen Sie das n-te Element in einem Array zu?
Andrew Savinykh

@AndrewSavinykh Momentan gibt es kein eingebautes dafür, aber es ist etwas, das ich implementieren möchte.
Adnan

@Adnan Ich habe einen Weg gefunden, es zu tun. Erstellen Sie eine weitere Liste, die den Wert hat, der auch am n-ten Index zugewiesen werden soll. Führen Sie dann die Listen mit dem ñvorangestellten Wert von n(dem Index) zusammen. tio.run/nexus/05ab1e#@2/iw2XiE2Tio81ldHjj//8A
mbomb007

@ mbomb007 Möglicherweise besteht das einzige Problem darin, dass Sie das Array anschließend nicht ändern können, da der Befehl merge nur Zeichenfolgen als Argumente verwendet (und die Liste in eine Zeichenfolge konvertiert).
Adnan

2

Reihenfolge der Eingänge

Die Reihenfolge, in der Sie Eingaben vornehmen, kann sich drastisch auf Ihren Code auswirken. Wenn Sie häufig sden 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.


2

05AB1E ASCII-Art Golf

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"

Probieren Sie es online aus.

Dies wird erreicht durch:

  1. Auflisten der eindeutigen Zeichen in der ASCII-Zeichnung.
  2. Ordnen Sie sie nach der Häufigkeit, mit der sie in der Zeichenfolge in absteigender Reihenfolge vorkommen (am häufigsten nach am wenigsten vorkommenden Zeichen).
  3. Kehren Sie die ersten beiden Elemente um, wenn die ASCII-Zeichnung mit dem am häufigsten vorkommenden Zeichen beginnt (um führende Nullen in der komprimierten Ganzzahl zu vermeiden).
  4. Ordnen Sie die Zeichen der Eingabe 0-9A-Za-zin dieser Reihenfolge zu, wobei jedes einzelne Zeichen ein eigenes Zuordnungszeichen erhält, bis jedes ersetzt wurde.
  5. Basis komprimiert es mit der höchsten Basis, die Sie ersetzen müssen (basierend auf der Anzahl der eindeutigen Zeichen).
  6. Base konvertiere es erneut in base-255 (für 05AB1E-Komprimierung).
  7. Format alles im Format: •<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 Jfü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:

05AB1E , 106 Bytes

•I£.µ*:]ó±øqaµb₄ΘYQmœ¹µû₄p´ζÂĆ_5ŠKÑ×ðòË|₄#¹¶úôÂ-Í|¯ε¼É₂ïδ&é–9»ÞFò1î×HÃBjý2ĆÉ≠FYÂÂèC j‘£Å₅Œ•“─ └┘┐┌
XBA“ÅвJ

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.

               # 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)

1
Übrigens, seit 05AB1E die Codepage geändert hat, wurde die maximale Basis von 214 auf 255 geändert .
Adnan,

1
Vielleicht möchten Sie Ihrer Antwort etwas hinzufügen (oder den Generator mit modifizieren), aber wenn in der ASCII-Grafik weniger als 10 verschiedene Zeichen verwendet werden, können Sie zwei Bytes Golf spielen. Das heißt, Ihr Generator gibt diesen 22-Byte-Wert an , aber es kann stattdessen auch dieser 20-Byte-Wert sein .
Kevin Cruijssen

@ KevinCruijssen die Idee war, was ich zu vermitteln versuchte, nicht wirklich behaupten, dass Generator etwas Gutes ist: P. Ich bezweifle ehrlich, dass es überhaupt noch auf osabie läuft. Das habe ich vor ein paar Jahren geschrieben!
Magic Octopus Urn

@MagicOctopusUrn Ich bin nicht sicher, ob es in der Elixir-Neuschreibung ausgeführt wird, aber es funktioniert auf jeden Fall immer noch in der älteren Version. Ich habe die Base-214 bereits vor ungefähr einem halben Jahr in Base-255 geändert, wie in Adnans Kommentar oben erwähnt. Abgesehen davon funktioniert es großartig und ich habe es ein paar Mal benutzt (obwohl ich es jedes Mal weiter gespielt habe.;)). Die Erzeugung sowohl der Zeichenkette als auch der Zahl funktioniert hervorragend!
Kevin Cruijssen

Hier ist eine verbesserte Version. (Sehr hässlich und schnell geschrieben, aber es funktioniert). Es würde Ihr Beispiel 108 Bytes anstelle von 113 machen. Die Verbesserungen, die ich gemacht habe, sind: Sortiere die verschiedenen Zeichen nach dem höchsten Vorkommen zuerst (es sei denn, das höchste Vorkommen ist das erste Zeichen, in welchem ​​Fall es die oberen zwei Zeichen vertauscht), so dass es komprimiert wird Ganzzahl ist so klein wie möglich; Verwenden Sie <str><compr_int><int>вèJanstelle von Ihrem <compr_int><int>BžLR<str>‡; und statt "als String-Anführungszeichen verwenden, so "kann ein Teil der Eingabe sein.
Kevin Cruijssen

1

Strings und Ints sind gleiche Typen

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 .


0

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 :

  • Anstelle von gFkönnen Sie vauch einen N-index verwenden, der verwendet werden kann.
  • Der vy -> ʒAustausch ist etwas kniffliger:
    • Sie müssen die Ergebnisse sofort ausdrucken. Dies unterdrückt das automatische Drucken von der Oberseite des Stapels.
    • Das Code-Snippet wird auf einem neuen temporären Stapel ausgeführt . Dies bedeutet, dass stapelabhängige Snippets nicht verwendet werden können.
    • yIn solchen Schleifen ist das Aufrufen nicht möglich.

Ich weiß, dass dies vor einem Jahr gepostet wurde, aber nicht [, µund εauch Teil der normalen Schleifen / Iterationen?
Kevin Cruijssen

Auch das Aufrufen yist mit einigen von diesen jetzt möglich.
Magic Octopus Urn
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.