@ Pohon BBS
SICP : Let's Read! (18 replies)

■ 🕑 13. exercise 1.3
│   (define (square x)
│   (* x x))
│   (define (sum-squares x y)
│   (+ (square x) (square y)))
│  
│   (define (sum-greater-squares x y z)
│   (if (> x y)
│   (if (> y z)
│   (sum-squares x y)
│   (sum-squares x z))
│   (if (> x z)
│   (sum-squares y x)
│   (sum-squares y z))))
│  
│   (sum-greater-squares 1 2 3)
│   (sum-greater-squares 4 2 3)
│   (sum-greater-squares 5 1 0)
│  
│   
└─■ 🕑 14. Excercise 1.3
  │  My attempt at exercise 1.3. it took me a long time as most of my attempts made code that excluded anything that wasn't the maximum number, so i guess finding the "middle" number is what makes this challenging. my first attempts were checking each variable against the others individually (mistake). if x>y then output x otherwise 0, if x>z output x otherwise 0 then multiply both outputs, repeat for each variable (rather silly in retrospect). After this i decided to only compare to the third variable if the first check failed and directly compute the square if the variable wasn't the minimum. Code below:
  │  
  │  #lang sicp
  │  (define (sicp_ex_1.3 x y z)
  │   (+
  │   (if (< x y) (if (< x z) 0 (* x x)) (* x x))
  │   (if (< y x) (if (< y z) 0 (* y y)) (* y y))
  │   (if (< z y) (if (< z x) 0 (* z z)) (* z z))))
  │  
  │  (sicp_ex_1.3 1 2 3)
  │  result was 13 so it worked
  │   
  ├─■ 🕑 15. corrected exercise 1.3
  │   Updated to catch PhatCat's fix -- if x, y, and z are the same
  │   value, the code does not work
  │   
  │   (define (square x)
  │    (* x x))
  │   (define (sum-squares x y)
  │    (+ (square x) (square y)))
  │   
  │   (define (sum-greater-squares x y z)
  │    (if (> x y)
  │    (if (> y z)
  │    (sum-squares x y)
  │    (sum-squares x z))
  │    (if (> x z)
  │    (sum-squares y x)
  │    (if (= x y z)
  │    (sum-squares x x)
  │    (sum-squares y z)))))

  │    
  └─■ 🕑 16. fix ex 1.3
    │  summed all 3 squares if x y z were the same. added a check to just force one variable to zero if all the numbers were equal so theres probably a more elegant solution :P. Code:
    │  
    │  #lang sicp
    │  
    │  (define (square x) (* x x))
    │  
    │  (define (sicp_ex_1.3 x y z)
    │   (+
    │   (if (= x y) 0 (if (= x z) 0
    │   (if (< x y) (if (< x z) 0 (square x)) (square x))))
    │   (if (< y x) (if (< y z) 0 (square y)) (square y))
    │   (if (< z y) (if (< z x) 0 (square z)) (square z))))
    │  
    │  (sicp_ex_1.3 1 2 3)
    │  (sicp_ex_1.3 2 2 2)
    │  (sicp_ex_1.3 2 1 0)
    │   
    └─■ 🕑 17. epic phail
        Fixed the fix
        
        #lang sicp
        
        (define (square x) (* x x))
        
        (define (sicp_ex_1.3 x y z)
         (+
         (if (= x y z) 0
         (if (< x y) (if (< x z) 0 (square x)) (square x))))
         (if (< y x) (if (< y z) 0 (square y)) (square y))
         (if (< z y) (if (< z x) 0 (square z)) (square z)))
        
        (sicp_ex_1.3 1 2 3)
        (sicp_ex_1.3 2 2 2)
        (sicp_ex_1.3 2 1 0)
         

Pohon BBS