120 "Sauvo": 500, |
120 "Sauvo": 500, |
121 "Kemiönsaari": 500, |
121 "Kemiönsaari": 500, |
122 } |
122 } |
123 |
123 |
124 if 'Kauppatori' not in reitti: |
124 if 'Kauppatori' not in reitti: |
125 prioriteetit['Länsikeskus'] = prioriteetit['Skanssi'] = prioriteetit['Kauppatori'] |
125 priorities['Länsikeskus'] = priorities['Skanssi'] = priorities['Kauppatori'] |
126 |
126 |
127 # nimiä joista voidaan joustaa tarvittaessa |
127 # nimiä joista voidaan joustaa tarvittaessa |
128 helpot_supistukset = { |
128 abbreviations = { |
129 'Raision keskusta': 'Raisio', |
129 'Raision keskusta': 'Raisio', |
130 'Ruskon keskusta': 'Rusko', |
130 'Ruskon keskusta': 'Rusko', |
131 'Naantalin keskusta': 'Naantali', |
131 'Naantalin keskusta': 'Naantali', |
132 'Kaarinan keskusta': 'Kaarina', |
132 'Kaarinan keskusta': 'Kaarina', |
133 'Kauppakeskus Mylly': 'Mylly', |
133 'Kauppakeskus Mylly': 'Mylly', |
134 } |
134 } |
135 |
135 |
136 # jos ei nyt millään vaan mahdu muuten... |
136 from_place = reitti[0] |
137 vakavat_supistukset = { |
137 destination = reitti[-1] |
138 'Kauppatori': 'Tori', |
|
139 'Ylioppilaskylä': 'Yo-kylä', |
|
140 } |
|
141 |
|
142 lähtö = reitti[0] |
|
143 määränpää = reitti[-1] |
|
144 reitti_arvot = {} |
138 reitti_arvot = {} |
145 f = lambda i: i**-0.3 |
139 f = lambda i: i**-0.3 |
146 jakaja = max(f(i + 1) for i in range(len(reitti))) |
140 factor = 1 / max(f(i + 1) for i in range(len(reitti))) |
147 for i, pysäkki in enumerate(reitti): |
141 for i, stop in enumerate(reitti): |
148 # muunna indeksi siten että myöhemmät alueet korostuvat |
142 # muunna indeksi siten että myöhemmät alueet korostuvat |
149 i = f(i + 1) / jakaja |
143 i = f(i + 1) * factor |
150 # ota prioriteetti huomioon, jotkin alueet ovat tärkeämpiä kyltissä kuin toiset |
144 # ota prioriteetti huomioon, jotkin alueet ovat tärkeämpiä kyltissä kuin toiset |
151 i *= prioriteetit.get(pysäkki, 1) |
145 i *= priorities.get(stop, 1) |
152 reitti_arvot[pysäkki] = i |
146 reitti_arvot[stop] = i |
153 # nollaa lähtöpaikan arvo ettei se mitenkään tule kylttiin |
147 # nollaa lähtöpaikan arvo ettei se mitenkään tule kylttiin |
154 if lähtö in reitti_arvot: |
148 if from_place in reitti_arvot: |
155 reitti_arvot[lähtö] = 0 |
149 reitti_arvot[from_place] = 0 |
156 # varmista että määränpää tulee kylttiin |
150 # varmista että destination tulee kylttiin |
157 reitti_arvot[määränpää] = 1e10 |
151 reitti_arvot[destination] = 1e10 |
158 # muodosta kyltti-tiedot järjestettynä reittiarvon mukaan |
152 # muodosta sign-tiedot järjestettynä reittiarvon mukaan |
159 painot = sorted([ |
153 weights = sorted([ |
160 (pysäkki, reitti_arvot[pysäkki], i) \ |
154 (stop, reitti_arvot[stop], i) \ |
161 for i, pysäkki in enumerate(reitti) \ |
155 for i, stop in enumerate(reitti) \ |
162 if reitti_arvot[pysäkki] >= 1 |
156 if reitti_arvot[stop] >= 1 |
163 ], key = lambda pysäkki: -pysäkki[1]) |
157 ], key = lambda stop: -stop[1]) |
164 # enintään neljä tulee kylttiin |
158 # enintään neljä tulee kylttiin |
165 painot = painot[:3] |
159 weights = weights[:3] |
166 # jos kolmas kylttiarvo ei ole tarpeeksi merkittävä suhteessa reitin pituuteen niin otetaan se pois |
160 # jos kolmas kylttiarvo ei ole tarpeeksi merkittävä suhteessa reitin pituuteen niin otetaan se pois |
167 try: |
161 try: |
168 if painot[2][0] != määränpää and painot[2][1] < (1000 / length ** 1.15): |
162 if weights[2][0] != destination and weights[2][1] < (1000 / length ** 1.15): |
169 del painot[2] |
163 del weights[2] |
170 except IndexError: |
164 except IndexError: |
171 pass |
165 pass |
172 try: |
166 try: |
173 if painot[1][0] != määränpää and painot[1][1] < (500 / length ** 1.15): |
167 if weights[1][0] != destination and weights[1][1] < (500 / length ** 1.15): |
174 del painot[1] |
168 del weights[1] |
175 except IndexError: |
169 except IndexError: |
176 pass |
170 pass |
177 # lajitellaan painoarvot uudestaan reittijärjestykseen jotta kyltti tulee oikeinpäin |
171 # lajitellaan painoarvot uudestaan reittijärjestykseen jotta sign tulee oikeinpäin |
178 painot = sorted(painot, key = lambda paino: paino[2]) |
172 weights = sorted(weights, key = lambda paino: paino[2]) |
179 # muodostetaan kyltti.. |
173 # muodostetaan sign.. |
180 kyltti = [paino[0] for paino in painot] |
174 sign = [paino[0] for paino in weights] |
181 #kyltti = abstract_sign(kyltti) |
175 #sign = abstract_sign(sign) |
182 # supista nimet jos mahdollista |
176 # supista nimet jos mahdollista |
183 def viimeistele(kyltti, supistus_taso = 0): |
177 def finalise(sign, abbreviation_level = 0): |
184 if supistus_taso > 0: |
178 if abbreviation_level > 0: |
185 kyltti = [helpot_supistukset.get(paikka, paikka) for paikka in kyltti] |
179 sign = [abbreviations.get(paikka, paikka) for paikka in sign] |
186 if supistus_taso > 1: |
180 return sign |
187 kyltti = [vakavat_supistukset.get(paikka, paikka) for paikka in kyltti] |
181 result = finalise(sign) |
188 return kyltti |
182 for i in range(len(sign) - 1): |
189 tulos = viimeistele(kyltti) |
183 if sign[i + 1].startswith(sign[i]): |
190 for i in range(len(kyltti) - 1): |
184 del sign[i] |
191 if kyltti[i + 1].startswith(kyltti[i]): |
185 if len(' - '.join(sign)) > 20: |
192 del kyltti[i] |
186 result = finalise(sign, abbreviation_level = 1) |
193 if len(' - '.join(kyltti)) > 20: |
187 if whole: |
194 tulos = viimeistele(kyltti, supistus_taso = 1) |
188 result = [from_place] + result |
195 if len(' - '.join(kyltti)) > 70: |
189 short_from_place = replacements.get(from_place, from_place) |
196 tulos = viimeistele(kyltti, supistus_taso = 2) |
190 if ( |
197 if kokonainen: |
191 short_from_place != result[-1] |
198 tulos = [lähtö] + tulos |
192 and abbreviations.get(short_from_place, short_from_place) in eksoalueet | {'Kauppatori'} |
199 lyhyt_lähtö = replacements.get(lähtö, lähtö) |
193 and result[-1] in eksoalueet | {'Kauppatori'} |
200 if lyhyt_lähtö != tulos[-1] and helpot_supistukset.get(lyhyt_lähtö, lyhyt_lähtö) in eksoalueet | {'Kauppatori'} and tulos[-1] in eksoalueet | {'Kauppatori'}: |
194 ): |
201 tulos = ['Turku' if k == 'Kauppatori' else k for k in tulos] |
195 result = ['Turku' if k == 'Kauppatori' else k for k in result] |
202 return tulos |
196 return result |