Skip to content

Commit

Permalink
Merge pull request #737 from luechtdiode/735-optimize-gearchange-turn10
Browse files Browse the repository at this point in the history
#735 Optimize generation of station steps supporting gear-splitted numbering
  • Loading branch information
luechtdiode authored Nov 19, 2023
2 parents 67f322f + 50e5dd0 commit 23bd2e1
Show file tree
Hide file tree
Showing 7 changed files with 384 additions and 151 deletions.
396 changes: 295 additions & 101 deletions newclient/resultcatcher/package-lock.json

Large diffs are not rendered by default.

8 changes: 4 additions & 4 deletions newclient/resultcatcher/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@
"@angular/platform-browser-dynamic": "^16.2.12",
"@angular/router": "^16.2.12",
"@capacitor/app": "4.1.1",
"@capacitor/core": "4.5.0",
"@capacitor/core": "4.8.1",
"@capacitor/haptics": "4.1.0",
"@capacitor/keyboard": "4.1.0",
"@capacitor/splash-screen": "4.1.2",
Expand All @@ -37,22 +37,22 @@
"devDependencies": {
"@angular-devkit/build-angular": "^16.2.9",
"@angular-eslint/builder": "~16.2.0",
"@angular-eslint/eslint-plugin": "~16.2.0",
"@angular-eslint/eslint-plugin": "~17.0.1",
"@angular-eslint/eslint-plugin-template": "~16.2.0",
"@angular-eslint/template-parser": "~16.2.0",
"@angular/cli": "16.2.9",
"@angular/compiler": "^16.2.12",
"@angular/compiler-cli": "^16.2.12",
"@angular/language-service": "^16.2.12",
"@babel/plugin-transform-async-to-generator": "^7.18.6",
"@babel/plugin-transform-async-to-generator": "^7.23.3",
"@capacitor/cli": "4.8.0",
"@ionic/angular-toolkit": "^9.0.0",
"@types/jasmine": "~4.3.0",
"@types/jasminewd2": "~2.0.3",
"@types/node": "^20.9.0",
"@typescript-eslint/eslint-plugin": "5.45.0",
"@typescript-eslint/parser": "5.45.0",
"eslint": "^8.29.0",
"eslint": "^8.53.0",
"eslint-plugin-import": "2.26.0",
"eslint-plugin-jsdoc": "39.6.4",
"eslint-plugin-prefer-arrow": "1.2.3",
Expand Down
9 changes: 5 additions & 4 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -241,9 +241,9 @@
<scala.majorversion>2.13</scala.majorversion>
<scala.version>2.13.12</scala.version>
<akkaHttp.version>10.5.3</akkaHttp.version>
<javafx.version>19</javafx.version>
<javafx.version>21.0.1</javafx.version>
<akka.version>2.8.5</akka.version>
<scalafx.version>19.0.0-R30</scalafx.version>
<scalafx.version>21.0.0-R32</scalafx.version>
<!--scalafx.version>20.0.0-R31</scalafx.version-->
<scalatest.version>3.3.0-SNAP4</scalatest.version>
<scala-maven-plugin.version>4.8.1</scala-maven-plugin.version>
Expand Down Expand Up @@ -312,7 +312,8 @@
<dependency>
<groupId>org.xerial</groupId>
<artifactId>sqlite-jdbc</artifactId>
<version>3.39.3.0</version> <!-- next version bring regression reading null BigInteger fields -->
<version>3.39.3.0</version> <!-- next version brings regression reading null BigInteger fields - according to slick docu, the sqllite driver doesn't support bigedecimal anymore -->
<!--version>3.44.0.0</version-->
</dependency>
<dependency>
<groupId>org.postgresql</groupId>
Expand All @@ -322,7 +323,7 @@
<dependency>
<groupId>com.typesafe.slick</groupId>
<artifactId>slick-hikaricp_${scala.majorversion}</artifactId>
<version>3.4.1</version>
<version>${slick.version}</version>
</dependency>
<dependency>
<groupId>org.simplejavamail</groupId>
Expand Down
2 changes: 1 addition & 1 deletion src/main/resources/app/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,6 @@

<body>
<app-root></app-root>
<script src="runtime.96226d674e5be819.js" type="module"></script><script src="polyfills.04266a2a1c92f89b.js" type="module"></script><script src="main.27e12c3544104f50.js" type="module"></script></body>
<script src="runtime.96226d674e5be819.js" type="module"></script><script src="polyfills.04266a2a1c92f89b.js" type="module"></script><script src="main.47d84a20c42ea8b1.js" type="module"></script></body>

</html>
1 change: 0 additions & 1 deletion src/main/resources/app/main.27e12c3544104f50.js

This file was deleted.

1 change: 1 addition & 0 deletions src/main/resources/app/main.47d84a20c42ea8b1.js

Large diffs are not rendered by default.

118 changes: 78 additions & 40 deletions src/main/scala/ch/seidel/kutu/renderer/RiegenblattToHtmlRenderer.scala
Original file line number Diff line number Diff line change
Expand Up @@ -13,37 +13,67 @@ object RiegenBuilder {
RiegenRotationsregel(kandidaten.head.wertungen.head.wettkampf)
else RiegenRotationsregel("")

def pickStartformationen(geraete: Seq[(Option[Disziplin], Seq[Riege])], durchgang: Option[String], extractKandidatEinteilung: Kandidat => (Option[Riege], Seq[Disziplin])) = {
geraete.flatMap{s =>
val (startdisziplin, _) = s
val splitpoint = geraete.indexWhere(g => g._1.equals(startdisziplin))
val shifted = geraete.drop(splitpoint) ++ geraete.take(splitpoint)
shifted.zipWithIndex.map{ss =>
val ((disziplin, _), offset) = ss
val tuti = kandidaten.filter{k =>
val (einteilung, diszipline) = extractKandidatEinteilung(k)
einteilung match {
case Some(einteilung) =>
einteilung.durchgang.equals(durchgang) &&
einteilung.start.equals(startdisziplin) &&
diszipline.map(_.id).contains(disziplin.map(_.id).getOrElse(0))
case None => false
}
}.sortBy(sorter.sort)

val completed = tuti.
flatMap(k => k.wertungen).
filter(wertung => disziplin.forall(_.equals(wertung.wettkampfdisziplin.disziplin))).
forall(_.endnote.nonEmpty)

if(tuti.nonEmpty) {
val mo = (tuti.size * geraete.size + offset) % tuti.size
(offset, disziplin, tuti.drop(mo) ++ tuti.take(mo), completed)
}
else {
(offset, disziplin, tuti, completed)
def pickStartformationen(geraete: Seq[(Option[Disziplin], Seq[Riege], Int)], durchgang: Option[String], extractKandidatEinteilung: Kandidat => (Option[Riege], Seq[Disziplin])): Seq[(Int, Option[Disziplin], Seq[Kandidat], Boolean)] = {
/*
sationmap[Disziplin,Int](
// Disziplin -> Halt
Boden -> 1,
Barren -> 2,
Balken -> 2,
Minitramp -> 3,
Sprung -> 4
)
*/
val stationmap: Map[Disziplin, Int] = geraete.foldLeft(Map[Disziplin, Int]()) { (acc, item) =>
acc.updated(item._1.get, item._3)
}
/*
1. Halt: Riege Startgerät (1W,Boden), (2M,Barren), (3W,Balken), (4W,Minitramp) (5M,Minitramp), (6M,Sprung)
2. Halt: Riege Startgerät (1W,Balken), (2M,Minitramp), (3W,Sprung),
(4W,Boden) (5M,Boden), (6M,Barren)
3. Halt: Riege Startgerät (1W,Minitramp), (2M,Sprung),
(3W,Boden), (4W,Balken) (5M,Barren), (6M,Minitramp)
4. Halt: Riege Startgerät (1W,Sprung)
, (2M,Boden), (3W,Balken), (4W,Minitramp) (5M,Minitramp), (6M,Sprung)
*/
val athletdevicemap: Seq[(Kandidat, List[Disziplin])] = geraete.flatMap(d => kandidaten
.map { kandidat =>
(kandidat, extractKandidatEinteilung(kandidat))
}
.filter { riegeneinteilung =>
val (_, (einteilung, diszipline)) = riegeneinteilung
val disziplin = d._1.get
einteilung match {
case Some(einteilung) =>
einteilung.durchgang.equals(durchgang) &&
einteilung.start.contains(disziplin) &&
diszipline.map(_.id).contains(disziplin.id)
case None => false
}
}
.map { riegeneinteilung =>
val (kandidat, (_, diszipline)) = riegeneinteilung
val disziplin = d._1.get
(kandidat, (diszipline.dropWhile(d => d.id != disziplin.id) ++ diszipline.takeWhile(d => d.id != disziplin.id)).toList)
}
)

stationmap.values.toList.distinct.sorted.flatMap { station =>
athletdevicemap.map{ kandidat =>
(kandidat._2(station), kandidat)
}.groupBy(_._1)
.map{gr =>
val (disziplin: Disziplin, candidates: Seq[(Disziplin, (Kandidat, List[Disziplin]))]) = gr
val completed = candidates.flatMap(k => k._2._1.wertungen)
.filter(wertung => disziplin.equals(wertung.wettkampfdisziplin.disziplin))
.forall(_.endnote.nonEmpty)
val sortedCandidates = candidates.map(x => x._2._1).sortBy(sorter.sort)
val scWithOffset = sortedCandidates.drop(station) ++ sortedCandidates.take(station)
(station, Some(gr._1), scWithOffset, completed)
}
}.filter(p => p._3.nonEmpty)
}

Expand All @@ -54,9 +84,11 @@ object RiegenBuilder {
.sortBy(d => d._1).zipWithIndex
.map{d =>
val ((durchgang, kandidatriegen), durchgangIndex) = d
val dzl1 = kandidatriegen.flatMap(_._1.diszipline)
val riegen = kandidatriegen.map(_._2).sortBy(r => r.start.map( dzl1.indexOf(_)))
val dzl = dzl1.distinct.sortBy{dzl1.indexOf(_)}
val dzlmap: Map[Disziplin,Int] = kandidatriegen.flatMap(_._1.diszipline.zipWithIndex).foldLeft(Map[Disziplin,Int]()){(acc, item) =>
acc.updated(item._1, item._2)
}
val dzl = dzlmap.keys.toList.sortBy{dzlmap(_)}
val riegen = kandidatriegen.map(_._2).sortBy(r => r.start.map( dzl.indexOf(_)))
//kandidat.diszipline für die Rotationsberechnung verwenden
val rg = riegen.groupBy(e => e.start).toList.sortBy{d => d._1.map( dzl.indexOf(_))}
val geraete = dzl.foldLeft(rg){(acc, item) =>
Expand All @@ -65,15 +97,16 @@ object RiegenBuilder {
case _ => acc :+ (Some(item) -> List[Riege]())
}
}.sortBy(geraet => geraet._1.map(g => dzl.indexOf(g)))
.map(geraet => (geraet._1, geraet._2, dzlmap(geraet._1.get)))

val startformationen = pickStartformationen(geraete, durchgang, k => (k.einteilung, k.diszipline))
.zipWithIndex
.map(x => {
val (sf, index) = x
(sf._1, sf._2, sf._3, sf._4, durchgangIndex*100 + index + 1)
(sf._1, sf._2, sf._3, sf._4, durchgangIndex * 100 + index + 1)
})

if (printorder) {
(durchgang, startformationen.sortBy(d => d._2.map( dzl.indexOf(_)).getOrElse(0) * 100 + d._1))
(durchgang, startformationen.sortBy(d => d._2.map( dzl.indexOf(_)).getOrElse(0) * 100 + d._1))
}
else {
(durchgang, startformationen.sortBy(d => d._1 * 100 + d._2.map( dzl.indexOf(_)).getOrElse(0)))
Expand All @@ -88,10 +121,13 @@ object RiegenBuilder {
.map{d =>
val ((durchgang, kandidatriegen), durchgangIndex) = d
val riegen1 = kandidatriegen.map(_._2)
val dzl1 = kandidatriegen.flatMap(_._1.diszipline2)
val riegen = riegen1.sortBy(r => r.start.map( dzl1.indexOf(_)))
val dzl2 = dzl1.toSet.toList
val dzl = dzl2.sortBy{dzl1.indexOf(_)}
val dzlmap: Map[Disziplin, Int] = kandidatriegen.flatMap(_._1.diszipline2.zipWithIndex).foldLeft(Map[Disziplin, Int]()) { (acc, item) =>
acc.updated(item._1, item._2)
}
val dzl = dzlmap.keys.toList.sortBy {
dzlmap(_)
}
val riegen = riegen1.sortBy(r => r.start.map( dzlmap(_)))

//kandidat.diszipline für die Rotationsberechnung verwenden
val rg = riegen.groupBy(e => e.start).toList.sortBy{d => d._1.map( dzl.indexOf(_))}
Expand All @@ -100,7 +136,9 @@ object RiegenBuilder {
case Some(_) => acc
case _ => acc :+ (Some(item) -> List[Riege]())
}
}
}.sortBy(geraet => geraet._1.map(g => dzl.indexOf(g)))
.map(geraet => (geraet._1, geraet._2, dzlmap(geraet._1.get)))

val startformationen = pickStartformationen(geraete, durchgang, k => (k.einteilung2, k.diszipline2))
.zipWithIndex
.map(x => {
Expand Down

0 comments on commit 23bd2e1

Please sign in to comment.