Sat, 10 Jun 2017 17:40:36 +0300
Abstraktoi kyltti (jolloin kauppatorin jälkeiset alueet esitetään vähemmän tarkasti)
| 5 | 1 | #!/usr/bin/env python3 | 
| 2 | def supista_reitti(reitti, kokonainen = False): | |
| 
12
 
a47c9bde457d
Abstraktoi kyltti (jolloin kauppatorin jälkeiset alueet esitetään vähemmän tarkasti)
 
Teemu Piippo <teemu@hecknology.net> 
parents: 
7 
diff
changeset
 | 
3 | def abstract_sign(sign): | 
| 
 
a47c9bde457d
Abstraktoi kyltti (jolloin kauppatorin jälkeiset alueet esitetään vähemmän tarkasti)
 
Teemu Piippo <teemu@hecknology.net> 
parents: 
7 
diff
changeset
 | 
4 | abstractions = { | 
| 
 
a47c9bde457d
Abstraktoi kyltti (jolloin kauppatorin jälkeiset alueet esitetään vähemmän tarkasti)
 
Teemu Piippo <teemu@hecknology.net> 
parents: 
7 
diff
changeset
 | 
5 | 'Moikoinen': 'Hirvensalo', | 
| 
 
a47c9bde457d
Abstraktoi kyltti (jolloin kauppatorin jälkeiset alueet esitetään vähemmän tarkasti)
 
Teemu Piippo <teemu@hecknology.net> 
parents: 
7 
diff
changeset
 | 
6 | 'Maanpää': 'Hirvensalo', | 
| 
 
a47c9bde457d
Abstraktoi kyltti (jolloin kauppatorin jälkeiset alueet esitetään vähemmän tarkasti)
 
Teemu Piippo <teemu@hecknology.net> 
parents: 
7 
diff
changeset
 | 
7 | 'Papinsaari': 'Hirvensalo', | 
| 
 
a47c9bde457d
Abstraktoi kyltti (jolloin kauppatorin jälkeiset alueet esitetään vähemmän tarkasti)
 
Teemu Piippo <teemu@hecknology.net> 
parents: 
7 
diff
changeset
 | 
8 | 'Häppilä': 'Hirvensalo', | 
| 
 
a47c9bde457d
Abstraktoi kyltti (jolloin kauppatorin jälkeiset alueet esitetään vähemmän tarkasti)
 
Teemu Piippo <teemu@hecknology.net> 
parents: 
7 
diff
changeset
 | 
9 | 'Friskala': 'Hirvensalo', | 
| 
 
a47c9bde457d
Abstraktoi kyltti (jolloin kauppatorin jälkeiset alueet esitetään vähemmän tarkasti)
 
Teemu Piippo <teemu@hecknology.net> 
parents: 
7 
diff
changeset
 | 
10 | 'Kukola': 'Hirvensalo', | 
| 
 
a47c9bde457d
Abstraktoi kyltti (jolloin kauppatorin jälkeiset alueet esitetään vähemmän tarkasti)
 
Teemu Piippo <teemu@hecknology.net> 
parents: 
7 
diff
changeset
 | 
11 | 'Oriniemi': 'Hirvensalo', | 
| 
 
a47c9bde457d
Abstraktoi kyltti (jolloin kauppatorin jälkeiset alueet esitetään vähemmän tarkasti)
 
Teemu Piippo <teemu@hecknology.net> 
parents: 
7 
diff
changeset
 | 
12 | 'Haarla': 'Hirvensalo', | 
| 
 
a47c9bde457d
Abstraktoi kyltti (jolloin kauppatorin jälkeiset alueet esitetään vähemmän tarkasti)
 
Teemu Piippo <teemu@hecknology.net> 
parents: 
7 
diff
changeset
 | 
13 | 'Lauttasaari': 'Hirvensalo', | 
| 
 
a47c9bde457d
Abstraktoi kyltti (jolloin kauppatorin jälkeiset alueet esitetään vähemmän tarkasti)
 
Teemu Piippo <teemu@hecknology.net> 
parents: 
7 
diff
changeset
 | 
14 | 'Pikisaari': 'Hirvensalo', | 
| 
 
a47c9bde457d
Abstraktoi kyltti (jolloin kauppatorin jälkeiset alueet esitetään vähemmän tarkasti)
 
Teemu Piippo <teemu@hecknology.net> 
parents: 
7 
diff
changeset
 | 
15 | 'Ylioppilaskylä': 'Nummi', | 
| 
 
a47c9bde457d
Abstraktoi kyltti (jolloin kauppatorin jälkeiset alueet esitetään vähemmän tarkasti)
 
Teemu Piippo <teemu@hecknology.net> 
parents: 
7 
diff
changeset
 | 
16 | 'Verkahovi': 'Nummi', | 
| 
 
a47c9bde457d
Abstraktoi kyltti (jolloin kauppatorin jälkeiset alueet esitetään vähemmän tarkasti)
 
Teemu Piippo <teemu@hecknology.net> 
parents: 
7 
diff
changeset
 | 
17 | 'Vienola': 'Pahaniemi', | 
| 
 
a47c9bde457d
Abstraktoi kyltti (jolloin kauppatorin jälkeiset alueet esitetään vähemmän tarkasti)
 
Teemu Piippo <teemu@hecknology.net> 
parents: 
7 
diff
changeset
 | 
18 | 'Takakirves': 'Kärsämäki', | 
| 
 
a47c9bde457d
Abstraktoi kyltti (jolloin kauppatorin jälkeiset alueet esitetään vähemmän tarkasti)
 
Teemu Piippo <teemu@hecknology.net> 
parents: 
7 
diff
changeset
 | 
19 | 'Liljalaakso': 'Länsinummi', | 
| 
 
a47c9bde457d
Abstraktoi kyltti (jolloin kauppatorin jälkeiset alueet esitetään vähemmän tarkasti)
 
Teemu Piippo <teemu@hecknology.net> 
parents: 
7 
diff
changeset
 | 
20 | 'Pernon telakka': 'Perno', | 
| 
 
a47c9bde457d
Abstraktoi kyltti (jolloin kauppatorin jälkeiset alueet esitetään vähemmän tarkasti)
 
Teemu Piippo <teemu@hecknology.net> 
parents: 
7 
diff
changeset
 | 
21 | } | 
| 
 
