#!/usr/bin/env tclsh # # Task 2: Final Score # # Submitted by: Mohammad Sajid Anwar # # You are given an array of scores by a team. # # Write a script to find the total score of the given team. The score can be any # integer, +, C or D. The + adds the sum of previous two scores. The score C # invalidates the previous score. The score D will double the previous score. # # Example 1 # # Input: @scores = ("5","2","C","D","+") # Output: 30 # # Round 1: 5 # Round 2: 5 + 2 # Round 3: 5 (invalidate the previous score 2) # Round 4: 5 + 10 (double the previous score 5) # Round 5: 5 + 10 + 15 (sum of previous two scores) # # Total Scores: 30 # # Example 2 # # Input: @scores = ("5","-2","4","C","D","9","+","+") # Output: 27 # # Round 1: 5 # Round 2: 5 + (-2) # Round 3: 5 + (-2) + 4 # Round 4: 5 + (-2) (invalidate the previous score 4) # Round 5: 5 + (-2) + (-4) (double the previous score -2) # Round 6: 5 + (-2) + (-4) + 9 # Round 7: 5 + (-2) + (-4) + 9 + 5 (sum of previous two scores) # Round 8: 5 + (-2) + (-4) + 9 + 5 + 14 (sum of previous two scores) # # Total Scores: 27 # # Example 3 # # Input: @scores = ("7","D","D","C","+","3") # Output: 45 # # Round 1: 7 # Round 2: 7 + 14 (double the previous score 7) # Round 3: 7 + 14 + 28 (double the previous score 14) # Round 4: 7 + 14 (invalidate the previous score 28) # Round 5: 7 + 14 + 21 (sum of previous two scores) # Round 6: 7 + 14 + 21 + 3 # # Total Scores: 45 # # Example 4 # # Input: @scores = ("-5","-10","+","D","C","+") # Output: -55 # # Round 1: (-5) # Round 2: (-5) + (-10) # Round 3: (-5) + (-10) + (-15) (sum of previous two scores) # Round 4: (-5) + (-10) + (-15) + (-30) (double the previous score -15) # Round 5: (-5) + (-10) + (-15) (invalidate the previous score -30) # Round 6: (-5) + (-10) + (-15) + (-25) (sum of previous two scores) # # Total Scores: -55 # # Example 5 # # Input: @scores = ("3","6","+","D","C","8","+","D","-2","C","+") # Output: 128 # # Round 1: 3 # Round 2: 3 + 6 # Round 3: 3 + 6 + 9 (sum of previous two scores) # Round 4: 3 + 6 + 9 + 18 (double the previous score 9) # Round 5: 3 + 6 + 9 (invalidate the previous score 18) # Round 6: 3 + 6 + 9 + 8 # Round 7: 3 + 6 + 9 + 8 + 17 (sum of previous two scores) # Round 8: 3 + 6 + 9 + 8 + 17 + 34 (double the previous score 17) # Round 9: 3 + 6 + 9 + 8 + 17 + 34 + (-2) # Round 10: 3 + 6 + 9 + 8 + 17 + 34 (invalidate the previous score -2) # Round 11: 3 + 6 + 9 + 8 + 17 + 34 + 51 (sum of previous two scores) # # Total Scores: 128 # package require tcltest set cases { {{"5" "2" "C" "D" "+"} 30 "Example 1"} {{"5" "-2" "4" "C" "D" "9" "+" "+"} 27 "Example 2"} {{"7" "D" "D" "C" "+" "3"} 45 "Example 3"} {{"-5" "-10" "+" "D" "C" "+"} -55 "Example 4"} {{"3" "6" "+" "D" "C" "8" "+" "D" "-2" "C" "+"} 128 "Example 5"} } proc final_score {scores} { set stack {} foreach s $scores { if {$s eq "C"} { set stack [lrange $stack 0 end-1] } elseif {$s eq "D"} { lappend stack [expr {2 * [lindex $stack end]}] } elseif {$s eq "+"} { lappend stack [expr {[lindex $stack end] + [lindex $stack end-1]}] } else { lappend stack [expr $s + 0] } } return [expr [join $stack +]] } tcltest::configure -verbose {pass} foreach case $cases { tcltest::test [lindex $case 2] {} { final_score [lindex $case 0] } [lindex $case 1] } exit 0