Ich habe kürzlich eine Code Golf Challenge gestartet und es scheint, als ob der Gewinner GolfScript ist (Überraschung, Überraschung!). Interessant ist, dass es einen weiteren sehr starken Konkurrenten gab, der alle Chancen hatte, GolfScript zu gewinnen. Sein Name ist APL. Ich sehe hier eine Menge Antworten in APL. Es scheint, dass diese Sprache für Code-Golf ziemlich effizient ist, deshalb entscheide ich mich, nach Tipps für Code-Golf zu fragen, die Sie für APL-Programme kennen. Zögern Sie nicht, einige Codebeispiele zu posten. Es ist normalerweise sehr interessant, Sprache in Aktion zu sehen.
Züge
quelle
Tricks für den Umgang mit
/
und⌿
in ZügenWenn Sie Züge benutzen, möchten Sie vielleicht Reduzierungen
f/
wie Summe+/
oder sogar Nachbildung verwenden//
. Wenn Ihr Zug jedoch links von der Verkleinerung mehr Teile enthält, benötigen Sie Klammern, um eine Spitze zu erstellen. Hier sind einige Tricks zum Speichern von Bytes.Verwenden Sie diese
1∊
Option anstelle von monadischen∨/
oder∨⌿
booleschen ArraysAufgabe: Geben Sie bei zwei gleichlangen Zeichenfolgen A und B 2 zurück, wenn die entsprechenden Zeichen von A und B gleich sind, andernfalls 0. ZB
A←'abc'
undB←'def'
gibt0
undA←'abc'
undB←'dec'
gibt2
.Eine DFN-Lösung kann sein,
A{2×∨/⍺=⍵}B
aber Sie möchten sie durch Stillschweigen verkürzen.A(2×∨/=)B
wird nicht funktionieren, weil die Regeln der Zugbildung dies so parsen, wie2 (× ∨/ =)
Sie es möchten2 × (∨/=)
.Beobachten Sie, dass
∨/
oder∨⌿
auf einem Booleschen Vektor (∨/,
oder∨⌿,
für Arrays mit höherem Rang) gefragt wird, ob 1 vorhanden ist, dh1∊
, wir können unseren Zug schreiben als2×1∊=
.Beachten Sie, dass
∊
das richtige Argument verwendet wird, sodass Sie nicht jede Zeile oder Spalte einzeln reduzieren können.Verwenden Sie
1⊥
anstelle von monadisch+/
oder+⌿
Aufgabe: Geben Sie bei einer Liste von Listen L und einem Index N die Summe der N-ten Liste dreimal zurück. ZB
L←(3 1 4)(2 7)
undN←1
gibt24
.Eine DFN-Lösung kann sein,
N{3×+/⍺⊃⍵}L
aber Sie möchten sie durch Stillschweigen verkürzen.N(3×+/⊃)L
wird nicht funktionieren, weil die Regeln der Zugbildung dies so parsen, wie3(× +/ ⊃)
Sie es möchten3 × (+/⊃)
.Beachten Sie, dass das Auswerten einer Liste von Zahlen in Unary (Basis-1) gleichbedeutend ist mit dem Summieren der Liste, da because { a , b , c , d } = a + b + c + d = ( a × 1³) + ( b × 1²) ) + ( c × 1¹) + ( d × 1⁰). Deshalb
+/a b c d
ist das genauso1⊥a b c d
, und wir können unseren Zug so schreiben3×1⊥⊃
.Beachten Sie, dass bei übergeordneten Argumenten
1⊥
gleichbedeutend mit ist+⌿
.Verwenden Sie
f.g
stattf/g
mit Skalar- und / oder VektorargumentenAufgabe: Geben Sie für eine Liste L und eine Zahl N den Bereich 1 durch die Anzahl der verbleibenden minimalen Divisionen zurück, wenn die Elemente von L durch NEg dividiert sind
L←31 41 59
undN←7
ergeben1 2 3
.Eine DFN-Lösung kann sein,
N{⍳⌊/⍺|⍵}L
aber Sie möchten sie durch Stillschweigen verkürzen.N(⍳⌊/|)L
wird nicht funktionieren, weil die Regeln der Zugbildung dies so parsen, wie⍳ (⌊/) |
Sie es möchten⍳ (⌊/|)
.Das innere Produkt
A f.g B
von skalaren zwei Funktionen, wenn die Argumente Skalare und / oder Vektoren sind, ist dasselbe wie,f/ A g B
weil beide(A[1] g B[1]) f (A[2] g B[2]) f (A[3] g B[3])
usw. sind, so dass wir unseren Zug schreiben können als⍳⌊.|
.Beachten Sie, dass dies für höherrangige Arrays nicht funktioniert.
Verwenden Sie
∊⊆
anstelle von/
booleschen linken und einfachen Vektor-rechten ArgumentenAufgabe: Filtern Sie die Liste mit einer Liste L und einer Zahl N so, dass nur Zahlen größer als N übrig bleiben. ZB
L←3 1 4
undN←1
gibt3 4
.Eine DFN-Lösung kann sein,
N{(⍺<⍵)/⍵}L
aber Sie möchten sie durch Stillschweigen verkürzen.N(</⊢)L
wird nicht funktionieren, da die Bindungsregeln dies analysieren,(</) ⊢
aber Sie möchten/
die Funktion replizieren und nicht den Operator reduzieren .Dyadisch
⊆
mit einem booleschen linken Argument unterteilt das rechte Argument in Einsenreihen im linken Argument und löscht Elemente, die durch 0en gekennzeichnet sind. Dies ist fast das, was wir wollen, abgesehen von der unerwünschten Partitionierung. Wir können jedoch die Partitionierung durch Anwenden von monadic aufheben∊
. So{(⍺<⍵)/⍵}
können{∊(⍺<⍵)⊆⍵}
wir werden und so können wir unseren Zug schreiben∊<⊆⊢
.Beachten Sie, dass dies für höherrangige Arrays nicht funktioniert.
Verwenden Sie
0⊥
anstelle von⊢/
oder⊢⌿
mit numerischen ArgumentenAufgabe: Multiplizieren Sie das N mit dem am weitesten rechts stehenden Element von LEg
L←3 1 4
undN←2
geben Sie eine Liste L und eine Zahl N an8
.Eine DFN-Lösung kann sein,
N{⍺×⊢/⍵}L
aber Sie möchten sie durch Stillschweigen verkürzen.N(⊣×⊢/⊢)L
wird nicht funktionieren, weil die Regeln der Zugbildung dies so parsen, wie⊣ (× ⊢/ ⊢)
Sie es möchten⊣ × (⊢/⊢)
.Beachten Sie, dass
0⊥
in einem numerischen Array dasselbe wie in einem numerischen Array ist⊢⌿
, sodass wir unseren Zug als schreiben können⊣×0⊥⊢
.Beachten Sie, dass hiermit die letzte Hauptzelle höherrangiger Arrays ausgewählt wird.
quelle
Verwenden Sie
⊥
diese Option , um die Multiplikation mit der Addition zu kombinierenAnnahmen:
a
undb
sind Begriffe, die keine weiteren Klammern erfordern, wenn sie als linkes Argument verwendet werdenC
ist ein Ausdruck, für den möglicherweise Klammern erforderlich sind, wenn er als linkes Argument verwendet wirda
b
C
zu numerischen Skalaren auswertenquelle
Komplexe Zahlen
Oft übersehen, bieten sie wunderbare Möglichkeiten, um Ausdrücke zu verkürzen, die sich mit Gittern, Irrgärten, Fraktalen oder Geometrien befassen.
quelle
Indizierung der Modulo-Vektorlänge
⊃i⌽a
ist oft kürzer als die naive⊃a[(≢a)|i]
odera⊃⍨i|⍨≢a
(woa
ist ein Vektor undi
ist eine ganze Zahl und⎕io
ist 0)Eine nützliche Variation dazu (danke EriktheOutgolfer für den Hinweis) ist:
I↑Y⌽⍨I×X
WoY
ist die Verkettung einiger LängenvektorenI
und woX
ist der Index desjenigen , den wir auswählen möchten, zum Beispiel:3↑'JanFeb...Dec'⌽⍨3×month
quelle
Konstante Funktionen
=⍨
und≠⍨
danke an ngn.Manchmal brauchen Sie nur einen einzigen Wert für jedes Element einer Liste. Während Sie vielleicht versucht sind zu verwenden
{value}¨
, ist es kürzer zu verwenden,value⊣¨
aber für einige gängige Werte können Sie noch kürzer werden (mit⎕IO←0
):¯1
s mit⍬⍸list
0
s mit⍬⍳list
1
s mit⍬⍷list
Beachten Sie, dass diese nur auf Listen funktionieren (obwohl sie möglicherweise verschachtelt sind). Für höherrangige Arrays können Sie Folgendes verwenden, um alle Nullen und alle Einsen abzurufen:
1
s mit=⍨
0
s mit≠⍨
Wenn Sie festlegen
⎕ML←0
, können alle Zahlen zu Nullen gemacht werden (als ob0×
) mit:∊
Wenn Sie nur eine einzelne Zahl benötigen, können Sie möglicherweise monadic verwenden
≡
, um 1 oder 0 zu erhalten, anstatt1⊣
oder zu verwenden0⊣
.quelle
⊣\
⊣
und⊢
mit/
und⌿
einen eigenen Beitrag verdienen.Verwenden
⍨
Vermeiden Sie Klammern
⍨
(Pendeln) kann Ihnen Bytes sparen, indem Klammern vermieden werden. Wenn Sie eine Funktion haben, bei der das linke Argument in Klammern gesetzt werden muss und das rechte Argument nicht, können Sie ein Byte speichern, z . B.(A<B)÷C
→C÷⍨A<B
.Doppelte Arrays
Verwenden Sie
,⍨A
oder , um eine Kopie eines Arrays an dessen Ende anzuhängen⍪⍨A
.Doppelte Zahlen
Anstatt
2∘×
zu double zu verwenden, können Sie Folgendes verwenden,+⍨
da das Argument zu sich selbst hinzugefügt wird:1+2∘×
→1++⍨
.Quadratzahl
Anstatt
2*⍨Y
zu quadrieren, können Sie verwenden,×⍨Y
da es das Argument mit sich selbst multipliziert:2*⍨A+B
→×⍨A+B
.Zufällige Permutation
?⍨N
gibt Ihnen eine zufällige Permutation der LängeN
.Selbsteinstufung
Finden Sie die Indizes des ersten Auftretens jeder Hauptzelle mit
⍳⍨A
Zählen Sie nachfolgende 1s in einem Booleschen Vektor
Anstatt
+/∧\⌽B
zu zählen, wie viele nachfolgende Einsen sich inN
Ihnen befinden, können Sie verwenden⊥⍨
.Umgekehrte Zusammensetzung
A f∘g B
istA f g B
, aber wenn du willst(g A) f B
, benutzef⍨∘g⍨
.Rückwärts reduzieren
f/ a1 a2 a3
ista1 f (a2 f a3)
. Wenn Sie möchten(a1 f a2) f a3
, verwenden Sief⍨/⌽
.Reverse Scan
f\ A B C
istA (A f B) (A f (B f C))
.f⍨/∘⌽¨,\ A B C
istA (A f B) ((A f B) f C)
.f⍨\⌽ A B C
ist((A f B) f C) (B f C) C
.⌽f/∘⌽¨,\⌽ A B C
. ist(A f (B f C)) (B f C) C
.quelle
Zählen Sie die Zeichen in einer Zeichenfolge ohne auf
⍳≢
Aufgabe: Geben Sie zwei Zeichenfolgen an, S und T, und listen Sie die Indizes ihrer Verkettung auf. ZB
S←'abcd'
undT←'xyz'
gibt1 2 3 4 5 6 7
.Eine DFN-Lösung kann sein,
S{⍳≢⍺,⍵}T
aber Sie möchten sie durch Stillschweigen verkürzen.⍳≢,
wird nicht funktionieren, weil die Regeln für das Parsen von Zügen dies so analysieren, wie(⍳)≢(,)
Sie es möchten(⍳≢),
.Dyadisch
⍋
mit einem leeren linken Argument bewertet einfache Zeichenarrays gemäß ihrer aktuellen Reihenfolge, die mit identisch ist⍳≢
. So{⍳≢⍺,⍵}
können{⍬⍋⍺,⍵}
wir werden , so können wir unseren Zug als schreiben⍬⍋,
.Beachten Sie, dass dies nicht für numerische oder gemischte Arrays funktioniert.
quelle