1

我有一个数组:

{ "abc" "def" "cba" "fed" "junk" } 

我想检查数组中的每个项目是否具有其反转版本作为同一数组中的成员。

在 Python 中,我将其表示为:

>>> array = ["abc", "def", "cba", "fed", "junk"]
>>> [item for item in array if item[::-1] in array] # [::-1] reverses a string
['abc', 'def', 'cba', 'fed']

甚至:

>>> list(filter(lambda x: x[::-1] in array, array))
['abc', 'def', 'cba', 'fed']    

我试过了:

IN: scratchpad dup [ dup reverse swap member? ] filter

--- Data stack:
{ "abc" "def" "cba" "fed" "junk" }
{  }

不,每个项目的报价都失败了。

我确信有一个明显的答案,或者一个组合器和引用可以有效地做到这一点。它是什么?

4

1 回答 1

2

在这里你需要一个闭包。在每个元素上运行的引用需要查看元素本身以外的值。使用油炸引号实现了编写闭包的便捷语法。

例如:

{ "abc" "def" "cba" "fed" "junk" } dup '[ reverse _ in? ] map

您将“外部”堆栈中的值绑定到_“内部”的位置。with您可以使用或使用curry更低级别的单词来构造和运行等效闭包:

{ "abc" "def" "cba" "fed" "junk" } dup [ reverse swap in? ] with map

然后添加all?以检查所有值是否满足谓词:

{ "abc" "def" "cba" "fed" "junk" } dup '[ reverse _ in? ] all?

USE: sets加载in?单词。

于 2016-03-22T17:46:24.643 回答