TDD Code Kata #3 - Anagramy

Łukasz Piotrowski Komentarzy 0

    Ze słowem anagram nie jeden z Was się spotkał. A jeśli się nie spotkaliście to zachęcam do odwiedzenia Wujka Google lub Cioci Wikipedii.

    Dzisiejsze zadanie będzie proste. A przynajmniej tak ma się wydawać. Lecimy...


    Wstęp i Zasady

    Celem dzisiejszego zadania jest przemyślane pisanie kodu, tworzenie algorytmów i rozwiązań jak najbardziej optymalnych.

    Jak i w poprzednim trzymamy się zasady Test First:

    1. Staraj się nie czytać całej treści zadania, chyba że zostało to zaznaczone inaczej
    2. Najpierw napisz Test wg. specyfikacji zadania. Wystarczy jak napiszesz tylko te które spełniają poprawne wyniki.
    3. Napisz najbardziej minimalną i najszybszą implementację która spełnia test (Choćby miał być to np. return 1)
    4. Po każdym spełnieniu testu zrób refactoring kodu

    Na uwagę zasługuje również to, że podczas pisania testów wszystkie punkty powinny być zawsze spełniane. Nie zmieniamy specyfikacji w trakcie (Jeśli będzie tego wymagało zadanie na pewno będzie to opisane).

    A teraz lecimy z zadaniem...

    Zadanie

    1. Utwórz metodę check(string, string): bool (2 parametry string, na wyjściu bool) która sprawdzi czy oba słowa prowadzone są anagramami np:
      • check('kat', 'akt') - wynik true
      • check('dom', 'moce') - wynik false
      • check('noc', 'moc') - wynik false
    2. Dodaj możliwość wprowadzenia tablicy ze słowami. Jako wynik true/false jeśli znaleziono jakikolwiek anagram np:
      • check(['akt', 'kat', 'dom'] - wynik true
      • check(['koty', 'kat', 'dom'] - wynik false
    3. Dodaj metodę getAnagrams(): array która po wykonaniu metody check zwróci tablicę wielowymiarową anagramów w formacie:
      • Uwaga, tablice posortowane alfabetycznie!!
        [
        'akt' => [
           'kat', 
           'tak'
        ],
        'kat' => [
           'akt', 
           'tak'
        ],
        'tak' => [
           'akt', 
           'kat'
        ],
        ]
        Tablica ta zawiera "powtórzenia".
    4. Dodaj parametr w funkcji getAnagrams dający możliwość przefiltrowania tablicy pod kątem powtórzeń. Mając tablicę z pkt. 3 po przefiltrowaniu powinna być tablica:
      [
       'akt' => [
           'kat', 
           'tak'
       ],
      ]
    5. Dla metody check() dodaj możliwość podania jako wejścia pliku np: check('path/anagrams.txt'). Plik powinien być formatu: 1 słowo = 1 wiersz. Wszystkie powyższe powinny nadal działać.
    6. Przetestujcie wydajność, czas oraz ilość odnalezionych słów na słowniku: anagrams.txt

    Podsumowanie

    Zadanie jak widać nie jest bardzo skomplikowane. Wymaga tutaj jednak sprytu, wyczucia, ponieważ uruchomienie rozwiązania na dużym słowniku może spowodować opłakane skutki.

    Mile będą widziane Wasze wyniki, ile słów udało się znaleźć w słowniku, jaki czas mieliście. Możecie też podsyłać własne słowniki do testów.

    Inne artykuły

    Top