Husk에서의 골프 팁


15

Husk 는 PPCG 사용자 LeoZgarb가 만든 새로운 골프 언어 입니다. Jelly 및 05AB1E와 같이 매우 간결한 언어를 유지하거나 더 자주 경쟁하거나 점점 더 경쟁이 치열 해지기 시작했습니다.

Husk에 특정한 골프 기술 중 일부를 나열 해 봅시다. 항상 그렇듯이 답변 당 하나의 팁을 게시하십시오.



1
@totallyhuman 첫 번째 허 스크 답변 여전히 새로운 것은 아닙니다
H.PWiz

답변:


10

술어의 리턴 값 사용

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


7

넘친 라인 레이블 사용

아시다시피, [₀-₉]+|[₀-₉]구문은 현재 존재하는 것과 다른 회선을 호출하는 정규식입니다.

이 팁은 특정 행에 정의 된 함수를 아래 표에있는 둘 이상의 함수에 대한 인수 또는 아래에있는 하나 이상의 함수에 대한 인수로 호출하려는 경우에 특히 유용합니다.

기능 테이블 :

+----------+----------+
|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 인덱스에 오류가 발생한다.


5

람다는 새로운 기능보다 짧을 수 있습니다

여러 줄의 프로그램이 있는지 아는 것처럼 첨자가있는 줄을 참조 할 수 있습니다 ( ₀…₉예 :

f
g

기능을 참조합니다 g. 이제 항상 입력을 함수에 적용하고 g여러 번 사용하면됩니다. 이 같은:

f₁⁰[...]g₁⁰[...]
h

추가 사용마다 1 바이트를 절약하기 때문에 람다를 소개해야합니다.

λf⁰[...]g⁰[...])h

반대의 경우도 마찬가지입니다

자체 참조 람다 ( φχψ)의 경우 입력을 재귀 함수에 직접 적용하는 특수한 경우가 있습니다.이 경우 새 람다를 정의하는 대신 아래 첨자 를 사용하고을 사용하는 것이 좋습니다 .


5

사용 Γ

리스트 또는 리스트 디스 트럭 션 에서 패턴 매칭으로Γ 알려진 내장의 주요 용도는 리스트를 헤드와 테일로 나누고 이진 함수를 적용하는 것입니다. 이것은 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

세 번째 과부하는 조금 더 복잡합니다. 마찬가지로 listaf함수 g를 가져 와서 목록을 취하는 새 함수 를 반환 합니다. 그러나 이번에 f는 추가 함수 인수 g가 필요하며 입력 목록의 꼬리를 포함하여 모든 값에서 호출 할 수 있습니다. 이것은 목록에 listF일반적인 재귀 체계 를 구현 한다는 것을 의미 합니다. /를 listF사용한 명시 적 재귀 는 일반적 으로이 대답 과 동일하거나 길이가 짧기 때문에 자주 사용되지 않습니다 .listlistN

listNF

listNF하는 것입니다 listF무엇 listN에있다 list입력이 : a생략하고, 반환 형식의 기본 값이 대신 사용됩니다. 드문 경우이긴하지만, 예를 들어이 답변같이 오른쪽 접기보다 짧을 수 있습니다 .

의 재귀 버전의 예로 Γ,이 함수 Γλ·:o⁰↔는 목록을 순서대로 순서대로 순서대로 섞습니다. 온라인으로 사용해보십시오! 함수 f는 명시적인 lambda λ·:o⁰↔이며, 인수 는 전체 함수입니다. 으로 f꼬리를 뒤집은 다음으로 주 함수를 재귀 적으로 호출 o⁰하고 마지막으로 머리를 다시 붙입니다 ·:. 물론 Γ·:o₀↔바이트는 짧지 만 행에이 함수 이외의 것이 포함되어 있으면 작동하지 않습니다.


3

조합기는 고차 기능에 적용 가능

정수 X 목록이 있고 length (X) 보다 큰 X 의 총 요소 수를 계산하려고 한다고 가정하십시오 . 술어를 만족시키는 계수 요소는 고차 함수를 사용하여 수행 되지만 여기서 술어 ( length (X) 보다 큼 )는 X에 따라 다릅니다 . 용액은 적용하는 연결자 에 상기 기능 체크가리스트 개수보다 짧은 것을인지한다. 함수 에서 목록 X 가 전달되고 부분적으로 적용된 함수가 전달 되며 X 가 두 번째 인수로 제공됩니다.##o>LṠ#o>Lo>L##

일반적으로 α고차 함수 인 β경우 이진 함수 및 γ단항 함수 Ṡαβ는 Haskell 의사 코드와 같습니다.

\x -> α (\y -> β x y) x

§αβγ 에 해당

\x -> α (\y -> β x y) (γ x)

~αβγ동등

\x y -> α (\z -> β x z) (γ y)

유형이 일치하는 한.

다른 구체 예로서, §►δṁ≠P목록의 순열 발견 X 의 값에 대응하는 절대 차들의 합을 최대화 X를 ( δṁ≠절대 차를 이용하여 두 개의리스트를 참아 및 합계 소요).


3

껍질의 기본값

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)가 실패한 경우
  • 첫 번째 / 마지막 요소 가져 오기 ( ←→) 또는 하나의 색인 생성 ( !)
  • Γ빈 목록의 패턴 일치 ( )
  • 빈 목록 사용 또는 사용
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.