Palindrome pairs: Difference between revisions

Same wording appears on leetcode.
(added Factor)
(Same wording appears on leetcode.)
 
Line 1:
Task deleted pending original task writer giving some indication that the same task on leetcode and here have no plagiarism issues.
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.
<br>
Input: ["abcd","dcba","lls","s","sssll"]
<br>
Output:
<br>
(abcd,dcba)
<br>
(dcba,abcd)
<br>
(s,lls)
<br>
(lls,sssll)
<br>
{{draft task}}
 
=={{header|Factor}}==
<lang factor>USING: formatting kernel math.combinatorics qw sequences ;
IN: rosetta-code.palindrome-pairs
 
: palindrome? ( seq -- ? ) dup reverse = ;
 
qw{ abcd dcba lls s sssll } 2 [
dup reverse [
dup concat palindrome?
[ "," join "(%s)\n" printf ] [ drop ] if
] bi@
] each-combination</lang>
{{out}}
<pre>
(abcd,dcba)
(dcba,abcd)
(s,lls)
(lls,sssll)
</pre>
 
=={{header|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>
{{Out}}
<pre>(abcd,dcba)
(dcba,abcd)
(s,lls)
(lls,sssll)
(don't,Nod)</pre>
 
=={{header|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:
<pre>
(abcd,dcba)
(dcba,abcd)
(s,lls)
(lls,sssll)
</pre>
 
=={{header|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>
{{out}}
<pre>
(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?")
</pre>
 
=={{header|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>
{{out}}
<pre>
L("abcd","dcba")
L("lls","sssll")
L("dcba","abcd")
L("s","lls")
</pre>
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>
{{out}}
<pre>
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?")
</pre>
Anonymous user