답변:
편집 : APL을 전혀 모르지만 그것을 받아들이고 싶은 사람들을 위해, Dyalog APL 마스터 링 은 아주 좋은 자료입니다.
평가는 엄격하게 오른쪽에서 왼쪽입니다. 여기에는 변수 설정이 포함되므로 활용하십시오.
2+a, 1+a←1
-> 3 4
a
로 설정 1
, 1+a
평가 2
, a,2
평가 1 2
및 2+1 2
평가합니다 3 4
.
C ←
와 같이 함수와 결합 될 수 있습니다 a +← 3
. C와 달리 이것은 일반적입니다 :로 foo F← bar
설정 foo
합니다 F bar
. 직관적이지 않은 식으로, 이것이 bar
아닌을 반환합니다 F bar
.
익명 함수에서도 작동합니다.
a←0
a+←3 ⋄ a
3
a+←3 ⋄ a
6
a { ⍵/'!' } ←4 ⋄ a
!!!!
A[3]←8
예상대로 배열에을 (를) 할당 할 수 있습니다 . 그러나 동시에 여러 항목을 할당 할 수도 있습니다. A[3 5 6]←9 1 4
또는 A[3 5 6]←9
모든 항목을 동일한 항목으로 설정할 수도 있습니다. 물론 ←
여기에도 함수를 추가 할 수 있습니다 . 이 기능은 마치 마치 마치 각 요소에 개별적으로 적용됩니다 F¨
.
⍨
너무 행복해 보이지 않더라도 친구입니다.
F
dyadic 인 경우 , dyadic ⍨
는 인수를 a F b
<-> 전환합니다 b F⍨ a
. 이것은 중괄호를 사용하지 않아도되므로 골프 때 유용합니다.
(F G H x) K y <-> y K⍨ F G H x
오른손은 항상 왼손보다 먼저 평가되므로 평가 순서가 변경됩니다.
경우 F
이항이다, 모나드는 ⍨
함수의 양쪽에 동일한 인수를 적용 :
5⍴5
5 5 5 5 5
⍴⍨5
5 5 5 5 5
인수는 한 번만 평가됩니다. 이것은 특히 외부 제품에 유용합니다. 즉, 배열의 각 값을 같은 배열의 다른 값과 비교 ∘.=⍨
하려면 수행 하는 대신 사용할 수 있습니다 x∘.=x←(whatever)
.
경우 F
모나드이다, ⍨
아무것도하지 않는다,하지만 인수에서 기능을 분리한다. 따라서 함수가 복잡한 경우 여전히 중괄호를 저장할 수 있습니다.
{⍵+3}⍣5 6
∇{⍵+3}
∇ ⍣ 5 6
({⍵+3}⍣5)6
21
{⍵+3}⍣5⍨6
21
관용구를 배우십시오! 그런 다음 관용구를 골프. 예를 들면 다음과 같습니다.
((((1↑⍴X),⍴Y)↑X)^.=Y)⌿X
기계적으로 다음과 같이 변형 될 수 있습니다.
X⌿⍨Y^.=⍨X↑⍨(1↑⍴X),⍴Y
그리고 더 나아가 :
X⌿⍨Y^.=⍨X↑⍨(⊃⍴X),⍴Y
⊃
이 경우 (첫 번째)는 1↑
(하나를 취하십시오)와 같습니다. 그리고 아마도 :
X⌿⍨Y^.=⍨X↑⍨(≢X),⍴Y
≢
(탈리) ⊃⍴
스칼라를 제외한 모든 스칼라에 대해 (모양의 첫 번째 요소 )와 같습니다 .
A(f g h)B ←→ (A f B)g A h B ⍝ fork
(f g h)B ←→ ( f B)g h B ⍝ fork
A( g h)B ←→ g A h B ⍝ atop
( g h)B ←→ g h B ⍝ atop
(A g h) ←→ ({A} g h) ⍝ "Agh" fork
(f g h k) ←→ (f (g h k)) ⍝ 4-train
(f g h k l) ←→ (f g (h k l)) ⍝ 5-train, etc
(f g h k l m) ←→ (f(g h(k l m))) ⍝ groups of 3 from the right, last could be 2
f∘g B ←→ f g B ⍝ "compose" operator, useful in trains
A f∘g B ←→ A f g B
/
과 ⌿
기차에서열차 를 사용할 때 f/
합계 +/
또는 복제 감소 와 같은 감소를 사용할 수 있습니다 //
. 그러나 열차 왼쪽에 더 많은 부품이있는 경우 꼭대기를 만들려면 괄호가 필요합니다. 다음은 바이트를 절약하는 몇 가지 요령입니다.
1∊
모나 딕 ∨/
또는 ∨⌿
불리언 배열 대신 사용작업 : 길이가 같은 두 문자열 A와 B가 주어지면 A와 B의 해당 문자가 같은 경우 2를, 그렇지 않으면 0을 반환합니다. 예 A←'abc'
및 B←'def'
제공 0
하고 A←'abc'
하고 B←'dec'
있습니다 2
.
dfn 솔루션이있을 수도 A{2×∨/⍺=⍵}B
있지만 암묵적으로 처리하여 솔루션 을 줄이려고합니다. A(2×∨/=)B
기차 형성 규칙이 이것을 파싱 2 (× ∨/ =)
하지만 원하는 대로 작동하지 않습니다 2 × (∨/=)
.
그 관찰 ∨/
또는 ∨⌿
부울 벡터 (에 ∨/,
또는 ∨⌿,
더 높은 순위 배열) 즉, 어떤 한 존재가 있는지 여부를 묻는 1∊
우리가 우리 기차를 작성할 수 있도록 2×1∊=
.
참고 ∊
별도로 각 행 또는 열을 줄이기 위해 사용할 수 있도록, 오른쪽 인수를 ravels.
1⊥
하는 대신 모나드의 +/
또는+⌿
작업 : 목록 L과 인덱스 N의 목록이 주어지면 N 번째 목록의 합계를 세 번 반환하십시오. 예 L←(3 1 4)(2 7)
하고 N←1
있습니다 24
.
dfn 솔루션이있을 수도 N{3×+/⍺⊃⍵}L
있지만 암묵적으로 처리하여 솔루션 을 줄이려고합니다. N(3×+/⊃)L
기차 형성 규칙이 이것을 파싱 3(× +/ ⊃)
하지만 원하는 대로 작동하지 않습니다 3 × (+/⊃)
.
단항 (base-1)으로 숫자 목록을 평가하는 것은 ∑ { a , b , c , d } = a + b + c + d = ( a × 1³) + ( b × 1² 이므로리스트를 합산하는 것과 같습니다. ) + ( c × 1¹) + ( d × 1⁰). 따라서 +/a b c d
와 동일하며 1⊥a b c d
열차를 다음과 같이 작성할 수 있습니다 3×1⊥⊃
.
순위가 높은 인수에서는와 1⊥
같습니다 +⌿
.
f.g
대신 사용f/g
작업 : 목록 L 및 개수 N이 주어 철저한 1 L의 요소 NEG로 나누어 최소 분할 나머지 숫자 범위 복귀 L←31 41 59
및 N←7
범에게 1 2 3
.
dfn 솔루션이있을 수도 N{⍳⌊/⍺|⍵}L
있지만 암묵적으로 처리하여 솔루션 을 줄이려고합니다. N(⍳⌊/|)L
기차 형성 규칙이 이것을 파싱 ⍳ (⌊/) |
하지만 원하는 대로 작동하지 않습니다 ⍳ (⌊/|)
.
A f.g B
인수가 스칼라 및 / 또는 벡터 일 때 스칼라 두 함수 의 내부 곱은 f/ A g B
둘 다 (A[1] g B[1]) f (A[2] g B[2]) f (A[3] g B[3])
등 이기 때문에 동일 하므로 기차를로 작성할 수 있습니다 ⍳⌊.|
.
상위 어레이에서는 작동하지 않습니다.
∊⊆
대신 사용/
작업 : 목록 L과 숫자 N이 주어지면 N보다 큰 숫자 만 남도록 목록을 필터링하십시오. 예 L←3 1 4
하고 N←1
있습니다 3 4
.
dfn 솔루션이있을 수도 N{(⍺<⍵)/⍵}L
있지만 암묵적으로 처리하여 솔루션 을 줄이려고합니다. N(</⊢)L
바인딩 규칙이이를 구문 분석 할 것이기 때문에 작동하지 (</) ⊢
않지만 연산자 reduce 대신 /
함수 복제 가 되려고합니다 .
⊆
왼쪽 부울 인수가있는 Dyadic 은 왼쪽 인수에서 1의 실행에 따라 오른쪽 인수를 분할하고 0으로 표시된 요소를 삭제합니다. 이것은 우리가 원하는 것입니다. 원치 않는 파티셔닝을 절약하십시오. 그러나 monadic을 적용하여 분할을 제거 할 수 있습니다 ∊
. 따라서 {(⍺<⍵)/⍵}
될 수 {∊(⍺<⍵)⊆⍵}
있으므로 우리는 우리의 기차를 쓸 수 있습니다 ∊<⊆⊢
.
상위 어레이에서는 작동하지 않습니다.
0⊥
대신 ⊢/
또는 ⊢⌿
숫자 인수와 함께 사용작업은 : 다리의 오른쪽 요소 목록 L 및 숫자 N, 곱 N을 감안 L←3 1 4
하고 N←2
있습니다 8
.
dfn 솔루션이있을 수도 N{⍺×⊢/⍵}L
있지만 암묵적으로 처리하여 솔루션 을 줄이려고합니다. N(⊣×⊢/⊢)L
기차 형성 규칙이 이것을 파싱 ⊣ (× ⊢/ ⊢)
하지만 원하는 대로 작동하지 않습니다 ⊣ × (⊢/⊢)
.
관찰 0⊥
숫자 배열과 동일하다 ⊢⌿
우리가 우리 기차를 작성할 수 있도록 ⊣×0⊥⊢
.
이것은 상위 배열의 마지막 주요 셀을 선택합니다.
간과되어 종종 격자, 미로, 도형 또는 기하학을 다루는 표현을 단축 할 수있는 훌륭한 기회를 제공합니다.
0j1⊥¨ 0j1⊥ ⍝ pair(s) of reals -> complex
11 9∘○¨ 11 9○ ⍝ complex -> pair(s) of reals
|z0-z1 ⍝ distance between two points
0j1×z 0j¯1×z ⍝ rotate by ±90° around (0,0)
0j1*⍳4 ⍝ the four cardinal directions
+z -+z ⍝ reflect across x or y axis
+\0,z ⍝ sequence of steps -> path
2-/z ⍝ path -> sequence of steps
0j1⊥¨n-⍳2⍴1+2×n ⍝ lattice centred on (0,0)
=⍨
그리고 ≠⍨
ngn 덕분에.
때로는 목록의 각 요소에 대해 단일 값이 필요합니다. 을 사용 {value}¨
하고 싶을 수도 있지만 사용 하는 것이 더 짧지 value⊣¨
만 일반적인 값의 경우 더 짧아 질 수 있습니다 (을 사용하여 ⎕IO←0
).
¯1
와 함께 ⍬⍸list
0
와 함께 ⍬⍳list
1
와 함께 ⍬⍷list
이들은 목록에서만 작동합니다 (중첩 될 수도 있음). 상위 배열의 경우 다음을 사용하여 모든 0과 1을 얻을 수 있습니다.
1
와 함께 =⍨
0
와 함께 ≠⍨
을 설정하면 다음 ⎕ML←0
과 같이 모든 숫자를 0으로 만들 수 있습니다 0×
.
∊
당신은 단지 하나의 번호가 필요하면 모나드 사용할 수 있습니다 ≡
사용하는 대신 1 또는 0을 얻기 위해 1⊣
또는 0⊣
.
⊣\
⊣
와 ⊢
함께 /
하고 ⌿
자신의 게시물 장점.
⍨
⍨
(통근)은 괄호를 피함으로써 바이트를 절약 할 수 있습니다. 왼쪽 인수를 괄호로 묶어야하고 오른쪽 인수는 그렇지 않은 함수가있을 때마다 바이트를 저장할 수 있습니다 (예 : (A<B)÷C
→) C÷⍨A<B
.
끝 사용에 배열의 복사본을 추가하려면 ,⍨A
나 ⍪⍨A
.
2∘×
두 배로 사용 하는 대신 +⍨
인수를 추가 하기 때문에 사용할 수 있습니다 . 1+2∘×
→ 1++⍨
.
2*⍨Y
제곱 을 사용 하는 대신 ×⍨Y
인수 자체를 곱하기 때문에 사용할 수 있습니다 . 2*⍨A+B
→ ×⍨A+B
.
?⍨N
길이의 임의 순열을 제공합니다 N
.
다음과 같이 각 주요 셀의 첫 항목 색인을 찾습니다. ⍳⍨A
에 사용할 수 +/∧\⌽B
있는 후행 1 수를 세는 대신을 N
사용할 수 있습니다 ⊥⍨
.
A f∘g B
입니다 A f g B
.하지만 원하는 경우를 (g A) f B
사용하십시오 f⍨∘g⍨
.
f/ a1 a2 a3
입니다 a1 f (a2 f a3)
. 원하는 경우을 (a1 f a2) f a3
사용하십시오 f⍨/⌽
.
f\ A B C
입니다
A (A f B) (A f (B f C))
.
f⍨/∘⌽¨,\ A B C
입니다
A (A f B) ((A f B) f C)
.
f⍨\⌽ A B C
입니다
((A f B) f C) (B f C) C
.
⌽f/∘⌽¨,\⌽ A B C
. 입니다
(A f (B f C)) (B f C) C
.
⍳≢
작업 : 두 개의 문자열 S와 T가 주어지면 연결 지수를 나열합니다. 예 S←'abcd'
하고 T←'xyz'
있습니다 1 2 3 4 5 6 7
.
dfn 솔루션이있을 수도 S{⍳≢⍺,⍵}T
있지만 암묵적으로 처리하여 솔루션 을 줄이려고합니다. ⍳≢,
열차 파싱 규칙이이를 분석 (⍳)≢(,)
하지만 원하는 대로 작동하지 않습니다 (⍳≢),
.
⍋
빈 왼쪽 인수가있는 Dyadic 는 현재 순서에 따라 간단한 문자 배열을 등급 화합니다 ⍳≢
. 따라서 {⍳≢⍺,⍵}
될 수있는 {⍬⍋⍺,⍵}
우리가 우리 기차를 작성할 수 있도록 ⍬⍋,
.
숫자 형 배열이나 혼합형 배열에서는 작동하지 않습니다.