条件付きを避ける
Kには、:[
Lispスタイルと同等の条件付き構文()がありますcond
。
:[cond1;result1; cond2;result2; cond3;result3; default]
必要な数の条件を設定できますが、一致するものがない場合はデフォルト値が返されます。
場合によっては(再帰プログラムや副作用のシーケンスに依存するプログラムのように)、これらのいずれかを使用して回避することはできません。ただし、少し余分な作業を行う余裕がある状況では、「cond」をリストのインデックス付けに置き換えることができます。
悪名高いfizzbuzzプログラムについて考えてみましょう。従来の命令型プログラミングスタイルで記述された場合、次のようになります。
{:[~x!15;"FizzBuzz";~x!3;"Fizz";~x!5;"Buzz";x]}'1+!100
分割可能性テストでは、ここでかなりの繰り返しがあります。別のアプローチでは、4つのケース(数、3による可分性、5による可分性、3および5による可分性)が存在することを認識し、これらのケースの1つをリストから選択するインデックスを直接計算しようとします。
{(x;"Fizz";"Buzz";"FizzBuzz")@+/1 2*~x!/:3 5}'1+!100
2文字が短くなり、言語がより適切に使用されます。リストリテラルが右から左に評価されることを知っていると、再利用された部分式を結合するための追加のゴルフの機会も得られます。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]}'
(私はどちらを読みたいかを知っています!)