Husk 는 PPCG 사용자 Leo 와 Zgarb가 만든 새로운 골프 언어 입니다. Jelly 및 05AB1E와 같이 매우 간결한 언어를 유지하거나 더 자주 경쟁하거나 점점 더 경쟁이 치열 해지기 시작했습니다.
Husk에 특정한 골프 기술 중 일부를 나열 해 봅시다. 항상 그렇듯이 답변 당 하나의 팁을 게시하십시오.
Husk 는 PPCG 사용자 Leo 와 Zgarb가 만든 새로운 골프 언어 입니다. Jelly 및 05AB1E와 같이 매우 간결한 언어를 유지하거나 더 자주 경쟁하거나 점점 더 경쟁이 치열 해지기 시작했습니다.
Husk에 특정한 골프 기술 중 일부를 나열 해 봅시다. 항상 그렇듯이 답변 당 하나의 팁을 게시하십시오.
답변:
Husk에서 일부 속성에 대한 입력을 테스트하는 함수는 일반적으로 양의 정수가 진실이기 때문에 사실적인 경우 의미있는 결과를 반환합니다.
예 :
≠ Numbers: Absolute difference
Chars: Absolute difference of code points
Lists: First Index where the differ
Comparisons <, >, ≤, ≥:
For strict comparisons:
Numbers,Chars: max 0 (the appropriate difference¹)
Lists: The first index where the comparison between the two lists is true
For non-strict comparisons:
Numbers,Chars: max 0 (the appropriate difference + 1)
Lists: Either the result of the strict comparison or, if they are equal,
the length of the list + 1
ṗ Index into the list of prime numbers
V The index of the first element for which the condition is true
€ The first index of that element/substring in the list
£ Works like €
& Given two arguments of the same type will return the second argument if false,
otherwise will return the first argument
| Given two arguments of the same type will return the second argument if true,
otherwise will return the first argument
¦ Return the quotient if divisibility holds
Λ,E,Ë Will all return length+1 in truthy cases
Char predicates:
□,±,√,D,½ will each return the codepoint of its argument on truthy cases
¹ 적절한 차이 는 문자의 코드 포인트 차이를 의미합니다. 또한 인수 순서를 나타냅니다. 즉 <x y
,x-y
아시다시피, [₀-₉]+|[₀-₉]
구문은 현재 존재하는 것과 다른 회선을 호출하는 정규식입니다.
이 팁은 특정 행에 정의 된 함수를 아래 표에있는 둘 이상의 함수에 대한 인수 또는 아래에있는 하나 이상의 함수에 대한 인수로 호출하려는 경우에 특히 유용합니다.
기능 테이블 :
+----------+----------+
|Index |Function |
+----------+----------+
|1 |´ (argdup)|
+----------+----------+
|2 |` (flip) |
+----------+----------+
|3 |m (map) |
+----------+----------+
|4 |z (zip) |
+----------+----------+
|5 |S (hook) |
+----------+----------+
코드의 줄에는 위에서 아래로 각각 0부터 시작하는 인덱스가 표시됩니다. 경우 M <N , M은 레이블이고, N은 코드의 줄 수는, 라벨은 라인에 정의 된 함수를 나타내는 M을 . 경우 N ≤ M <N * 6은 , 그 인덱스에서 테이블 위에 함수 나타내는 ⌊M ÷ N⌋ 행에서 정의 된 함수 M 개조 N 첫번째 인수로한다. 경우 N * 6 ≤ M 인덱스에 오류가 발생한다.
여러 줄의 프로그램이 있는지 아는 것처럼 첨자가있는 줄을 참조 할 수 있습니다 ( ₀…₉
예 :
f
g
₁
기능을 참조합니다 g
. 이제 항상 입력을 함수에 적용하고 g
여러 번 사용하면됩니다. 이 같은:
f₁⁰[...]g₁⁰[...]
h
추가 사용마다 1 바이트를 절약하기 때문에 람다를 소개해야합니다.
λf⁰[...]g⁰[...])h
자체 참조 람다 ( φχψ
)의 경우 입력을 재귀 함수에 직접 적용하는 특수한 경우가 있습니다.이 경우 ₀
새 람다를 정의하는 대신 아래 첨자 를 사용하고을 사용하는 것이 좋습니다 ⁰
.
Γ
리스트 또는 리스트 디스 트럭 션 에서 패턴 매칭으로Γ
알려진 내장의 주요 용도는 리스트를 헤드와 테일로 나누고 이진 함수를 적용하는 것입니다. 이것은 Haskell 패턴 일치 관용구에 해당합니다.
f (x : xs) = <something>
f [] = <something else>
여기서 <something>
함유 표현 x
, xs
및 가능 f
. 의 오버로드는 4 가지 Γ
이며 각각 약간 다르게 작동합니다.
list
첫 번째 오버로드 list
는 값 a
과 이진 함수를 사용 f
합니다. 리스트를 가져 오는 새로운 함수를 리턴하고 a
비어 있으면 리턴 f
하고 비어 있지 않은 경우 헤드와 테일을 호출 합니다. 예를 들어, Γ_1€
목록을 가져 와서 -1
비어 있으면 반환 하고, 그렇지 않으면 꼬리에 첫 번째 요소가 처음 나타나는 인덱스를 반환 합니다.
listN
제 과부하가 listN
유사하다 list
그 이외에는, a
생략 및 리턴 유형 디폴트 값 대신에 이용된다. 예를 들어, Γ€
에 해당 Γ0€
기본 숫자 값이기 때문에 0
.
실제로 기본값은 관련이 없거나 정확히 필요한 값이기 때문에 listN
보다 자주 사용됩니다 list
. 일반적인 패턴은 다음 Γ~αβγ
과 αβγ
같습니다. 이것은 β
첫 번째 요소와 γ
꼬리에 적용 되며 결과를와 결합합니다 α
. 예를 들어이 답변 에 사용되었습니다 . 다른 패턴은 첫 번째 요소에만 Γo:α
적용 α
하고 첫 번째 요소를 제외한 모든 요소 Γ·:mα
에 적용 α
하기 위한 것입니다. 후자는 이 답변 에 사용되었습니다 .
listF
세 번째 과부하는 조금 더 복잡합니다. 마찬가지로 list
값 a
과 f
함수 g
를 가져 와서 목록을 취하는 새 함수 를 반환 합니다. 그러나 이번에 f
는 추가 함수 인수 g
가 필요하며 입력 목록의 꼬리를 포함하여 모든 값에서 호출 할 수 있습니다. 이것은 목록에 listF
일반적인 재귀 체계 를 구현 한다는 것을 의미 합니다.
/를 listF
사용한 명시 적 재귀 는 일반적 으로이 대답 과 동일하거나 길이가 짧기 때문에 자주 사용되지 않습니다 .list
listN
listNF
listNF
하는 것입니다 listF
무엇 listN
에있다 list
입력이 : a
생략하고, 반환 형식의 기본 값이 대신 사용됩니다. 드문 경우이긴하지만, 예를 들어이 답변 과 같이 오른쪽 접기보다 짧을 수 있습니다 .
의 재귀 버전의 예로 Γ
,이 함수 Γλ·:o⁰↔
는 목록을 순서대로 순서대로 순서대로 섞습니다.
온라인으로 사용해보십시오!
함수 f
는 명시적인 lambda λ·:o⁰↔
이며, 인수 ⁰
는 전체 함수입니다. 으로 f
꼬리를 뒤집은 ↔
다음으로 주 함수를 재귀 적으로 호출 o⁰
하고 마지막으로 머리를 다시 붙입니다 ·:
. 물론 Γ·:o₀↔
바이트는 짧지 만 행에이 함수 이외의 것이 포함되어 있으면 작동하지 않습니다.
정수 X 목록이 있고 length (X) 보다 큰 X 의 총 요소 수를 계산하려고 한다고 가정하십시오 . 술어를 만족시키는 계수 요소는 고차 함수를 사용하여 수행 되지만 여기서 술어 ( length (X) 보다 큼 )는 X에 따라 다릅니다 . 용액은 적용하는 연결자 에 상기 기능 체크가리스트 개수보다 짧은 것을인지한다. 함수 에서 목록 X 가 전달되고 부분적으로 적용된 함수가 전달 되며 X 가 두 번째 인수로 제공됩니다.#
Ṡ
#
o>L
Ṡ#o>L
o>L
#
#
일반적으로 α
고차 함수 인 β
경우 이진 함수 및 γ
단항 함수 Ṡαβ
는 Haskell 의사 코드와 같습니다.
\x -> α (\y -> β x y) x
§αβγ
에 해당
\x -> α (\y -> β x y) (γ x)
및 ~αβγ
동등
\x y -> α (\z -> β x z) (γ y)
유형이 일치하는 한.
다른 구체 예로서, §►δṁ≠P
목록의 순열 발견 X 의 값에 대응하는 절대 차들의 합을 최대화 X를 ( δṁ≠
절대 차를 이용하여 두 개의리스트를 참아 및 합계 소요).
Husk는 Haskell만큼 엄격하지 않으므로 last
빈 목록 의 요소 를 가져올 때 문제가 발생 합니다. 이를 위해 사전 정의 된 값을 사용합니다. 기본값은 maxima 및 minima입니다.
.------------------------------------.---------------.----------.-------.
| Type (X and Y are placeholders) | default (def) | max | min |
|------------------------------------|---------------|----------|-------|
| Character (C) | ' ' | \1114111 | \NUL |
| Numbers (N) | 0 | Inf | -Inf |
| List of X (LX) | [] | ∞ max | [] | *
| Function :: X -> Y | const (def Y) | n/a | n/a |
'------------------------------------'---------------'----------'-------'
* 여기서 ∞는 해당 최대 값의 무한 목록을 나타내야합니다 (예는 아래 참조).
참고 : 튜플 (X, Y)의 경우 각 구성 요소의 값을 개별적으로 사용합니다.
최대 값과 최소값은 ▲▼
빈 목록 에만 사용되지만 (예 husk -u "▼" "[]:LLN"
: 무한 목록 반환 Inf
) 기본값은 몇 군데에 사용됩니다.
F
및 Ḟ
)Θ
)r
)가 실패한 경우←→
) 또는 하나의 색인 생성 ( !
)Γ
빈 목록의 패턴 일치 ( )►
또는 사용◄