Posts for flagitious


1 2
20 21
Experienced Forum User, Published Author, Player (200)
Joined: 7/6/2004
Posts: 511
Cool WIP fmp and thanks for the youtube link xxezrabxxx. It is entertaining. Question for you about using the bomb jump to get the moon pearl/etc. I'm assuming it was faster to levitate than bomb jump right? Would you have used levitation in Gannon's tower to skip Moldorm like they do in RTA?
g,o,p,i=1e4,a[10001];main(x){for(;p?g=g/x*p+a[p]*i+2*!o: 53^(printf("%.4d",o+g/i),p=i,o=g%i);a[p--]=g%x)x=p*2-1;}
Experienced Forum User, Published Author, Player (200)
Joined: 7/6/2004
Posts: 511
I think a TAS with rules identical to the rules at Any% no major glitches on speedrun.com would be worthwhile. The main differences between that and the existing run would be:
    Use JPN version No up+down No save/quit
JPN version wasn't used by me originally simply because I didn't know about it nor that it had cool non game breaking glitches. The up+down saved time, but made the run less relatable. And it also increased the arbitrariness of the rules since there are numerous ways to pseudo exploration glitch with it. The save/quit is a pretty minor issue, I personally think it should be allowed but would be nice to go with the most common ruleset in speedrun.com so would defer to it. I know Tompa gave up making runs in these types of categories due to the lack of a clearly defined ruleset but they seem to have rules that everyone can agree on at speedrun.com. Could we not ride that train as well, or what specifically is the issue? I am likely ignorant of all the known glitches.
g,o,p,i=1e4,a[10001];main(x){for(;p?g=g/x*p+a[p]*i+2*!o: 53^(printf("%.4d",o+g/i),p=i,o=g%i);a[p--]=g%x)x=p*2-1;}
Experienced Forum User, Published Author, Player (200)
Joined: 7/6/2004
Posts: 511
That was a really cool problem Derakon, I wish I had a chance to try it before it was sovled! What program did you use to help you visualize and experiment to try to find the solution?
g,o,p,i=1e4,a[10001];main(x){for(;p?g=g/x*p+a[p]*i+2*!o: 53^(printf("%.4d",o+g/i),p=i,o=g%i);a[p--]=g%x)x=p*2-1;}
Experienced Forum User, Published Author, Player (200)
Joined: 7/6/2004
Posts: 511
It depends on the unspecified P>1/2?
g,o,p,i=1e4,a[10001];main(x){for(;p?g=g/x*p+a[p]*i+2*!o: 53^(printf("%.4d",o+g/i),p=i,o=g%i);a[p--]=g%x)x=p*2-1;}
Experienced Forum User, Published Author, Player (200)
Joined: 7/6/2004
Posts: 511
Sorry a little slow, I am (all in response to stuff on page 37) rhebus: The distribution is not a small skewed discrete probability distribution. But it could be if the outer feels like it. You have shown that there are cases where it is indeed advantageous to guess second, and since I guess it is reasonable to assume that there that this has a finite chance of happening then it is indeed advantageous to guess second for all distributions on average. (Since in no case can it be beneficial to guess first). Tub: I agree it seems to be non precisely defined problem, and that stems from the human behavior involved, but I think the spirit of the problem is accurately presented and most things can be inferred. I do not know if it is safe to assume that the numbers have a finite range. For example I often pick 10^100 or even negative infinity just to fuck with people. I don't think Case A is the correct one, you cannot figure out how a person will pick a number unless you are Derren Brown :). Case C looks like the real case. p4wn3r: That is a very interesting paradox, thank you. Warp: You have shown that it is a contradiction, but you have not shown the error in the reasoning of it being 5/4x expected (hence the paradox).
g,o,p,i=1e4,a[10001];main(x){for(;p?g=g/x*p+a[p]*i+2*!o: 53^(printf("%.4d",o+g/i),p=i,o=g%i);a[p--]=g%x)x=p*2-1;}
Experienced Forum User, Published Author, Player (200)
Joined: 7/6/2004
Posts: 511
This looks like good analysis at first glance. It will be about a day before I can get time to fully try to understand your reasoning. (And I may have led to believe that I had the 'answer' when I still need to figure it out too :)
g,o,p,i=1e4,a[10001];main(x){for(;p?g=g/x*p+a[p]*i+2*!o: 53^(printf("%.4d",o+g/i),p=i,o=g%i);a[p--]=g%x)x=p*2-1;}
Experienced Forum User, Published Author, Player (200)
Joined: 7/6/2004
Posts: 511
A couple clarifications, guesses and answers don't have to be whole numbers. And its neither random nor not random, nor is there a fixed range.
g,o,p,i=1e4,a[10001];main(x){for(;p?g=g/x*p+a[p]*i+2*!o: 53^(printf("%.4d",o+g/i),p=i,o=g%i);a[p--]=g%x)x=p*2-1;}
Experienced Forum User, Published Author, Player (200)
Joined: 7/6/2004
Posts: 511
Ok here is a problem (I guess it could be called a math problem?) that I was thinking about recently after a game of 21. When I play basketball with two friends and the ball goes out of bounds, the person who caused the out picks a secret number and then the player 1 guesses a number and then player 2 guesses a number. Whoever is closer gets possession. Does player 2 have an advantage? On the one hand, if player 2 had chosen their number simultaneously, he would have an equal chance, but if choses simultaneously in his head, then refines it to just higher or just lower than player 1's guess, he will have an ever better chance, giving him an advantage. (And this increase in chance is not infinitely small because the random number is typically in a finite range, and the two players predictions are typically finitely different). But on the other hand, player 1 can just choose a number such that he thinks it is equally probable that the correct number is either higher or lower, giving him 50% chance of winning. (Please ignore the chance that player 1 guesses the number exactly, and that player 2 can then not guess this number. Possible ways this could be enforced is say redo if either player gets exact, or say the correct number has infinite precision and is sufficiently random.) It is purposefully vague what number can be chosen, there are no limits and no fixed probability distribution to choose from. The players chances are affected by how well they can read and predict the originator's randomness, but both players have equal knowledge of their behavior. So does player 2 have the advantage and why?
g,o,p,i=1e4,a[10001];main(x){for(;p?g=g/x*p+a[p]*i+2*!o: 53^(printf("%.4d",o+g/i),p=i,o=g%i);a[p--]=g%x)x=p*2-1;}
Experienced Forum User, Published Author, Player (200)
Joined: 7/6/2004
Posts: 511
Great ideal, terrible physics. If it's going to be called and look like Mario, it has to at least resemble mario in the most important aspects of gameplay. Another oddity sometimes jumping on the carnivorous plants kills them, sometimes it kills you. Got to world 53
g,o,p,i=1e4,a[10001];main(x){for(;p?g=g/x*p+a[p]*i+2*!o: 53^(printf("%.4d",o+g/i),p=i,o=g%i);a[p--]=g%x)x=p*2-1;}
Experienced Forum User, Published Author, Player (200)
Joined: 7/6/2004
Posts: 511
It inverts the first number then subtracts one from each number until the (second number) is zero, then inverts the first one again. it also has to do sign extension so that the first one cannot be zero. The xkcd people didn't count this solution as valid because it doesn't work when both numbers are the empty string (though this is not considered valid input by the malevolence engine, as it passes that). It could be modified to handle that properly and still be much shorter than their solution though.
g,o,p,i=1e4,a[10001];main(x){for(;p?g=g/x*p+a[p]*i+2*!o: 53^(printf("%.4d",o+g/i),p=i,o=g%i);a[p--]=g%x)x=p*2-1;}
Experienced Forum User, Published Author, Player (200)
Joined: 7/6/2004
Posts: 511
Pointless Boy, ah I see that is a good challenge (I was wondering why it wasn't a built in one) RandomPie: Wow even though I know the algorithm used I already can't make any sense out of that. Have been tweaking it though, got it down to 34 ?lvl=30&code=c10:4f3;y10:5f3;c10:6f2;r10:8f2;c10:9f3;r11:3f2;c11:4f0;y11:5f0;q11:6f6;c11:7f3;p11:8f7;q11:9f7;p12:3f7;q12:4f5;c12:5f1;i12:6f3;y12:7f1;b12:8f0;g12:9f2;b13:3f0;g13:4f0;c13:5f0;p13:6f4;c13:7f0;g13:8f1;q13:9f5;y12:2f3;q10:11f4;q11:11f2;c12:12f3;q10:10f3;q11:12f3;g11:10f3;y10:12f1; Minor tweaks may get 1 or 2 more less, but there still might be some big ways to save on the part that loops through which thing to convert to unary. Edit: oops was looking at wrong tab (it was someones solution to another level, no wonder it didn't make any sense)
g,o,p,i=1e4,a[10001];main(x){for(;p?g=g/x*p+a[p]*i+2*!o: 53^(printf("%.4d",o+g/i),p=i,o=g%i);a[p--]=g%x)x=p*2-1;}
Experienced Forum User, Published Author, Player (200)
Joined: 7/6/2004
Posts: 511
latest list (note only this link is up to date, not the list below) robobugs 11 TheRandomPie_IV (alternating colors) robobears 15 flagitious (first symbol is same as the last) androids 12 nitsuja (x blue and then x red) robomecha 19 Pointless Boy (move last to front) robotanks 25 TheRandomPie_IV (>=16) robochildren 16 Nix (number of reds = number of blues) police 29 yaichi, modification of barbrady1978 (put a yellow in the middle (even length strings)) teachers 19 TheRandomPie_IV (accept x blue, then x red, then x blue) rocket planes 14 klmz (move all blue to front) officers 18 flagitious (+1) judiciary 39 J.P. (repeat midway through (even only inputted)) politicians 20 Nix (exactly twice as many blue as red) academics 25 Pointless Boy (reverse ) generals 17 flagitious (-1) engineers 20 Nix (is a palindrome?) seraphim 19 tehtmi (identical separated by green (always equal length inputs but not stated, is this still true with malev?)) ophanim 39 yaichi (a>b) metatron 37 flagitious (a+b) I was working on a method for ophanim, maybe someone can have better luck with it http://pleasingfungus.com/?lvl=30&code=c8:13f2;c9:13f2;c10:13f2;c11:13f2;c7:13f2;c6:11f3;g7:4f3;y7:5f3;c7:6f2;g7:9f3;q7:10f4;q7:11f7;g8:3f3;q8:4f0;c8:5f3;i8:6f7;c8:7f3;c8:8f3;q8:9f7;q8:10f2;y8:11f1;r9:3f3;p9:4f4;b9:5f1;c9:6f2;c10:4f0;c10:5f3;c10:6f2;r10:7f2;g10:8f2;c11:3f3;q11:4f7;p11:5f7;c11:6f3;p11:7f7;q11:8f1;y12:3f0;y12:4f1;y12:5f3;c12:6f0;b12:7f0;c12:8f2;c13:3f0;c13:4f1;c13:5f1;c13:6f1;c13:7f1;c13:8f1;c12:2f3;c6:12f3;c6:13f2; It only uses 23 non conveyors but I couldn't organize it very well, best I could get was 40 total parts. This converts both numbers to unary then basically subtracts. I think if I convert my metatron it could be about 35, but there's got to be a better way.
g,o,p,i=1e4,a[10001];main(x){for(;p?g=g/x*p+a[p]*i+2*!o: 53^(printf("%.4d",o+g/i),p=i,o=g%i);a[p--]=g%x)x=p*2-1;}
Experienced Forum User, Published Author, Player (200)
Joined: 7/6/2004
Posts: 511
Thanks, Pointless Boy, although the metatron one is not a record, which is 37. BTW what was your first challenge (I'd probably want to start with it)? There is also a forum at the main site, but its 26 pages... Thanks random pie, I'll update the list today and convert it to html so links can be clicked. Slowest is interesting, but I haven't even tried fastest yet.
g,o,p,i=1e4,a[10001];main(x){for(;p?g=g/x*p+a[p]*i+2*!o: 53^(printf("%.4d",o+g/i),p=i,o=g%i);a[p--]=g%x)x=p*2-1;}
Experienced Forum User, Published Author, Player (200)
Joined: 7/6/2004
Posts: 511
I went though and compared our list (update) to xkcds and the results were surprising, they managed to beat us in many levels that appeared optimal. Here is the summary of the differences. I have not had time to find the links to their solutions (it is possible they were not actually posted, but if you find them let me know please)
tasvideos losses on
Robo-children! nitsuja 17 v 16 Nix
Judiciary! klmz 46 v 39 J.P.
Politicians! scepho 23 v 20 Nix
Engineers! nitsuja 21 v 20 Nix
Seraphim klmz/gunty 21 v 19 tehtmi
Ophanim TheRandomPie_IV 53 v 40 J.P.

tasvideos wins on
Officers! flagitious 18 v 20 J.P.
Generals! flagitious 17 v 18 J.P.
Metatron flagitious 37 v 46 J.P.
Police klmz 32 v ??? (they quoted his)
g,o,p,i=1e4,a[10001];main(x){for(;p?g=g/x*p+a[p]*i+2*!o: 53^(printf("%.4d",o+g/i),p=i,o=g%i);a[p--]=g%x)x=p*2-1;}
Post subject: Re: Fails detected on multiple records
Experienced Forum User, Published Author, Player (200)
Joined: 7/6/2004
Posts: 511
Explanation of solution to finding if input contains all 4 colors
?ctm=Rainbow;Accept_if_input_contains_all_four_colors.;rgbgbrbrbgbrbgrg:x|ygbrg:*|ggrrrbyg:*|ybbbrrbyb:x|:x|brgy:*;13;3;0;
solution You can't remove all of one color, then remove all the next because there is no way to tell once you've removed all of one color without entering a potential infinite loop. The other approach of seeing what the firt symbol is, forking for each case, would require 16 states with connections that probably make this impossible (bisqwit came close, but it didn't quite fit, and isn't fully correct yet, another error case is brgby, or any of the solo switches that want a color, but get one of the other pair colors first). Solution: The idea is to always make progress each time you return to the main loop (the black box). Progress is defined as removing at least one or exiting. If this holds true, it will eventually terminate. This solution is correct so long as the color removed was redudant (2 or more present) or this string lacks another color, in which case it doesn't matter what is removed since it is doomed to rightfully fail). The blue red box is entered only when it knows a blue and a red have been encountered, likewise for the yellow green box. These just check then that the opposite two colors are present or fail if they aren't, using the brute force state method. The blue box is entered only when a blue has been found and removed, it then adds a blue and finds the next blue or red. If a red is found, goto the blue red box (exit case). Otherwise a blue is found (impossible there there is no blue since one was added), then it is removed and we have accomplished our task for the main loop (2 blues removed, 1 added). If there were no more blues before adding one, then this loop won't exit until that same blue is found again. In this case that means there were no reds, so it is safe to fail, but we cannot not know this is the case, luckily this one blue is removed and the invariant is maintained. The red box is the complement of the blue box. If main loop does not encounter a red/blue, the orange box is entered. If the string is empty, we exit at the black X). Now suppose a yellow is encountered (equivalent logic for green), it is then added back, and another yellow green switch is encountered, if yellow there is net of -1 yellow, return to main loop, if green, yellow green are present, enter yellow green box. If blue, it is safe to enter the blue box which we have shown will make progress, (same for red). The last case to check for is a yellow or green followed by nothing, that same yellow that was added is then removed again in the next switch and sent back to the main loop, with progress (empty string now). Therefore it is correct and exits. PS: The malevolence engine is cool, now it would make sense to go for speed too (on the built in levels that is)
g,o,p,i=1e4,a[10001];main(x){for(;p?g=g/x*p+a[p]*i+2*!o: 53^(printf("%.4d",o+g/i),p=i,o=g%i);a[p--]=g%x)x=p*2-1;}
Experienced Forum User, Published Author, Player (200)
Joined: 7/6/2004
Posts: 511
Bisqwit, how did you make those awesome gifs? If it is something something you automated I would like to incorporate in my list (like on mouse over). That accept if one of each color is present level is interesting, I think it might be possible even with the limited space, but this is something I need to work on more. Edit: Ok it is possible
Scepheo wrote:
Bisqwit wrote:
New challenges:
http://pleasingfungus.com/?ctm=Rainbow;Accept_if_input_contains_all_four_colors.;rgbgbrbrbgbrbgrg:x|ygbrg:*|ggrrrbyg:*|ybbbrrbyb:x|:x|brgy:*;13;3;0;
This one might be impossible!
It's possible, but I'm quite sure you don't have enough space.
I started off trying to be super compact, and later realized certain parts I didn't need, and had plenty of space so the result isn't very aesthetically pleasing or compact. Apparently there is a bug if you try to save on a custom level, it puts you back on the last level, but with your design intact, so I couldn't actually run this to test it, but theoretically it works (if not it is something silly like 1 conveyor facing wrong way). I will write an explanation/proof tomorrow. Edit2: missed an overlapping conveyor, fixed Edit3: missed a more serious problem, I'll fix tomorrw :(, picture removed Edit4: nevermind it was correct, I need sleep
g,o,p,i=1e4,a[10001];main(x){for(;p?g=g/x*p+a[p]*i+2*!o: 53^(printf("%.4d",o+g/i),p=i,o=g%i);a[p--]=g%x)x=p*2-1;}
Experienced Forum User, Published Author, Player (200)
Joined: 7/6/2004
Posts: 511
Didn't have time to fully optimize this but I'll post what I got (a couple more may be shaved using this method, but it might be harder to figure out what this method actually is versus figuring it out from scratch) 37 metatron http://pleasingfungus.com/?lvl=31&code=r10:3f2;p11:3f3;b12:3f0;g12:2f3;q11:4f3;g12:4f3;b9:7f2;g10:6f2;q10:7f5;r10:8f1;c11:5f2;p11:6f2;b11:7f3;q11:8f7;b11:9f2;r12:5f3;c12:6f3;c12:7f3;p12:8f3;q12:9f1;r13:5f2;g13:6f0;r13:7f0;q13:8f5;p14:5f7;q14:6f1;y14:7f1;g14:8f1;b15:5f0;y15:6f0;q13:9f7;c14:9f0;q12:11f0;p12:10f7;r13:10f0;b11:10f2;p12:12f2; Also this is the correct but slower version, a shorter version is faster but will fail in some extreme cases (that are never tested for though)
g,o,p,i=1e4,a[10001];main(x){for(;p?g=g/x*p+a[p]*i+2*!o: 53^(printf("%.4d",o+g/i),p=i,o=g%i);a[p--]=g%x)x=p*2-1;}
Experienced Forum User, Published Author, Player (200)
Joined: 7/6/2004
Posts: 511
It is hard to keep up with all the levels posted so I put together a list. It is mostly complete, but if there is anything I missed or any mistakes let me know. If the level list has a number of parts but not a person, that means I think the level is straightforward and many people probably have this solution (the number is just how many parts it took me). If the solutions have a * by them it means I haven't gotten around to looking at that level in depth yet, so I haven't checked correctness, optimizing, etc. Maybe it would be good to make a page on tasvideos so any editor can keep it up to date? The following were ones I have, and didn't see anything better here: robobears 15 http://pleasingfungus.com/?lvl=7&code=p12:4f7;c11:4f3;p11:5f2;p11:6f4;c11:7f1;c12:5f3;c12:6f3;c12:7f3;c12:8f3;c12:9f3;c12:10f3;p13:5f0;c13:4f3;c13:7f1;p13:6f6; politicians 29 (haven't optimized fully yet) http://pleasingfungus.com/?lvl=22&code=b12:2f3;b12:3f3;y12:4f3;r9:7f2;c10:5f3;c10:6f3;p10:7f7;c11:5f0;b11:6f3;p11:7f6;r11:8f1;c12:5f0;g12:6f1;q12:7f6;y12:8f3;q12:9f2;c12:10f3;c12:11f3;c12:12f3;p14:8f2;b14:9f1;p14:7f1;r13:7f2;b15:7f0;q14:6f5;y13:6f1;c13:5f0;c13:9f1;c13:8f2; engineers 27 http://pleasingfungus.com/?lvl=24&code=p12:7f3;b11:6f2;r13:6f0;c12:6f3;q11:7f5;q13:7f1;c12:8f3;c12:9f3;c12:10f3;c12:11f3;c12:12f3;c10:6f1;c14:6f1;p14:7f4;c10:4f2;c10:5f1;c11:4f2;c11:5f3;c12:3f3;y12:4f3;c13:4f0;c13:5f3;c14:4f0;c14:5f1;c12:2f3;p10:7f6;p12:5f3;
g,o,p,i=1e4,a[10001];main(x){for(;p?g=g/x*p+a[p]*i+2*!o: 53^(printf("%.4d",o+g/i),p=i,o=g%i);a[p--]=g%x)x=p*2-1;}
Experienced Forum User, Published Author, Player (200)
Joined: 7/6/2004
Posts: 511
I converted my solution to Generals as well, it turned out to be simpler in the edge cases: 17. I can barely understand mine as well btw. Also my attempt at police was 46 too. Edit: interesting side challenge, no conveyors rocket planes academics
g,o,p,i=1e4,a[10001];main(x){for(;p?g=g/x*p+a[p]*i+2*!o: 53^(printf("%.4d",o+g/i),p=i,o=g%i);a[p--]=g%x)x=p*2-1;}
Experienced Forum User, Published Author, Player (200)
Joined: 7/6/2004
Posts: 511
nitsuja wrote:
flagitious wrote:
I have been working on Officers today too, got it down to 18 parts.
Wow! This doesn't work when given an empty string though, which the game recognizes as zero, but I guess it doesn't specify whether handling that is required...
It can be modified to handle empty string correctly, although I'm going to side that this is not required. Bisqwit I am certainly not out of your league, there are just many many levels
g,o,p,i=1e4,a[10001];main(x){for(;p?g=g/x*p+a[p]*i+2*!o: 53^(printf("%.4d",o+g/i),p=i,o=g%i);a[p--]=g%x)x=p*2-1;}
Experienced Forum User, Published Author, Player (200)
Joined: 7/6/2004
Posts: 511
I have been working on Officers today too, got it down to 18 parts. On the levels like androids or teachers, where it ask for some number of red then some number of blue, it does not specify if there can then be something extra after that or if it has to be the end. Has anyone seen a test case that tests this? Or know which way it should be?
g,o,p,i=1e4,a[10001];main(x){for(;p?g=g/x*p+a[p]*i+2*!o: 53^(printf("%.4d",o+g/i),p=i,o=g%i);a[p--]=g%x)x=p*2-1;}
Experienced Forum User, Published Author, Player (200)
Joined: 7/6/2004
Posts: 511
This thread is very hard to read because the long strings with no spaces extend the page to the right for all text including paragraphs that people write, forcing one to scroll to the right on each line. Would it be possible to fix this (either client or server side?). Or maybe to convert all level codes to urls which have shorter text? (This would be easier for viewers too since they could just be clicked.) for example edit: firefox doesn't have this problem, chrome does
g,o,p,i=1e4,a[10001];main(x){for(;p?g=g/x*p+a[p]*i+2*!o: 53^(printf("%.4d",o+g/i),p=i,o=g%i);a[p--]=g%x)x=p*2-1;}
Experienced Forum User, Published Author, Player (200)
Joined: 7/6/2004
Posts: 511
Bisqwit wrote:
arflech wrote:
I didn't realize that you could enter the branches from any direction; that certainly makes some levels easier...
That, and also, I didn't learn of bridges until in RoboMechas, where I absolutely needed them.
I too didn't know about bridges for a long time, but I did get past RoboMechas before learning about them: url It is interesting to try to solve with as few as parts as possible (for all possible inputs), basically it is like trying to code golf a weak version of befunge. But it doesn't really make sense to optimize for speed because only hard coded inputs are used (which can easily be exploited). Although I do like Nitrodon for bringing asymptotic notation into this :)
g,o,p,i=1e4,a[10001];main(x){for(;p?g=g/x*p+a[p]*i+2*!o: 53^(printf("%.4d",o+g/i),p=i,o=g%i);a[p--]=g%x)x=p*2-1;}
Experienced Forum User, Published Author, Player (200)
Joined: 7/6/2004
Posts: 511
The best part is, you know that someone who thinks they can get accurate results by asking strangers to voluntarily describe some seriously fucked up issues, will present these joke responses as if they are real and that this will be the next headline in some 'new science' magazine / class.
g,o,p,i=1e4,a[10001];main(x){for(;p?g=g/x*p+a[p]*i+2*!o: 53^(printf("%.4d",o+g/i),p=i,o=g%i);a[p--]=g%x)x=p*2-1;}
Experienced Forum User, Published Author, Player (200)
Joined: 7/6/2004
Posts: 511
Congrats, although I cannot read swedish also. Is it published via ebook also out of curiosity? (might be worth doing if nearly all your profit goes to the publishing cost).
g,o,p,i=1e4,a[10001];main(x){for(;p?g=g/x*p+a[p]*i+2*!o: 53^(printf("%.4d",o+g/i),p=i,o=g%i);a[p--]=g%x)x=p*2-1;}
1 2
20 21