On Fri, Jan 3, 2014 at 2:42 AM, Danny Yoo <d...@hashcollision.org> wrote:
> > I hope you don't take offense. But I actually do not understand > print_candl_info(). I thought I did! But then I realized I was > deluding myself. I don't not understand it after all, and that's > after staring at it for more than about thirty minutes. > > I dare you to try to offend me, while offering helpful comments! Okay, I take that back. Anyway, no I don't. > Take that a "canary in the coalmine" kind of comment. eval() can > encourages habits that hurt program readability in a deep way. > > Fair enough. > where we first unroll the original's outer loop out so that there are > no eval()s anywhere. This hurts program length a little, but we can > deal with that. Do you agree so far that the program above preserves > the meaning of what you had before? > > Ha ha, you must understand, because you recreated the original form of the code. First, realize that this is all a learning exercise for me, I am not actually obsessed by Chutes & Ladders. So I was trying to figure out if I could do this thing of iterating over a list of (functions, lists, dictionaries) and print both some output related to the object, and the objects name. But I think you now understand that. In this _particular_ case, I've got that little list_index kluge, which is probably good, since it sort of forces me to try to solve a more general case (or get other people to!... er, thanks!) > > If we can assume that the rewritten code "means" the same thing, then > we can eliminate the duplication by doing something like this: > > ######################################################## > def print_candl_info(garray): > game_array, chute_nums, ladder_nums = {}, chutes, ladders > for i in chute_nums.keys(): chute_nums[i] = 0 > for i in ladder_nums.keys(): ladder_nums[i] = 0 > > summarize_game("chutes", chute_nums, 4, garray) > summarize_game("ladders", ladder_nums, 5, garray) > > I see what you did there. > Hmmm. I don't understand why chute_nums is assigned to chutes, nor > ladder_nums to ladders, and I don't see game_array being used here > yet. We can absorb that: > > > Yes, game_array was left over, sorry. But chutes and ladders are dictionaries that should remain unchanged, for the purpose of future games. chute_nums = chutes only b/c that was an easy way to fill in all the keys: I then zero out the values, and increment the values for every time any given chute or ladder is traversed during a game (this information is in game[4] and game[5], each of which are lists of the chutes or ladders traversed in each given game). I hope that's clear. So I think you can't lose that, or you'd have to fill in those keys differently (which is how I did it at first, but this approach seemed cleaner). ######################################################## > def print_candl_info(garray): > summarize_game("chutes", chutes, 4, garray) > summarize_game("ladders", ladders, 5, garray) > > def summarize_game(game_name, game_nums, game_index, garray): > for i in game_nums.keys(): game_nums[i] = 0 > > for corl in game_nums: > for game in garray: > if corl in game[game_index]: > game_nums[corl] += 1 > print("total ", game_name, "= ", sum(game_nums.values())) > ######################################################## > > This is definitely an improvement, IMO. Summarize_game is _almost_ a really good name, but it isn't really summarizing a single game: it's iterating over all the games in garray (the array of games), and adding up all the particular chutes and ladders occurrences, if I haven't already made that clear... It's sneaky like that. I'm tempted to say summarize_candl, but candl is getting boring... I'll leave it for now. > As a side note: the code above has more latitude than the original > because it can print out a friendlier game name. That is, for > example, you can do this: > > ################################################## > summarize_game("OOOO Chutes! OOOO", chutes, 4, garray) > summarize_game("HHHH Ladders! HHHH", ladders, 5, garray) > ################################################## > Yep, true that. Thanks Danny, this was instructive. Very kind of you. -- Keith
_______________________________________________ Tutor maillist - Tutor@python.org To unsubscribe or change subscription options: https://mail.python.org/mailman/listinfo/tutor