Renamed 'sequence' to 'substring'
[ou-summer-of-code-2017.git] / monotone-substrings / single_substring_itertools.ipynb
1 {
2 "cells": [
3 {
4 "cell_type": "code",
5 "execution_count": 1,
6 "metadata": {
7 "collapsed": true
8 },
9 "outputs": [],
10 "source": [
11 "import itertools"
12 ]
13 },
14 {
15 "cell_type": "code",
16 "execution_count": 2,
17 "metadata": {
18 "collapsed": true
19 },
20 "outputs": [],
21 "source": [
22 "def cmp(x, y):\n",
23 " if x == y:\n",
24 " return 0\n",
25 " elif x > y:\n",
26 " return -1\n",
27 " else:\n",
28 " return 1"
29 ]
30 },
31 {
32 "cell_type": "code",
33 "execution_count": 3,
34 "metadata": {
35 "collapsed": false
36 },
37 "outputs": [],
38 "source": [
39 "def longest_monotone(seq, allow_same=False, debug=False):\n",
40 " \"\"\"Find the longest monotonic substring. If allow_same is True, \n",
41 " instead find the longest non-decreasing or non-increasing substring\"\"\"\n",
42 " cmps = [cmp(x, y) for x, y in zip(seq, seq[1:])]\n",
43 " groups = [(k, len(list(g)) + 1) for k, g in itertools.groupby(cmps)]\n",
44 " if allow_same:\n",
45 " groups = merged(groups)\n",
46 " if debug:\n",
47 " return max(t[1] for t in groups), groups\n",
48 " else:\n",
49 " return max(t[1] for t in groups)"
50 ]
51 },
52 {
53 "cell_type": "code",
54 "execution_count": 4,
55 "metadata": {
56 "collapsed": true
57 },
58 "outputs": [],
59 "source": [
60 "def merged(gs):\n",
61 " padded = gs + [(0, 0)]\n",
62 " mgs = []\n",
63 " prev = (0, 1)\n",
64 " for curr, nxt in zip(padded, padded[1:]):\n",
65 " if prev[0] == 0:\n",
66 " prev = (curr[0], prev[1] + curr[1] - 1)\n",
67 " elif curr[0] == 0:\n",
68 " prev = (prev[0], prev[1] + curr[1] - 1)\n",
69 " if prev[0] != nxt[0]:\n",
70 " mgs += [prev]\n",
71 " prev = (0, curr[1])\n",
72 " elif prev[0] == curr[0]:\n",
73 " prev = (prev[0], prev[1] + curr[1] - 1)\n",
74 " else:\n",
75 " mgs += [prev]\n",
76 " prev = curr\n",
77 " mgs += [prev]\n",
78 " return mgs "
79 ]
80 },
81 {
82 "cell_type": "code",
83 "execution_count": 5,
84 "metadata": {
85 "collapsed": false
86 },
87 "outputs": [
88 {
89 "data": {
90 "text/plain": [
91 "5"
92 ]
93 },
94 "execution_count": 5,
95 "metadata": {},
96 "output_type": "execute_result"
97 }
98 ],
99 "source": [
100 "longest_monotone([1,2,3,4,5,4,5,6])"
101 ]
102 },
103 {
104 "cell_type": "code",
105 "execution_count": 6,
106 "metadata": {
107 "collapsed": false
108 },
109 "outputs": [
110 {
111 "data": {
112 "text/plain": [
113 "(5, [(1, 5), (-1, 2), (1, 3)])"
114 ]
115 },
116 "execution_count": 6,
117 "metadata": {},
118 "output_type": "execute_result"
119 }
120 ],
121 "source": [
122 "longest_monotone([1,2,3,4,5,4,5,6], debug=True)"
123 ]
124 },
125 {
126 "cell_type": "code",
127 "execution_count": 7,
128 "metadata": {
129 "collapsed": false
130 },
131 "outputs": [
132 {
133 "data": {
134 "text/plain": [
135 "5"
136 ]
137 },
138 "execution_count": 7,
139 "metadata": {},
140 "output_type": "execute_result"
141 }
142 ],
143 "source": [
144 "longest_monotone([10,1,2,3,4,5,4,5,6])"
145 ]
146 },
147 {
148 "cell_type": "code",
149 "execution_count": 8,
150 "metadata": {
151 "collapsed": false
152 },
153 "outputs": [
154 {
155 "data": {
156 "text/plain": [
157 "5"
158 ]
159 },
160 "execution_count": 8,
161 "metadata": {},
162 "output_type": "execute_result"
163 }
164 ],
165 "source": [
166 "longest_monotone([10,1,2,3,4,5,5,5,4,3,5,6])"
167 ]
168 },
169 {
170 "cell_type": "code",
171 "execution_count": 9,
172 "metadata": {
173 "collapsed": false
174 },
175 "outputs": [
176 {
177 "data": {
178 "text/plain": [
179 "7"
180 ]
181 },
182 "execution_count": 9,
183 "metadata": {},
184 "output_type": "execute_result"
185 }
186 ],
187 "source": [
188 "longest_monotone([10,1,2,3,4,5,5,5,4,3,5,6], allow_same=True)"
189 ]
190 },
191 {
192 "cell_type": "code",
193 "execution_count": 10,
194 "metadata": {
195 "collapsed": false
196 },
197 "outputs": [
198 {
199 "data": {
200 "text/plain": [
201 "5"
202 ]
203 },
204 "execution_count": 10,
205 "metadata": {},
206 "output_type": "execute_result"
207 }
208 ],
209 "source": [
210 "longest_monotone([10,1,2,5,5,5,4,3,2,1,5,6])"
211 ]
212 },
213 {
214 "cell_type": "code",
215 "execution_count": 11,
216 "metadata": {
217 "collapsed": false
218 },
219 "outputs": [
220 {
221 "data": {
222 "text/plain": [
223 "7"
224 ]
225 },
226 "execution_count": 11,
227 "metadata": {},
228 "output_type": "execute_result"
229 }
230 ],
231 "source": [
232 "longest_monotone([10,1,2,5,5,5,4,3,2,1,5,6], allow_same=True)"
233 ]
234 },
235 {
236 "cell_type": "code",
237 "execution_count": 12,
238 "metadata": {
239 "collapsed": false
240 },
241 "outputs": [
242 {
243 "data": {
244 "text/plain": [
245 "7"
246 ]
247 },
248 "execution_count": 12,
249 "metadata": {},
250 "output_type": "execute_result"
251 }
252 ],
253 "source": [
254 "longest_monotone([10,1,2,5,5,5,4,3,2,5,6,6,6,6,6,6,6,2])"
255 ]
256 },
257 {
258 "cell_type": "code",
259 "execution_count": 13,
260 "metadata": {
261 "collapsed": false
262 },
263 "outputs": [
264 {
265 "data": {
266 "text/plain": [
267 "9"
268 ]
269 },
270 "execution_count": 13,
271 "metadata": {},
272 "output_type": "execute_result"
273 }
274 ],
275 "source": [
276 "longest_monotone([10,1,2,5,5,5,4,3,2,5,6,6,6,6,6,6,6,2], allow_same=True)"
277 ]
278 },
279 {
280 "cell_type": "code",
281 "execution_count": 14,
282 "metadata": {
283 "collapsed": false
284 },
285 "outputs": [
286 {
287 "data": {
288 "text/plain": [
289 "7"
290 ]
291 },
292 "execution_count": 14,
293 "metadata": {},
294 "output_type": "execute_result"
295 }
296 ],
297 "source": [
298 "longest_monotone([10,1,2,5,5,5,6,7,7,8,8,3,2,5,6,6,6,6,6,6,6,2], allow_same=False)"
299 ]
300 },
301 {
302 "cell_type": "code",
303 "execution_count": 15,
304 "metadata": {
305 "collapsed": false
306 },
307 "outputs": [
308 {
309 "data": {
310 "text/plain": [
311 "10"
312 ]
313 },
314 "execution_count": 15,
315 "metadata": {},
316 "output_type": "execute_result"
317 }
318 ],
319 "source": [
320 "longest_monotone([10,1,2,5,5,5,6,7,7,8,8,3,2,5,6,6,6,6,6,6,6,2], allow_same=True)"
321 ]
322 },
323 {
324 "cell_type": "code",
325 "execution_count": 16,
326 "metadata": {
327 "collapsed": false
328 },
329 "outputs": [
330 {
331 "name": "stdout",
332 "output_type": "stream",
333 "text": [
334 "0 24\n"
335 ]
336 }
337 ],
338 "source": [
339 "for i in range(1):\n",
340 " with open('sequence{:03}.txt'.format(i)) as f:\n",
341 " sseq = f.read()\n",
342 " seq = [int(s) for s in sseq.split(',')]\n",
343 " s = longest_monotone(seq)\n",
344 " print(i, s)"
345 ]
346 },
347 {
348 "cell_type": "code",
349 "execution_count": 17,
350 "metadata": {
351 "collapsed": false
352 },
353 "outputs": [
354 {
355 "name": "stdout",
356 "output_type": "stream",
357 "text": [
358 "0 24\n",
359 "1 34\n",
360 "2 23\n",
361 "3 23\n",
362 "4 22\n",
363 "5 27\n",
364 "6 27\n",
365 "7 24\n",
366 "8 22\n",
367 "9 21\n"
368 ]
369 }
370 ],
371 "source": [
372 "for i in range(10):\n",
373 " with open('sequence{:03}.txt'.format(i)) as f:\n",
374 " sseq = f.read()\n",
375 " seq = [int(s) for s in sseq.split(',')]\n",
376 " s = longest_monotone(seq)\n",
377 " print(i, s)"
378 ]
379 },
380 {
381 "cell_type": "code",
382 "execution_count": 18,
383 "metadata": {
384 "collapsed": false
385 },
386 "outputs": [
387 {
388 "name": "stdout",
389 "output_type": "stream",
390 "text": [
391 "0 29\n",
392 "1 34\n",
393 "2 25\n",
394 "3 30\n",
395 "4 29\n",
396 "5 27\n",
397 "6 27\n",
398 "7 28\n",
399 "8 23\n",
400 "9 26\n"
401 ]
402 }
403 ],
404 "source": [
405 "for i in range(10):\n",
406 " with open('sequence{:03}.txt'.format(i)) as f:\n",
407 " sseq = f.read()\n",
408 " seq = [int(s) for s in sseq.split(',')]\n",
409 " s = longest_monotone(seq, allow_same=True)\n",
410 " print(i, s)"
411 ]
412 },
413 {
414 "cell_type": "code",
415 "execution_count": null,
416 "metadata": {
417 "collapsed": true
418 },
419 "outputs": [],
420 "source": []
421 }
422 ],
423 "metadata": {
424 "kernelspec": {
425 "display_name": "Python 3",
426 "language": "python",
427 "name": "python3"
428 },
429 "language_info": {
430 "codemirror_mode": {
431 "name": "ipython",
432 "version": 3
433 },
434 "file_extension": ".py",
435 "mimetype": "text/x-python",
436 "name": "python",
437 "nbconvert_exporter": "python",
438 "pygments_lexer": "ipython3",
439 "version": "3.5.2"
440 }
441 },
442 "nbformat": 4,
443 "nbformat_minor": 0
444 }