#!/usr/bin/env python # coding: utf-8 # This notebook is part of programming course prepared by Jerzy Wawro, Galicea # # Wesele # ## Problem: Jak rozmieścić gości przy stole. # # * [Algorytmizacja zadania](#Algorytmizacja-zadania) # * [Szczegóły](#Szczegóły) # * [Ograniczenia](#Ograniczenia) # * [Kod - uproszczony](#Kod) # * [Test - uproszczony](#Testowanie) # * [Algorytm](#Algorytm) # * [Test](#Test) # ## Algorytmizacja zadania # # ***Zadanie***: zaplanować rozmieszczenie gości weselnych przy stole. # Czy jest to zadanie algorytmiczne? Przy takim sformułowaniu oczywiście nie. Musimy dodać jakieś reguły rozmieszczania. Na przykład takie: # Im bliżej młodych (jeden z końców stołu), tym miejsce bardziej honorowe. Wszyscy goście mają przypisane rangi (wagi), które pozwalają ich uporządkować. # # ## Szczegóły # # Chcemy aby komputer pomógł nam w planowaniu. Musimy więc zadanie opisać na odpowiednim dla programowania poziomie szczegółowości (operując strukturami danych dostępnymi w językach programowania). Dla uproszczenia ponumerujmy gości. # Mamy zatem listę gości (guests) o następującej strukturze: # {'name': nazwisko, 'rank': ranga} # # **Przykład**: # guests = [{'name': 'Jan Kowalski', 'rank': 3}, {'name': 'Anna Kot', 'rank':2}] # # # ## Ograniczenia # # * Czy można założyć, że lista jest niepusta? # * Tak # * Czy można założyć, że dane są poprawne (lista elementów z wypełnionymi polami name i rank)? # * Tak # ## Dane testowe # #
# * guests = [{'name': 'Jan Kowalski', 'rank': 3}, {'name': 'Anna Kot', 'rank':2}]
# 
# ## Algorytm zerowy # # Możemy posortować listę gości według ich rangi. Po przeszukaniu internetu znajdujemy odpowiedni przykład sortowania, który adoptujemy dla naszych celów. # ## Kod # In[ ]: class Solution0(object): def sort_key(self, guest): return guest['rank'] def location(self,guests): return sorted(guests, key=self.sort_key) # debug: #s=Solution0() #print s.location([{'name': 'Jan Kowalski', 'rank': 3}, {'name': 'Anna Kot', 'rank':2}]) # ## Testowanie # **Uruchom poniższy program aby przetestować algorytm.** # In[ ]: from nose.tools import assert_equal, assert_raises class TestWedding0(object): def test_location(self, func): print('Testuję...') self.test0list=[{'name': 'Jan Kowalski', 'rank': 3}, {'name': 'Anna Kot', 'rank':2}] self.test0expected = [{'name': 'Anna Kot', 'rank': 2}, {'name': 'Jan Kowalski', 'rank': 3}] self.test1list=[ {"name": 'Jan Kowalski', "rank": 4}, {"name": 'Anna Dobrowolska', "rank": 6}, {"name": 'Jan Nowak', "rank": 1}, {"name": 'Anna Kowalska', "rank":3}, {"name": 'Anna Tkacz', "rank": 2}, {"name": 'Jan Szostek', "rank": 5}, {"name": 'Maria Nowak', "rank": 0}, {"name": 'Jan Romanow', "rank": 3}] self.test1expected = [{'name': 'Maria Nowak', 'rank': 0}, {'name': 'Jan Nowak', 'rank': 1}, {'name': 'Anna Tkacz', 'rank': 2}, {'name': 'Anna Kowalska', 'rank': 3}, {'name': 'Jan Romanow', 'rank': 3}, {'name': 'Jan Kowalski', 'rank': 4}, {'name': 'Jan Szostek', 'rank': 5}, {'name': 'Anna Dobrowolska', 'rank': 6}] assert_raises(TypeError, func, None) self.result=func(self.test0list) assert_equal(self.result, self.test0expected) self.result=func(self.test1list) assert_equal(self.result, self.test1expected) print('Sukces: poprawnie posortowane') def main(): test = TestWedding0() solution = Solution0() try: test.test_location(solution.location) except AttributeError as e: print e pass if __name__ == '__main__': main() # ### Dodatkowe warunki # # Goście siedzą po dwóch stronach stołu. Dodatkowo małżeństwa (pary) powinny siedzieć obok siebie, a kobiety z mężczyznami na przemian. # ## Algorytm # # Sortowanie przez wybieranie - do dwóch list. # In[ ]: class Solution1(object): def location(self,guests): r_list=[] l_list=[] r_rank=0 l_rank=0 r_ids=[] l_ids=[] for guest in guests: if guest['partner'] in r_ids: # wstaw po prawej i=0 while (i