Simple examples: Difference between revisions
Jump to navigation
Jump to search
Miraheze>Adám Brudzewsky |
Miraheze>Marshall No edit summary |
||
Line 4: | Line 4: | ||
=== Indices of multiple elements === | === Indices of multiple elements === | ||
<code class="apl">∊</code> gives us a mask for elements (characters) in the left argument that are members of the right argument: | <code class="apl">∊</code> gives us a mask for elements (characters) in the left argument that are members of the right argument: | ||
< | <source lang=apl> | ||
'mississippi'∊'sp' | 'mississippi'∊'sp' | ||
0 0 1 1 0 1 1 0 1 1 0 | 0 0 1 1 0 1 1 0 1 1 0 | ||
</ | </source> | ||
<code class="apl">⍸</code> gives us the indices where true (1): | <code class="apl">⍸</code> gives us the indices where true (1): | ||
< | <source lang=apl> | ||
⍸'mississippi'∊'sp' | ⍸'mississippi'∊'sp' | ||
3 4 6 7 9 10 | 3 4 6 7 9 10 | ||
</ | </source> | ||
We can combine this into an anonymous infix (dyadic) function: | We can combine this into an anonymous infix (dyadic) function: | ||
< | <source lang=apl> | ||
'mississippi' (⍸∊) 'sp' | 'mississippi' (⍸∊) 'sp' | ||
3 4 6 7 9 10 | 3 4 6 7 9 10 | ||
</ | </source> | ||
{{Works in|[[Dyalog APL]], [[NARS2000]], [[dzaima/APL]]}} | {{Works in|[[Dyalog APL]], [[NARS2000]], [[dzaima/APL]]}} | ||
=== Parenthesis nesting level === | === Parenthesis nesting level === | ||
First we compare all characters to the opening and closing characters; | First we compare all characters to the opening and closing characters; | ||
< | <source lang=apl> | ||
'()'∘.='plus(square(a),plus(square(b),times(2,plus(a,b)))' | '()'∘.='plus(square(a),plus(square(b),times(2,plus(a,b)))' | ||
0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 | 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 | ||
0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 | 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 | ||
</ | </source> | ||
An opening increases the current level, while a closing decreases, so we convert this to ''changes'' (or ''deltas'') by subtracting the bottom row from the top row: | An opening increases the current level, while a closing decreases, so we convert this to ''changes'' (or ''deltas'') by subtracting the bottom row from the top row: | ||
< | <source lang=apl> | ||
-⌿'()'∘.='plus(square(a),plus(square(b),times(2,plus(a,b)))' | -⌿'()'∘.='plus(square(a),plus(square(b),times(2,plus(a,b)))' | ||
0 0 0 0 1 0 0 0 0 0 0 1 0 ¯1 0 0 0 0 0 1 0 0 0 0 0 0 1 0 ¯1 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 ¯1 ¯1 ¯1 | 0 0 0 0 1 0 0 0 0 0 0 1 0 ¯1 0 0 0 0 0 1 0 0 0 0 0 0 1 0 ¯1 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 ¯1 ¯1 ¯1 | ||
</ | </source> | ||
The running sum is what we're looking for: | The running sum is what we're looking for: | ||
< | <source lang=apl> | ||
+\-⌿'()'∘.='plus(square(a),plus(square(b),times(2,plus(a,b)))' | +\-⌿'()'∘.='plus(square(a),plus(square(b),times(2,plus(a,b)))' | ||
0 0 0 0 1 1 1 1 1 1 1 2 2 1 1 1 1 1 1 2 2 2 2 2 2 2 3 3 2 2 2 2 2 2 2 3 3 3 3 3 3 3 4 4 4 4 3 2 1 | 0 0 0 0 1 1 1 1 1 1 1 2 2 1 1 1 1 1 1 2 2 2 2 2 2 2 3 3 2 2 2 2 2 2 2 3 3 3 3 3 3 3 4 4 4 4 3 2 1 | ||
</ | </source> | ||
{{Works in|all APLs}} | {{Works in|all APLs}} | ||
{{APL programming language}} | {{APL programming language}} |
Revision as of 12:29, 25 October 2019
This page contains examples that show APL's strengths. The examples require minimal background and have no special dependencies.
Text processing
APL represents text as character lists (vectors), making many text operations trivial.
Indices of multiple elements
∊
gives us a mask for elements (characters) in the left argument that are members of the right argument:
'mississippi'∊'sp' 0 0 1 1 0 1 1 0 1 1 0
⍸
gives us the indices where true (1):
⍸'mississippi'∊'sp' 3 4 6 7 9 10
We can combine this into an anonymous infix (dyadic) function:
'mississippi' (⍸∊) 'sp' 3 4 6 7 9 10
Parenthesis nesting level
First we compare all characters to the opening and closing characters;
'()'∘.='plus(square(a),plus(square(b),times(2,plus(a,b)))' 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1
An opening increases the current level, while a closing decreases, so we convert this to changes (or deltas) by subtracting the bottom row from the top row:
-⌿'()'∘.='plus(square(a),plus(square(b),times(2,plus(a,b)))' 0 0 0 0 1 0 0 0 0 0 0 1 0 ¯1 0 0 0 0 0 1 0 0 0 0 0 0 1 0 ¯1 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 ¯1 ¯1 ¯1
The running sum is what we're looking for:
+\-⌿'()'∘.='plus(square(a),plus(square(b),times(2,plus(a,b)))' 0 0 0 0 1 1 1 1 1 1 1 2 2 1 1 1 1 1 1 2 2 2 2 2 2 2 3 3 2 2 2 2 2 2 2 3 3 3 3 3 3 3 4 4 4 4 3 2 1
Works in: all APLs