a47c9bde457d
Abstraktoi kyltti (jolloin kauppatorin jälkeiset alueet esitetään vähemmän tarkasti)
 
Teemu Piippo <teemu@hecknology.net> 
parents: 
7 
diff
changeset
 | 
22 | try: | 
| 
 
a47c9bde457d
Abstraktoi kyltti (jolloin kauppatorin jälkeiset alueet esitetään vähemmän tarkasti)
 
Teemu Piippo <teemu@hecknology.net> 
parents: 
7 
diff
changeset
 | 
23 | start = sign.index('Kauppatori') | 
| 
 
a47c9bde457d
Abstraktoi kyltti (jolloin kauppatorin jälkeiset alueet esitetään vähemmän tarkasti)
 
Teemu Piippo <teemu@hecknology.net> 
parents: 
7 
diff
changeset
 | 
24 | except ValueError: | 
| 
 
a47c9bde457d
Abstraktoi kyltti (jolloin kauppatorin jälkeiset alueet esitetään vähemmän tarkasti)
 
Teemu Piippo <teemu@hecknology.net> 
parents: 
7 
diff
changeset
 | 
25 | return sign | 
| 
 
a47c9bde457d
Abstraktoi kyltti (jolloin kauppatorin jälkeiset alueet esitetään vähemmän tarkasti)
 
Teemu Piippo <teemu@hecknology.net> 
parents: 
7 
diff
changeset
 | 
26 | result = [] | 
| 
 
a47c9bde457d
Abstraktoi kyltti (jolloin kauppatorin jälkeiset alueet esitetään vähemmän tarkasti)
 
Teemu Piippo <teemu@hecknology.net> 
parents: 
7 
diff
changeset
 | 
