def build_rightpart(): """Build the right part of the fireball function.""" # build in 1: (K dec) apply_card("put", 1) apply_slot(1, "dec") apply_card("K", 1) # build in 0: greg build_greg(0) # smash together to get (greg (K dec)) in 0 smash() # copy it to 1. apply_card("put", 1) apply_slot(1, "zero") apply_card("get", 1) # build horace in 0. build_horace(0) # smash together to get (horace (greg (K dec))) in 0. smash() # Wrap with an S. apply_card("S", 0) # build ian in 1. build_ian(1) # smash together to get ((S (horace (greg (K dec)))) ian) in 0. smash()
def build_june(): """ Building june actually takes slots 0, 1 and 2. (S (horace ((S (horace (greg (K S)))) ((S (horace fanny)) (greg I))))) ------------------------- ------------------------------- june1 june2 or: (S (horace (june1 june2))) """ # build june2 in slot 0. build_june2() # copy june2 to slot 2. copy(0, 2) # build june1 in slots 0,1. build_june1() # copy june2 back to slot 1. copy(2,1) # smash together to get (june1 june2) in slot 0. smash() # copy (june1 june2) to slot 1. copy(0, 1) # build horace in slot 0 build_horace(0) # smash together to get (horace (june1 june2)) in slot 0. smash() # wrap with an S for (S (horace june1 june2)) apply_card("S", 0)
def build_fanny(): """((S (K K)) (K K)). Uses slots 0 and 1, result ends up in slot 0.""" apply_card("put", 1) apply_slot(1, "K") apply_card("K", 1) build_greg(0) smash()
def build_linkedlist_better(): """Builds the linked list of dec in slot 0.""" ## build the stuff. apply_slot(0, "S") apply_slot(0,"dec") apply_slot(0,"dec") for i in range(330): apply_card("S", 0) apply_slot(0,"dec")
def build_linkedlist_better(): """Builds the linked list of dec in slot 0.""" ## build the stuff. apply_slot(0, "S") apply_slot(0, "dec") apply_slot(0, "dec") for i in range(330): apply_card("S", 0) apply_slot(0, "dec")
def build_june2(): """june2: takes up slots 0 and 1. ((S (horace fanny)) (greg I)) """ # build fanny (always in 0) build_fanny() # move fanny to 1. copy(0,1) # build horace in 0 build_horace(0) # smash together to get (horace fanny) in 0 smash() # wrap with an S apply_card("S", 0) # (greg I) is the equivalent of K, so just apply what we have in # slot 0 to K! apply_slot(0, "K")
def build_leftpart(): """Build the left part of the fireball function. Doing this uses slots 0,1,2,3 and the result will be in slot 0. (S (horace ((S (horace ((S (horace (greg (K S)))) ((S (horace fanny)) (greg I))))) -------------------------------------- june ((S (horace fanny)) ian) ))) ----------------------- kelly More abstractly: (S (horace ((S (horace (june1 june2))) kelly))) even more abstractly: (S (horace (june kelly))) """ # build kelly. build_kelly() # copy kelly to 3. copy(0, 3) # build june in slots 0,1,2 build_june() # copy kelly to slot 1 copy(3, 1) # smash together to get (june kelly) in 0 smash() # copy (june kelly) to 1 copy(0, 1) # build horace in 0 build_horace(0) # smash together to get (horace (june kelly)) in 0 smash() # wrap with an S for the whole left part. apply_card("S", 0)
def main(): # Decrements all the other player's slots by 8 within 17,000 turns # or so. Maybe we can exploit this? # Put "((S dec) dec)" in slot 1. apply_slot(1, "dec") apply_card("S", 1) apply_slot(1, "dec") # Build an S in slot 0. apply_slot(0, "S") # # Put (S ((S dec) dec)) in slot 0. smash() # Put (S ((S dec) dec)) and ((S dec) dec) together in slot 0. smash() # Slot 0 contains: ((S ((S dec) dec)) ((S dec) dec)) # Copy it over to slot 1 as well copy(0, 1) # # Now do: (((S slot0) slot1) targetslot) apply_card("S", 0) smash() num = 0 while (len(pipeline) < 17000): # Save for later copy(0, 2) build_num_in_slot(num, 1) smash() # Copy back to slot 0 copy(2, 0) num = num + 1 gameloop()
def main(): # Decrements all the other player's slots by 8 within 17,000 turns # or so. Maybe we can exploit this? # Put "((S dec) dec)" in slot 1. apply_slot(1, "dec") apply_card("S", 1) apply_slot(1, "dec") # Build an S in slot 0. apply_slot(0, "S") # # Put (S ((S dec) dec)) in slot 0. smash() # Put (S ((S dec) dec)) and ((S dec) dec) together in slot 0. smash() # Slot 0 contains: ((S ((S dec) dec)) ((S dec) dec)) # Copy it over to slot 1 as well copy(0,1) # # Now do: (((S slot0) slot1) targetslot) apply_card("S", 0) smash() num = 0; while (len(pipeline) < 17000): # Save for later copy(0,2) build_num_in_slot(num, 1) smash() # Copy back to slot 0 copy(2,0) num = num + 1 gameloop()
def build_base(slot): """((S (K dec)) I)""" apply_card("put", slot) apply_slot(slot, "dec") apply_card("K", slot) apply_card("S", slot) apply_slot(slot, "I")
def main(): ## This takes up slots 0,1 and also 5,6,7, but it puts the y combinator ## into slot 5. build_applicative_y(5) ## stomps registers [0,4]. Result is in 0. build_fireball() ## make 0 and 1 Y, fireball respectively copy(0, 1) copy(5, 0) ## combinate: now the combinated fireball is in 0. smash() ## make backup copies of the combinated fireball. copy(0, 1) copy(0, 2) ## pass slot 0 a slot number. apply_slot(0, "zero") for i in range(999): unsafe_copy(1, 0) ## pass slot 0 a slot number. apply_slot(0, "zero") build_num_in_slot(0, 1) ## really should be up to range 256, but we're not fast enough yet. for targetslot in range(1, 10): apply_card("succ", 1) for i in range(1000): ### put the combinated fireball in slot 0. unsafe_copy(2, 0) ## pass slot 0 a slot number. smash() gameloop()
def main(): ## This takes up slots 0,1 and also 5,6,7, but it puts the y combinator ## into slot 5. build_applicative_y(5) ## stomps registers [0,4]. Result is in 0. build_fireball() ## make 0 and 1 Y, fireball respectively copy(0,1) copy(5,0) ## combinate: now the combinated fireball is in 0. smash() ## make backup copies of the combinated fireball. copy(0,1) copy(0,2) ## pass slot 0 a slot number. apply_slot(0, "zero") for i in range(999): unsafe_copy(1,0) ## pass slot 0 a slot number. apply_slot(0, "zero") build_num_in_slot(0, 1) ## really should be up to range 256, but we're not fast enough yet. for targetslot in range(1, 10): apply_card("succ", 1) for i in range(1000): ### put the combinated fireball in slot 0. unsafe_copy(2,0) ## pass slot 0 a slot number. smash() gameloop()
def build_onemore(): """(S ((S (horace (greg (K dec)))) (greg I)))""" apply_card("put", 1) apply_slot(1, "dec") apply_card("K", 1) build_greg(0) smash() # now should have (greg (K dec)) in 0. copy(0,1) build_horace(0) smash() apply_card("S", 0) # now up to (S (horace (greg (K dec)))) in 0. # (greg I) is equivalent to K, so we can just apply slot 0 to K! apply_slot(0, "K") apply_card("S", 0)
def build_onemore(): """(S ((S (horace (greg (K dec)))) (greg I)))""" apply_card("put", 1) apply_slot(1, "dec") apply_card("K", 1) build_greg(0) smash() # now should have (greg (K dec)) in 0. copy(0, 1) build_horace(0) smash() apply_card("S", 0) # now up to (S (horace (greg (K dec)))) in 0. # (greg I) is equivalent to K, so we can just apply slot 0 to K! apply_slot(0, "K") apply_card("S", 0)
def main(): ## build the damage function. build_linkedlist_better() # two backup copies of the function. copy(0, 1) copy(0, 2) ## step 1: kill their low-numberd slots. (high-numbered for us.) build_num_in_slot(254, 1) smash() for targetslot in range(254, 256): for i in range(LOOPS): ### put the unrolled fireball in slot 0. unsafe_copy(2, 0) ## pass the function a target slot number. smash() if targetslot != 255: apply_card("succ", 1) build_num_in_slot(250, 1) for targetslot in range(250, 254): for i in range(LOOPS): ### put the unrolled fireball in slot 0. unsafe_copy(2, 0) ## pass the function a target slot number. smash() if targetslot != 253: apply_card("succ", 1) ## just in case we've iterated over all the slots, try it twice. This ## should take us through the end of a game. for times in range(2): unsafe_copy(2, 0) copy(2, 1) ## now start working on slot 0, which is easy to attack. apply_slot(0, "zero") for i in range(LOOPS): unsafe_copy(1, 0) ## pass slot 0 a slot number. apply_slot(0, "zero") build_num_in_slot(0, 1) for targetslot in range(1, 256): apply_card("succ", 1) for i in range(LOOPS): ### put the unrolled fireball in slot 0. unsafe_copy(2, 0) ## pass the function a target slot number. smash() gameloop()
def main(): ## build the damage function. build_linkedlist_better() # two backup copies of the function. copy(0, 1) copy(0, 2) ## step 1: kill their low-numberd slots. (high-numbered for us.) build_num_in_slot(254,1) smash() for targetslot in range(254, 256): for i in range(LOOPS): ### put the unrolled fireball in slot 0. unsafe_copy(2,0) ## pass the function a target slot number. smash() if targetslot != 255: apply_card("succ", 1) build_num_in_slot(250,1) for targetslot in range(250, 254): for i in range(LOOPS): ### put the unrolled fireball in slot 0. unsafe_copy(2,0) ## pass the function a target slot number. smash() if targetslot != 253: apply_card("succ", 1) ## just in case we've iterated over all the slots, try it twice. This ## should take us through the end of a game. for times in range(2): unsafe_copy(2,0) copy(2,1) ## now start working on slot 0, which is easy to attack. apply_slot(0, "zero") for i in range(LOOPS): unsafe_copy(1,0) ## pass slot 0 a slot number. apply_slot(0, "zero") build_num_in_slot(0, 1) for targetslot in range(1, 256): apply_card("succ", 1) for i in range(LOOPS): ### put the unrolled fireball in slot 0. unsafe_copy(2,0) ## pass the function a target slot number. smash() gameloop()
def build_june1(): """june1: takes up slots 0 and 1. (S (horace (greg (K S))))""" # put greg in 0 build_greg(0) # put S in 1 apply_card("put", 1) apply_slot(1, "S") # put K around the S apply_card("K", 1) # smash together to get (greg (K S)) smash() # copy (greg (K S)) to 1 copy(0, 1) # put horace in 0 build_horace(0) # smash together for (horace (greg (K S))) smash() # wrap with an S for (S (horace (greg (K S)))) apply_card("S", 0)
def build_ian(slot): """(K I)""" apply_card("put", slot) apply_card("K", slot)
def main(): build_onemore() copy(0, 2) ## back up the onemore for later use build_base(1) smash() copy(0,1) ## move the now-bigger function into 1 ## build up a function that does 67 damage. That's the biggest one that we ## can run without going over the function application limit. for i in range(65): # copy the onemore into 0 copy(2,0) smash() # copy the now-bigger function into 1 copy(0,1) ## two backup copies of the 67-damage thing. copy(0,2) ## step 1: kill their low-numbered slots. (high-numbered for us.) build_num_in_slot(253,1) smash() for targetslot in range(253, 256): for i in range(LOOPS): ### put the unrolled fireball in slot 0. unsafe_copy(2,0) ## pass the function a target slot number. smash() if targetslot != 255: apply_card("succ", 1) build_num_in_slot(250,1) for targetslot in range(250, 253): for i in range(LOOPS): ### put the unrolled fireball in slot 0. unsafe_copy(2,0) ## pass the function a target slot number. smash() if targetslot != 253: apply_card("succ", 1) unsafe_copy(2,0) copy(2,1) ## now start working on slot 0, which is easy to attack. apply_slot(0, "zero") for i in range(LOOPS): unsafe_copy(1,0) ## pass slot 0 a slot number. apply_slot(0, "zero") build_num_in_slot(0, 1) ## really should be up to range 256. How fast are we? for targetslot in range(1, 100): apply_card("succ", 1) for i in range(LOOPS): ### put the unrolled fireball in slot 0. unsafe_copy(2,0) ## pass the function a target slot number. smash() gameloop()
def build_applicative_y(n): """ Build the applicative-order Y combinator into slot n. Warning: touches slots 0 and 1 as well as slots n, n+1, and n+2. Supposedly, what we're building is: ((S ((S (horace (greg I))) ((S (horace (june1 ((S (horace (june1 kelly))) kelly)))) (greg ian)))) ((S (horace (greg I))) ((S (horace (june1 ((S (horace (june1 kelly))) kelly)))) (greg ian))))) """ # Put (june1 kelly) in slot n. build_june1() copy(0, n) # move june1 to slot n build_kelly() apply_slotX_to_slotY(n, 0) # Put address of n in slot 0. build_num_in_slot(n, 0) # Put (horace (june1 kelly)) in slot n+1. build_horace(n+1) apply_slotX_to_slotY(n+1, n, yaddr=0) # Put (S (horace (june1 kelly))) in slot n+1. apply_card("S", n+1) # Put ((S (horace (june1 kelly))) kelly) in slot n+1. build_kelly() # always ends up in slot 0. apply_slotX_to_slotY(n+1, 0) # Put june1 in slot 0. build_june1() # Put address of n+1 in slot 1. build_num_in_slot(n+1, 1) # Put (june1 ((S (horace (june1 kelly))) kelly)) in slot 0. apply_slotX_to_slotY(0, n+1, yaddr=1) # Put horace in slot n. build_horace(n) # Put (horace (june1 ((S (horace (june1 kelly))) kelly))) in slot n. apply_slotX_to_slotY(n, 0) # Put (S (horace (june1 ((S (horace (june1 kelly))) kelly)))) in slot n. apply_card("S", n) # Put (greg ian) in slot 0. build_greg(0) build_ian(1) smash() # Put # ((S (horace (june1 ((S (horace (june1 kelly))) kelly)))) (greg ian)) # in slot n. apply_slotX_to_slotY(n, 0) # Put (greg I) in slot n+1. # It turns out (greg I) is equivalent to K! apply_card("put", n+1) apply_slot(n+1, "K") # Put (horace (greg I)) in slot n+2. build_horace(n+2) # Put address of n+1 in slot 1. build_num_in_slot(n+1, 1) apply_slotX_to_slotY(n+2, n+1, yaddr=1) # Put (S (horace (greg I))) in slot n+2. apply_card("S", n+2) # Put # ((S (horace (greg I))) # ((S (horace (june1 ((S (horace (june1 kelly))) kelly)))) (greg ian))) # in slot n+2. build_num_in_slot(n, 0) apply_slotX_to_slotY(n+2, n, yaddr=0) # Copy slot n+2 to slot n+1. copy(n+2, n+1) # Apply S to slot n+2, leaving the result in slot n+2. apply_card("S", n+2) # Apply contents of n+2 to contents of n+1, leaving the result in # slot n+2. #build_num_in_slot(n+1, 1) apply_slotX_to_slotY(n+2, n+1, yaddr=1) # Copy slot n+2 to slot n. copy(n+2, n)
def build_clarice(slot): apply_slot(slot,"S") apply_card("K",slot) apply_card("S",slot) apply_slot(slot,"K") apply_card("S",slot) # and now the S around clarice.
def build_kelly(): """((S (horace fanny)) ian)""" # build fanny (always in 0) build_fanny() # build horace in 2. build_horace(2) # move fanny to 1. apply_card("put", 1) apply_slot(1, "zero") apply_card("get", 1) # move horace to 0. apply_card("put", 0) apply_slot(0, "zero") apply_card("succ", 0) apply_card("succ", 0) apply_card("get", 0) # smash together to get (horace fanny) in 0. smash() # put an S around (horace fanny) in 0 to get (S (horace fanny)) apply_card("S", 0) # build ian in 1. build_ian(1) # smash together to get ((S (horace fanny)) ian) in 0. smash()
def build_dianne(slot): apply_card("put",slot) apply_card("S",slot) apply_slot(slot,"I") apply_card("K",slot)
def main(): build_onemore() copy(0, 2) ## back up the onemore for later use build_base(1) smash() copy(0, 1) ## move the now-bigger function into 1 ## build up a function that does 67 damage. That's the biggest one that we ## can run without going over the function application limit. for i in range(65): # copy the onemore into 0 copy(2, 0) smash() # copy the now-bigger function into 1 copy(0, 1) ## two backup copies of the 67-damage thing. copy(0, 2) ## step 1: kill their low-numbered slots. (high-numbered for us.) build_num_in_slot(253, 1) smash() for targetslot in range(253, 256): for i in range(LOOPS): ### put the unrolled fireball in slot 0. unsafe_copy(2, 0) ## pass the function a target slot number. smash() if targetslot != 255: apply_card("succ", 1) build_num_in_slot(250, 1) for targetslot in range(250, 253): for i in range(LOOPS): ### put the unrolled fireball in slot 0. unsafe_copy(2, 0) ## pass the function a target slot number. smash() if targetslot != 253: apply_card("succ", 1) unsafe_copy(2, 0) copy(2, 1) ## now start working on slot 0, which is easy to attack. apply_slot(0, "zero") for i in range(LOOPS): unsafe_copy(1, 0) ## pass slot 0 a slot number. apply_slot(0, "zero") build_num_in_slot(0, 1) ## really should be up to range 256. How fast are we? for targetslot in range(1, 100): apply_card("succ", 1) for i in range(LOOPS): ### put the unrolled fireball in slot 0. unsafe_copy(2, 0) ## pass the function a target slot number. smash() gameloop()
def build_greg(slot): """(S (K K))""" apply_card("put", slot) apply_slot(slot, "K") apply_card("K", slot) apply_card("S", slot)
def build_horace(slot): """(S (K S))""" apply_card("put", slot) apply_slot(slot, "S") apply_card("K", slot) apply_card("S", slot)
def build_abe(slot): """(S (K (S I I)))""" build_dianne(slot) apply_card("S", slot)