in reply to Unique List of Common Characters Between Two Strings
Let's bloat it up with the ultra-cool Quantum::Superpositions. Performing a comparision using all( any( list1 ), any( list2 ) ) returns a quantum superposition of the two lists, as a wierd sort of scalar. Take that scalar's eigenstate and you end up with a bare unique list of characters found only in both lists.
use strict; use warnings; use Quantum::Superpositions; my ($str1, $str2) = @ARGV; die "Usage: $0 <string1> <string2>" if ! defined $str2; print In_Common($str1, $str2), "\n"; sub In_Common { my ($str1, $str2) = @_; return join '', eigenstates( all( any( split( //, $str1 ) ), any( split( //, $str2 ) ) ) ); }
Of course this module is mostly a proof of concept, but it's a pretty cool concept.
By the way, I was just considering how one might modify the code to allow for any number of strings on the commandline. For example: ("abc", "bcd", "cde") would result in the output of "c". Or ("abcd", "bcde", "cdef", "defg") would output "d". I thought of a few strategies, but they all feel inelegant
Update: Ah, I got it. ...Here's a version of the preceeding script that allows for any number of strings on the command line:
use strict; use warnings; use Quantum::Superpositions; print In_Common( @ARGV ), "\n"; sub In_Common { return join '', eigenstates( all( map { any( split( //, $_ ) ) } @_ ) ); }
With this script, ("abcd", "bcde", "cdef", "defg") would return "d".
Dave
|
---|