27 | for i, place in enumerate(sign): | 
| 
 
a47c9bde457d
Abstraktoi kyltti (jolloin kauppatorin jälkeiset alueet esitetään vähemmän tarkasti)
 
Teemu Piippo <teemu@hecknology.net> 
parents: 
7 
diff
changeset
 | 
28 | if i >= start: | 
| 
 
a47c9bde457d
Abstraktoi kyltti (jolloin kauppatorin jälkeiset alueet esitetään vähemmän tarkasti)
 
Teemu Piippo <teemu@hecknology.net> 
parents: 
7 
diff
changeset
 | 
29 | abstract_place = abstractions.get(place, place) | 
| 
 
a47c9bde457d
Abstraktoi kyltti (jolloin kauppatorin jälkeiset alueet esitetään vähemmän tarkasti)
 
Teemu Piippo <teemu@hecknology.net> 
parents: 
7 
diff
changeset
 | 
30 | if abstract_place not in result: | 
| 
 
a47c9bde457d
Abstraktoi kyltti (jolloin kauppatorin jälkeiset alueet esitetään vähemmän tarkasti)
 
Teemu Piippo <teemu@hecknology.net> 
parents: 
7 
diff
changeset
 | 
31 | result.append(abstract_place) | 
| 
 
a47c9bde457d
Abstraktoi kyltti (jolloin kauppatorin jälkeiset alueet esitetään vähemmän tarkasti)
 
Teemu Piippo <teemu@hecknology.net> 
parents: 
7 
diff
changeset
 | 
32 | else: | 
| 
 
a47c9bde457d
Abstraktoi kyltti (jolloin kauppatorin jälkeiset alueet esitetään vähemmän tarkasti)
 
Teemu Piippo <teemu@hecknology.net> 
parents: 
7 
diff
changeset
 | 
33 | result.append(place) | 
| 
 
a47c9bde457d
Abstraktoi kyltti (jolloin kauppatorin jälkeiset alueet esitetään vähemmän tarkasti)
 
Teemu Piippo <teemu@hecknology.net> 
parents: 
7 
diff
changeset
 | 
