Autorské riešenie
Pri riešení tejto úlohy bolo potrebné zvoliť vhodné parametre procedúry/funkcie:
Jednotlivé skladby budeme reprezentovať napr. číslami 1, 2, 3... a na manipuláciu s nimi použijeme štruktúru zoznam. Počet skladieb - ak máme splniť dané podmienky - musí byť aspoň rovný počtu skladieb, ktoré máme k dispozícii (podmienka "Každá skladba zaznie aspoň raz."), a zároveň nesmie byť väčší ako dvojnásobok počtu skladieb, ktoré máme k dispozícii (podmienka "Každá skladba zaznie najviac dva krát."). To, či parameter spĺňa tieto podmienky, môžeme ošetriť pomocou generovania výnimiek alebo pomocou podmienky if. Prvá myšlienka riešenia sa zdá byť jednoduchá: Ku skladbám, ktoré máme k dispozícii, pridáme chýbajúci počet skladieb (do počtu, ktorý sa požaduje) a náhodne ich zamiešame. Dôležitým momentom je však podmienka, že skladba nesmie zaznieť hneď po sebe. Preto je potrebné takto vytvorený zoznam skontrolovať - porovnať dve po sebe idúce skladby a zvoliť vhodnú stratégiu, čo robiť v prípade, ak sú rovnaké. V našom riešení zvolíme takýto postup: Ak sa dve po sebe idúce skladby zhodujú (označme ich indexy v rámci zoznamu i a i+1), vymeníme druhú z nich s ďalšou, po nej nasledujúcou skladbou (teda skladbu s indexom i+1 vymeníme so skladbou i+2). Ak je skladba s indexom i+1 posledná v zozname, vymeníme ju s prvou skladbou zoznamu. Keďže v špeciálnom prípade sa po tejto výmene (výmene posledného s prvým prvkom zoznamu) môže stať, že sa prvá a druhá skladba (s indexmi 0 a 1) budú zhodovať, porovnáme ešte tieto dve skladby a v prípade potreby zopakujeme výmenu skladieb s indexmi 0 a 1. Ide o konkrétne o situáciu, keď k dispozícii máme dva skladby a chceme vygenerovať zoznam troch skladieb. Napríklad, v prvom kroku získame zoznam [2, 1, 1]. Po výmene získame zoznam [1, 1, 2], preto je potrebné ešte skontrolovať prvé dva prvky zoznamu, čím získame výsledný zoznam [1, 2, 1]. ;Imagine
logo
viem vytvor_playlist :zoznam :pocet urobtu "dlzka počet :zoznam ak2 (nieje (zároveň (:pocet >= :dlzka) (:pocet <= 2 * :dlzka))) [vy "|Chybný počet skladieb, playlist nie je možné vytvoriť.|] [ urobtu "playlist :zoznam ak2 počet :playlist < :pocet [urobtu "zoznam pomiešaj :zoznam opakuj :pocet - (počet :playlist) [urobtu "playlist veta :playlist prvy :zoznam urobtu "zoznam bezPrvého :zoznam] urobtu "playlist pomiešaj :playlist opakuj počet :playlist [ak prvok počítadlo :playlist = prvok (počítadlo + 1) :playlist [ak2 počítadlo + 1 <> počet :playlist [urobtu "pomocna prvok (počítadlo + 1) :playlist urobtu "playlist nahraď (počítadlo + 1) :playlist prvok (počítadlo + 2) :playlist urobtu "playlist nahraď (počítadlo + 2) :playlist :pomocna ] [urobtu "pomocna prvok 1 :playlist urobtu "playlist nahraď 1 :playlist prvok (počítadlo + 1) :playlist urobtu "playlist nahraď (počítadlo + 1) :playlist :pomocna ] ] ] ak prvok 1 :playlist = prvok 2 :playlist [urobtu "pomocna prvok 1 :playlist urobtu "playlist nahraď 1 :playlist prvok 2 :playlist urobtu "playlist nahraď 1 :playlist :pomocna ] ] [urobtu "playlist pomiešaj :playlist] vy :playlist ] koniec
# Python import random def vytvor_playlist(zoznam, pocet): if not(len(zoznam <= pocet <= len(zoznam) * 2): raise ValueError('Nesprávny počet skladieb.') playlist = zoznam.copy() if len(playlist) < pocet: random.shuffle(zoznam) playlist += zoznam[:(pocet - len(playlist))] random.shuffle(playlist) for i in range(len(playlist) - 1): if playlist[i] == playlist[i+1]: if i + 1 != len(playlist)-1: playlist[i+1], playlist[i+2] = playlist[i+2], playlist[i+1] else: playlist[i + 1], playlist[0] = playlist[0], playlist[i + 1] if playlist[0] == playlist[1]: playlist[1], playlist[2] = playlist[2], playlist[1] else: random.shuffle(playlist) return playlist try: print(vytvor_playlist([1, 2], 3)) except ValueError as chyba: print(chyba) Vaše zaujímavé riešenia a najčastejšie chyby Zaujímavé bolo, že každé odovzdané riešenie bolo originálne - niektorí z Vás použili na reprezentáciu playlistu zoznam, ďalší množinu či reťazec. Rovnako rôzne boli algoritmy tvorby playlistu - aj keď mali niektoré rovnaký základ, to dotiahnutie jednotlivých podmienok bolo veľmi rôznorodé. Najčastejšou chybou bolo to, že ste sa pri generovaní playlistu úplne spoľahli na náhodu - z čoho sa napokon mohol stať nekonečný program. Napríklad, vyberali ste novú skladbu zo zoznamu dostupných, a testovali ste, či sa už v zozname nenachádza dva krát, prípadne či by sa pred ňou neocitla rovnaká skladba. Alebo ste pre danú skladbu, ktorú ste chceli vložiť do playlistu, generovali náhodnú pozíciu dovtedy, kým neboli splnené všetky podmienky. Niektorí z Vás pochopili slovné spojenie "iný počet skladieb" ako "náhodný počet skladieb", a teda program pri každom spustení generoval rôzne dlhé playlisty. Takýto program je z hľadiska použ |
||||||||||
© Univerzita Pavla Jozefa Šafárika v Košiciach, Prírodovedecká fakulta, Ústav informatiky palmaj (zavinac) upjs.sk |