{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "This notebook is part of programming course prepared by Jerzy Wawro, Galicea" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Wesele" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Problem: Jak rozmieścić gości przy stole.\n", "\n", "* [Algorytmizacja zadania](#Algorytmizacja-zadania)\n", "* [Szczegóły](#Szczegóły)\n", "* [Ograniczenia](#Ograniczenia)\n", "* [Kod - uproszczony](#Kod)\n", "* [Test - uproszczony](#Testowanie)\n", "* [Algorytm](#Algorytm)\n", "* [Test](#Test)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Algorytmizacja zadania\n", "\n", "***Zadanie***: zaplanować rozmieszczenie gości weselnych przy stole.\n", "Czy jest to zadanie algorytmiczne? Przy takim sformułowaniu oczywiście nie. Musimy dodać jakieś reguły rozmieszczania. Na przykład takie:\n", "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ć. \n", "\n", "## Szczegóły\n", "\n", "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.\n", "Mamy zatem listę gości (guests) o następującej strukturze:\n", "{'name': nazwisko, 'rank': ranga}\n", "\n", "**Przykład**:\n", "guests = [{'name': 'Jan Kowalski', 'rank': 3}, {'name': 'Anna Kot', 'rank':2}]\n", "\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Ograniczenia\n", "\n", "* Czy można założyć, że lista jest niepusta?\n", " * Tak\n", "* Czy można założyć, że dane są poprawne (lista elementów z wypełnionymi polami name i rank)?\n", " * Tak" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Dane testowe\n", "\n", "
\n",
    "* guests = [{'name': 'Jan Kowalski', 'rank': 3}, {'name': 'Anna Kot', 'rank':2}]\n",
    "
" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Algorytm zerowy\n", "\n", "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." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Kod" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "class Solution0(object):\n", " \n", " def sort_key(self, guest): \n", " return guest['rank']\n", "\n", " def location(self,guests):\n", " return sorted(guests, key=self.sort_key)\n", "\n", "# debug:\n", "#s=Solution0()\n", "#print s.location([{'name': 'Jan Kowalski', 'rank': 3}, {'name': 'Anna Kot', 'rank':2}])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Testowanie" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Uruchom poniższy program aby przetestować algorytm.**" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "from nose.tools import assert_equal, assert_raises\n", "\n", "\n", "class TestWedding0(object):\n", "\n", " def test_location(self, func):\n", " print('Testuję...')\n", " self.test0list=[{'name': 'Jan Kowalski', 'rank': 3}, {'name': 'Anna Kot', 'rank':2}]\n", " self.test0expected = [{'name': 'Anna Kot', 'rank': 2}, {'name': 'Jan Kowalski', 'rank': 3}]\n", " self.test1list=[\n", " {\"name\": 'Jan Kowalski', \"rank\": 4}, \n", " {\"name\": 'Anna Dobrowolska', \"rank\": 6},\n", " {\"name\": 'Jan Nowak', \"rank\": 1},\n", " {\"name\": 'Anna Kowalska', \"rank\":3},\n", " {\"name\": 'Anna Tkacz', \"rank\": 2},\n", " {\"name\": 'Jan Szostek', \"rank\": 5},\n", " {\"name\": 'Maria Nowak', \"rank\": 0},\n", " {\"name\": 'Jan Romanow', \"rank\": 3}]\n", " self.test1expected = [{'name': 'Maria Nowak', 'rank': 0}, \n", " {'name': 'Jan Nowak', 'rank': 1}, \n", " {'name': 'Anna Tkacz', 'rank': 2}, \n", " {'name': 'Anna Kowalska', 'rank': 3}, \n", " {'name': 'Jan Romanow', 'rank': 3},\n", " {'name': 'Jan Kowalski', 'rank': 4}, \n", " {'name': 'Jan Szostek', 'rank': 5},\n", " {'name': 'Anna Dobrowolska', 'rank': 6}]\n", " assert_raises(TypeError, func, None)\n", " self.result=func(self.test0list)\n", " assert_equal(self.result, self.test0expected)\n", " self.result=func(self.test1list)\n", " assert_equal(self.result, self.test1expected)\n", " print('Sukces: poprawnie posortowane')\n", "\n", "\n", "def main():\n", " test = TestWedding0()\n", " solution = Solution0()\n", " \n", " try:\n", " test.test_location(solution.location)\n", " except AttributeError as e:\n", " print e\n", " pass\n", "\n", "\n", "if __name__ == '__main__':\n", " main()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Dodatkowe warunki\n", "\n", "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." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Algorytm\n", "\n", "Sortowanie przez wybieranie - do dwóch list." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "class Solution1(object):\n", "\n", " def location(self,guests):\n", " r_list=[]\n", " l_list=[]\n", " r_rank=0\n", " l_rank=0\n", " r_ids=[]\n", " l_ids=[]\n", " \n", " for guest in guests:\n", " if guest['partner'] in r_ids: # wstaw po prawej\n", " i=0\n", " while (i