Wednesday, April 19, 2006

Secondary 1 Maths Question

[Question]
Given the equation 28x +30y + 31z = 365 and that x, y, and z are natural numbers. Can we predict the value of x + y + z? Discuss and show your thinking.

[Anwser]
Natural number => integer number greater than 0

Determine the range for each variable
y=1,z=1 then x=10.85, 1 <= x <= 10
x=1,z=1 then y=10.20, 1 <= y <= 10
x=1,y=1 then z=9.90, 1 <= z <= 9

Rearrange equation
28x +30y + 31z = 365
28(x+y+z) + (2y+3z) = 365
x+y+z = [ 365 - (2y+3z) ] / 28

x+y+z has to be whole number
therefore 365-(2y+3z) has to be multiple of 28

Tabulate data

x+y+z365-(2y+3z)(2y+3z)5<=(2y+3z)<=47
1028085Out of range
1130857Out of range
1233629OK
133641Out of range

ANSWER: x+y+z is 12
So, what is x, y, z.
Let's try the brute force methods in
AWK, BC, Perl, Ruby, SH, Tcl


Answer is given at the end of this blog.

# AWK
awk '
END {
  for(x=1;x<=10;++x) {
    for(y=1;y<=10;++y) {
      for(z=1;z<=9;++z) {
        s=28*x+30*y+31*z
        if (s==365) {
          print x, "+", y, "+", z, "=", s;
        }
      }
    }
  }
}' /dev/null
# BC
for(x=1;x<=10;++x) {
  for(y=1;y<=10;++y) {
    for(z=1;z<=9;++z) {
      s=28*x+30*y+31*z
      if(s==365) {
        x
        "+"
        y
        "+"
        z
        "="
        s
      }
    }
  }
}
# Perl
foreach $x (1..10) {
  foreach $y (1..10) {
    foreach $z (1..9) {
      $s=28*$x+30*$y+31*$z;
      if ( $s == 365 ) {
        print $x, "+", $y, "+", $z, "=", $s, "\n";
      }
    }
  }
}
# Ruby
(1..10).each do
  |x|
  (1..10).each do
    |y|
    (1..9).each do
      |z|
      s=28*x+30*y+31*z
      if s==365
        print x, "+", y, "+", z, "=", s, "\n"
      end
    end
  end
end
# SH, extremely slow
#
# Works in Linux, Cygwin
# if you do not have "seq" in your system, define this
# seq()
# {
#   awk 'END{for(i='$1';i<='$2';++i) {print i}}' /dev/null
# }
for x in `seq 1 10`; do
  for y in `seq 1 10`; do
    for z in `seq 1 9`; do
      s=`expr 28 \* $x + 30 \* $y + 31 \* $z`
      if [ $s -eq 365 ]; then
        echo "$x + $y + $z = $s"
      fi
    done
  done
done
# Tcl: Method 1
for { set x 1 } { $x <= 10 } { incr x } {
  for { set y 1 } { $y <= 10 } { incr y } {
    for { set z 1 } { $z <= 9 }  { incr z } {
      set s [expr {28*$x + 30*$y + 31*$z}]
      if { $s == 365 } {
        puts  "$x + $y + $z = $s"
      }
    }
  }
}
# Tcl: Method 2
foreach x {1 2 3 4 5 6 7 8 9 10} {
  foreach y {1 2 3 4 5 6 7 8 9 10} {
    foreach z {1 2 3 4 5 6 7 8 9} {
      set s [expr {28*$x + 30*$y + 31*$z}]
      if { $s == 365 } {
        puts  "$x + $y + $z = $s"
      }
    }
  }
}
# Tcl: Method 3
set nine {1 2 3 4 5 6 7 8 9} 
set ten {1 2 3 4 5 6 7 8 9 10} 
foreach x $ten {
  foreach y $ten {
    foreach z $nine {
      set s [expr {28*$x + 30*$y + 31*$z}]
      if { $s == 365 } {
        puts  "$x + $y + $z = $s"
      }
    }
  }
}

[ANSWER]
x=1, y=4, z=7
x=2, y=1, z=9

0 Comments:

Post a Comment

<< Home