Tipps zum Golfen in J


33

GolfScript geht viel zu oft seinen eigenen Weg und ich bin der Meinung, dass eine Sammlung nützlicher Tipps zum Golfen in J im Kampf gegen das böse Imperium hilfreich sein könnte. Welche Tipps haben Sie, um diese bereits knappe Sprache zu verkürzen?

Für diejenigen, die J lernen möchten, ist der offensichtliche Einstieg die jsoftware- Site und insbesondere das Vokabular , das Learning J- Handbuch und das J for C-Programmierhandbuch .


1
Das Lesen GolfScript gets its own way far too oftenim Jahr 2019 hat etwas Lustiges .
Nicht verwandter String

Antworten:


14

Es gibt eine Reihe von Feinheiten, um die letzten Zeichen in J herauszuholen. Für das Folgende wird angenommen, dass jeder Großbuchstabe ein primitives Verb ist (dh, ich entferne die Leerzeichen, die ansonsten zur Begrenzung von Namen erforderlich wären).

  • Wenn Sie einen Zug gehen, und Sie müssen eine Funktion auf einer anderen teilweise durch, anzuwenden ([:FLGR)und (LF@:GR)die gleiche Anzahl von Zeichen, aber (LF@GR)man spart. Wenn der Rahmen von G größer oder gleich dem Monadenrang von F ist, ist dies eine gültige Transformation. Insbesondere haben alle Züge einen unendlichen Rang, ebenso wie die , ,. ,: ~. /: \: [ ]meisten Verwendungen von #und |..

  • Wenn Sie Zeichenfolgen aus einer Liste auswählen müssen und diese Zeichenfolgen keine Leerzeichen enthalten, verwenden Sie >i{ab`cd`ef. Es ist schmutzig, aber es speichert Zeichen für jede neue Zeichenfolge, mit der Sie sich befassen müssen, es sei denn, Sie ziehen nur einzelne Zeichen und selbst dann muss die Zeichenliste die Länge 4 haben, um kürzer zu sein. Was passiert, ist, dass undefinierte Namen als Verweise auf Verben behandelt werden, und wenn Sie die Gerundien dieser Verben nehmen, erhalten Sie eine geschachtelte Zeichenfolge des Namens. Alle Namen, für die bereits der Typ Nomen, Adverb oder Konjunktion definiert ist, können auf diese Weise nicht verwendet werden, da diese Namen zuvor aufgelöst `wurden.

  • Wenn Sie das Glück haben, einen Ausdruck zu haben, mit dem Sie arbeiten können, und nicht nur ein stillschweigendes Verb, lohnt es sich fast immer, alle Bits, die Sie wiederverwenden, Variablen zuzuweisen, seien es Substantive, Verben oder Adverbien. Die Parens zahlen sich manchmal aus, indem sie sich genau an die Stelle einfügen, an der Sie zuvor Leerzeichen hatten, und die meisten dieser Definitionen sind es wert, wenn sie noch einmal verwendet werden.

  • Konjunktionen wie (FGH)^:(u`v`w)können umgeschrieben werden u`v`w(FGH^:). Dies funktioniert für jede Zuglänge, auch für 1, obwohl Sie nur dann etwas speichern, wenn dieser Trick die Parens aus dem richtigen Argument entfernt. Dieser Trick funktioniert nur, wenn Sie den linken Operanden vorladen. (Haben Sie keine Ahnung, was gerade passiert ist? Suchen Sie nach "stillschweigenden Adverbien" und lesen Sie den Abschnitt zum Parsen und Ausführen des J-Wörterbuchs.)

  • Nicht benutzen a.&i., benutzen u:! {&a.und 3&u:sind jedoch in der Länge äquivalent, und die erstere kann in einer Konjunktion (abhängig von der Konjunktion) nützlicher sein.

  • Dinge wie (2%~F)und (F%2:)sind gleich lang. Dies ist nützlich, da Sie manchmal, je nachdem, wie der Rest Ihres Zuges aussieht, ihn umstrukturieren können@ den im ersten Punkt beschriebenen Tricks , um einige verzweifelte Charaktere zu retten. (Und natürlich, wenn Fes sich bei ]dem Zug um eine Monade handelt und %&2ein Char verwendet wird, duh.)

  • Hakenförmige Züge mit ] oder [als linkes Verb, z (]FGH).

    • ]Mit dieser Option können Sie eine dyadische Anwendung auflösen und nur das richtige Argument verwenden. (Nach links tauschen mit (]FGH)~, bei einer Strafe von mindestens 1 Zeichen, vielleicht mehr.) Speichert einen Buchstaben um (FGH)@]und ist in Gerundien sehr praktisch!
    • [Mit einem Hook, der monadisch angewendet wird, können Sie etwas für die Nebenwirkungen auf der rechten Seite tun und dann das Argument erneut zurückgeben. Die häufigste Verwendung ist mit1!:2 , möglicherweise mit Formatierungsmüll.
  • I / O saugt. Beschleunigen Sie den Prozess, indem Sie aus allem, was Sie können, Loops erstellen. 1!:1hat Rang 0, und beide 1!:2 3haben Rang _ 0, verwenden Sie dies also, indem Sie Arrays von 1s erstellen und 1!:1direkt über sie laufen . Beachten Sie, dass ".auch Rang 1 hat, sodass Sie diesen normalerweise direkt danach setzen können1!:1@ nachstellen können und ihn nicht über Shenanigans oder Ranglisten anhängen müssen.

  • Es ist nicht leicht, Orte zu finden, an denen dies möglich ist, aber es ::kann nützlich sein.

    • ::]^:_ist beispielsweise eine besonders leistungsfähige Kombination, mit der Sie etwas Gefährliches tun können, bis Sie es nicht mehr können. (Vorbehaltlich der üblichen ^:_Vorbehalte.)

    • Auf diese Weise können Sie auch {Listen verwenden, die nicht über den gewünschten Index verfügen, da in diesem Fall ein Domänenfehler auftritt. Nützlich, um zB nur dann den Kopf einer Liste zu übernehmen, wenn er existiert (versuchen Sie ::], die leere Liste oder ::_1:einen Fehlercode zurückzugeben usw.).

  • ]`($:@u)@.vkann in der Regel kürzer gemacht werden als u^:v^:_, insbesondere auf Definitionen von uund mit vdenen herumgespielt werden kann. Ein ähnlicher Fall gilt für die bedingte ähnliche u^:(1-v)vs. ]`u@.v. Betrachten Sie Ihre Optionen, insbesondere wenn Sie viele benannte Verben haben, die sich im Umlauf befinden. Es ist auch etwas flexibler, aber denken Sie daran, $:dass es bei der Verwendung eine Rekursionstiefe gibt, der Sie leicht begegnen können. (Normalerweise so etwas wie 1800 Iterationen?)


Der negative Trick ist wirklich cool.
FUZxxl,

"rette ein paar verzweifelte Charaktere" Wenn du beleuchtet lernst, sieht alles aus wie ein übertragener Beiname! :)
Soham Chowdhury

1
"mit %&2spart einen char, duh." Und -:rettet einen anderen!
Lynn

11

Das Wichtigste beim Golfspielen in J ist, das Problem nicht nur zu verstehen, sondern es auf eine Reihe von Array-Transformationen zu reduzieren. Sie müssen diese Denkweise verstehen, um mit J-Code erfolgreich zu sein.

Beispielsweise wurde kürzlich eine Herausforderung gestellt, um das größte Subarray-Problem zu lösen . Der Bestandsalgorithmus zur Lösung dieses Problems ist Kadanes Algorithmus mit der folgenden informellen Beschreibung:

Durchlaufen Sie das Array und suchen Sie an jeder Position die Summe des größten Subarrays, das hier endet. Dies ist das Maximum von 0 oder der Wert am aktuellen Index plus der Summe des größten Subarrays, das an der vorherigen Position endet. Berechnen Sie das Maximum dieser Subarrays, während Sie das größte Subarray im gesamten Array suchen.

Eine Übersetzung in imperativen Code ist unkompliziert:

  1. Sei A das Eingabearray.
  2. hmi ← 0.
  3. wenn i ≥ len (A) ist, gebe m zurück .
  4. h ← max (0, h + A [ i ]).
  5. m ← max ( m , h ).
  6. ii + 1.
  7. gehe zu 3.

Dieser Algorithmus scheint für J auf den ersten Blick kompliziert zu sein, da es eine explizite Schleife gibt, die auf den ersten Blick nicht nach einer Reduktion aussieht. Wenn Sie erkennen, was der Algorithmus tut, können Sie die einzelnen Schritte entwirren und feststellen, dass er tatsächlich zwei einfache Array-Operationen ausführt:

  1. Scannen durch die Anordnung , die Längen der größten Subarrays zu berechnen , bei jedem Index endet.
  2. Reduzieren Sie diese Längen mit der Max-Funktion, um das Maximum zu finden.

Nun sind diese beiden Schritte in J sehr einfach zu implementieren.

  1. (0 >. +)/\. y , 0- Dieser Schritt wird am anderen Ende des Arrays ausgeführt, um dem Paradigma von J besser zu entsprechen. 0 >. +ist stillschweigend 0 >. x + y.
  2. >./ y

Zusammen ergibt sich eine sehr knappe Implementierung des Algorithmus:

>./ (0 >. +)/\. y , 0

Wenn Sie diese Herangehensweise an die Implementierung von Algorithmen erlernen, sind Ihre Lösungen so knapp wie dieser Code.

Hier sind einige Tricks, die ich im Laufe der Zeit gesammelt habe. Diese Liste wird erweitert, sobald ich mehr Kenntnisse im J-Golf-Bereich habe.

  • Lerne das Wörterbuch. Es enthält viele wirklich obskure Verben, die keinen Sinn ergeben, bis Sie sehen, wie nützlich sie sind. Zum Beispiel ist Monadic =anfangs seltsam, aber sehr nützlich bei ASCII-Kunstherausforderungen.
  • Verwenden Sie dyadic &in stillschweigenden Kontexten, wenn Sie eine Machtverbindung wünschen. Das Vokabular schlägt u@[&0als stillschweigende Ersetzung vor, 4 : 'u^:x yund ich auch.
  • In vielen Fällen können Sie ein [:oder @:eine Sequenz vermeiden, u@vindem Sie eine Variante umit einem linken Argument auswählen . Wenn Sie beispielsweise das erste Element des Ergebnisses von vlöschen 1}.vmöchten , verwenden Sie anstelle von, [:}.vwenn }.@vdies aus irgendeinem Grund nicht möglich ist.
  • ] vist oft kürzer, als v@]wenn Sie monadisch vin einem dyadischen Kontext verwenden möchten . Dies ist besonders dann nützlich, wenn ves sich um einen langen Zug von Verben handelt.
  • Manchmal kann man m (n v w) ystatt schreiben (n v m&w) y. Auf diese Weise können Leerzeichen und Klammern vermieden werden.
  • #\statt >:@i.@#.
  • u &. vist nützlich, wenn veine Vorderseite hat. Wenn nicht, möchten Sie vielleicht verwenden[: vinv u & v oder u & (v :. vinv)verwenden.
  • Verstehe Rang und wie man ihn benutzt. Versuchen Sie, mit der Rang-Konjunktion herumzuspielen, bis Sie etwas bekommen, das passt. Es hilft zu verstehen, wie der Rang Ihren Code beeinflusst.
  • ^:_ ist äußerst nützlich für Algorithmen, bei denen Konvergenz erreicht werden soll, z. B. bei einer Überflutung oder Simulationen.
  • Kennen Sie Ihre Standardbibliothek. Es enthält sehr nützliche Funktionen, mit denen Sie Tonnen von Zeichen sparen können.
  • Die copulæ =.und=: können überall in eine Phrase eingebettet werden. Verwenden Sie diese Option, um Einzeiler zu erstellen, bei denen die implizite Notation nicht ausreicht.
  • Verwenden Sie monadic , beim Reduzieren mehrdimensionaler Arrays statt mehrfacher Reduzierungen.
  • Verstehen Sie, welche Ausdrücke von speziellem Code unterstützt werden, wenn die Herausforderung Laufzeitgrenzen auferlegt. Einige nützliche Dinge funktionieren in O ( n ) anstelle von O ( n 2 ) gegen den intuitiv.
  • Kästen sind für Bäume nützlich.

Ist J klug genug, um Ihre Max-Subarray-Lösung in O (n) auszuführen, indem Sie wiederverwendete Berechnungen zwischenspeichern, oder wird es die einfache Sache tun und sie in O (n ^ 2) ausführen?
Jonah

@Jonah Ich denke, es läuft in quadratischer Zeit.
FUZxxl

10

Seien Sie vorsichtig bei der Verwendung von Schleifen.

Während J Strukturen hat Looping ( for. do. end., while. do. end.und Variationen), wenn Sie sich dort mit finden die Möglichkeit , dass Ihr Algorithmus nicht Golf spielen J Stärken spielt und dass es Charakter Einsparungen gemacht werden.

^:Die Machtverbindung ist dein Freund. So führen Sie ein Verb xmal aus:

verb^:x

Wenn Sie das Ergebnis jeder Iteration in einer Liste benötigen:

verb^:(i.x)

Sie können auch ^:ein Verb mit folgenden Bedingungen ausführen:

  +:^:(3<])"0[ 1 2 3 4 5 6
1 2 3 8 10 12

Verdoppeln Sie, +:wenn ^:das Element größer als 3 ist 3<](das "0ändert den Rang des Verbs, sodass es jeweils für ein Element gilt).


Boxed Values ​​verhalten sich wie im (i.x)Beispiel, sind also f^:(<x)äquivalent zu f^:(i.x).
FireFly

9

Eingang

1!:1[1 wird eine Eingabezeile dauern, die durch Drücken der Eingabetaste beendet wird.

1!:1[3 nimmt eine Reihe von Eingabezeilen (beendet mit Strg-D auf meinem Mac, Strg-C unter Windows).

Wenn Sie versuchen, Zahlen einzugeben, ".wird die Zeichenfolge mit ausgewertet und eine Liste von Zahlen zurückgegeben, die bearbeitet werden können. Wenn Sie eine Zahl eingeben, aber die Ziffern einzeln bearbeiten müssen ".,.(dank des Kommentars von Jan Dvorak) oder "."0die Zeichenfolge in separate Ziffern aufteilen möchten:

   "."0[1!:1[1
12345
1 2 3 4 5

   ".,.1!:1[1
12345
1 2 3 4 5

Wenn Sie Zeichenfolgen einlesen, ist der kürzeste Weg, eine Box-Liste mit separaten Zeichenfolgen zu erhalten, die Verwendung ;:. Dies funktioniert am besten für durch Leerzeichen getrennte Zeichenfolgen:

   ;:1!:1[1
hello world
┌─────┬─────┐
│hello│world│
└─────┴─────┘

Aus Neugierde (ich habe nur ein bisschen mit J gespielt), was würde 1!:1[2sich als (wenn überhaupt) herausstellen?
Gaffi

Nach dem, was ich auf der 1!:Seite erfassen kann (ich bin kein J-Experte), ist 2 der Bildschirm, sodass Eingaben über den Bildschirm nicht viel Sinn ergeben.
Gareth

Danke für den Link. Von dort sieht es tatsächlich so aus, als ob 2es nicht gültig ist? Ich habe meinen J-Computer momentan nicht zum Ausprobieren. Wo ich sehe 2, knapp unter den Notizen über 1!:1, ist es für 1!:2.
Gaffi

@Gaffi Die Dateinummern für die Ein- und Ausgabe scheinen sequentiell zu sein, daher schätze ich, dass diese festgelegt sind und dass 2, 4 und 5 nur unter der Ausgabe angezeigt werden, da es keinen Sinn macht, sie auszugeben. Gleiches gilt umgekehrt für 1 und 3.
Gareth

Da ".Rang 1-xx ist und ,.immer ein 2D-Array erzeugt, kann ".,' ',.(Stich mit Leerzeichen, Ravel und Evaluieren; 8 Zeichen) durch nur ".,.(Ravel-Elemente und Evaluieren; 4 Zeichen) ersetzt werden.
John Dvorak

6

Verwenden der Iteration zum Berechnen von Sequenzen

Normalerweise müssen Sie zum Lösen einer OEIS-Sequenzanforderung eine der auf der Seite angegebenen Formeln verwenden. Einige passen gut zu J, andere weniger. Rekursive Formeln sind unkompliziert, die Iteration ist jedoch möglicherweise nicht einfach. Ein Muster, mit dem ich angefangen habe, ist

(s(]f)^:[~]) n
          ]  Gets n
 s           The first value in the sequence
         ~   Commute the argument order, n is LHS and s is RHS
        [    Gets n
      ^:     Nest n times with an initial argument s
  (]f)         Compute f s
             Returns (f^n) s

Dabei sist Wobei der erste Wert in der Sequenz fist, ein Verb, das den nächsten Term berechnet, wenn der vorherige Term angegeben ist, und nder auf Null basierende Index des Terms, den Sie berechnen möchten. Diese Methode beruht auf der Tatsache, dass bei der Berechnung der Potenz einer Dyade die LHS an die Dyade gebunden wird, um eine neue Monade zu bilden, und diese Monade auf dem Anfangswert verschachtelt ist. Die dem Power-Adverb zugewiesene Dyade ist ein Hook, bei (]f)dem der Index nfür die LHS und der Wert eines Terms in der Sequenz angegeben werden s. Der Haken gilt fauf sals Monade, und dann ignoriert ndas Ergebnis zurück f s.

Standardbibliothek

Manchmal werden Sie vielleicht feststellen, dass J ein Verb in seiner Standardbibliothek unterstützt . Beispielsweise sind die meisten bitweisen Ganzzahloperationen an Namen gebunden, die kürzer sind als die Verwendung des primitiven Aufrufs.

AND =: (17 b.) NB. it is actually '$:/ :(17 b.)'

Datums- und Zeitangaben sind ebenfalls verfügbar.

Bereiche

Wenn Sie eine Reihe von Werten haben [a, b, c]und einen Bereich basierend auf dem Produkt bilden möchten [0, 1, 2, ..., a*b*c-1], besteht der typische Ansatz darin, das Produkt zu finden und dann einen Bereich zu bilden, der möglicherweise [:i.*/6 Byte kostet. Ein kürzerer Weg ist ,@i.für 4 Bytes, da i.mehrdimensionale Arrays gebildet werden können, während immer noch hochgezählt wird, und durch Reduzieren wird ein gleichwertiger Bereich erzeugt.

Fortlaufend drucken

Eine stillschweigende Möglichkeit, einen Wert auszudrucken und ihn ohne explizite Schleife weiter zu verwenden, ist ([echo)für einen monadischen Fall. echoist ein Verb in der Standardbibliothek, das seinen Inhalt stdoutin dem Format ausgibt, das im Interpreter verwendet wird. Der Hook gibt dann den gleichen Eingabewert mit dem linken [Verb aus.

Basis 10 Stellen einer ganzen Zahl

Die Standardmethode zum Erfassen der 10-stelligen Basis einer Ganzzahl ist, 10#.inv]dass 8 Byte zu viel kosten! Eine Alternative besteht darin, es in eine Zeichenfolge zu konvertieren und bei Rang 0 zu analysieren, "."0@":wodurch ein Byte gespeichert wird. Eine noch bessere Möglichkeit ist ,.&.":, ein weiteres Byte zu speichern, wodurch die endgültigen Kosten 6 Bytes anstelle von 8 Bytes betragen.


5

Verwenden Sie eine explizite Definition, anstatt ein implizites Verb zu schreiben. sicher, 3 :'und 'kosten 5 Bytes, aber Sie können viel sparen @, @:und [:das auf diese Weise.


5

Einige (ziemlich) häufige Tricks, die ich gesehen habe

Ich teile ein paar Dinge, die sich für mich als nützlich erwiesen haben. Grundsätzlich sind dies alles Tipps, die ich selbst erhalten habe, aber für die meisten habe ich keine Credits.

Summe eines Arrays des ersten Ranges

Anstatt zu +/@:(FGH)benutzen (1#.FGH). Dies bedeutet eine Verschlechterung auf Basis 1, was effektiv ein Aufsummieren eines Arrays bedeutet. Obwohl es länger als ist +/, erfordert es keine Kappe oder Komposition, was es oft viel kürzer macht als die Verwendung+/ .

Hinterwahrheiten zählen

Wenn Sie eine Boolesche Liste haben und die Anzahl der nachgestellten Wahrheiten zählen möchten, verwenden Sie #.~. Sehen Sie hier . Die APL-Antwort bietet eine gute Erklärung dafür, wie dies funktioniert. Zugegeben, das war nur zweimal hilfreich für mich, aber ich dachte, ich würde es trotzdem teilen.

Unter (&.)

Kein bestimmter Trick, sondern nur ein allgemeiner Vorschlag: das Adverb &. -under führt oft zu eleganten und (was noch wichtiger ist) kurzen Lösungen. Denken Sie daran, wenn Sie Golf spielen.

Oft ist es nützlich für und andere Basisumwandlungsprobleme, z. B. diesen Code, der das höchstwertige Bit aus einer Zahl entfernt: }.&.#:(In eine Liste von Binärziffern umwandeln, die erste Ziffer entfernen, dann die Umwandlung in eine Liste von Binärziffern rückgängig machen und umwandeln zurück zur Dezimalzahl). Die einfache Lösung ist zwei Bytes: #.@}.@#:.

Unter ist auch hilfreich bei Herausforderungen, bei denen Sie mit Dezimalstellen arbeiten müssen, da Sie diese verwenden können u&.":. Zum Beispiel gibt der kurze Weg Meilen zum Aufteilen auf Dezimalstellen unter:,.&.": .

Ein letztes Beispiel ist das Ermitteln der Größe eines Vektors: +/&.:*:Beachten Sie, dass Sie alle Ergebnisse von *:-square mit -under erfassen müssen, &.:da *:-square den Rang Null hat.


4

Kürzere Wege, sich mit Rängen zu messen

Manchmal haben Sie Code wie <"0 i.3 3, wo Sie ein Verb vim Rang anwenden möchten r. Wenn Sie jedoch ein Substantiv (wie 0) verwenden, müssen Sie häufig ein Leerzeichen einfügen. Um dies zu vermeiden, können Sie stattdessen ein anderes Verb umit gleichem Rang verwenden u"v. Da zum Beispiel +rank hat 0 0 0, können wir <"+statt benutzen <"0.

Hier ist eine Tabelle aller Verben und ihrer Ränge (erhältlich mit v b. 0):

0 0 0     > + * - % ^ | ! ? <. <: >. >: +. +: *. *: %: ^. j. o. q: r.
0 _ _     -. -: E. i: p:
1 0 1     p..
1 0 _     { A.
1 1 0     p.
1 1 1     #.
1 1 _     C.
1 _ _     ;: ". i. I.
2 _ 2     %.
_ 0 0     = < ~. ~: {: }: ?. L.
_ 1 0     #:
_ 1 _     $ # |. |: {. }. ": {::
_ _ _     , ; [ ] _: $. $: ,. ,: /: \: [: e. s: u: x: 0:

Um diese Tabelle zu verwenden, finden Sie den gewünschten Rang rauf der linken Seite, und wählen Sie dann auf der rechten Seite ein geeignetes Verb vaus. Wenn ich zum Beispiel ein Verb vin der Tiefe vektorisieren muss 2 _ 2, finde ich diesen Rang auf der linken Seite und wähle ihn %.auf der rechten Seite aus. Dann benutze ich v"%.statt v"2 _ 2.


3

strings Bibliothek: Golftipps

Die Zeichenfolgenbibliothek ist äußerst hilfreich, um Zeichenfolgen zu manipulieren. Sicher, es dauert include'strings'(was in Anbetracht von J sehr kostspielig ist), aber manchmal können Sie die Vorteile nutzen.

stringreplace

Finden Sie sich mit String ersetzen? Beachten Sie, dass dies A stringreplace Bdasselbe ist wie B rplc A.

In der Tat ist dies so rplcimplementiert:

   rplc
 stringreplace~

cuts

Das Verb cutssieht also vor:

schneide y an x ​​(Konjunktion)
String (Verb schneidet n) Text
  n = _1 bis einschließlich Zeichenfolge
  n = 1 bis einschließlich String
  n = _2 nach, jedoch ohne String
  n = 2 nach und einschließlich String

Es schneidet also wirklich eine Schnur.


3

Zahlen von 0 bis 4 erhalten

Wenn die Verwendung von Zahlen in Ihrem Code eingeschränkt ist:

0 %_ : eins geteilt durch unendlich.
1 #_ : wie viele Unendlichkeiten?
2 #_ _ : zwei Unendlichkeiten.
3 verb : Es gibt eine eingebaute.
4 dyad : ein anderes eingebautes.

Zahlen von 10 bis 35 erhalten

Base-inifinity Literale: 11 : _bb, 26 : _bqusw.


3

Implizite Programmierung

Grundlagen

Dyadisches Verb

x (F G H) y == (x F y) G (x H y)
x (F G) y == x F (G y)
x ([: G H) y == G (x H y)  NB. G is called monadically

NB. Verbs are grouped from the right by units of 3.
NB. For the following, think like G, I, K are replaced by the results of (x G y) etc.
NB. and then the sentence is run as usual.
x (F G H I J K) y == x (F (G H (I J K))) y
                  == x F ((x G y) H ((x I y) J (x K y)))

NB. Using conjunctions for dyadic verb
x F@G y == F (x G y)  NB. Atop; Same as x ([: F G) y; Consider as golfing alternatives
x F&G y == (G x) F (G y)  NB. Compose; G is applied monadically to both arguments

Monadisches Verb

(F G H) y == (F y) G (H y)
(G H) y == y G (H y)  NB. Note that this is different from APL
([: G H) y == G (H y)
(F G H I J K) y == (F (G H (I J K))) y
                == y F ((G y) H ((I y) J (K y)))
F@G y == F (G y)

Sonstiges

x&F y == x F y
F&y x == x F y
y F~ x == x F y
F~ y == y F y

Tricks

(F x) G (H y)

Tacit Lösung: (G~F)~H; In Abhängigkeit von den tatsächlichen Verben sollten Sie erwägen, die zu entfernenden Argumente left und right neu anzuordnen ~.

x ((G~F)~H) y
x (G~F)~ (H y)
(H y) (G~F) x
(H y) G~ (F x)
(F x) G (H y)

Monadisch-dyadischer Ersatz

>:y == 1+y
<:y == 1-~y or _1+y
+:y == 2*y
-.y == 1-y
-:y == 2%~y
*:y == 2^~y
#.y == 2#.y
#.inv y == 2#.inv y  NB. #: doesn't work this way
{.y == 0{y
{:y == _1{y
}.y == 1}.y
+/y == 1#.y

1
(G~F)~Hist pure sprudelnde Güte!
Jonah

2

& ist dein Freund, benutze es mit Bedacht

vist ein Verb, nist ein Substantiv xundy sind jeweils linke und rechte Argumente.

Monade &: Stellen Sie sich vor~ Innerhalb der Adverb- / Konjunktionskette

Eine Adverb- / Konjunktionskette wird von links ausgewertet. So etwas _2&+/\&.>wird nicht funktionieren, weil es analysiert, wie (_2&+)/\&.>wir wollen _2&(+/\)&.>. In diesem Fall kann durch Tauschen von links / rechts +/\ein Byte gespart werden, +/\~&_2&.>da dieses wie folgt analysiert wird ((+/\)~)&_2&.>. So sehen Sie, warum dies funktioniert:

+/\~&_2 y
is equivalent to
y +/\~ _2
is equivalent to
_2 +/\ y
is equivalent to
_2&(+/\) y

Dyad &: Wiederhole xmal

Wissen Sie, dass , wenn Sie ein linkes Argument geben xzu &, gilt die Funktion es xmaly ? Bei einigen Herausforderungen müssen Sie bestimmte Betriebszeiten xeinhalten. Es ist hauptsächlich auf zwei Arten erreichbar:

  • Verwenden Sie den Netzoperator ^:ohne rechten Operanden

Wenn die Operation ist v, v^:wird sie zu einem Adverbzug, der, wenn ein linker Operand gegeben wird, zu einem monadischen Verb wird. So vwird angewendet y, xmal.

x(v^:)y
is equivalent to
(v^:x)y
  • Verwenden Sie die Dyade &als äußerste Konjunktion

Um dies zu verwenden, müssen Sie eine Konstante nund ein dyadisches Verb identifizieren u, sodass entweder n u yoder y u näquivalent zu ist v. Dann können Sie schreiben n&uoder u&ndie gesamte Aufgabe lösen. Diese Form ist am effektivsten, wenn die Wahl der Konstante offensichtlich ist, z. B. 3 3 u:Zoll (Zeichen in ASCII-Werte konvertieren).

Wird auch u&netwas vorgezogen, n&uwenn die äußerste Struktur von ueine Konjunktion oder ein Adverb ist (in diesem Fall n&usollte dies der Fall sein n&(u); Sie können dies u~&nstattdessen tun ).

Beachten Sie, dass Sie die Dyade &an einer beliebigen Stelle in einem Zug platzieren können, um die Wiederholung einer beliebigen Funktion für ein beliebiges Argument zu erreichen, ähnlich wie bei einer dynamischen ^:.

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.