diff --git a/hard/ugly_numbers/scala/build.sbt b/hard/ugly_numbers/scala/build.sbt new file mode 100644 index 0000000..e7bb32d --- /dev/null +++ b/hard/ugly_numbers/scala/build.sbt @@ -0,0 +1,3 @@ +scalaVersion := "2.11.5" + +libraryDependencies += "org.scalatest" % "scalatest_2.11" % "2.2.1" % "test" diff --git a/hard/ugly_numbers/scala/input00.txt b/hard/ugly_numbers/scala/input00.txt new file mode 120000 index 0000000..bf488fb --- /dev/null +++ b/hard/ugly_numbers/scala/input00.txt @@ -0,0 +1 @@ +../input00.txt \ No newline at end of file diff --git a/hard/ugly_numbers/scala/src/main/scala/uglynumbers.scala b/hard/ugly_numbers/scala/src/main/scala/uglynumbers.scala new file mode 100644 index 0000000..f75ae4b --- /dev/null +++ b/hard/ugly_numbers/scala/src/main/scala/uglynumbers.scala @@ -0,0 +1,33 @@ +object Main { + def product(string:String, repeat:Int = 1): Traversable[Traversable[Char]] = { + if (repeat == 1) string.map(Vector(_)) + else { + product(string, repeat - 1).flatMap(a => string.map(a ++ Vector(_))) + } + } + + def get_all_substrings(string:String) { + // For a string with length 4, ex: '1234', find all possible places + // where we can split in 1, 2 or 3 places: + // 1 234, 12 34, 123 4 + // 1 2 34, 12 3 4, 1 23 4 + // 1 2 3 4 + println(string) + val OPERATORS = "-+" + val slices = (1 until string.length).flatMap( + (1 until string.length).combinations(_)).map( + Vector(0) ++ _ ++ Vector(string.length)).map( + _.sliding(2).toVector) + for (slice <- slices) { + val operations = product(OPERATORS, slice.length - 1).map(Vector('+') ++ _) + println(slice, operations) + } + } + + def main(args: Array[String]) { + val inputs = (if (args.length < 1) io.Source.stdin + else io.Source.fromFile(args(0))).getLines().toVector + + inputs.map(get_all_substrings(_)) + } +}