조건을 피하십시오
K는 :[
Lisp 스타일과 동등한 조건부 구문 ( )을 갖습니다 cond
.
:[cond1;result1; cond2;result2; cond3;result3; default]
원하는만큼 조건을 가질 수 있으며, 일치하는 것이 없으면 기본값이 반환됩니다.
때때로 (재귀 적 프로그램이나 다른 일련의 부작용에 의존하는 프로그램에서와 같이), 이들 중 하나를 사용하지 않아도됩니다. 그러나 약간의 추가 작업을 수행 할 수있는 상황에서는 종종 "cond"를 목록 인덱싱으로 바꿀 수 있습니다.
악명 높은 피즈 버즈 프로그램을 고려하십시오 . 일반적인 명령형 프로그래밍 스타일로 작성하면 다음과 같이 할 수 있습니다.
{:[~x!15;"FizzBuzz";~x!3;"Fizz";~x!5;"Buzz";x]}'1+!100
분할 성 테스트에는 약간의 반복이 있습니다. 다른 접근법은 4 가지 경우 (수, 3으로 나눌 수 있음, 5로 나눌 수 있음, 3 및 5로 나눌 수 있음)를 인식하고 다음 사례 중 하나를 목록에서 선택하는 인덱스를 직접 계산하려고 시도합니다.
{(x;"Fizz";"Buzz";"FizzBuzz")@+/1 2*~x!/:3 5}'1+!100
두 글자가 짧고 언어를 더 잘 사용합니다. 목록 리터럴이 오른쪽에서 왼쪽으로 평가된다는 것을 알면 재사용되는 하위 표현식을 결합 할 수있는 추가 골프 기회도 얻게됩니다. 선택하지 않으면 문자열 케이스가 전혀 평가되지 않으므로 cond 기반 버전에서는이 작업을 쉽게 수행 할 수 없었습니다.
{(x;4#t;4_ t;t:"FizzBuzz")@+/1 2*~x!/:3 5}'1+!100
이제 전체적으로 5자를 저장했습니다. 덧붙여서,이 특정 예제는 k5에서 훨씬 더 잘 작동합니다. 왜냐하면 우리는 /
계수와 합산 벡터를 곱하는 단계를 처리하기 위해 "팩"과부하가 있기 때문입니다 .
{(x;4_t;4#t;t:"FizzBuzz")@2 2/~3 5!\:x}'1+!100
또한 ?
항목을 찾을 수없는 경우 키 목록 끝을지나 색인을 생성하는 "find"( ) 의 동작은 이러한 종류의 색인에서 "기본"사례 처리를 지원하도록 특별히 설계되었습니다. 모음을 대문자로 변환하려면이 조각을 고려하십시오.
{("AEIOU",x)"aeiou"?x}'
다음 중 하나와 비교하십시오.
{t:"aeiou"?x;:[t<5;"AEIOU"t;x]}'
{:[~4<t:"aeiou"?x;"AEIOU"t;x]}'
(나도 어느 쪽을 읽을 것인지 안다!)