У R немає окремого типу даних «множина». Натомість для схожих операцій над векторами тут використовують низку функцій.
Оператор %in% перевіряє належність до множини.
2 %in% 1:10 # TRUE
12 %in% 1:10 # FALSE
Серед відповідних функцій є unique (щоб прибрати дублікати), а також union(), intersect(), setdiff() і setequal() для операцій над парами множин.
> set_1 <- c("a", "b", "c", "b", "a")
> unique(set_1) # deduplicate
[1] "a" "b" "c"
> set_2 <- c('a', "c", "d")
> union(set_1, set_2) # values in either set
[1] "a" "b" "c" "d"
> intersect(set_1, set_2) # values in both sets
[1] "a" "c"
> setdiff(set_1, set_2) # values in set_1 but not set_2
[1] "b"
> setdiff(set_2, set_1) # values in set_2 but not set_1
[1] "d"
setequal(set_1, c("c", "b", "a", "b")) # are elements the same after deduplication?
[1] TRUE
У кожному з цих випадків set_1 і set_2 залишаються незмінними.
Озан збирає плейлист для майбутньої подорожі на машині. Він не хоче чути той самий трек двічі, але плейлист уже став таким довгим, що йому важко згадати, які треки вже додано.
API музичного плеєра Озана вміє працювати лише з векторами. Явні цикли чи логіка if/else тут неможливі. Йому потрібна наша допомога!
Реалізуйте функцію remove_duplicates, яка приймає плейлист як параметр і повертає новий плейлист, де всі треки унікальні.
> playlist <- c(
"Court and Spark - Joni Mitchell",
"Big Yellow Taxi - Joni Mitchell",
"Court and Spark - Joni Mitchell"
)
> remove_duplicates(playlist)
[1] "Court and Spark - Joni Mitchell" "Big Yellow Taxi - Joni Mitchell"
Реалізуйте функцію has_track, яка приймає плейлист і трек як параметри та повертає булеве значення (англ. Boolean), яке вказує, чи містить плейлист цей трек.
> playlist <- c(
"The Fashion Show - Grace Jones",
"Dr. Funkenstein - Parliament"
)
> has_track(playlist, "Dr. Funkenstein - Parliament")
[1] TRUE
> has_track(playlist, "Walking in the Rain - Grace Jones")
[1] FALSE
Реалізуйте функцію add_tracks, яка приймає плейлист і вектор з одного або більше треків як параметри та повертає новий плейлист, що містить ці треки.
> playlist <- c("Selma - Bijelo Dugme")
> playlist <- add_tracks(playlist, "Atomic Dog - George Clinton")
> playlist
[1] "Selma - Bijelo Dugme" "Atomic Dog - George Clinton"
> add_tracks(playlist, "Selma - Bijelo Dugme")
[1] "Selma - Bijelo Dugme" "Atomic Dog - George Clinton"
> add_tracks(playlist, c("The Chain - Fleetwood Mac", "Selma - Bijelo Dugme"))
[1] "Selma - Bijelo Dugme" "Atomic Dog - George Clinton" "The Chain - Fleetwood Mac"
Реалізуйте функцію delete_tracks, яка приймає плейлист і один або більше треків як параметри та повертає новий плейлист, який не містить цих треків.
> playlist <- c(
"The Treasure - Fra Lippo Lippi",
"After the Fall - Klaus Nomi"
)
> playlist <- delete_tracks(playlist, "The Treasure - Fra Lippo Lippi")
> playlist
[1] "After the Fall - Klaus Nomi"
> delete_tracks(playlist, "I Feel the Magic - Belinda Carlisle")
[1] "After the Fall - Klaus Nomi"
Озан знайомиться з новим другом і думає, наскільки схожі їхні смаки.
Реалізуйте функцію find_common_tracks, яка приймає два плейлисти та повертає новий плейлист, що містить лише треки, наявні в обох.
> playlist_1 <- c("Karma - Taylor Swift", "Tired - Adele")
> playlist_2 <- c("Andromeda - Weyes Blood", "Karma - Taylor Swift")
> find_common_tracks(playlist_1, playlist_2)
[1] "Karma - Taylor Swift"
Зареєструйтеся на Exercism, щоб вивчати й опановувати R, а також 21 концепція111 вправ та справжнє наставництво від людей, і все це безкоштовно.