Jelly ist eine implizite , golforientierte Programmiersprache von unserem eigenen Dennis . Es taucht hier immer häufiger in Antworten auf und schlägt andere Golf-Sprachen wie Pyth und CJam, indem es sowohl eine eigene Codepage als auch ein leistungsfähiges Kettensystem verwendet, um Programme kurz und bündig auszudrücken.
Lassen Sie uns ein paar nützliche Tipps zum Golfen in Jelly sammeln. (Wie immer ein Tipp pro Antwort!)
Antworten:
String-Komprimierung
Probieren Sie es online!
Eine komprimierte Zeichenfolge sieht so aus
“...»
, als ob die Punkte ein Teil der Base-250-codierten Daten sind. Der Dekomprimierungsalgorithmus ist etwas kompliziert: Der Block wird als eine Ganzzahl mit gemischter Basis interpretiert,divmod
wobei verschiedene Teile dieser Ganzzahl abgebrochen und daraus eine Zeichenfolge erstellt werden.Ich habe ein kleines Python 3-Interface erstellt, um Jelly-Strings zu komprimieren:
Verwenden Sie den Kompressor wie folgt.
Compress
ist ein String Builder:.string(s)
Fügt rohe, druckbare ASCII-Zeichen in die Zeichenfolge ein.(Jedes Zeichen kostet ungefähr 0,827 komprimierte Bytes.)
.dictionary(w)
Sucht eine Zeichenfolge in Jellys integrierten Wörterbüchern. Sie können die Zeichenfolge mit einem einzelnen Leerzeichen beginnen, wenn Sie eines möchten. Wenn dies vom normalen Verhalten beim Hinzufügen von Zeichenfolgen abweichen oder die Großschreibung eines Wörterbuchworts umkehren muss, werden dementsprechend Flags hinzugefügt.(Kostet ungefähr 1.997 Bytes für kurze Wörter, 2.433 Bytes für lange Wörter. Wenn Flags vorhanden sind, addieren Sie 0.199 Bytes.)
quelle
Ketten
(Dies ist eine Art Nachfolger der Tacit-Programmierung .)
Wie bewertet Jelly eine Kette? Wie bereits erläutert, sind drei Fälle zu berücksichtigen: ob diese Kette niladisch , monadisch oder dyadisch aufgerufen wurde .
1. Niladische Ketten
Dies sind die einfachsten von allen. Um eine Niladenkette zu bewerten, die mit einer Nilade beginnt , wie zum Beispiel
α f g h
, bewerten Sie die monadische Kettef g h
an dieser Niladeα
. (Vorsichtsmaßnahmen: Wenn die gesamte Kette leer ist, wird stattdessen 0 zurückgegeben. Wennα
es sich nicht um einen Nilad handelt, ersetzen Sieα=0
stattdessen use .)Zum Beispiel
4½
wird nur bei½
ausgewertet4
, was ist2
.2. Monadische Ketten
Monadische Ketten werden von links nach rechts zerlegt, bis keine zu berücksichtigenden Glieder mehr vorhanden sind. Außerdem haben wir hier einige Argumente übergeben
ω
. Es gibt zwei Fragen zu beantworten:Was ist der Startwert für diese Bewertung von links nach rechts?
Wenn unsere Kette mit einer Nilade beginnt
α
und auf sie null oder mehr Monaden (wie½
), Dyaden-Niladen-Paare (wie+2
) und Niladen-Dyaden-Paare (wie4*
) folgen : Wir beginnen mit der Bewertungα
und betrachten dann den Rest der Kette .Ansonsten gehen wir von dem an diese Kette übergebenen Argument aus
ω
und betrachten die gesamte Kette.Wie gehen wir die Kette entlang?
Nennen wir
V
den aktuellen Wert - anfangs ist es der oben beschriebene Wert, aber er wird aktualisiert, wenn wir die Kette durchlaufen - und bezeichnen+
,×
,÷
.Dann werden die folgenden Muster von oben nach unten verglichen:
3. Dyadische Ketten
Dies sind im Grunde wie monadische Ketten, aber dieses Mal gibt es zwei Argumente,
λ
(links) undρ
(rechts).Was ist der Startwert?
Wenn die Kette mit drei Dyaden beginnt
+ × %
, beginnen wir beiλ+ρ
und betrachten als× % ...
nächstes die Kette .Ansonsten gehen wir von
λ
der gesamten Kette aus und betrachten sie.Wie gehen wir die Kette entlang?
Diesmal sind die Muster
quelle
Numerische Werte in Sonderfällen
Hier sind einige Sonderfälle für den numerischen Parser von Jelly:
-
bewertet zu-1
.
bewertet zu0.5
ȷ
wertet aus zu1000
(ȷ
ist für wissenschaftliche Notation, zB2ȷ6
ist2000000
)ı
auswerten zu1j
(ı
ist für komplexe Zahlen, zB2ı3
ist2+3j
)Es ist auch erwähnenswert, dass so etwas
4ı
eigentlich4+1j
eher ist als4
.Sie können diese mischen und anpassen, zB:
-.
ist-0.5
und-ȷ
ist-1000
-ı
ist-1+1j
,ı-
ist-1j
und-ı-
ist-1-1j
.ȷ
ist500.0
.ı
ist0.5+1j
,ı.
ist0.5j
und.ı.
ist0.5+0.5j
ȷı
ist1000+1j
,ıȷ
ist1000j
undȷıȷ
ist1000+1000j
Beachten Sie, dass dies der Fall
ȷ-
ist0.1
, jedoch keine Bytes mehr gespeichert werden.1
. Dann gibt es noch Folgendes, was bereits in der entsprechenden Anzahl von Bytes mit der eingebauten Variablen für 10 (⁵
) durchgeführt werden kann, aber in dem seltenen Fall nützlich sein kann, dass die eingebaute Variable nicht verfügbar ist oder bei Bedarf gespart werden muss¤
:ȷ.
istsqrt(10) ~ 3.162277
,.ȷ.
istsqrt(10)/2 ~ 1.5811
undȷ-.
ist1/sqrt(10) ~ 0.31162
quelle
Optimierter Saitenkompressor
Probieren Sie es online!
In Lynns Beitrag wird genau beschrieben, was komprimierte Zeichenfolgen sind, und es wird ein Kompressor bereitgestellt, der diese komprimierten Zeichenfolgen erzeugt. Während jedoch mit einem Programm in Jelly tüftelt, fand ich es zu kombinieren , zu haben ermüdend
.dictionary
und.string
um zusammen mit der korrekten Platzierung der Räume und so weiter und so fort, die kürzestmögliche Zeichenfolge zu erreichen.Aus diesem Grund habe ich beschlossen, eine Erweiterung für Lynns Skript zu erstellen, die Benutzereingaben aufnimmt und den kürzesten Weg findet, wie sie komprimiert werden können, ohne dass der Benutzer irgendwelche Arbeiten ausführen muss. Das Skript ist ziemlich lang und deshalb habe ich einen TIO-Link hinzugefügt, anstatt den Code selbst.
Das Programm funktioniert durch Komprimieren mit drei verschiedenen Methoden und Bestimmen der kürzesten Methode:
Methode 1 codiert einfach jedes Byte der Eingabe zu einem Zeitpunkt, wodurch im Vergleich zu den anderen eher das längste Ergebnis erzielt wird. Selbst wenn die Eingabe sehr kurz ist, können relativ lange Alternativen erstellt werden. Der kürzeste Weg,
test
der komprimiert werden kann, ist beispielsweise“¡ḌY»
, während diese Methode“¡⁷ƑKʂ»
(2 Byte länger) zurückgibt . Dies funktioniert in der Regel nur, wenn die Zeichenfolge kürzer als 4 Zeichen istDie zweite Methode zerlegt die Zeichenfolge in Wörter und Interpunktion, da beide auf unterschiedliche Weise zum Kompressor hinzugefügt werden. Wörter, die Teil des Wörterbuchs sind, werden mit der
.dictionary
Methode von Lynns Code hinzugefügt , die sie stärker komprimiert, als wenn sie einfach durch Codepunkte hinzugefügt würden. Die Zeichensetzung muss jedoch nach Codepunkten hinzugefügt werden, da sie leider nicht Teil des Wörterbuchs sind.Die Interpunktion enthält Leerzeichen. Hier kommt Methode 3 ins Spiel, aber zuerst die Bewertung von Methode 2: Vergleichen wir die Methoden eins und zwei, in denen die Zeichenfolge komprimiert wird
Hello, World!
(enthält Wörter, Interpunktion und Leerzeichen, ist also perfekt). Komprimieren zeichenweise Ergebnisse in der letzten Folge von“ŒCdẉa÷¹ṂȤƓ(Ẋ)»
(15 Bytes lang), die, wie sich herausstellt, länger als die einfachere Möglichkeit zur Ausgabe Hallo, Welt !:“Hello, World!
. Schauen wir uns nun Methode zwei an. Dies erzeugt die komprimierte Zeichenfolge,“Ọƥ⁷Ƭė3⁶»
die 9 Bytes wiegt, eine große Verbesserung gegenüber der alten. Das kürzeste Hallo, Welt! Programm in Jelly ist 8 Bytes , also kann etwas verbessert werdenHier kommt Methode 3, wodurch sie noch kürzer wird. Wie erwartet ist die Ausgabe für Hello, World natürlich
“3ḅaė;œ»
das kürzestmögliche Programm. Was macht Methode 3, Methode 2 nicht? Methode 3 kombiniert einzelne Räume zu führenden Räumen, für die der Jelly-Dekomprimierer ein Flag hat. Im Code sowohl für den Kompressor als auch für den Dekomprimierer sehen Sie Codeif flag_space: word = ' ' + word
, der zeigt, dass führende Leerzeichen a) unterstützt werden und b) bytesparend sind. Daher wird der Stringsplitter aus Methode zwei so angepasst, dass Leerzeichen für sich direkt nach dem String kombiniert werden, um führende Strings zu erstellen. Dies bedeutet, dassHello, World!
analysiert wird als["Hello", ",", " World", "!"]
, was, wenn komprimiert, nur 6 Bytes beträgt (8, wenn Begrenzer eingeschlossen). Dies ist fast immer die kürzeste Komprimierungsmethode, mit Ausnahme der "Erweiterung", die ich hinzugefügt habe.Dies ist der Hauptteil des Programms, aber es gibt noch ein paar weitere Optionen, mit denen die Daten noch stärker komprimiert werden können.
--debug
, das nicht nur die kürzeste komprimierte Zeichenfolge anzeigt, sondern alle 3 zusammen mit einer Kopie "Dies ist die kürzeste"Nicht-Wörter
Nachdem ich diese Nachricht gesehen hatte, fing ich an, an Lynns Kompressor zu arbeiten , machte einen Knack und war frustriert darüber, dass ich nicht den kürzesten Weg fand, ihn zu komprimieren (es sind 29 oder 32 Bytes für den Datensatz). Beim Testen meiner Verbesserungen stellte ich jedoch fest, dass Wörter wie
knowns
nicht in Jellys Wörterbuch enthalten sind. Aus diesem Grund habe ich mich vorgenommen, einen Weg zu finden, um diese "Nichtwörter" in einem möglichst kurzen Jelly-Code zu komprimieren.Ich habe eine function (
trim
) erstellt, die den String als einen Punkt aufteilt, an dem mindestens einer der Teile des Strings Wörter sind. Zum Beispielknowns
würde aufgeteilt werden["known", "s"]
und das Programm das erste Wort über ein Wörterbuch add (.dictionary
) und den zweiten Teil des Wortes über einen.string
Aufruf hinzufügen . Es verbleiben jedoch zwei Randfälle: Zeichenfolgen, in denen keine Wörter enthalten sind (z. B.ajdl
), und Nicht-Wörter, in denen Wörter am Ende stehen, z. B.abctest
, die von dertrim
Funktion nicht aufgeteilt werden .Da es keine Möglichkeit gibt, Wörter in einer Zeichenfolge zu finden, die keine Wörter enthält, besteht die einfachste und kürzeste Möglichkeit, diese zu behandeln, darin, sie Zeichen für Zeichen über einen
.string
Aufruf hinzuzufügen . Soajdl
erhalten würde ergänzt durch.string('ajdl')
. Während Nichtwörter, die mit erkannten Wörtern enden, im Wesentlichen den Trimmer aber in umgekehrter Reihenfolge ausführen.dictionary
und.string
auf den Vorwärtstrimmer anwenden und umgekehrt .Wie sich herausstellt, ist das Trimmen der Zeichenfolge entweder vom Anfang oder vom Ende an natürlich kürzer als das Hinzufügen der einzelnen Zeichen zum Kompressor, wie durch die Eingabe von gezeigt wird
abctest this string
, was eine Debug-Ausgabe von ergibtDer Unterschied zwischen der optimalen Ausgabe (die den Trimmer verwendet) und der, die dies nicht tut, ist eine satte (für Jelly) 4 Bytes. Schließlich gibt es Fälle, in denen die Zeichenfolge selbst kürzer ist als jede komprimierte Version, die jetzt berücksichtigt wurde.
Ein großer Verdienst dafür geht natürlich an Lynn, die den Originalkompressor entwickelt hat
quelle
Sie können hochgestellte drei bis neun (
³⁴⁵⁶⁷⁸⁹
) verwenden, um einige häufig verwendete Werte abzurufen. Dies hängt jedoch von der Anzahl der Befehlszeilenargumente und bei Verknüpfungen von den Argumenten der Verknüpfungen ab.³
Gibt 100 zurück und funktioniert nur, wenn keine Eingabe vorhanden ist.⁴
Gibt 16 zurück und funktioniert nur, wenn es höchstens einen Eingang gibt.⁵
gibt 10 zurück und funktioniert nur, wenn es höchstens zwei Eingänge gibt.⁶
Gibt ein Leerzeichen zurück, wenn höchstens drei Eingaben vorhanden sind.⁷
Gibt eine neue Zeile zurück, wenn höchstens vier Eingänge vorhanden sind.Wenn es jedoch fünf Eingänge gibt, hat man Pech.
Kürzlich hat eine neue Version der Sprache den Wert
³
auf 100 gesenkt und einige neue Atome eingeführt, die Werte oder (für Links) ihre Argumente zurückgeben.⁸
Gibt überall eine leere Liste zurück, mit Ausnahme von Links, denen ein linkes Argument übergeben wurde.⁹
Gibt überall 256 zurück, außer bei Links, denen ein rechtes Argument übergeben wurde.Wenn Sie in einem Link sind und Argumente von beiden Seiten an ihn weitergeleitet bekommen, haben Sie jedoch kein Glück.
quelle
Missbrauch von String-Bugs
Dank geht an Adnan , der dies zuerst in Schreiben eines Programms zur Elastifizierung von Saiten ausgenutzt hat .
Jelly soll eines Tages eine Zeichenarithmetik erhalten, aber bis dies passiert, können wir die Tatsache ausnutzen, dass Python die meisten arithmetischen Operatoren überlastet und Jelly keine Typprüfung durchführt.
Zum Beispiel
soll
Ḥ
momentan nichts nützliches tun, ist aber da (unhalve) implementiert alsund arithmetische Atome vektorisieren in der Tiefe 0 (dh sie arbeiten mit Zahlen oder Zeichen), was den obigen Jelly-Code ergibt
Achten Sie darauf, dass dabei echte Python-Strings erzeugt werden (ein Typ, den Jelly eigentlich nicht haben sollte), damit er nicht in allen Situationen verwendet werden kann.
Ebenso
+/
kann es nützlich sein, Zeichenfolgen mit den gleichen Einschränkungen zu verketten.quelle
S
Es kann niemals nützlich sein, Zeichenfolgen zu verketten. Es wird versucht, sie zu ergänzen0
.+/
funktioniert aber.+/
.Optimaler Saitenkompressor
Vor kurzem habe ich fragte Erik die Outgolfer die hinzuzufügen optimierten String Kompressor zu JHT Referenzen Seite , aber sie sagte , dass
Deshalb entscheide ich mich, den optimalen Saitenkompressor zu implementieren.
Einfacher Ansatz, aber garantiert den kleinstmöglichen Wert (und damit die Anzahl der Bytes) zu finden
Eingaben von
(wörtliches Newline-Zeichen) eingegeben werden.
stdin
, Ausgaben von bis übernehmenstdout
. Als Newline kann genau wie beim Originalkompressor¶
oderWenn Sie versuchen, es mit viel Interpunktion (z. B. Eingabe
¶-----¶
) auszuführen, wird die unkomprimierte Zeichenfolge ausgegeben.Natürlich ist es Lynn zu verdanken, dass sie den Originalkompressor entwickelt hat .
quelle
Stillschweigende Programmierung
Jelly ist eine implizite Programmiersprache. Das heißt, Sie definieren Verknüpfungen (Funktionen), indem Sie vorhandene Verknüpfungen zu einer Kette zusammenfassen , ohne explizit auf die betreffenden Argumente einzugehen. Welche Art und Weise die Argumente durch diese Komposition „fließen“, wird durch das Muster definiert, in dem die Links angeordnet sind. Ein Beispiel dafür wird bald gegeben, aber zuerst müssen wir einige Konzepte einführen.
Die arity eines Links ist ein sehr wichtiges Konzept. Alle Atome - die eingebauten wie
+
und½
- haben feste Aritäten. Links werden je nach Art in drei Kategorien eingeteilt:Welche Art von Links definieren wir beim Schreiben eines Programms? Standardmäßig sind sie variabel - das heißt, der Aufrufer muss angeben, wie viele Argumente verwendet werden sollen, und im Fall des Hauptlinks hängt es davon ab, wie viele Argumente das Programm übergeben hat.
Als Beispiel
+½
dient eine Kette aus+
(Addition) und½
(Quadratwurzel). Da die jeweiligen Elemente dieser Kette 2 und 1 sind, bezeichnen wir sie als 2,1-Kette . Der Interpreter hat spezifische Regeln für das Aufteilen von Ketten, basierend auf ihren Aritäten: Diese Regeln schreiben vor, dassn
diese neue Verknüpfung bei einer Eingabe berechnet wirdn + sqrt(n)
. (Sie können+½
als "... plus seine Quadratwurzel" lesen . )Jelly Programming ist also im Wesentlichen die Kunst, diese Regeln gut zu lernen und clevere Ketten zu bilden, die die Arbeit stillschweigend erledigen .
quelle
replace(str, old, new)
).string (operator) (list)
, wo(list)
eine binäre Liste istold, new
. Das wäre sinnvoll, wenn Jelly einen eingebautenpair
Operator hätte. Nach diesem Schema wären es jedoch zwei Bytes für den Operator.½
ist Quadratwurzel? Warum nicht½
, ähm ... halb? Warum nicht√
für Quadratwurzel? :(H
schon halb: PProgrammstruktur
Jede Zeile in einem Jelly-Programm ist eine Linkdefinition . Links sind grundsätzlich Funktionen. Die unterste Zeile steht für "
main
": Dies ist der Link, der anhand der in der Befehlszeile übergebenen Argumente ausgewertet wird.Alle Links außer dem letzten sind Funktionsdefinitionen: Sie können mit Hilfe von Akteuren auf sie verweisen . Zum Beispiel
ç
ist „der Link über diese, als binären Operator (Dyade)“ . Betrachten Sie dieses Beispielprogramm , das das Quadrat der Summe seiner Argumente berechnet:Das ist so ähnlich wie der Pseudocode:
quelle
Mehrkettenglieder
Erinnern Sie sich, als ich schrieb, dass Sie einen Link definieren, indem Sie eine Kette von anderen Links bilden? Ich habe nicht die ganze Wahrheit gesagt: In Wirklichkeit handelt es sich um einen zweischichtigen Prozess. Ein Glied ist eine Kette von Ketten , und die äußere Kette hat standardmäßig nur eine Einheitslänge.
Betrachten Sie dieses Programm:
Das ist Ergänzung plus die Hälfte . Es nimmt einen Eingabewert
n
und berechnet(1-n)+(n/2)
. Nicht zu aufregend, ich weiß. Aber die Struktur ist wirklich so:Das von uns geschriebene Glied ist selbst eine Kette, die eine einzelne Kette enthält.
Angenommen, wir möchten
(1-n)+(1-n)(n/2)
stattdessen berechnen . Die dyadische Kette+×
würde funktionieren: Nach den Regeln für die Verkettung berechnet sieλ+(λ×ρ)
, was genau so aussieht, wie wir es brauchen. Doch einfach ersetzt+
durch+×
in unserem Programm nicht tun:C+×H
ein 1,2,2,1-Kette - Komplement, dann fügen Sie (das Argument), dann multiplizieren um die Hälfte - Berechnung((1-n)+n)×(n/2)
.Wir wollen Jelly zu behandeln
+×
als eine Einheit, und machen eine 1,2,1-Kette der UnterkettenC
,+×
undH
. Mehrkettenglieder machen wir genau das! Um sie zu konstruieren, verwenden wir die Kettenseparatorenøµð
: In der obigen Abbildung würden sie ein neues blaues Rechteck der Arität 0, 1 bzw. 2 einführen. In unserem Fall können wir die Ketten wie gewünscht gruppieren, indem wir Folgendes schreibenCð+×µH
:Es gibt keine Möglichkeit, diese Dinge noch weiter zu verschachteln. Sie müssen stattdessen mehrere Links definieren.
quelle
Wenn TMTOWTDI, wählen Sie diejenige aus, die zu Ihrer Kette passt.
Einer der Vorteile einer stillschweigenden Sprache ist, dass Sie normalerweise ohne variable Referenzen davonkommen können. Dies funktioniert jedoch nur, wenn die Glieder in Ihrer Kette die richtigen Eigenschaften haben.
Beispielsweise ist die einfache Methode, die Summe aller Arrays in einem 2D-Array zu berechnen
Dies ordnet das Summenatom allen Elementen des Arrays zu.
Angenommen, Sie haben eine monadische Kette, die aus dem Atom besteht
die jedes x eines 2D-Arrays auf x x abbildet . Zum Beispiel würde für A = [[1, 2], [3, 1], [2, 3]] das Aufrufen der Kette [[1, 4], [27, 1], [4, 27] ergeben. .
Nun wollen wir die Summe jedes Paares nehmen. Unglücklicherweise,
funktioniert nicht mehr, da
*
es sich nicht mehr wie ein Haken verhält ( A selbst als richtiges Argument verwenden), sondern wie eine Abzweigung , was bedeutet, dass es zuerstS€
auf A angewendet wird und das Ergebnis das richtige Argument von ist*
.Dies zu beheben ist einfach genug:
Beide erzeugen das gewünschte Ergebnis:
*¹
Ist eine Gabelung, in der¹
die Identitätsfunktion steht, und*⁸
ist eine Spitze , in⁸
der auf das linke Argument der Kette verwiesen wird ( A ).Es gibt jedoch eine Möglichkeit, ein Byte zu speichern! Die Spitze
ḅ1
(convert von unären zu integer) berechnet auch die Summe jeden Array in A A , aber im Gegensatz zuS€
,ḅ
ist ein dyadischer Link.Die Kette
gibt [5, 28, 31] zurück (wie gewünscht); da
ḅ
ist dyadisch,*
haken statt gabelnquelle
ḅ1
"?Ganzzahlige Komprimierung
Die Komprimierung von Zeichenfolgen ist nützlich, wenn Sie Text in Englisch erstellen. Wenn Sie jedoch andere Arten von Daten komprimieren müssen, ist dies ziemlich ineffektiv. Aus diesem Grund ist es am besten, eine große feste Konstante in Ihrem Programm als Ganzzahl zu speichern.
Da Jelly nun eine eigene Codepage als Konstante hat, wird der Komprimierungsalgorithmus für Ganzzahlen am einfachsten in Jelly selbst ausgedrückt:
Probieren Sie es online!
(Das obige Programm enthält auch eine Überprüfung, um den Wert anzuzeigen, auf den die Ganzzahl dekomprimiert wird.)
Sie können nicht nur eine Ganzzahl als Ganzzahl verwenden, sondern auch eine Zeichenfolge erstellen, indem Sie eine Basiskonvertierung durchführen und dann in ein Buchstabenalphabet indexieren. Das
ṃ
Atom automatisiert diesen Prozess und ist recht nützlich, da es den gesamten Dekomprimierungsprozess (mit Ausnahme des Alphabets, in das dekomprimiert wird) in einem einzelnen Byte beschreiben kann.quelle
Verwenden Sie äußere Produkte, um nützliche Ganzzahlmatrizen zu erstellen
Hier ist eine Zusammenfassung dieses Beitrags mit etwas besserer HTML-Tabellenformatierung.
Das äußere Produkt quick
þ
kann an Dyaden angehängt werden und bewirkt, dass die Dyade in ihren linken und rechten Argumenten auf jedes Elementpaar einwirkt. Es ist eine Abkürzung für€Ð€
. Wenn wir zum Beispiel den Code hätten[1,2]+€Ð€[0,10]
, könnten wir ihn verkürzen[1,2]+þ[0,10]
und sie würden beide ergeben[[1,2],[11,12]]
. Ich werde eine Dyade mitþ
angewendet (wie+þ
) als äußere Produktdyade bezeichnen.Wenn eine Ganzzahl eines der Argumente einer Dyade des äußeren Produkts ist, nimmt Jelly zuerst den Bereich dieser Zahl und verwendet dann das Ergebnis als Argument. In diesem Wissen kann das obige Beispiel weiter verkürzt werden
2+þ[0,10]
. Dies gilt sowohl für die linken als auch für die rechten Argumente einer äußeren Produktdyade.Einige Dyaden des äußeren Produkts ergeben, wenn sie monadisch auf eine Ganzzahl einwirken, bestimmte Ganzzahlmatrizen, die beim Golfen nützlich sein können (insbesondere ASCII-Kunst-Herausforderungen), aber viele Bytes benötigen, um sich anders zu konstruieren. Beispielsweise ergibt sich
=þ
bei Anwendung auf eine ganze Zahln
einen×n
Identitätsmatrix. Online versuchen=þ
!Nachfolgend finden Sie eine Tabelle der Dyaden und die Art der Matrizen, die sie ergeben, wenn sie zu Dyaden des äußeren Produkts verarbeitet und monadisch auf eine ganze Zahl einwirken. Dyaden, die in derselben Reihe aufgeführt sind, ergeben dieselben Matrizen. Es gibt Dyaden Ich habe nicht in der Tabelle enthalten wie
&
,|
,%
,w
,ẇ
undḍ
dass auch Integer - Matrizen erzeugen aber ihre Muster sind nicht so einfach und würde wahrscheinlich in weniger Situationen nützlich sein. Online versuchenwþ
!quelle
Listet Befehle und Literale auf
Wenn Sie versuchen, viele der nicht vektorisierenden Listenbefehle in einem Literal
n
oder einer Liste von Literalen zu verwendenz
, wird der Listenbefehl zuerst in eine Liste konvertiert und führt dann den Befehl in dieser Liste aus.Diese Befehle werden durch Aufrufe der
iterable
Funktion in jelly.py angezeigt .Hier sind einige unvollständige Listen der Funktionen dieser Listenbefehle.
Wraps in einer Liste
Die einfachste Rückkehr von
iterable
, um das Argument in eine Liste zu setzen und die von der Funktion zu verarbeitende zurückzugeben. Dies ist der Fall, wenn das Argument noch keine Liste ist, eine Zeichenfolge ist unditerable
die Argumente keine anderen Methoden erfordern.In Basis 10 konvertieren
Die Funktionen hier rufen
iterable
auf, um eine Zahl in eine Liste ihrer Ziffern umzuwandelnD
und dann mit diesen Ziffern auszuführen.In Liste mit Bereich konvertieren
Die Funktionen hier konvertieren eine Zahl in den Bereich
R = [1 ... n]
und werden dann in diesem Bereich ausgeführt.quelle
Es lohnt sich manchmal, von der Standardeingabe zu lesen, wenn genau zwei Eingaben vorhanden sind
Jelly ist für die Eingabe von Befehlszeilenargumenten optimiert. Es ist jedoch auch für das Schreiben von Monaden anstelle von Dyaden optimiert. Bei Dyaden gibt es so viele mögliche Bedeutungen für jedes eingebaute Element, dass Sie häufig Zeichen für die Disambiguierung ausgeben müssen, während bei Monaden in der Regel viele Möglichkeiten bestehen, dasselbe auszudrücken.
Als solcher, wenn man nur einmal einen von zwei Eingängen zu verwenden, und das Problem ist, dass es nicht so leicht kann implizit aus gelesen werden
⁴
(dh Sie müssen entweder die machen⁴
explizite oder sonst ein Zeichen ausgeben}
,@
oder dergleichen) Ziehen Sie in Betracht, es von der Standardeingabe zu lesen,Ɠ
anstatt es in der Befehlszeile zu platzieren. Auf diese Weise können Sie die Eingabe genau dort platzieren, wo Sie sie benötigenƓ
, und gleichzeitig sicherstellen, dass alle anderen impliziten Eingaben von Ihren anderen Eingaben übernommen werden. Das kostet ein Byte und spart ein Byte. Je nach Problem kann es durchaus sein, dass Sie ein zweites Byte einsparen, indem Sie mehr Spielraum für die Neuordnung des Codes haben.quelle
Es gibt mehrere nicht naheliegende Möglichkeiten, die Eigenschaften eines Arguments mithilfe von zu überprüfen
Ƒ
. Nachfolgend einige. Ich verließ aus vielen Nutzungen dieses schnell (zBAƑ
,ŒuƑ
,3Ƒ
) weil sie bereits die einfachstenen Methoden ihr Verhalten zu erreichen.Fühlen Sie sich frei, dies zu bearbeiten, um weitere interessante Fälle hinzuzufügen.
quelle
Sie können einen Online - Editor versuchen wollen Jelly Ball entwickelt , um einfach zu bauen Code in Jelly Sprache .
Die Funktionen umfassen:
Probieren Sie es aus: https://jellyballs.github.io
quelle