Skip to content

Instantly share code, notes, and snippets.

@martin-kokos
Last active June 11, 2017 13:44
Show Gist options
  • Star 4 You must be signed in to star a gist
  • Fork 2 You must be signed in to fork a gist
  • Save martin-kokos/7fb98650c66bd8d93767da6627affffa to your computer and use it in GitHub Desktop.
Save martin-kokos/7fb98650c66bd8d93767da6627affffa to your computer and use it in GitHub Desktop.
Python víkend: Zadání úkolu

Python víkend v Kiwi.com - vstupní úkol

Pomocí této úlohy nám prokážete, že jste s Pythonem již přišli do styku a znáte jeho základy. Tím pádem by nemělo nic bránit tomu, abyste si workshop užili a nebyl pro vás příliš složitý.

##Limitace

Žádné limitace.

  • Python2.7 nebo 3
  • všechny moduly jsou povoleny

##Popis úkolu

Máte data o jednotlivých letech (segmentech) a batožinách. Vaším úkolem je nalézt kombinace jednotlivých letů (itineráře, tzn. minimálně 2 segmenty) pro pasažéry bez batožiny, jedním nebo dvěma kusy batožiny tak, aby segmenty navazovaly s časem na přestup 1-4 hodiny. Jednotlivé sloupce jsou ve vstupních datech pojmenovány:

  • source, destination vyjadřující kód letiště odletu a příletu
  • departure, arrival jsou časy odletu a příletu
  • price je cena za letenku bez batožiny
  • bags_allowed je počet kusů batožiny které se daji dokoupit
  • bag_price je cena za kus batožiny přikoupené navíc
  • flight_number je unikátní identifikátor segmentu

Pro jednoduchou orientaci v nabídce nakombinovaných segmentů by bylo vhodné, aby nabídky letů pro pasažéry s různým počtem batožiny již obsahovaly celkovou cenu za všechny segmenty včetně poplatků za batožinu.

##Vstupní data (csv) (pouze ukázka)

(Data byla aktualizována viz. DostalJ kometář. Omlouváme se za chybu. Pokud vaše řešení zavisí na původním formátu YYYY-DD-MM, budeme na to brát ohled)

