diff options
| author | Mohammad S Anwar <Mohammad.Anwar@yahoo.com> | 2021-10-01 18:35:21 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2021-10-01 18:35:21 +0100 |
| commit | 7ba63ba98a923600977af991503798362b2b86f5 (patch) | |
| tree | 2ae9392e0f7ecc6c0c4ccb02954a968e7714d47e | |
| parent | ef554f1471149e585c33d034f1e7c5f3e8fc5828 (diff) | |
| parent | 37d86dfde0716a3a800dcd84f0bcafddd0c338c3 (diff) | |
| download | perlweeklychallenge-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.scala | 13 | ||||
| -rw-r--r-- | challenge-132/ben-davies/scala/ch-2.scala | 34 |
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(" ")) +} |
