Initial commit
This commit is contained in:
33
lab_6/Album.kt
Normal file
33
lab_6/Album.kt
Normal file
@@ -0,0 +1,33 @@
|
||||
package lab_6
|
||||
|
||||
import kotlin.time.Duration
|
||||
|
||||
/**
|
||||
* Represents an album by a specific artist, containing multiple tracks.
|
||||
*
|
||||
* @property albumName The name of the album.
|
||||
* @property artist The artist or band associated with the album.
|
||||
* @property tracks An [Array] of tracks included on the album.
|
||||
*/
|
||||
class Album(val albumName: String, val artist: String, val tracks: List<Track>) {
|
||||
|
||||
/**
|
||||
* Returns an array of tracks within the specified duration range.
|
||||
*/
|
||||
fun tracksInDurationRange(durationRange: ClosedRange<Duration>): Array<Track> {
|
||||
return this.tracks.filter { it.duration in durationRange }.toTypedArray()
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the total duration of all tracks on the album.
|
||||
*/
|
||||
private fun totalDuration(): Duration {
|
||||
var totalDuration: Duration = Duration.ZERO
|
||||
this.tracks.forEach { totalDuration += it.duration }
|
||||
return totalDuration
|
||||
}
|
||||
|
||||
override fun toString(): String {
|
||||
return "${this.albumName} by ${this.artist}\nTotal duration: ${this.totalDuration()}\nTracks:\n${this.tracks.joinToString("\n")}"
|
||||
}
|
||||
}
|
||||
15
lab_6/Dancepop.kt
Normal file
15
lab_6/Dancepop.kt
Normal file
@@ -0,0 +1,15 @@
|
||||
package lab_6
|
||||
|
||||
import kotlin.time.Duration
|
||||
|
||||
/**
|
||||
* Represents a track in the Dance-pop style.
|
||||
*
|
||||
* @param numberInAlbum The position of the track on the album.
|
||||
* @param trackName The name of the track.
|
||||
* @param feature The featured artist(s) in the track (nullable if no featured artist).
|
||||
* @param duration The [Duration] of the track.
|
||||
*/
|
||||
class Dancepop(numberInAlbum: Int, trackName: String, feature: String?, duration: Duration): Track(numberInAlbum, trackName, feature, duration) {
|
||||
override val style = "Dance-pop"
|
||||
}
|
||||
15
lab_6/Electropop.kt
Normal file
15
lab_6/Electropop.kt
Normal file
@@ -0,0 +1,15 @@
|
||||
package lab_6
|
||||
|
||||
import kotlin.time.Duration
|
||||
|
||||
/**
|
||||
* Represents a track in the Electropop style.
|
||||
*
|
||||
* @param numberInAlbum The position of the track on the album.
|
||||
* @param trackName The name of the track.
|
||||
* @param feature The featured artist(s) in the track (nullable if no featured artist).
|
||||
* @param duration The [Duration] of the track.
|
||||
*/
|
||||
class Electropop(numberInAlbum: Int, trackName: String, feature: String?, duration: Duration): Track(numberInAlbum, trackName, feature, duration) {
|
||||
override val style = "Electropop"
|
||||
}
|
||||
15
lab_6/Interlude.kt
Normal file
15
lab_6/Interlude.kt
Normal file
@@ -0,0 +1,15 @@
|
||||
package lab_6
|
||||
|
||||
import kotlin.time.Duration
|
||||
|
||||
/**
|
||||
* Represents an interlude track.
|
||||
*
|
||||
* @param numberInAlbum The position of the track on the album.
|
||||
* @param trackName The name of the track.
|
||||
* @param feature The featured artist(s) in the track (nullable if no featured artist).
|
||||
* @param duration The [Duration] of the track.
|
||||
*/
|
||||
class Interlude(numberInAlbum: Int, trackName: String, feature: String?, duration: Duration): Track(numberInAlbum, trackName, feature, duration) {
|
||||
override val style = "Interlude"
|
||||
}
|
||||
15
lab_6/Synthpop.kt
Normal file
15
lab_6/Synthpop.kt
Normal file
@@ -0,0 +1,15 @@
|
||||
package lab_6
|
||||
|
||||
import kotlin.time.Duration
|
||||
|
||||
/**
|
||||
* Represents a track in the Synth-pop style.
|
||||
*
|
||||
* @param numberInAlbum The position of the track on the album.
|
||||
* @param trackName The name of the track.
|
||||
* @param feature The featured artist(s) in the track (nullable if no featured artist).
|
||||
* @param duration The [Duration] of the track.
|
||||
*/
|
||||
class Synthpop(numberInAlbum: Int, trackName: String, feature: String?, duration: Duration): Track(numberInAlbum, trackName, feature, duration) {
|
||||
override val style = "Synth-pop"
|
||||
}
|
||||
27
lab_6/Track.kt
Normal file
27
lab_6/Track.kt
Normal file
@@ -0,0 +1,27 @@
|
||||
package lab_6
|
||||
|
||||
import kotlin.time.Duration
|
||||
|
||||
/**
|
||||
* Represents a track on an album.
|
||||
*
|
||||
* @param numberInAlbum The position of the track on the album.
|
||||
* @param trackName The name of the track.
|
||||
* @param feature The featured artist(s) in the track (nullable if no featured artist).
|
||||
* @param duration The [Duration] of the track.
|
||||
*/
|
||||
open class Track(val numberInAlbum: Int, val trackName: String, val feature: String?, val duration: Duration) {
|
||||
|
||||
/**
|
||||
* The style or genre of the track.
|
||||
*/
|
||||
open val style = ""
|
||||
|
||||
override fun toString(): String {
|
||||
return if (this.feature == null) {
|
||||
"#${this.numberInAlbum}: ${this.trackName} (${this.duration})"
|
||||
} else {
|
||||
"#${this.numberInAlbum}: ${this.trackName} ft. ${this.feature} (${this.duration})"
|
||||
}
|
||||
}
|
||||
}
|
||||
48
lab_6/main.kt
Normal file
48
lab_6/main.kt
Normal file
@@ -0,0 +1,48 @@
|
||||
package lab_6
|
||||
|
||||
import kotlin.time.Duration.Companion.minutes
|
||||
import kotlin.time.Duration.Companion.seconds
|
||||
|
||||
fun main() {
|
||||
|
||||
val chromatica = Album(
|
||||
"Chromatica",
|
||||
"Lady Gaga",
|
||||
listOf(
|
||||
Interlude(1, "Chromatica I", null, 1.minutes),
|
||||
Synthpop(2, "Alice", null, 2.minutes + 57.seconds),
|
||||
Dancepop(3, "Stupid Love", null, 3.minutes + 13.seconds),
|
||||
Dancepop(4, "Rain On Me", "Ariana Grande", 3.minutes + 2.seconds),
|
||||
Synthpop(5, "Free Woman", null, 3.minutes + 11.seconds),
|
||||
Electropop(6, "Fun Tonight", null, 2.minutes + 53.seconds),
|
||||
Interlude(7, "Chromatica II", null, 41.seconds),
|
||||
Synthpop(8, "911", null, 2.minutes + 52.seconds),
|
||||
Electropop(9, "Plastic Doll", null, 3.minutes + 41.seconds),
|
||||
Dancepop(10, "Sour Candy", "Blackpink", 2.minutes + 37.seconds),
|
||||
Dancepop(11, "Enigma", null, 2.minutes + 59.seconds),
|
||||
Synthpop(12, "Replay", null, 3.minutes + 6.seconds),
|
||||
Interlude(13, "Chromatica III", null, 27.seconds),
|
||||
Electropop(14, "Sine From Above", "Elton John", 4.minutes + 4.seconds),
|
||||
Synthpop(15, "1000 Doves", null, 3.minutes + 35.seconds),
|
||||
Dancepop(16, "Babylon", null, 2.minutes + 41.seconds)
|
||||
)
|
||||
)
|
||||
|
||||
println("$chromatica\n")
|
||||
|
||||
println(
|
||||
"${chromatica.albumName} tracks sorted by musical style:\n${
|
||||
chromatica.tracks.sortedBy { it.style }.joinToString("\n")
|
||||
}\n"
|
||||
)
|
||||
|
||||
val durationRange = 1.minutes..3.minutes + 30.seconds
|
||||
|
||||
println(
|
||||
"${chromatica.albumName} tracks in a duration range ($durationRange):\n${
|
||||
chromatica.tracksInDurationRange(durationRange).joinToString("\n")
|
||||
}"
|
||||
)
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user