Palindrome pairs
Given a list of unique words, find all pairs of distinct indices (i, j) in the given list, so that the concatenation of the two words, i.e. words[i] + words[j] is a palindrome.
Input: ["abcd","dcba","lls","s","sssll"]
Output:
(abcd,dcba)
(dcba,abcd)
(s,lls)
(lls,sssll)
Perl 6
<lang perl6>my @words = <abcd dcba lls s sssll Nod don't>; #'
sub is-palindrome (Str $s) { $_ eq .flip given $s.lc.comb(/\w/).join }
for @words.combinations(2) {
say "({.join: ','})" if .join.&is-palindrome; say "({.reverse.join: ','})" if .reverse.join.&is-palindrome;
}</lang>
- Output:
(abcd,dcba) (dcba,abcd) (s,lls) (lls,sssll) (don't,Nod)
Ring
<lang ring>
- Project : Palindrome pairs
- Date : 2018/07/27
- Author : Gal Zsolt (~ CalmoSoft ~)
- Email : <calmosoft@gmail.com>
load "stdlib.ring" pairs = ["abcd","dcba","lls","s","sssll"] for n = 1 to len(pairs)-1
for m = n + 1 to len(pairs) pal1 = pairs[n] + pairs[m] pal2 = pairs[m] + pairs[n] if palindrome(pal1) see "(" + pairs[n] + "," + pairs[m] + ")" + nl ok if palindrome(pal2) see "(" + pairs[m] + "," + pairs[n] + ")" + nl ok next
next </lang> Output:
(abcd,dcba) (dcba,abcd) (s,lls) (lls,sssll)
Sidef
<lang ruby>func find_palindromes(arr, callback) {
arr.len.variations(2, {|i,j| var w = (arr[i]+arr[j]).fc.gsub(/\W+/) callback(i, j) if (w == w.flip) })
}
var t = [
"abcd","dcba","lls","s","sssll", "Mr. Owl ate","or a cat I saw?", " my metal worm","Was it a car ",
]
find_palindromes(t, {|i,j|
say "(#{i}, #{j}) = (#{t[i].dump}, #{t[j].dump})"
})</lang>
- Output:
(0, 1) = ("abcd", "dcba") (1, 0) = ("dcba", "abcd") (2, 4) = ("lls", "sssll") (3, 2) = ("s", "lls") (5, 7) = ("Mr. Owl ate", " my metal worm") (8, 6) = ("Was it a car ", "or a cat I saw?")
zkl
<lang zkl>fcn palindromePairs(strs){
strs=Utils.Helpers.pickNFrom(2,strs); strs.extend(strs.apply("reverse")).filter( fcn(anb){ // ("s","lls")
ab:=anb.concat(); ab==ab.reverse()
})
}</lang> <lang zkl>palindromePairs(T("abcd","dcba","lls","s","sssll")) .concat("\n").println();</lang>
- Output:
L("abcd","dcba") L("lls","sssll") L("dcba","abcd") L("s","lls")
Or, if we want to really stretch the meaning of palindrome, make the following one line change: <lang zkl>fcn palindromePairs(strs){
strs=Utils.Helpers.pickNFrom(2,strs); strs.extend(strs.apply("reverse")).filter( fcn(anb){ // ("s","lls")
ab:=anb.apply(fcn(s){ s.filter("[a-zA-Z]".glob).toLower() }).concat(); ab==ab.reverse()
})
}</lang> <lang zkl>palindromePairs(T("abcd","dcba","lls","s","sssll",
"Mr. Owl ate","or a cat I saw?", " my metal worm","Was it a car ",))
.concat("\n").println();</lang>
- Output:
L("abcd","dcba") L("lls","sssll") L("Mr. Owl ate"," my metal worm") L("dcba","abcd") L("s","lls") L("Was it a car ","or a cat I saw?")