2016-03-20 2 views
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" } 
{ } 

Неа, котировка не выполняется для каждого элемента ,

Я уверен, что есть очевидный ответ или комбинатор и цитата, которые делают это эффективно. Что это?

ответ

1

Здесь вам нужно закрыть. В цитате, которая выполняется для каждого элемента, нужно посмотреть на значение, отличное от самого элемента. Удобный синтаксис для записи замыканий реализуется с использованием fried quotations.

например:

{ "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?.

+0

Aha! Спасибо! – cat

+0

Так 'in?' Для 'set' и 'member?' Для 'seq'uences. '{Array}' является последовательностью, правильно? Итак, есть ли причина использовать 'in?' Over 'member?'? – cat

+1

'in?' - это несколько символов короче, чем 'member?'. Для последовательностей они делают то же самое. Причина в том, что есть два варианта, вероятно, наследие. –