Palindrome pairs

Revision as of 02:44, 28 July 2018 by Chunes (talk | contribs) (added Factor)

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)

Palindrome pairs is a draft programming task. It is not yet considered ready to be promoted as a complete task, for reasons that should be found in its talk page.

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>

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>

  1. Project : Palindrome pairs
  2. Date  : 2018/07/27
  3. Author : Gal Zsolt (~ CalmoSoft ~)
  4. 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?")