aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMohammad S Anwar <Mohammad.Anwar@yahoo.com>2021-10-01 18:35:21 +0100
committerGitHub <noreply@github.com>2021-10-01 18:35:21 +0100
commit7ba63ba98a923600977af991503798362b2b86f5 (patch)
tree2ae9392e0f7ecc6c0c4ccb02954a968e7714d47e
parentef554f1471149e585c33d034f1e7c5f3e8fc5828 (diff)
parent37d86dfde0716a3a800dcd84f0bcafddd0c338c3 (diff)
downloadperlweeklychallenge-club-7ba63ba98a923600977af991503798362b2b86f5.tar.gz
perlweeklychallenge-club-7ba63ba98a923600977af991503798362b2b86f5.tar.bz2
perlweeklychallenge-club-7ba63ba98a923600977af991503798362b2b86f5.zip
Merge pull request #4946 from Kaiepi/challenge-132
Add Ben Davies' Scala 3 solutions for challenge 132
-rw-r--r--challenge-132/ben-davies/scala/ch-1.scala13
-rw-r--r--challenge-132/ben-davies/scala/ch-2.scala34
2 files changed, 47 insertions, 0 deletions
diff --git a/challenge-132/ben-davies/scala/ch-1.scala b/challenge-132/ben-davies/scala/ch-1.scala
new file mode 100644
index 0000000000..47f0e9f3af
--- /dev/null
+++ b/challenge-132/ben-davies/scala/ch-1.scala
@@ -0,0 +1,13 @@
+import java.time.LocalDate
+import java.time.format.DateTimeFormatter
+import java.time.temporal.ChronoUnit
+
+@main def ch1(input: String) = {
+ val formatter = DateTimeFormatter.ofPattern("yyyy/MM/dd")
+ val birthday = LocalDate.parse(input, formatter)
+ val today = LocalDate.of(2021, 9, 22)
+ val lifetime = ChronoUnit.DAYS.between(birthday, today)
+ val before = birthday.minus(lifetime, ChronoUnit.DAYS)
+ val after = today.plus(lifetime, ChronoUnit.DAYS)
+ println(before.format(formatter) + ", " + after.format(formatter))
+}
diff --git a/challenge-132/ben-davies/scala/ch-2.scala b/challenge-132/ben-davies/scala/ch-2.scala
new file mode 100644
index 0000000000..25b4297f0d
--- /dev/null
+++ b/challenge-132/ben-davies/scala/ch-2.scala
@@ -0,0 +1,34 @@
+implicit class Relation(r: NonEmptyTuple) {
+ inline def but(i: Int) = r.take(i) ++ r.drop(i).drop(1)
+}
+
+extension [S <: NonEmptyTuple](ss: List[S])
+ def hashjoin[R <: NonEmptyTuple](rs: List[R])(si: Int, ri: Int)(using Ordering[Tuple.Elem[S, si.type]]) = {
+ // 1. For each tuple r in the build input R
+ // 1.1 Add r to the in-memory hash table
+ val init = Map.empty[Tuple.Elem[S, si.type] | Tuple.Elem[R, ri.type], List[R]].withDefaultValue(List.empty)
+ val hash = rs.foldRight(init) { (r, acc) => acc.updated(r(ri), r :: acc(r(ri))) }
+ // 2. Do a final scan of the probe input S and add the resulting join
+ // tuples to the output relation
+ ss sortBy { _(si) } flatMap { s => hash(s(si)) map { s ++ _.but(ri) } }
+ }
+
+@main def ch2 = {
+ val playerAges = List(
+ (20, "Alex" ),
+ (28, "Joe" ),
+ (38, "Mike" ),
+ (18, "Alex" ),
+ (25, "David"),
+ (18, "Simon"),
+ )
+ val playerNames = List(
+ ("Alex", "Stewart"),
+ ("Joe", "Root" ),
+ ("Mike", "Gatting"),
+ ("Joe", "Blog" ),
+ ("Alex", "Jones" ),
+ ("Simon","Duane" ),
+ );
+ for r <- playerAges.hashjoin(playerNames)(1, 0) do println(r.toList.mkString(" "))
+}