如何使用翻转反转字符串中字符集的顺序?

How to reverse the order of sets of characters in a string using flip?

我想颠倒列表中每个元素的货币顺序,即 CADUSD 需要变成 USDCAD。

ccys:("CADUSD";"NZDUSD"; "USDAUD")
"" sv/:flip(-3,3)#'\:ccys 

以上就是这样做的。我读过 flip x returns x transposed 并且 # 是 take 运算符;但我无法清楚地理解 ' 和 flip(-3,3)# 是如何实现的。

你能帮我理解一下吗? 或者,有没有更简单的方法来做同样的事情?

因为 ccys 和 (-3 3) 的长度不同,您需要 each left 和 each both 将 3 和 -3 与 # 应用于 ccys 中的每个字符串而不是 ccys 本身。

// each left will apply -3 & 3 # to the entire ccys list
q)-3 3#\:ccys
"CADUSD" "NZDUSD" "USDAUD"
"CADUSD" "NZDUSD" "USDAUD"

// each both will then apply the -3 & 3 # to each nested string
q)(-3,3)#'\:ccys
"USD" "USD" "AUD"
"CAD" "NZD" "USD"

// flip then transposes the 2 by 3 matrix of strings 
// to a 3 by 2 matrix of strings
q)flip (-3,3)#'\:ccys
"USD" "CAD"
"USD" "NZD"
"AUD" "USD"

// this each right sv (scalar from vector) will merge each  
// ccy into a currency pair. sv basically combines a list of strings,
// seperated by the left argument which in this case is nothing / ""
"" sv/:

// I would more commonly use raze each for this part:
q)raze each flip -3 3#'\:ccys
"USDCAD"
"USDNZD"
"AUDUSD"

至于更简单的方法,由于字符串的长度都相同,而您只想交换前 3 个字符和后 3 个字符,您可以通过深度索引来实现:

q)ccys[;3 4 5 0 1 2]
"USDCAD"
"USDNZD"
"AUDUSD"

如果您知道所有货币都是 3 个字符,rotate 关键字也可以实现此目的:

q)3 rotate/:ccys
"USDCAD"
"USDNZD"
"AUDUSD"