34 | return result | 
| 5 | 35 | if not reitti: | 
| 36 | return '' | |
| 37 | kunnat = {'Turku', 'Naantali', 'Lieto', 'Aura', 'Kaarina', 'Pargas', 'Marttila', 'Somero', 'Koski Tl', 'Tarvasjoki'} | |
| 38 | replacements = { | |
| 39 | "Ylioppilaskylä-Itä": "Ylioppilaskylä", | |
| 40 | "Ylioppilaskylä-Länsi": "Ylioppilaskylä", | |
| 41 | "Caribia": "Ylioppilaskylä", | |
| 42 | "Jokila": "Lieto", | |
| 43 | "Piispala": "Lieto", | |
| 44 | 'Saaro': 'Ruissalo', | |
| 45 | 'Silvola': 'Vahto', | |
| 46 | 'Hemmola': 'Vahto', | |
| 47 | 'Paasniittu': 'Ruskon keskusta', | |
| 48 | 'Kahari': 'Ruskon keskusta', | |
| 49 | } | |
| 50 | have_already = set() | |
| 51 | i = 0 | |
| 52 | while i < len(reitti): | |
| 53 | if reitti[i] in replacements: | |
| 54 | reitti[i] = replacements[reitti[i]] | |
| 55 | if reitti[i] in have_already: | |
| 56 | del reitti[i] | |
| 57 | else: | |
| 58 | have_already.add(reitti[i]) | |
| 59 | i += 1 | |
| 60 | prioriteetit = { | |
| 61 | 'Ihala': 150, | |
| 62 | 'Kauppakeskus Mylly': 200, | |
| 63 | 'Kuninkoja': 80, | |
| 64 | 'Moikoinen': 50, | |
| 65 | 'Raision keskusta': 100, | |
| 6 | 66 | 'Friskala': 20, | 
| 5 | 67 | 'Kukola': 50, | 
| 68 | 'Kaistarniemi': 50, | |
| 69 | 'Papinsaari': 50, | |
| 70 | 'Oriniemi': 50, | |
| 71 | 'Pikisaari': 50, | |
| 72 | 'Häppilä': 50, | |
| 73 | 'Haarla': 50, | |
| 74 | 'Ylioppilaskylä': 50, | |
| 75 | 'Halinen': 70, | |
| 76 | 'Kakskerta': 50, | |
| 77 | 'Pansio': 50, | |
| 78 | 'Räntämäki': 10, | |
| 79 | 'Verkahovi': 20, | |
| 80 | 'Skanssi': 200, | |
| 81 | 'Vaala': 20, | |
| 82 | 'Varissuo': 60, | |
| 83 | 'Kohmo': 80, | |
| 84 | 'Kupittaa': 70, | |
| 85 | 'Kauppatori': 1e15, | |
| 86 | 'Lentoasema': 50, | |
| 87 | 'Runosmäki': 50, | |
| 88 | 'Lieto': 100, | |
| 89 | 'Liedon asemanseutu': 200, | |
| 6 | 90 | 'Ilmarinen': 50, | 
| 5 | 91 | 'Vahto': 50, | 
| 92 | 'Ruskon keskusta': 200, | |
| 6 | 93 | 'Oriketo': 30, | 
| 5 | 94 | 'Harittu': 40, | 
| 95 | 'Jäkärlä': 50, | |
| 96 | 'Paattinen': 100, | |
| 97 | 'Kaarinan keskusta': 200, | |
| 98 | 'Naantalin keskusta': 200, | |
| 99 | 'Uittamo': 50, | |
| 6 | 100 | 'Piikkiö': 100, | 
| 101 | 'Paimio': 100, | |
| 5 | 102 | 'Pargas': 50, | 
| 103 | 'Yli-Maaria': 50, | |
| 104 | 'Saramäki': 50, | |
| 105 | 'Tarvasjoki': 100, | |
| 106 | 'Marttila': 100, | |
| 107 | 'Koski Tl': 100, | |
| 108 | 'Katariina': 50, | |
| 109 | 'Länsikeskus': 50, | |
| 110 | 'Kaanaa': 100, | |
| 111 | 'Satava': 50, | |
| 6 | 112 | 'Suikkila': 50, | 
| 113 | 'Raunistula': 50, | |
| 114 | 'Räntämäki': 50, | |
| 115 | 'Moisio': 25, | |
| 5 | 116 | } | 
| 117 | ||
| 118 | if 'Kauppatori' not in reitti: | |
| 119 | prioriteetit['Länsikeskus'] = prioriteetit['Skanssi'] = prioriteetit['Kauppatori'] | |
| 120 | ||
| 121 | # nimiä joista voidaan joustaa tarvittaessa | |
| 122 | helpot_supistukset = { | |
| 123 | 'Raision keskusta': 'Raisio', | |
| 124 | 'Ruskon keskusta': 'Rusko', | |
| 125 | 'Naantalin keskusta': 'Naantali', | |
| 126 | 'Kaarinan keskusta': 'Kaarina', | |
| 127 | 'Liedon asemanseutu': 'Lieto as.', | |
| 128 | 'Kauppakeskus Mylly': 'Mylly', | |
| 129 | } | |
| 130 | ||
| 131 | # jos ei nyt millään vaan mahdu muuten... | |
| 132 | vakavat_supistukset = { | |
| 133 | 'Kauppatori': 'Tori', | |
| 134 | 'Ylioppilaskylä': 'Yo-kylä', | |
| 135 | } | |
| 136 | ||
| 137 | lähtö = reitti[0] | |
| 138 | määränpää = reitti[-1] | |
| 139 | reitti_arvot = {} | |
| 140 | f = lambda i: i**-0.6 | |
| 141 | jakaja = max(f(i + 1) for i in range(len(reitti))) | |
| 142 | for i, pysäkki in enumerate(reitti): | |
| 143 | # muunna indeksi siten että myöhemmät alueet korostuvat | |
| 144 | i = f(i + 1) / jakaja | |
| 145 | # ota prioriteetti huomioon, jotkin alueet ovat tärkeämpiä kyltissä kuin toiset | |
| 146 | i *= prioriteetit.get(pysäkki, 1) | |
| 147 | reitti_arvot[pysäkki] = i | |
| 148 | # nollaa lähtöpaikan arvo ettei se mitenkään tule kylttiin | |
| 149 | if lähtö in reitti_arvot: | |
| 150 | reitti_arvot[lähtö] = 0 | |
| 151 | # varmista että määränpää tulee kylttiin | |
| 152 | reitti_arvot[määränpää] = 1e10 | |
| 153 | # muodosta kyltti-tiedot järjestettynä reittiarvon mukaan | |
| 154 | painot = sorted([ | |
| 155 | (pysäkki, reitti_arvot[pysäkki], i) \ | |
| 156 | for i, pysäkki in enumerate(reitti) \ | |
| 157 | if reitti_arvot[pysäkki] >= 1 | |
| 158 | ], key = lambda pysäkki: -pysäkki[1]) | |
| 159 | # enintään neljä tulee kylttiin | |
| 160 | painot = painot[:4] | |
| 161 | # jos neljäs kylttiarvo ei ole tarpeeksi merkittävä suhteessa reitin pituuteen niin otetaan neljäs pois | |
| 162 | if len(painot) == 4 and painot[3][0] != määränpää and painot[3][1] < (4000 / len(reitti) ** 1.5): | |
| 163 | del painot[3] | |
| 164 | # sama kolmannelle | |
| 165 | if len(painot) == 3 and painot[2][0] != määränpää and painot[2][1] < (500 / len(reitti) ** 1.5): | |
| 166 | del painot[2] | |
| 167 | if len(painot) == 2 and painot[1][0] != määränpää and painot[1][1] < (100 / len(reitti) ** 1.5): | |
| 168 | del painot[1] | |
| 169 | # lajitellaan painoarvot uudestaan reittijärjestykseen jotta kyltti tulee oikeinpäin | |
| 170 | painot = sorted(painot, key = lambda paino: paino[2]) | |
| 171 | # muodostetaan kyltti.. | |
| 172 | kyltti = [paino[0] for paino in painot] | |
| 
12
 
