Anyway, despite ignoring those variables, there were plenty of difficulties. INTERCAL has no ifs, no gotos, no most anything that is in any other language. There are only NEXT instructions which push instructions onto a call stack, where they can be manipulated with FORGET or RESUME, and, of course, everyone's favorite, COME FROM (the opposite of GO TO, which is not in the language).
So, with all of these fun things to keep up with, there are some even more fun things in INTERCAL: the errors. Among the compile and run time errors I had to solve while writing this program were
THE NEXT STACK RUPTURES. ALL DIE. OH, THE EMBARRASSMENT!
WHAT BASE AND/OR LANGUAGE INCLUDES 23?
RANDOM COMPILER BUG
PROGRAM HAS GOTTEN LOST ON THE WAY TO WHO KNOWS WHERE
PROGRAM HAS DISAPPEARED INTO THE BLACK LAGOON
THROW STICK BEFORE RETRIEVING!
YOU MUST LIKE THIS LABEL A LOT!
PROGRAMMER IS INSUFFICIENTLY POLITE
And that isn't even all of them. The last one has a particularly good story: all INTERCAL commands must be prefixed with either DO, PLEASE, or PLEASE DO. Put too many PLEASEs, you get an error for being overly polite, too few, insufficiently polite: the programmer must remember to keep a delicate balance.
This INTERCAL program is the result of about 4 days of working with the language, with varying degrees of effort on those days. This is not only the first and longest INTERCAL program I have written, but it is actually as of now the longest Project Euler solution I have written. This solution opens up ELM, the language I previously solved problem 17 in, so be on the lookout for the next appearance of that functional language that compiles to html and Javascript.
(3) DO NOT GIVE UP (2000) PLEASE NOTE THIS IS A MODULUS FUNCTION DO STASH :1 + :2 + :196 DO (1550) NEXT DO :196 <- :1 PLEASE DO :1 <- :3 DO (1540) NEXT DO :197 <- :2 PLEASE DO :1 <- :196 DO :2 <- :3 DO (1510) NEXT DO RETRIEVE :1 + :2 + :196 PLEASE RESUME #1 (2010) PLEASE DO NOTE THIS FCN GIVES SINGLE DIGIT LETTERS DO NOTE :2 <- LETTERS(:1) DO STASH :1 + :3 + :4 (19) DO (18) NEXT (29) DO :2 <- #4 (18) DO (17) NEXT (28) PLEASE DO :2 <- #5 (17) DO (16) NEXT (27) DO :2 <- #5 (16) DO (15) NEXT (26) PLEASE DO :2 <- #3 (15) DO (14) NEXT (25) DO :2 <- #4 (14) DO (13) NEXT (24) DO :2 <- #4 (13) PLEASE DO (12) NEXT (23) DO :2 <- #5 (12) DO (11) NEXT (22) DO :2 <- #3 (11) DO (10) NEXT (21) DO :2 <- #3 (10) DO (100) NEXT (20) DO :2 <- #0 (100) PLEASE DO :2 <- #1 DO (1509) NEXT DO :1 <- :3 PLEASE RESUME :1 DO COME FROM (29) DO COME FROM (28) DO COME FROM (27) PLEASE DO COME FROM (26) DO COME FROM (25) DO COME FROM (24) DO COME FROM (23) DO COME FROM (22) DO COME FROM (21) DO COME FROM (20) DO :4 <- :2 DO :2 <- :1 DO :1 <- #10 DO (1510) NEXT DO :2 <- :4 PLEASE DO FORGET :3 DO NOT RETRIEVE :1 + :3 + :4 PLEASE RESUME #1 (2020) DO NOTE THIS FCN GIVES TWO DIGIT LETTERS DO NOTE :2 <- LETTERS(:1) PLEASE STASH :1 + :3 + :4 + :5 + :6 + :7 + :14 (39) DO (38) NEXT (49) DO :5 <- #6 (38) DO (37) NEXT (48) DO :5 <- #6 (37) DO (36) NEXT (47) PLEASE DO :5 <- #7 (36) DO (35) NEXT (46) DO :5 <- #5 (35) DO (34) NEXT (45) DO :5 <- #5 (34) DO (33) NEXT (44) PLEASE DO :5 <- #5 (33) DO (32) NEXT (43) DO :5 <- #6 (32) DO (31) NEXT (42) PLEASE DO :5 <- #6 (31) DO (30) NEXT (41) DO (2030) NEXT (30) DO (200) NEXT (40) DO :5 <- #0 (200) PLEASE DO :2 <- #10 DO :14 <- :1 DO (1550) NEXT DO :1 <- :3 DO :2 <- #1 DO (1509) NEXT DO :7 <- :3 PLEASE RESUME :7 DO COME FROM (49) DO COME FROM (48) DO COME FROM (47) DO COME FROM (46) DO COME FROM (45) PLEASE DO COME FROM (44) DO COME FROM (43) DO COME FROM (42) DO COME FROM (40) PLEASE DO :1 <- :14 DO :2 <- #10 DO (2000) NEXT PLEASE DO :1 <- :3 DO (2010) NEXT DO :1 <- :5 DO (1509) NEXT PLEASE DO COME FROM (41) DO :6 <- :3 DO :2 <- :7 DO :1 <- #10 PLEASE DO (1510) NEXT DO FORGET :3 DO :2 <- :6 DO RETRIEVE :1 + :3 + :4 + :5 + :6 + :7 + :14 PLEASE RESUME #1 (2030) DO NOTE THIS IS THE TEENS FUNCTION DO NOTE :3 <- LETTERS(:14) DO STASH :1 + :2 + :5 + :6 (59) DO (58) NEXT (69) DO :6 <- #8 (58) DO (57) NEXT (68) DO :6 <- #8 (57) DO (56) NEXT (67) DO :6 <- #9 (56) DO (55) NEXT (66) PLEASE DO :6 <- #7 (55) DO (54) NEXT (65) DO :6 <- #7 (54) DO (53) NEXT (64) DO :6 <- #8 (53) DO (52) NEXT (63) DO :6 <- #8 (52) DO (51) NEXT (62) PLEASE DO :6 <- #6 (51) DO (50) NEXT (61) DO :6 <- #6 (50) DO (300) NEXT (60) DO :6 <- #3 (300) DO :1 <- :14 DO :2 <- #10 PLEASE DO (2000) NEXT DO :1 <- :3 DO :2 <- #1 DO (1509) NEXT PLEASE RESUME :3 DO COME FROM (69) DO COME FROM (68) DO COME FROM (67) DO COME FROM (66) DO COME FROM (65) PLEASE DO COME FROM (64) DO COME FROM (63) DO COME FROM (62) DO COME FROM (61) PLEASE DO COME FROM (60) DO :2 <- :3 DO :1 <- #10 DO (1510) NEXT DO FORGET :3 PLEASE DO :3 <- :6 DO RETRIEVE :1 + :2 + :5 + :6 PLEASE RESUME #1 (2040) PLEASE DO NOTE THIS IS THE EVERYTHING FCN DO NOTE :6 <- LETTERS(:1) DO STASH :1 + :2 + :3 + :5 + :7 DO :5 <- :1 (101) DO (102) NEXT (111) DO NOT GIVE UP (102) DO (103) NEXT DO FORGET #1 PLEASE DO :1 <- :5 DO (2020) NEXT (112) DO :6 <- :2 (103) PLEASE DO :1 <- :5 DO :2 <- #100 DO (1550) NEXT DO :1 <- :3 DO :2 <- :3 DO (1550) NEXT PLEASE DO :1 <- :3 DO :2 <- #1 DO (1509) NEXT DO RESUME :3 DO COME FROM (111) DO :1 <- :5 DO :2 <- #100 DO (1550) NEXT DO :1 <- :3 PLEASE DO (2010) NEXT DO :6 <- :2 DO :1 <- :6 DO :2 <- #7 DO (1509) NEXT PLEASE DO :6 <- :3 (90) DO (91) NEXT DO :1 <- :6 DO :2 <- #3 DO (1509) NEXT PLEASE DO :6 <- :3 DO :1 <- :5 DO :2 <- #100 DO (2000) NEXT DO :1 <- :3 DO (2020) NEXT PLEASE DO :1 <- :6 DO (1509) NEXT (96) DO :6 <- :3 (91) DO (92) NEXT (95) DO FORGET #1 (92) DO :1 <- :5 DO :2 <- #100 DO (2000) NEXT DO :1 <- :3 PLEASE DO :2 <- :3 DO (1550) NEXT DO :1 <- :3 DO :2 <- #1 PLEASE DO (1509) NEXT DO RESUME :3 DO COME FROM (95) DO COME FROM (96) DO COME FROM (112) DO RETRIEVE :1 + :2 + :3 + :5 + :7 PLEASE RESUME #1 DO NOTE THIS IS MAIN DO COME FROM (3) DO :206 <- #11 DO :205 <- #1 (70) DO (71) NEXT (80) DO READ OUT :206 (71) DO (72) NEXT PLEASE DO :1 <- :205 DO (2040) NEXT DO :1 <- :205 PLEASE DO :2 <- #1 DO (1509) NEXT DO :205 <- :3 PLEASE DO :1 <- :6 DO :2 <- :206 DO (1509) NEXT DO :206 <- :3 PLEASE DO FORGET #2 DO (70) NEXT (72) DO :1 <- :205 DO :2 <- #1000 DO (1550) NEXT PLEASE DO :1 <- :3 DO :2 <- #1 DO (1509) NEXT PLEASE RESUME :3 DO COME FROM (80) PLEASE DO GIVE UP
No comments:
Post a Comment