diff --git a/teil12/pool_squares.py b/teil12/pool_squares.py index 7a883c6..01a5068 100644 --- a/teil12/pool_squares.py +++ b/teil12/pool_squares.py @@ -1,5 +1,4 @@ #encoding: UTF-8 -#Quelle: https://stackoverflow.com/questions/6976372/mulitprocess-pools-with-different-functions import datetime from timeit import default_timer as timer @@ -10,19 +9,23 @@ from multiprocessing import Pool __verbose__ = False +# gibt den String s nur aus, wenn __verbose__ True ist. def print_verbose(s): if __verbose__: print(s) +# Arbeitsfunktion läuft in der Zahlenliste von start bis ende +# und summiert die Quadratzahlen in dem Bereich auf. +# Die Methode wird in jedem Prozess mit unterschiedlichen Werten +# für start und ende abgearbeitet. def calc_sum_square(zahlen, *args,**kwargs): + print(f'calc_sum_square() {args}') + time.sleep(1.0) start = kwargs['start'] ende = kwargs['end'] threadnr = kwargs['threadnr'] summe = 0 -# print_verbose(f'x={x}') -# time.sleep(1.0) -# print_verbose(f'kwargs={kwargs}') print_verbose(f'von {start} bis {ende}') for n in range(start,ende): i = zahlen[n] @@ -31,30 +34,42 @@ def calc_sum_square(zahlen, *args,**kwargs): return summe +# Diese Methode wird initial pro Prozess von der Poolsteuerung aufgerufen und +# steuert die Verteilung der Parameter. +# f ist der Zeiger auf die aufzurufende Methode +# *arg wnthält das Tupel mit den Argumenten +# def smap(f, *arg): + +# Auflösen des Tupels: args enthält die Liste mit den Zahlen, +# kwarg das Dictionary mit den Parametern für jeden Prozess args, kwargs = arg -# print(f'smap() args= {args}') - time.sleep(1.0) -# print(f'smap() kwargs={kwargs}') - time.sleep(1.0) - return f(list(args), **kwargs) +# Aufruf der übergebenen Funktion mit den Parametern + return f(args, **kwargs) if __name__ == '__main__': start = timer() + # Liste mit 10 Mio Integerzahlen anlegen. zahlen = [i for i in range(10000000)] ende = timer() print(f'Zahlenliste erzeugt in {ende-start}s') split = int(len(zahlen) / 3) - print(f'split={split}') + print_verbose(f'split={split}') time.sleep(1.0) start = timer() +# Pool mit drei Prozesssen with Pool(processes=3) as pool: +# Die Methode pool.starmap() bekommt neben der aufzurufenden Methode smap() eine Liste von Tupeln. +# Jedes Tupel enthält pro Prozess die auszuführende Methode, die Liste mit den Zahlen und ein Dictionary mit +# den Parametern 'threadnr', 'start' und 'end' +# starmap() wartet solange, bis alle drei Teilprozesse beendet sind und gibt dann eine Liste mit den return Werten +# zurück. result = pool.starmap(smap, [(calc_sum_square, zahlen, {'threadnr':1,'start':0, 'end':split}), (calc_sum_square, zahlen, {'threadnr':2,'start':split+1,'end':split*2}), (calc_sum_square, zahlen,{'threadnr':3,'start':(split*2)+1,'end':split*3})]) print(f'Ergebnis: {result}') ende = timer() diff --git a/teil12/zahlen.txt b/teil12/zahlen.txt deleted file mode 100644 index 46c4509..0000000 --- a/teil12/zahlen.txt +++ /dev/null @@ -1,2000 +0,0 @@ -0:1 -1:1 -0:2 -2:1 -1:2 -3:1 -2:2 -4:1 -3:2 -5:1 -4:2 -6:1 -5:2 -7:1 -6:2 -8:1 -7:2 -9:1 -8:2 -10:1 -9:2 -11:1 -10:2 -12:1 -11:2 -13:1 -12:2 -14:1 -13:2 -15:1 -14:2 -16:1 -15:2 -17:1 -16:2 -18:1 -17:2 -19:1 -18:2 -20:1 -19:2 -21:1 -20:2 -22:1 -21:2 -23:1 -22:2 -24:1 -23:2 -25:1 -24:2 -26:1 -25:2 -27:1 -26:2 -28:1 -27:2 -29:1 -28:2 -30:1 -29:2 -31:1 -30:2 -32:1 -31:2 -33:1 -32:2 -34:1 -33:2 -35:1 -34:2 -36:1 -35:2 -37:1 -36:2 -38:1 -37:2 -39:1 -38:2 -40:1 -39:2 -41:1 -40:2 -42:1 -41:2 -43:1 -42:2 -44:1 -43:2 -45:1 -44:2 -46:1 -45:2 -47:1 -46:2 -48:1 -47:2 -49:1 -48:2 -50:1 -49:2 -51:1 -50:2 -52:1 -51:2 -53:1 -52:2 -54:1 -53:2 -55:1 -54:2 -56:1 -55:2 -57:1 -56:2 -58:1 -57:2 -59:1 -58:2 -60:1 -59:2 -61:1 -60:2 -62:1 -61:2 -63:1 -62:2 -64:1 -63:2 -65:1 -64:2 -66:1 -65:2 -67:1 -66:2 -68:1 -67:2 -69:1 -68:2 -70:1 -69:2 -71:1 -70:2 -72:1 -71:2 -73:1 -72:2 -74:1 -73:2 -75:1 -74:2 -76:1 -75:2 -77:1 -76:2 -78:1 -77:2 -79:1 -78:2 -80:1 -79:2 -81:1 -80:2 -82:1 -81:2 -83:1 -82:2 -84:1 -83:2 -85:1 -84:2 -86:1 -85:2 -87:1 -86:2 -88:1 -87:2 -89:1 -88:2 -90:1 -89:2 -91:1 -90:2 -92:1 -91:2 -93:1 -92:2 -94:1 -93:2 -95:1 -94:2 -96:1 -95:2 -97:1 -96:2 -98:1 -97:2 -99:1 -98:2 -100:1 -99:2 -101:1 -100:2 -102:1 -101:2 -103:1 -102:2 -104:1 -103:2 -105:1 -104:2 -106:1 -105:2 -107:1 -106:2 -108:1 -107:2 -109:1 -108:2 -110:1 -109:2 -111:1 -110:2 -112:1 -111:2 -113:1 -112:2 -114:1 -113:2 -115:1 -114:2 -116:1 -115:2 -117:1 -116:2 -118:1 -117:2 -119:1 -118:2 -120:1 -119:2 -121:1 -120:2 -122:1 -121:2 -123:1 -122:2 -124:1 -123:2 -125:1 -124:2 -126:1 -125:2 -127:1 -126:2 -128:1 -127:2 -129:1 -128:2 -130:1 -129:2 -131:1 -130:2 -132:1 -131:2 -133:1 -132:2 -134:1 -133:2 -135:1 -134:2 -136:1 -135:2 -137:1 -136:2 -138:1 -137:2 -139:1 -138:2 -140:1 -139:2 -141:1 -140:2 -142:1 -141:2 -143:1 -142:2 -144:1 -143:2 -145:1 -144:2 -146:1 -145:2 -147:1 -146:2 -148:1 -147:2 -149:1 -148:2 -150:1 -149:2 -151:1 -150:2 -152:1 -151:2 -153:1 -152:2 -154:1 -153:2 -155:1 -154:2 -156:1 -155:2 -157:1 -156:2 -158:1 -157:2 -159:1 -158:2 -160:1 -159:2 -161:1 -160:2 -162:1 -161:2 -163:1 -162:2 -164:1 -163:2 -165:1 -164:2 -166:1 -165:2 -167:1 -166:2 -168:1 -167:2 -169:1 -168:2 -170:1 -169:2 -171:1 -170:2 -172:1 -171:2 -173:1 -172:2 -174:1 -173:2 -175:1 -174:2 -176:1 -175:2 -177:1 -176:2 -178:1 -177:2 -179:1 -178:2 -180:1 -179:2 -181:1 -180:2 -182:1 -181:2 -183:1 -182:2 -184:1 -183:2 -185:1 -184:2 -186:1 -185:2 -187:1 -186:2 -188:1 -187:2 -189:1 -188:2 -190:1 -189:2 -191:1 -190:2 -192:1 -191:2 -193:1 -192:2 -194:1 -193:2 -195:1 -194:2 -196:1 -195:2 -197:1 -196:2 -198:1 -197:2 -199:1 -198:2 -200:1 -199:2 -201:1 -200:2 -202:1 -201:2 -203:1 -202:2 -204:1 -203:2 -205:1 -204:2 -206:1 -205:2 -207:1 -206:2 -208:1 -207:2 -209:1 -208:2 -210:1 -209:2 -211:1 -210:2 -212:1 -211:2 -213:1 -212:2 -214:1 -213:2 -215:1 -214:2 -216:1 -215:2 -217:1 -216:2 -218:1 -217:2 -219:1 -218:2 -220:1 -219:2 -221:1 -220:2 -222:1 -221:2 -223:1 -222:2 -224:1 -223:2 -225:1 -224:2 -226:1 -225:2 -227:1 -226:2 -228:1 -227:2 -229:1 -228:2 -230:1 -229:2 -231:1 -230:2 -232:1 -231:2 -233:1 -232:2 -234:1 -233:2 -235:1 -234:2 -236:1 -235:2 -237:1 -236:2 -238:1 -237:2 -239:1 -238:2 -240:1 -239:2 -241:1 -240:2 -242:1 -241:2 -243:1 -242:2 -244:1 -243:2 -245:1 -244:2 -246:1 -245:2 -247:1 -246:2 -248:1 -247:2 -249:1 -248:2 -250:1 -249:2 -251:1 -250:2 -252:1 -251:2 -253:1 -252:2 -254:1 -253:2 -255:1 -254:2 -256:1 -255:2 -257:1 -256:2 -258:1 -257:2 -259:1 -258:2 -260:1 -259:2 -261:1 -260:2 -262:1 -261:2 -263:1 -262:2 -264:1 -263:2 -265:1 -264:2 -266:1 -265:2 -267:1 -266:2 -268:1 -267:2 -269:1 -268:2 -270:1 -269:2 -271:1 -270:2 -272:1 -271:2 -273:1 -272:2 -274:1 -273:2 -275:1 -274:2 -276:1 -275:2 -277:1 -276:2 -278:1 -277:2 -279:1 -278:2 -280:1 -279:2 -281:1 -280:2 -282:1 -281:2 -283:1 -282:2 -284:1 -283:2 -285:1 -284:2 -286:1 -285:2 -287:1 -286:2 -288:1 -287:2 -289:1 -288:2 -290:1 -289:2 -291:1 -290:2 -292:1 -291:2 -293:1 -292:2 -294:1 -293:2 -295:1 -294:2 -296:1 -295:2 -297:1 -296:2 -298:1 -297:2 -299:1 -298:2 -300:1 -299:2 -301:1 -300:2 -302:1 -301:2 -303:1 -302:2 -304:1 -303:2 -305:1 -304:2 -306:1 -305:2 -307:1 -306:2 -308:1 -307:2 -309:1 -308:2 -310:1 -309:2 -311:1 -310:2 -312:1 -311:2 -313:1 -312:2 -314:1 -313:2 -315:1 -314:2 -316:1 -315:2 -317:1 -316:2 -318:1 -317:2 -319:1 -318:2 -320:1 -319:2 -321:1 -320:2 -322:1 -321:2 -323:1 -322:2 -324:1 -323:2 -325:1 -324:2 -326:1 -325:2 -327:1 -326:2 -328:1 -327:2 -329:1 -328:2 -330:1 -329:2 -331:1 -330:2 -332:1 -331:2 -333:1 -332:2 -334:1 -333:2 -335:1 -334:2 -336:1 -335:2 -337:1 -336:2 -338:1 -337:2 -339:1 -338:2 -340:1 -339:2 -341:1 -340:2 -342:1 -341:2 -343:1 -342:2 -344:1 -343:2 -345:1 -344:2 -346:1 -345:2 -347:1 -346:2 -348:1 -347:2 -349:1 -348:2 -350:1 -349:2 -351:1 -350:2 -352:1 -351:2 -353:1 -352:2 -354:1 -353:2 -355:1 -354:2 -356:1 -355:2 -357:1 -356:2 -358:1 -357:2 -359:1 -358:2 -360:1 -359:2 -361:1 -360:2 -362:1 -361:2 -363:1 -362:2 -364:1 -363:2 -365:1 -364:2 -366:1 -365:2 -367:1 -366:2 -368:1 -367:2 -369:1 -368:2 -370:1 -369:2 -371:1 -370:2 -372:1 -371:2 -373:1 -372:2 -374:1 -373:2 -375:1 -374:2 -376:1 -375:2 -377:1 -376:2 -378:1 -377:2 -379:1 -378:2 -380:1 -379:2 -381:1 -380:2 -382:1 -381:2 -383:1 -382:2 -384:1 -383:2 -385:1 -384:2 -386:1 -385:2 -387:1 -386:2 -388:1 -387:2 -389:1 -388:2 -390:1 -389:2 -391:1 -390:2 -392:1 -391:2 -393:1 -392:2 -394:1 -393:2 -395:1 -394:2 -396:1 -395:2 -397:1 -396:2 -398:1 -397:2 -399:1 -398:2 -400:1 -399:2 -401:1 -400:2 -402:1 -401:2 -403:1 -402:2 -404:1 -403:2 -405:1 -404:2 -406:1 -405:2 -407:1 -406:2 -408:1 -407:2 -409:1 -408:2 -410:1 -409:2 -411:1 -410:2 -412:1 -411:2 -413:1 -412:2 -414:1 -413:2 -415:1 -414:2 -416:1 -415:2 -417:1 -416:2 -418:1 -417:2 -419:1 -418:2 -420:1 -419:2 -421:1 -420:2 -422:1 -421:2 -423:1 -422:2 -424:1 -423:2 -425:1 -424:2 -426:1 -425:2 -427:1 -426:2 -428:1 -427:2 -429:1 -428:2 -430:1 -429:2 -431:1 -430:2 -432:1 -431:2 -433:1 -432:2 -434:1 -433:2 -435:1 -434:2 -436:1 -435:2 -437:1 -436:2 -438:1 -437:2 -439:1 -438:2 -440:1 -439:2 -441:1 -440:2 -442:1 -441:2 -443:1 -442:2 -444:1 -443:2 -445:1 -444:2 -446:1 -445:2 -447:1 -446:2 -448:1 -447:2 -449:1 -448:2 -450:1 -449:2 -451:1 -450:2 -452:1 -451:2 -453:1 -452:2 -454:1 -453:2 -455:1 -454:2 -456:1 -455:2 -457:1 -456:2 -458:1 -457:2 -459:1 -458:2 -460:1 -459:2 -461:1 -460:2 -462:1 -461:2 -463:1 -462:2 -464:1 -463:2 -465:1 -464:2 -466:1 -465:2 -467:1 -466:2 -468:1 -467:2 -469:1 -468:2 -470:1 -469:2 -471:1 -470:2 -472:1 -471:2 -473:1 -472:2 -474:1 -473:2 -475:1 -474:2 -476:1 -475:2 -477:1 -476:2 -478:1 -477:2 -479:1 -478:2 -480:1 -479:2 -481:1 -480:2 -482:1 -481:2 -483:1 -482:2 -484:1 -483:2 -485:1 -484:2 -486:1 -485:2 -487:1 -486:2 -488:1 -487:2 -489:1 -488:2 -490:1 -489:2 -491:1 -490:2 -492:1 -491:2 -493:1 -492:2 -494:1 -493:2 -495:1 -494:2 -496:1 -495:2 -497:1 -496:2 -498:1 -497:2 -499:1 -498:2 -500:1 -499:2 -501:1 -500:2 -502:1 -501:2 -503:1 -502:2 -504:1 -503:2 -505:1 -504:2 -506:1 -505:2 -507:1 -506:2 -508:1 -507:2 -509:1 -508:2 -510:1 -509:2 -511:1 -510:2 -512:1 -511:2 -513:1 -512:2 -514:1 -513:2 -515:1 -514:2 -516:1 -515:2 -517:1 -516:2 -518:1 -517:2 -519:1 -518:2 -520:1 -519:2 -521:1 -520:2 -522:1 -521:2 -523:1 -522:2 -524:1 -523:2 -525:1 -524:2 -526:1 -525:2 -527:1 -526:2 -528:1 -527:2 -529:1 -528:2 -530:1 -529:2 -531:1 -530:2 -532:1 -531:2 -533:1 -532:2 -534:1 -533:2 -535:1 -534:2 -536:1 -535:2 -537:1 -536:2 -538:1 -537:2 -539:1 -538:2 -540:1 -539:2 -541:1 -540:2 -542:1 -541:2 -543:1 -542:2 -544:1 -543:2 -544:2 -545:2 -546:2 -547:2 -548:2 -549:2 -550:2 -551:2 -552:2 -553:2 -554:2 -555:2 -556:2 -557:2 -545:1 -558:2 -546:1 -559:2 -547:1 -560:2 -548:1 -561:2 -549:1 -562:2 -550:1 -563:2 -551:1 -564:2 -552:1 -565:2 -553:1 -566:2 -554:1 -567:2 -555:1 -568:2 -556:1 -569:2 -557:1 -570:2 -558:1 -571:2 -559:1 -572:2 -560:1 -573:2 -561:1 -574:2 -562:1 -575:2 -563:1 -576:2 -564:1 -577:2 -565:1 -578:2 -566:1 -579:2 -567:1 -580:2 -568:1 -581:2 -569:1 -582:2 -570:1 -583:2 -571:1 -584:2 -572:1 -585:2 -573:1 -586:2 -574:1 -587:2 -575:1 -588:2 -576:1 -589:2 -577:1 -590:2 -578:1 -591:2 -579:1 -592:2 -580:1 -593:2 -581:1 -594:2 -582:1 -595:2 -583:1 -596:2 -584:1 -597:2 -585:1 -598:2 -586:1 -599:2 -587:1 -600:2 -588:1 -601:2 -589:1 -602:2 -590:1 -603:2 -591:1 -604:2 -592:1 -605:2 -593:1 -606:2 -594:1 -607:2 -595:1 -608:2 -596:1 -609:2 -597:1 -610:2 -598:1 -611:2 -599:1 -612:2 -600:1 -613:2 -601:1 -614:2 -602:1 -615:2 -603:1 -616:2 -604:1 -617:2 -605:1 -618:2 -606:1 -619:2 -607:1 -620:2 -608:1 -621:2 -609:1 -622:2 -610:1 -623:2 -611:1 -624:2 -612:1 -625:2 -613:1 -626:2 -614:1 -627:2 -615:1 -628:2 -616:1 -629:2 -617:1 -630:2 -618:1 -631:2 -619:1 -632:2 -620:1 -633:2 -621:1 -634:2 -622:1 -635:2 -623:1 -636:2 -624:1 -637:2 -625:1 -638:2 -626:1 -639:2 -627:1 -640:2 -628:1 -641:2 -629:1 -642:2 -630:1 -643:2 -631:1 -644:2 -632:1 -645:2 -633:1 -646:2 -634:1 -647:2 -635:1 -648:2 -636:1 -649:2 -637:1 -650:2 -638:1 -651:2 -639:1 -652:2 -640:1 -653:2 -641:1 -654:2 -642:1 -655:2 -643:1 -656:2 -644:1 -657:2 -645:1 -658:2 -646:1 -659:2 -647:1 -660:2 -648:1 -661:2 -649:1 -662:2 -650:1 -663:2 -651:1 -664:2 -652:1 -665:2 -653:1 -666:2 -654:1 -667:2 -655:1 -668:2 -656:1 -669:2 -657:1 -670:2 -658:1 -671:2 -659:1 -672:2 -660:1 -673:2 -661:1 -674:2 -662:1 -675:2 -663:1 -676:2 -664:1 -677:2 -665:1 -678:2 -666:1 -679:2 -667:1 -680:2 -668:1 -681:2 -669:1 -682:2 -670:1 -683:2 -671:1 -684:2 -672:1 -685:2 -673:1 -686:2 -674:1 -687:2 -675:1 -688:2 -676:1 -689:2 -677:1 -690:2 -678:1 -691:2 -679:1 -692:2 -680:1 -693:2 -681:1 -694:2 -682:1 -695:2 -683:1 -696:2 -684:1 -697:2 -685:1 -698:2 -686:1 -699:2 -687:1 -700:2 -688:1 -701:2 -689:1 -702:2 -690:1 -703:2 -691:1 -704:2 -692:1 -705:2 -693:1 -706:2 -694:1 -707:2 -695:1 -708:2 -696:1 -709:2 -697:1 -710:2 -698:1 -711:2 -699:1 -712:2 -700:1 -713:2 -701:1 -714:2 -702:1 -715:2 -703:1 -716:2 -704:1 -717:2 -705:1 -718:2 -706:1 -719:2 -707:1 -720:2 -708:1 -721:2 -709:1 -722:2 -710:1 -723:2 -711:1 -724:2 -712:1 -725:2 -713:1 -726:2 -714:1 -727:2 -715:1 -728:2 -716:1 -729:2 -717:1 -730:2 -718:1 -731:2 -719:1 -732:2 -720:1 -733:2 -721:1 -734:2 -722:1 -735:2 -723:1 -736:2 -724:1 -737:2 -725:1 -738:2 -726:1 -739:2 -727:1 -740:2 -728:1 -741:2 -729:1 -742:2 -730:1 -743:2 -731:1 -744:2 -732:1 -745:2 -733:1 -746:2 -734:1 -747:2 -735:1 -748:2 -736:1 -749:2 -737:1 -750:2 -738:1 -751:2 -739:1 -752:2 -740:1 -753:2 -741:1 -754:2 -742:1 -755:2 -743:1 -756:2 -744:1 -757:2 -745:1 -758:2 -746:1 -759:2 -747:1 -760:2 -748:1 -761:2 -749:1 -762:2 -750:1 -763:2 -751:1 -764:2 -752:1 -765:2 -753:1 -766:2 -754:1 -767:2 -755:1 -768:2 -756:1 -769:2 -757:1 -770:2 -758:1 -771:2 -759:1 -772:2 -760:1 -773:2 -761:1 -774:2 -762:1 -775:2 -763:1 -776:2 -764:1 -777:2 -765:1 -778:2 -766:1 -779:2 -767:1 -780:2 -768:1 -781:2 -769:1 -782:2 -770:1 -783:2 -771:1 -784:2 -772:1 -785:2 -773:1 -786:2 -774:1 -787:2 -775:1 -788:2 -776:1 -789:2 -777:1 -790:2 -778:1 -791:2 -779:1 -792:2 -780:1 -793:2 -781:1 -794:2 -782:1 -795:2 -783:1 -796:2 -784:1 -797:2 -785:1 -798:2 -786:1 -799:2 -787:1 -800:2 -788:1 -801:2 -789:1 -802:2 -790:1 -803:2 -791:1 -804:2 -792:1 -805:2 -793:1 -806:2 -794:1 -807:2 -795:1 -808:2 -796:1 -809:2 -797:1 -810:2 -798:1 -811:2 -799:1 -812:2 -800:1 -813:2 -801:1 -814:2 -802:1 -815:2 -803:1 -816:2 -804:1 -817:2 -805:1 -818:2 -806:1 -819:2 -807:1 -820:2 -808:1 -821:2 -809:1 -822:2 -810:1 -823:2 -811:1 -824:2 -812:1 -825:2 -813:1 -826:2 -814:1 -827:2 -815:1 -828:2 -816:1 -829:2 -817:1 -830:2 -818:1 -831:2 -819:1 -832:2 -820:1 -833:2 -821:1 -834:2 -822:1 -835:2 -823:1 -836:2 -824:1 -837:2 -825:1 -838:2 -826:1 -839:2 -827:1 -840:2 -828:1 -841:2 -829:1 -842:2 -830:1 -843:2 -831:1 -844:2 -832:1 -845:2 -833:1 -846:2 -834:1 -847:2 -835:1 -848:2 -836:1 -849:2 -837:1 -850:2 -838:1 -851:2 -839:1 -852:2 -840:1 -853:2 -841:1 -854:2 -842:1 -855:2 -843:1 -856:2 -844:1 -857:2 -845:1 -858:2 -846:1 -859:2 -847:1 -860:2 -848:1 -861:2 -849:1 -862:2 -850:1 -863:2 -851:1 -864:2 -852:1 -865:2 -853:1 -866:2 -854:1 -867:2 -855:1 -868:2 -856:1 -869:2 -857:1 -870:2 -858:1 -871:2 -859:1 -872:2 -860:1 -873:2 -861:1 -874:2 -862:1 -875:2 -863:1 -876:2 -864:1 -877:2 -865:1 -878:2 -866:1 -879:2 -867:1 -880:2 -868:1 -881:2 -869:1 -882:2 -870:1 -883:2 -871:1 -884:2 -872:1 -885:2 -873:1 -886:2 -874:1 -887:2 -875:1 -888:2 -876:1 -889:2 -877:1 -890:2 -878:1 -891:2 -879:1 -892:2 -880:1 -893:2 -881:1 -894:2 -882:1 -895:2 -883:1 -896:2 -884:1 -897:2 -885:1 -898:2 -886:1 -899:2 -887:1 -900:2 -888:1 -901:2 -889:1 -902:2 -890:1 -903:2 -891:1 -904:2 -892:1 -905:2 -893:1 -906:2 -894:1 -907:2 -895:1 -908:2 -896:1 -909:2 -897:1 -910:2 -898:1 -911:2 -899:1 -912:2 -900:1 -913:2 -901:1 -914:2 -902:1 -915:2 -903:1 -916:2 -904:1 -917:2 -905:1 -918:2 -906:1 -919:2 -907:1 -920:2 -908:1 -921:2 -909:1 -922:2 -910:1 -923:2 -911:1 -924:2 -912:1 -925:2 -913:1 -926:2 -914:1 -927:2 -915:1 -928:2 -916:1 -929:2 -917:1 -930:2 -918:1 -931:2 -919:1 -932:2 -920:1 -933:2 -921:1 -934:2 -922:1 -935:2 -923:1 -936:2 -924:1 -937:2 -925:1 -938:2 -926:1 -939:2 -927:1 -940:2 -928:1 -941:2 -929:1 -942:2 -930:1 -943:2 -931:1 -944:2 -932:1 -945:2 -933:1 -946:2 -934:1 -947:2 -935:1 -948:2 -936:1 -949:2 -937:1 -950:2 -938:1 -951:2 -939:1 -952:2 -940:1 -953:2 -941:1 -954:2 -942:1 -955:2 -943:1 -956:2 -944:1 -957:2 -945:1 -958:2 -946:1 -959:2 -947:1 -960:2 -948:1 -961:2 -949:1 -962:2 -950:1 -963:2 -951:1 -964:2 -952:1 -965:2 -953:1 -966:2 -954:1 -967:2 -955:1 -968:2 -956:1 -969:2 -957:1 -970:2 -958:1 -971:2 -959:1 -972:2 -960:1 -973:2 -961:1 -974:2 -962:1 -975:2 -963:1 -976:2 -964:1 -977:2 -965:1 -978:2 -966:1 -979:2 -967:1 -980:2 -968:1 -981:2 -969:1 -982:2 -970:1 -983:2 -971:1 -984:2 -972:1 -985:2 -973:1 -986:2 -974:1 -987:2 -975:1 -988:2 -976:1 -989:2 -977:1 -990:2 -978:1 -991:2 -979:1 -992:2 -980:1 -993:2 -981:1 -994:2 -982:1 -995:2 -983:1 -996:2 -984:1 -997:2 -985:1 -998:2 -986:1 -999:2 -987:1 -988:1 -989:1 -990:1 -991:1 -992:1 -993:1 -994:1 -995:1 -996:1 -997:1 -998:1 -999:1