From 168e07261537eea7ea1eef079f10cc8c356f99f8 Mon Sep 17 00:00:00 2001 From: Michael Adams Date: Fri, 4 Aug 2023 16:58:25 -0700 Subject: [PATCH 1/4] Nim code more idiomatic; fix errors --- .../01_Acey_Ducey/nim/aceyducey.nim | 84 +++++++++---------- .../05_Bagels/nim/bagels.nim | 60 ++++++------- 00_Alternate_Languages/33_Dice/nim/dice.nim | 33 ++++---- 3 files changed, 87 insertions(+), 90 deletions(-) diff --git a/00_Alternate_Languages/01_Acey_Ducey/nim/aceyducey.nim b/00_Alternate_Languages/01_Acey_Ducey/nim/aceyducey.nim index a36aacf9..ed180de4 100644 --- a/00_Alternate_Languages/01_Acey_Ducey/nim/aceyducey.nim +++ b/00_Alternate_Languages/01_Acey_Ducey/nim/aceyducey.nim @@ -5,65 +5,65 @@ var retry: bool = true proc printGreeting() = - echo(spaces(26),"ACEY DUCEY CARD GAME") - echo(spaces(15),"CREATIVE COMPUTING MORRISTOWN, NEW JERSEY") - echo("\n") - echo("ACEY-DUCEY IS PLAYED IN THE FOLLOWING MANNER ") - echo("THE DEALER (COMPUTER) DEALS TWO CARDS FACE UP") - echo("YOU HAVE AN OPTION TO BET OR NOT BET DEPENDING") - echo("ON WHETHER OR NOT YOU FEEL THE CARD WILL HAVE") - echo("A VALUE BETWEEN THE FIRST TWO.") - echo("IF YOU DO NOT WANT TO BET, INPUT A 0") - echo("") + echo spaces(26),"ACEY DUCEY CARD GAME" + echo spaces(15),"CREATIVE COMPUTING MORRISTOWN, NEW JERSEY" + echo """ + +ACEY-DUCEY IS PLAYED IN THE FOLLOWING MANNER +THE DEALER (COMPUTER) DEALS TWO CARDS FACE UP +YOU HAVE AN OPTION TO BET OR NOT BET DEPENDING +ON WHETHER OR NOT YOU FEEL THE CARD WILL HAVE +A VALUE BETWEEN THE FIRST TWO. +IF YOU DO NOT WANT TO BET, INPUT A 0 + +""" proc printBalance() = - echo("YOU NOW HAVE ", stash," DOLLARS.") - echo("") + echo "YOU NOW HAVE ", stash," DOLLARS." + echo "" proc printCard(aCard: int) = case aCard: - of 11: echo("=== JACK ===") - of 12: echo("=== QUEEN ===") - of 13: echo("=== KING ===") - of 14: echo("=== ACE ===") - else: echo("=== ", aCard, " ===") + of 11: echo "=== JACK ===" + of 12: echo "=== QUEEN ===" + of 13: echo "=== KING ===" + of 14: echo "=== ACE ===" + else: echo "=== ", aCard, " ===" proc drawDealerCards() = - echo("HERE ARE YOUR NEXT TWO CARDS: ") + echo "HERE ARE YOUR NEXT TWO CARDS: " cardA = rand(2..14) cardB = cardA # Copy cardA, so we can test cardB to be different while cardB == cardA: cardB = rand(2..14) if cardA > cardB: # Make sure cardA is the smaller card - swap(cardA, cardB) - echo("") - printCard(cardA) - echo("") - printCard(cardB) - echo("") + swap cardA, cardB + echo "" + printCard cardA + echo "" + printCard cardB + echo "" proc drawPlayerCard() = - cardC = rand(2..14) - printCard(cardC) - echo("") + cardC = rand 2..14 + printCard cardC + echo "" proc getBet(): int = result = stash + 1 #ensure we enter the loop while (result < 0) or (result > stash): - echo("WHAT IS YOUR BET: ") + echo "WHAT IS YOUR BET: " result = readLine(stdin).parseInt() if result > stash: - echo("SORRY, MY FRIEND, BUT YOU BET TOO MUCH.") - echo("YOU HAVE ONLY ", stash," DOLLARS TO BET.") - if bet == 0: - echo("CHICKEN!!") + echo "SORRY, MY FRIEND, BUT YOU BET TOO MUCH." + echo "YOU HAVE ONLY ", stash, " DOLLARS TO BET." + if result == 0: + echo "CHICKEN!!" proc tryAgain(): bool = - echo("TRY AGAIN (YES OR NO)") + echo "TRY AGAIN (YES OR NO)" var answer = readLine(stdin).normalize() - case answer: - of "yes", "y": result = true - else: result = false + result = (answer == "y") or (answer == "yes") printGreeting() while retry: @@ -72,15 +72,15 @@ while retry: printBalance() drawDealerCards() bet = getBet() - echo("") + echo "" drawPlayerCard() if (cardC >= cardA) and (cardC <= cardB): - echo("YOU WIN!!!") + echo "YOU WIN!!!" stash += bet else: - echo("SORRY, YOU LOSE") + echo "SORRY, YOU LOSE" stash -= bet - echo("SORRY, FRIEND, BUT YOU BLEW YOUR WAD."); - echo("") + echo "SORRY, FRIEND, BUT YOU BLEW YOUR WAD." + echo "" retry = tryAgain() -echo("O.K., HOPE YOU HAD FUN!"); +echo "O.K., HOPE YOU HAD FUN!" diff --git a/00_Alternate_Languages/05_Bagels/nim/bagels.nim b/00_Alternate_Languages/05_Bagels/nim/bagels.nim index d1866913..dd260e3d 100644 --- a/00_Alternate_Languages/05_Bagels/nim/bagels.nim +++ b/00_Alternate_Languages/05_Bagels/nim/bagels.nim @@ -24,19 +24,19 @@ proc playGame() = # We want 3 unique random numbers: loop until we get them! while unique == false: unique = genSeed() - echo("O.K. I HAVE A NUMBER IN MIND.") + echo "O.K. I HAVE A NUMBER IN MIND." for i in 1..20: var c, d: int = 0 - echo("GUESS #", i) + echo "GUESS #", i prompt = readLine(stdin).normalize() if (prompt.len() != 3): - echo("TRY GUESSING A THREE-DIGIT NUMBER.") + echo "TRY GUESSING A THREE-DIGIT NUMBER." continue for z in 1..3: b[z] = prompt.substr(z-1, z-1).parseInt() # Convert string digits to array ints if (b[1] == b[2]) or (b[2] == b[3]) or (b[3] == b[1]): - echo("OH, I FORGOT TO TELL YOU THAT THE NUMBER I HAVE IN MIND") - echo("HAS NO TWO DIGITS THE SAME.") + echo "OH, I FORGOT TO TELL YOU THAT THE NUMBER I HAVE IN MIND" + echo "HAS NO TWO DIGITS THE SAME." # Figure out the PICOs if (a[1] == b[2]): c += 1 if (a[1] == b[3]): c += 1 @@ -51,45 +51,45 @@ proc playGame() = if (d != 3): if (c != 0): for j in 1..c: - echo("PICO") + echo "PICO" if (d != 0): for j in 1..d: - echo("FERMI") + echo "FERMI" if (c == 0) and (d == 0): - echo("BAGELS") + echo "BAGELS" # If we have 3 FERMIs, we win! else: - echo("YOU GOT IT!!!") - echo("") + echo "YOU GOT IT!!!" + echo "" wincount += 1 youwin = true break # Only invoke if we've tried 20 guesses without winning - if (youwin == false): - echo("OH WELL.") - echo("THAT'S TWENTY GUESSES. MY NUMBER WAS ", a[1], a[2], a[3]) + if not youwin: + echo "OH WELL." + echo "THAT'S TWENTY GUESSES. MY NUMBER WAS ", a[1], a[2], a[3] # main program -echo(spaces(33), "BAGELS") -echo(spaces(15), "CREATIVE COMPUTING MORRISTOWN, NEW JERSEY") -echo("\n\n") -echo("WOULD YOU LIKE THE RULES (YES OR NO)") +echo spaces(33), "BAGELS" +echo spaces(15), "CREATIVE COMPUTING MORRISTOWN, NEW JERSEY" +echo "\n\n" +echo "WOULD YOU LIKE THE RULES (YES OR NO)" prompt = readLine(stdin).normalize() -if (prompt.substr(0, 0) == "y"): - echo("I AM THINKING OF A THREE-DIGIT NUMBER. TRY TO GUESS") - echo("MY NUMBER AND I WILL GIVE YOU CLUES AS FOLLOWS:") - echo(" PICO - ONE DIGIT CORRECT BUT IN THE WRONG POSITION") - echo(" FERMI - ONE DIGIT CORRECT AND IN THE RIGHT POSITION") - echo(" BAGELS - NO DIGITS CORRECT") - echo("") +if prompt.substr(0, 0) == "y": + echo "I AM THINKING OF A THREE-DIGIT NUMBER. TRY TO GUESS" + echo "MY NUMBER AND I WILL GIVE YOU CLUES AS FOLLOWS:" + echo " PICO - ONE DIGIT CORRECT BUT IN THE WRONG POSITION" + echo " FERMI - ONE DIGIT CORRECT AND IN THE RIGHT POSITION" + echo " BAGELS - NO DIGITS CORRECT" + echo "" while(stillplaying == true): playGame() - echo("PLAY AGAIN (YES OR NO)") + echo "PLAY AGAIN (YES OR NO)" prompt = readLine(stdin).normalize() - if (prompt.substr(0, 0) != "y"): + if prompt.substr(0, 0) != "y": stillplaying = false if wincount > 0: - echo("") - echo("A ", wincount, " POINT BAGELS BUFF!!") -echo("") -echo("HOPE YOU HAD FUN. BYE.") + echo "" + echo "A ", wincount, " POINT BAGELS BUFF!!" +echo "" +echo "HOPE YOU HAD FUN. BYE." diff --git a/00_Alternate_Languages/33_Dice/nim/dice.nim b/00_Alternate_Languages/33_Dice/nim/dice.nim index a1e5fa45..f19903a1 100644 --- a/00_Alternate_Languages/33_Dice/nim/dice.nim +++ b/00_Alternate_Languages/33_Dice/nim/dice.nim @@ -6,17 +6,17 @@ var z: string retry: bool = true -echo(spaces(34), "DICE") -echo(spaces(15), "CREATIVE COMPUTING MORRISTOWN, NEW JERSEY") -echo("\n") -echo("THIS PROGRAM SIMULATES THE ROLLING OF A PAIR OF DICE.") -echo("YOU ENTER THE NUMBER OF TIMES YOU WANT THE COMPUTER TO") -echo("'ROLL' THE DICE. WATCH OUT, VERY LARGE NUMBERS TAKE") -echo("A LONG TIME. IN PARTICULAR, NUMBERS OVER 5000.") +echo spaces(34), "DICE" +echo spaces(15), "CREATIVE COMPUTING MORRISTOWN, NEW JERSEY" +echo "\n" +echo "THIS PROGRAM SIMULATES THE ROLLING OF A PAIR OF DICE." +echo "YOU ENTER THE NUMBER OF TIMES YOU WANT THE COMPUTER TO" +echo "'ROLL' THE DICE. WATCH OUT, VERY LARGE NUMBERS TAKE" +echo "A LONG TIME. IN PARTICULAR, NUMBERS OVER 5000." while(retry): - echo("\n") - echo("HOW MANY ROLLS") + echo "\n" + echo "HOW MANY ROLLS" x = readLine(stdin).parseInt() for v in 2..12: f[v] = 0 # Initialize array to 0 @@ -25,14 +25,11 @@ while(retry): b = rand(1..6) # Die 2 r = a + b # Sum of dice f[r] += 1 # Increment array count of dice sum result - echo() - echo("TOTAL SPOTS: ", "NUMBER OF TIMES") + echo "" + echo "TOTAL SPOTS: ", "NUMBER OF TIMES" for v in 2..12: - echo(v, ": ", f[v]) # Print out counts for each possible result - echo("\n") - echo("TRY AGAIN?") + echo v, ": ", f[v] # Print out counts for each possible result + echo "\n" + echo "TRY AGAIN?" z = readLine(stdin).normalize() - if (z=="yes") or (z=="y"): - retry = true - else: - retry = false + retry = (z=="yes") or (z=="y") From 2d3ebc98a3dcd101e1066e084a99a61a1e74068a Mon Sep 17 00:00:00 2001 From: Michael Adams Date: Fri, 4 Aug 2023 23:01:38 -0700 Subject: [PATCH 2/4] Port Train to Nim --- 00_Alternate_Languages/91_Train/nim/train.nim | 37 +++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 00_Alternate_Languages/91_Train/nim/train.nim diff --git a/00_Alternate_Languages/91_Train/nim/train.nim b/00_Alternate_Languages/91_Train/nim/train.nim new file mode 100644 index 00000000..062e6dd1 --- /dev/null +++ b/00_Alternate_Languages/91_Train/nim/train.nim @@ -0,0 +1,37 @@ +import std/[random,strutils] + +var + carSpeed, diff, err, guess, trainSpeed, carTime: int + stillplaying: bool = true + +# Return a tuple that'll be carSpeed, diff, trainSpeed +proc randomNumbers(): (int,int,int) = + randomize() + result = (rand(1..25)+40 , rand(1..15)+5 , rand(1..19)+20) + +# Do we want to play again? +proc tryAgain(): bool = + echo "ANOTHER PROBLEM (YES OR NO)" + var answer = readLine(stdin).normalize() + result = (answer == "y") or (answer == "yes") + +echo spaces(33), "TRAIN" +echo spaces(15), "CREATIVE COMPUTING MORRISTOWN, NEW JERSEY" +echo "\n" +echo "TIME - SPEED DISTANCE EXERCISE" + +while stillplaying: + echo "" + (carSpeed, diff, trainSpeed) = randomNumbers() # Get random numbers for prompt + echo "A CAR TRAVELING ", carSpeed, " MPH CAN MAKE A CERTAIN TRIP IN" + echo diff, " HOURS LESS THAN A TRAIN TRAVELING AT ", trainSpeed, " MPH." + echo "HOW LONG DOES THE TRIP TAKE BY CAR?" + guess = readLine(stdin).parseInt() # Get guess + carTime = (diff * trainSpeed / (carSpeed - trainSpeed)).toInt() # Calculate answer + err = (((carTime - guess) * 100) / guess).toInt().abs() # Calculate error to an absolute value + if err > 5: # Error within 5%? + echo "SORRY. YOU WERE OFF BY ", err, " PERCENT." + else: + echo "GOOD! ANSWER WITHIN ", err, " PERCENT." + echo "CORRECT ANSWER IS ", carTime, " HOURS." + stillplaying = tryAgain() From 76d65ddcb2e8d52190b78887d6ecd9658ad31f0d Mon Sep 17 00:00:00 2001 From: Michael Adams Date: Sat, 5 Aug 2023 01:33:44 -0700 Subject: [PATCH 3/4] Craps ported to Nim --- 00_Alternate_Languages/29_Craps/nim/craps.nim | 66 +++++++++++++++++++ 1 file changed, 66 insertions(+) create mode 100644 00_Alternate_Languages/29_Craps/nim/craps.nim diff --git a/00_Alternate_Languages/29_Craps/nim/craps.nim b/00_Alternate_Languages/29_Craps/nim/craps.nim new file mode 100644 index 00000000..133ee590 --- /dev/null +++ b/00_Alternate_Languages/29_Craps/nim/craps.nim @@ -0,0 +1,66 @@ +import std/[random,strutils] + +var + wager, winnings, rollResult: int + stillplaying: bool = true + +proc tryAgain(): bool = + echo "WANT TO PLAY AGAIN? (YES OR NO)" + var answer = readLine(stdin).normalize() + result = (answer == "y") or (answer == "yes") + +proc takePoint(point: int) = + var flag = true + while flag: + var pointRoll: int = (rand 1..6) + (rand 1..6) # roll dice, then add the sum + if pointRoll == 7: + echo pointRoll, "- CRAPS. YOU LOSE." + echo "YOU LOSE ", wager, " DOLLARS." + winnings -= wager + flag = false + if pointRoll == point: + echo point, "- A WINNER.........CONGRATS!!!!!!!!" + echo "AT 2 TO 1 ODDS PAYS YOU...LET ME SEE... ", 2*wager, " DOLLARS" + winnings += (2*wager) + flag = false + if flag: + echo pointRoll, " - NO POINT. I WILL ROLL AGAIN" + +echo spaces(33), "CRAPS" +echo spaces(15), "CREATIVE COMPUTING MORRISTOWN, NEW JERSEY" +echo "\n" +echo "2,3,12 ARE LOSERS; 4,5,6,8,9,10 ARE POINTS; 7,11 ARE NATURAL WINNERS." +winnings = 0 + +# play the game +while stillplaying: + echo "" + echo "INPUT THE AMOUNT OF YOUR WAGER." + wager = readline(stdin).parseInt() + echo "I WILL NOW THROW THE DICE" + rollResult = (rand 1..6) + (rand 1..6) # roll dice, then add the sum + case rollResult: + of 7, 11: + echo rollResult, "- NATURAL....A WINNER!!!!" + echo rollResult, " PAYS EVEN MONEY, YOU WIN ", wager, " DOLLARS" + winnings += wager + of 2: + echo rollResult, "- SNAKE EYES....YOU LOSE." + echo "YOU LOSE ", wager, " DOLLARS." + winnings -= wager + of 3, 12: + echo rollResult, "- CRAPS...YOU LOSE." + echo "YOU LOSE ", wager, " DOLLARS." + winnings -= wager + else: + echo rollResult, " IS THE POINT. I WILL ROLL AGAIN" + takePoint(rollResult) + if winnings < 0: echo "YOU ARE NOW UNDER $", winnings + if winnings > 0: echo "YOU ARE NOW AHEAD $", winnings + if winnings == 0: echo "YOU ARE NOW EVEN AT 0" + stillplaying = tryAgain() + +# done playing +if winnings < 0: echo "TOO BAD, YOU ARE IN THE HOLE. COME AGAIN." +if winnings > 0: echo "CONGRATULATIONS---YOU CAME OUT A WINNER. COME AGAIN!" +if winnings == 0: echo "CONGRATULATIONS---YOU CAME OUT EVEN, NOT BAD FOR AN AMATEUR" From 3f25036fdc2bed7e97ae5fa05da104fb1d9a8bde Mon Sep 17 00:00:00 2001 From: Michael Adams Date: Sat, 5 Aug 2023 01:49:11 -0700 Subject: [PATCH 4/4] Fix random logic in Nim ports --- 00_Alternate_Languages/01_Acey_Ducey/nim/aceyducey.nim | 2 ++ 00_Alternate_Languages/05_Bagels/nim/bagels.nim | 2 ++ 00_Alternate_Languages/29_Craps/nim/craps.nim | 2 ++ 00_Alternate_Languages/33_Dice/nim/dice.nim | 2 ++ 00_Alternate_Languages/91_Train/nim/train.nim | 5 +++-- 5 files changed, 11 insertions(+), 2 deletions(-) diff --git a/00_Alternate_Languages/01_Acey_Ducey/nim/aceyducey.nim b/00_Alternate_Languages/01_Acey_Ducey/nim/aceyducey.nim index ed180de4..a980ed5d 100644 --- a/00_Alternate_Languages/01_Acey_Ducey/nim/aceyducey.nim +++ b/00_Alternate_Languages/01_Acey_Ducey/nim/aceyducey.nim @@ -4,6 +4,8 @@ var bet, cardA, cardB, cardC, stash: int retry: bool = true +randomize() # Seed the random number generator + proc printGreeting() = echo spaces(26),"ACEY DUCEY CARD GAME" echo spaces(15),"CREATIVE COMPUTING MORRISTOWN, NEW JERSEY" diff --git a/00_Alternate_Languages/05_Bagels/nim/bagels.nim b/00_Alternate_Languages/05_Bagels/nim/bagels.nim index dd260e3d..f302b375 100644 --- a/00_Alternate_Languages/05_Bagels/nim/bagels.nim +++ b/00_Alternate_Languages/05_Bagels/nim/bagels.nim @@ -10,6 +10,8 @@ var prompt: string stillplaying: bool = true +randomize() # Seed the random number generator + # Seed 3 unique random numbers; indicate if they're all unique proc genSeed(): bool = for i in 1..3: diff --git a/00_Alternate_Languages/29_Craps/nim/craps.nim b/00_Alternate_Languages/29_Craps/nim/craps.nim index 133ee590..770b6c0e 100644 --- a/00_Alternate_Languages/29_Craps/nim/craps.nim +++ b/00_Alternate_Languages/29_Craps/nim/craps.nim @@ -4,6 +4,8 @@ var wager, winnings, rollResult: int stillplaying: bool = true +randomize() # Seed the random number generator + proc tryAgain(): bool = echo "WANT TO PLAY AGAIN? (YES OR NO)" var answer = readLine(stdin).normalize() diff --git a/00_Alternate_Languages/33_Dice/nim/dice.nim b/00_Alternate_Languages/33_Dice/nim/dice.nim index f19903a1..6564ae9b 100644 --- a/00_Alternate_Languages/33_Dice/nim/dice.nim +++ b/00_Alternate_Languages/33_Dice/nim/dice.nim @@ -6,6 +6,8 @@ var z: string retry: bool = true +randomize() # Seed the random number generator + echo spaces(34), "DICE" echo spaces(15), "CREATIVE COMPUTING MORRISTOWN, NEW JERSEY" echo "\n" diff --git a/00_Alternate_Languages/91_Train/nim/train.nim b/00_Alternate_Languages/91_Train/nim/train.nim index 062e6dd1..aa92c1a7 100644 --- a/00_Alternate_Languages/91_Train/nim/train.nim +++ b/00_Alternate_Languages/91_Train/nim/train.nim @@ -4,10 +4,11 @@ var carSpeed, diff, err, guess, trainSpeed, carTime: int stillplaying: bool = true +randomize() # Seed the random number generator + # Return a tuple that'll be carSpeed, diff, trainSpeed proc randomNumbers(): (int,int,int) = - randomize() - result = (rand(1..25)+40 , rand(1..15)+5 , rand(1..19)+20) + result = (rand(41..65), rand(6..20), rand(21..39)) # Do we want to play again? proc tryAgain(): bool =