a47c9bde457d
Abstraktoi kyltti (jolloin kauppatorin jälkeiset alueet esitetään vähemmän tarkasti)
 
Teemu Piippo <teemu@hecknology.net> 
parents: 
7 
diff
changeset
 | 
173 | kyltti = abstract_sign(kyltti) | 
| 5 | 174 | # supista nimet jos mahdollista | 
| 175 | def viimeistele(kyltti, supistus_taso = 0): | |
| 176 | if supistus_taso > 0: | |
| 177 | kyltti = [helpot_supistukset.get(paikka, paikka) for paikka in kyltti] | |
| 178 | if supistus_taso > 1: | |
| 179 | kyltti = [vakavat_supistukset.get(paikka, paikka) for paikka in kyltti] | |
| 180 | return kyltti | |
| 181 | tulos = viimeistele(kyltti) | |
| 182 | if len(' - '.join(kyltti)) > 20: | |
| 183 | tulos = viimeistele(kyltti, supistus_taso = 1) | |
| 184 | if len(' - '.join(kyltti)) > 70: | |
| 185 | tulos = viimeistele(kyltti, supistus_taso = 2) | |
| 186 | if kokonainen: | |
| 187 | tulos = [lähtö] + tulos | |
| 188 | lyhyt_lähtö = replacements.get(lähtö, lähtö) | |
| 189 | if lyhyt_lähtö != tulos[-1] and helpot_supistukset.get(lyhyt_lähtö, lyhyt_lähtö) in kunnat | {'Kauppatori'} and tulos[-1] in kunnat | {'Kauppatori'}: | |
| 190 | tulos = ['Turku' if k == 'Kauppatori' else k for k in tulos] | |
| 191 | return tulos |