source,destination,departure,arrival,flight_number,price,bags_allowed,bag_price
USM,HKT,2017-02-11T06:25:00,2017-02-11T07:25:00,PV404,24,1,9
USM,HKT,2017-02-12T12:15:00,2017-02-12T13:15:00,PV755,23,2,9
USM,HKT,2017-02-12T21:15:00,2017-02-12T22:15:00,PV729,25,1,14
USM,HKT,2017-02-11T14:50:00,2017-02-11T15:50:00,PV966,21,1,17
USM,HKT,2017-02-12T00:35:00,2017-02-12T01:35:00,PV398,24,1,14
USM,HKT,2017-02-12T05:15:00,2017-02-12T06:15:00,PV870,19,1,13
USM,HKT,2017-02-12T10:00:00,2017-02-12T11:00:00,PV320,22,1,18
USM,HKT,2017-02-12T13:40:00,2017-02-12T14:40:00,PV540,26,2,13
USM,HKT,2017-02-12T09:30:00,2017-02-12T10:30:00,PV290,19,2,8
USM,HKT,2017-02-11T02:40:00,2017-02-11T03:40:00,PV876,25,2,16
USM,HKT,2017-02-12T09:35:00,2017-02-12T10:35:00,PV275,24,2,17
HKT,USM,2017-02-12T10:35:00,2017-02-12T11:30:00,PV996,23,1,15
HKT,USM,2017-02-11T15:45:00,2017-02-11T16:40:00,PV243,22,1,6
HKT,USM,2017-02-11T19:05:00,2017-02-11T20:00:00,PV146,21,2,5
HKT,USM,2017-02-12T16:00:00,2017-02-12T16:55:00,PV634,21,1,12
HKT,DPS,2017-02-12T00:00:00,2017-02-12T03:40:00,PV961,70,1,39
HKT,USM,2017-02-12T00:20:00,2017-02-12T01:15:00,PV101,18,2,7
HKT,DPS,2017-02-11T12:00:00,2017-02-11T15:40:00,PV100,96,1,40
HKT,USM,2017-02-12T22:05:00,2017-02-12T23:00:00,PV672,24,2,5
HKT,USM,2017-02-11T06:30:00,2017-02-11T07:25:00,PV442,17,1,11
HKT,USM,2017-02-12T07:15:00,2017-02-12T08:10:00,PV837,18,1,12
BWN,DPS,2017-02-11T06:10:00,2017-02-11T08:30:00,PV953,48,1,25
BWN,DPS,2017-02-12T14:35:00,2017-02-12T16:55:00,PV388,49,1,30
BWN,DPS,2017-02-11T05:35:00,2017-02-11T07:55:00,PV378,59,1,29
BWN,DPS,2017-02-12T10:35:00,2017-02-12T12:55:00,PV046,50,1,25
BWN,DPS,2017-02-11T13:40:00,2017-02-11T16:00:00,PV883,51,1,26
BWN,DPS,2017-02-12T19:10:00,2017-02-12T21:30:00,PV999,54,2,23
BWN,DPS,2017-02-11T16:15:00,2017-02-11T18:35:00,PV213,55,2,22
BWN,DPS,2017-02-11T02:35:00,2017-02-11T04:55:00,PV873,46,1,34
BWN,DPS,2017-02-11T01:15:00,2017-02-11T03:35:00,PV452,57,1,33
BWN,DPS,2017-02-12T08:45:00,2017-02-12T11:05:00,PV278,41,2,22
BWN,DPS,2017-02-12T22:50:00,2017-02-13T01:10:00,PV042,56,2,31
DPS,HKT,2017-02-12T08:25:00,2017-02-12T12:05:00,PV207,83,1,38
DPS,BWN,2017-02-12T17:15:00,2017-02-12T19:40:00,PV620,43,2,25
DPS,BWN,2017-02-11T13:15:00,2017-02-11T15:40:00,PV478,47,1,23
DPS,HKT,2017-02-11T09:15:00,2017-02-11T12:55:00,PV414,67,1,49
DPS,HKT,2017-02-12T08:25:00,2017-02-12T12:05:00,PV699,78,2,41
DPS,HKT,2017-02-12T15:20:00,2017-02-12T19:00:00,PV974,85,1,38
DPS,HKT,2017-02-11T00:20:00,2017-02-11T04:00:00,PV519,79,2,44
DPS,HKT,2017-02-11T08:50:00,2017-02-11T12:30:00,PV260,89,1,43
DPS,BWN,2017-02-12T16:45:00,2017-02-12T19:10:00,PV451,57,1,24
DPS,BWN,2017-02-11T22:10:00,2017-02-12T00:35:00,PV197,50,1,30

##Výstup

  • Výstupní data můžou být v jakémkoliv formátu vhodném k dalšímu zpracování.
  • Ignorovat opakování segmentů (A->B) v kombinaci. A a B představují kód letiště.
    • A->B->A->B je nevalidní kombinace.
    • A->B->A je validní kombinace.

##Zpracování

  • Úkol byl navržený tak, aby začátečníkům poskytl výzvu a možnost vyzkoušet si základní datové typy a kontrolní struktury (if, for atd.), a zdatnějším lidem kteří už dříve programovali v jiném jazyce trvalo zpracování chvilku.
  • Řešení by mělo být jednoduché
  • Neočekáváme, že řešení bude optimalizované na výpočetní náročnost nebo využití paměti (pokud vás to však baví a chcete využít matematické znalosti ze školy, můžete)

##Použití

Vstupní data bude program číst ze stdin a bude jej tak možné spustit následujícím způsobem cat input.csv | find_combinations.py skript poté zapíše výstup na stdout a případné chyby na stderr.

##Kontakt

  • Posílat můžete jako .py soubor / .zip balík v příloze e-mailu nebo odkaz na GitHub repozitář.
  • Vyřešené úkoly a otázky nám zasílejte na mike@kiwi.com
@wasek2611
Copy link

Dobrý den,

bohužel moc nechápu zadání. Mohli byste sem vložit výstup jak má vypadat?
Ty vstupní data jsou kompletní? Že je u toho napsaná jen ukázka.

Díky moc!

@MichalCab
Copy link

MichalCab commented Nov 17, 2016

Ahoj,

