[翻譯]K-99問題解答

lt發表於2016-07-07

原文地址
語言參考
問題1:找出列表的最後1個元素
示例

last "abcdef"  
"f"

解法

last : *|:           / 反轉, 取第1個元素
last2: {x@-1+#x}     / 索引下標為長度-1的元素
last3: {:[1=#x;x;_f 1_ x]} /迴圈,如果x的長度=1,則返回x,否則返回x去掉第一個元素後的子列表(原文沒有,自己猜的)
last4: {-1#x}        / 從尾部取1個元素

注意:這個函式的引數是列表,而不管列表中的元素是什麼型別,字元列表、數字列表,列表列表都適用.

last "abcd"
"d"
last 1 3 5 7
7
last (1 2); (3 4); (5 8)
5 8

問題2:找出列表的倒數第2個元素
示例

butlast "abcdef"
"e"

解法

butlast : {(|x)@1}  / 反轉, 取索引下標為1的元素
butlast2: {x@-2+#x}  / 索引下標為長度-2的元素
butlast3: {:[2=#x;*x;_f 1_ x]}  /迴圈,如果x的長度=2,則返回x第1個元素,否則返回x去掉第一個元素後的子列表
butlast4: *-2!  / 把位於尾部2位的移到前面,後邊接上前面的所有元素,然後取第1個元素(原文沒有,自己猜的)

問題3:獲取列表的第n個元素
示例

elementat["abcdef";3]
"c"

解法

elementat : {x@y-1}  /x列表的索引下標為y-1的元素
elementat2: {*(y-1)(1_)/x}  /對x迴圈應用y-1次去掉第一個元素操作,然後取第一個元素
elementat3: {:[y=1;*x;_f[1_ x;y-1]]} /迴圈,如果要求第一個元素,則返回x的第一個元素,否則遞迴執行本函式,引數x變為列表去掉第一個元素後的子列表,y變為y-1

問題4:獲取列表的元素個數

示例

  length 1 2 3 4
4

解法

length : #: /#是K求列表長度的運算子
length2: {+/*:'1,'x} /**還沒看懂

問題5:反轉列表的元素

示例

  reverse "abcdef"
"fedcba"

解法

reverse : |: /|是K反轉列表的元素的運算子
reverse2: {x@(-1+l)-!l:#x} /把x的長度賦給l,!l產生從0到l-1的列表,依次取x的索引為l-1、l-2 ..0的元素
reverse3: {:[1=#x;x;_f[1_ x],*x]} /迴圈,如果元素個數不為1,遞迴執行本函式後面跟著第1個元素,引數x變為列表去掉第一個元素後的子列表,否則返回x的第一個元素

相關文章