     token = pOptions[:token]
     character = pOptions[:character]
     strip = pOptions[:strip]
+    original = pOptions[:original]
     pSetList
     |> Enum.map(&stringToSet(&1, token, character, strip))
-    |> Enum.reduce([], &CustomSet.symmetricDifference_DifferenceUnion/2)
+    |> Enum.reduce([], fn pSetA, pSetB -> symmetricDifference(pSetA, pSetB, original) end)
     |> Enum.sort
     |> Enum.each(&IO.puts/1)
   end
+
+  def symmetricDifference(pSetA, pSetB, true), do: CustomSet.symmetricDifference_IntersectionDifference(pSetA, pSetB)
+  def symmetricDifference(pSetA, pSetB, false), do: CustomSet.symmetricDifference_DifferenceUnion(pSetA, pSetB)
 
   def benchmark(pOptions) do
     range_max = pOptions[:max]

      token: ",",
      character: false,
      strip: false,
      benchmark: false,
      max: 1000000,
      count: 12,

    IO.puts("    -c          : operate on sets of characters instead of sets of strings")
    IO.puts("    --strip     : strip leading and trailing whitespace from set items")
    IO.puts("    -s          : strip leading and trailing whitespace from set items")
    IO.puts("    --original  : use original algorithm (subtract intersection from union) as opposed to faster algorith (union of differences)")
    IO.puts("    -o          : use original algorithm (subtract intersection from union) as opposed to faster algorith (union of differences)")
    IO.puts("    --benchmark : perform algorithm benchmark")
    IO.puts("    -b          : perform algorithm benchmark")
    IO.puts("    --max       : benchmark range max, default 1000000")