struktura výstupu je na řešiteli, avšak výstup by měl být jednoduše strojově čitelný. Informací kterou má výstup obsahovat je jednoznačný identifikátor cesty, cena cesty a počtet batožin s kterým cestující cestuje (0, 1, 2).

Vstupní data jsou jen ukázkou vstupu. Data na vstupu mohou být jakákoliv avšak zachovají stejnou strukturu.

:)

@MichalCab
Copy link

MichalCab commented Nov 18, 2016

C-A-B-A a A-B-A-D je validní cesta, jelikož se neopakují segmenty. Opakování letiť nevadí.

Občas se i takové lety prodávají a výjdou levněji. Tzn někdy je C-A-B-A levnější než C-A.

@DostalJ
Copy link

DostalJ commented Nov 18, 2016

Dobrý den,
nevím, jestli na data koukám správně, ale jste si jistí formátem departure a arrival? Pokud by skutečně bylo YYYY-MM-DD, tak by se data odehrála ve dvou měsících vždy jedenáctého.
Děkuji.

@Sgiath
Copy link

Sgiath commented Nov 18, 2016

Měl bych doplňující otázky ke vstupu a výstupu :)

  1. price a bag_price jsou vždy integer?
  2. výstup má být v jakémkoliv formátu vhodném k dalšímu zpracování to znamená asi opět ve stringu, když výstup má být na stdout, že? Protože nejlepší formát k dalšímu zpracování se mi jeví nějaká šikovná třida s rozumným API ;)
  3. u výstupu můžeme předpokládat, že další zpracovávání bude mít k dispozici tytéž data co my (takže stačí např. vypsat jen čísla letů ve správném pořadí), nebo na výstupu mají být všechny informace o danných letech?
  4. dalším zpracováním se myslí strojové zpracování, takže s human-readable formátem si nemusíme dělat starosti...?

@MichalCab
Copy link

Sgiath:

  1. ano
  2. "Výstupem" může být klidně API, ale není to součástí tohoto tasku. Proto nám stačí "string" na stdout.
  3. Číslo letu může být stejné pro lety v různé dny. (pravidelná linka co lítá každý týden má většinou stejné flight_no)
  4. Může být implementován i přepínač "--humanreadable", ale opět to není součástí tohoto tasku.

:)

@MichalCab
Copy link

DostalJ:

Ano, jsme, je to pouze ukázka. Vstupní data při testování vašich řešení můžou být jiná, avšak formát a datová struktura zůstává stejná.

:)

@Matlino
Copy link

Matlino commented Nov 21, 2016

V úlohe nie je písane, že by sme mali vypisovať časy príletov, odletov alebo čísla letov jednotlivých kombinácií letov. Takže ak sa stane, že nejaká kombinácia letov sa bude vyskytovať na výstupe viackrát, máme ju vypísať iba raz? Alebo máme naopak jednotlivé kombinácie vyššie spomínaným spôsobom rozlíšiť?

EDIT: alebo staci ak su odlisene celkovou cenou za danu kombinaciu letov?

@milanoid
Copy link

@MichalCab lámu si hlavu na těmi kombinacemi. Chceme zjistit všechny kombinace, které splňují ty omezující podmínky (doba na přestup 1-4 hodiny, bez opakování segmentů)? Nebo jen nejlevnější? Nebo úplně jinak?

Vidět ukázkový výstup pro ukázkový vstup by určitě pomohlo. Díky.

@martin-kokos
Copy link
Author

martin-kokos commented Nov 27, 2016

@Matlino @milanoid
Jak bylo řečeno:

Úkol byl navržený tak, aby začátečníkům poskytl výzvu a možnost vyzkoušet si základní datové typy a kontrolní struktury (if, for atd.) ...

čili není cílem se trefit do našich představ o tom jak ma vypadat výstup.
Avšak:

Výstupní data můžou být v jakémkoliv formátu vhodném k dalšímu zpracování.

@mathewcohle
Copy link

Budete davat vediet aj tym, co nebudu pozvany? Aby si vedel clovek zariadit vikend :)

@martin-kokos
Copy link
Author

@iambanker Ano, napíšeme i těm.
Některým lidem úloha přišla dost těžká, proto jsme se rozhodli deadline posunout o den, do úterní půlnoci.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment