Skip to content

Instantly share code, notes, and snippets.

@tra38
Last active June 3, 2020 04:48
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save tra38/aca196c32ec3a86fe93775799bee09ca to your computer and use it in GitHub Desktop.
Save tra38/aca196c32ec3a86fe93775799bee09ca to your computer and use it in GitHub Desktop.
Part of Dev Bootcamp's Phase 4

Basics

  1. Write a function that squares a number
;square : number -> number
(define (square number)
    (* number number) 
  )

(square 5)
  1. Write a function that converts fahrenheit to celsius
;converter : number -> number 
(define (converter f_degree)
  (/ (- f_degree 32) 1.800)
)
(converter 200)
  1. Write a function that takes farhenheit and returns "brrr" if the temperature in celsisus is less than zero, and "could be worse" if the temperature in celsisus is above zero. (Edge case: what if it is zero? I'll decide it'll return "brrr".)
#lang racket
;converter : number -> number 
(define (converter f_degree)
  (/ (- f_degree 32) 1.800)
)

;weather-man : number -> string
(define ( weather-man f_degree )
  ( if (
          <=
          (converter f_degree)
          0
        )
       "brr"
       "could be worse"
   )
)

(converter 10)
(weather-man 10)
(converter 200)
(weather-man 200)
(converter 32)
(weather-man 32)
  1. Write a function that returns a greeting based on a name and a language (english, spanish).
;greeting-getter : string -> string
(define (gretting-getter language)
  (
   case language
    [( "english" ) "hello" ]
    [( "spanish" ) "hola" ]
    [else "[language not found]" ]
   )
)

;greeting : string -> string
(define ( greeting name language )
   (string-append ( gretting-getter language) " " name )
)

(greeting "alice" "english")
(greeting "bob" "spanish")
(greeting "charlie" "esperanto")
  1. Write a function that calculates the surface area of a pipe.
;todo - find out how to actually calculate a surface area of the pipe

;pipe-surface-area : number number number -> number
(define (pipe-surface-area outer-radius core-radius length)
  (* (* core-radius (* 2 pi) ) (+ core-radius length ) )
)

(pipe-surface-area 0 10 100)

Lists

  1. Write a function that takes a list and return the length of that list.
;length : list -> number
(define (length list)
  (cond
      [ ( null? list ) 0]
      [ ( null? (cdr list ) ) 1]
      [ else (+ (length (cdr list)) 1) ]
   )
)

( length `(1 2 3 4 5 6))
( length null )
  1. Write a function that searches a list for an item and return the index of that item...or -1 if the item cannot be found.
; end-of-list? : list -> boolean
(define (end-of-list? list)
  ( null? list )
)

; find-element-index : list number number -> number
(define (find-element-index list element ( index 0 ) )
  (cond
    [ ( end-of-list? list ) -1 ]
    [ ( equal? element (car list) ) index]
    [ else (find-element-index (cdr list) element (+ 1 index) ) ]
  )
)

( find-element-index `(1 2 3 4 5 6) 2)
( find-element-index null 2)
( find-element-index `(1 2 3 4 5 6) 7)
( find-element-index `(1 2 3 4 5 6) 6)
  1. Write a function that takes a list and an index and returns the element at that index.
; end-of-list? : list -> boolean
(define (end-of-list? list)
  ( null? list )
)

;index : list number -> element
( define ( index list integer )
   (cond
    [( end-of-list? list ) "out of bounds exception" ]
    [( equal? 0 integer ) (car list) ]
    [ else (index ( cdr list ) (- integer 1 ) ) ]
   )
)


( index `(1 2 3 4 5 6) 2)
( index null 2)
( index `(1 2 3 4 5 6) 5 )
( index `(1 2 3 4 5 6) 6 )
  1. Write a function that takes a list and returns a new list containing just the first and last element.
; end-of-list? : list -> boolean
(define (end-of-list? list)
  ( null? list )
)

; last-element? : list -> boolean
(define (last-element? list)
  ( end-of-list? (cdr list ) )
)

; last-element : list -> element
(define (last-element list )
  (if
      ( last-element? list)
      ( car list )
      ( last-element (cdr list) )
   )
)

; alternative approach
; last-element : list -> element
;(define (last-element list)
;  (cond
;    [(last-element? list) (car list)]
;    [ else (last-element (cdr list))]
;  )
;)

; first-and-last : list -> list
( define ( first-and-last list)
   (
    if
    (null? list)
    "list is null"
    (cons 
          (car list)
          (if ( null? (cdr list) ) null (last-element list ) )
    )
  )
)

( first-and-last `(1 2 3 4 5 6))
( first-and-last `(1))
( first-and-last null)
( first-and-last `(1 2))
  1. Write a function that only returns even numbers from a list.
;is-even : number -> boolean
(define (is-even number)
  ( equal? 0 ( remainder number 2))
)

;even-numbers : list -> list
(define (even-numbers numbers)
   (cond
      [ ( empty? numbers ) null ]
      [ (is-even (car numbers) ) (cons (car numbers) (even-numbers ( cdr numbers )))]
      [ else ( even-numbers ( cdr numbers ))]
  )
)
(even-numbers '(1 2 3 4 5 6))
(even-numbers '(1 3 5))
(even-numbers '(-1 -2 -3 -4 -5 -6))

Higher-Order Functions

  1. Write a function that returns items from a list that match a provided criteria. The criteria will be a function that returns true or false given an item. You should be able to re-implement the last list drill using the function you write in this drill
;is-even : number -> boolean
(define (is-even number)
  ( equal? 0 ( remainder number 2))
)

;filter : list conditional -> list
(define (filter target-list conditional)
  
  (define (filter-rest target-list)
    (filter (cdr target-list) conditional)    
  )
  
  (cond
      [ ( empty? target-list ) null ]
      [ (conditional (car target-list) ) (cons (car target-list) (filter-rest target-list))]
      [ else (filter-rest target-list)]
  )
)

;even-numbers : list -> list
(define (even-numbers list)
  ( filter list is-even)
)

(even-numbers '(1 2 3 4 5 6))
(even-numbers '(1 3 5))
(even-numbers '(-1 -2 -3 -4 -5 -6))
(even-numbers '(2 4 6))
  1. Write a function that triples all numbers in a list, filter out the odds, and sum the remaining numbers. Use Racket's higher order functions for this.
  • First, let's try writing our own higher-order functions.
; is-even : number -> boolean
(define (is-even number)
  ( equal? 0 ( remainder number 2))
)

; filter : list conditional -> list
(define (filter target-list conditional)
  
  (define (filter-rest target-list)
    (filter (cdr target-list) conditional)    
  )
  
  (cond
      [ ( empty? target-list ) null ]
      [ (conditional (car target-list) ) (cons (car target-list) (filter-rest target-list))]
      [ else (filter-rest target-list)]
  )
)

; sum : list -> number
(define (sum target-list)
  (
   cond
    [ ( empty? target-list ) 0 ]
    [ else (+ (car target-list) (sum (cdr target-list)))]
  )
)

; triple : list -> list
(define (triple target-list)
  (
   cond
    [ ( empty? target-list ) null ]
    [ else (cons (* 3 (car target-list)) (triple (cdr target-list)))]
  )
)

; triple-even-sum : list -> number
(define (triple-even-sum target-list)
  (sum ( filter (triple target-list) is-even) )
)

(triple '(1 2 3 4 5 6) )
(filter (triple'(1 2 3 4 5 6)) is-even)
(triple-even-sum '(1 2 3 4 5 6))

(triple-even-sum '())

(triple-even-sum '(4))
  • Now that we understood the problem better, let's refactor our code to use Racket's built-in functions (in this case, apply, filter, and map).
; is-even : number -> boolean
(define (is-even number)
  ( equal? 0 ( remainder number 2))
)

; triple : number -> number
(define (triple number)
  (* 3 number)
)

; sum : list -> number
(define (sum target-list)
  ( apply + target-list)
)

; triple-even-sum : list -> number
(define (triple-even-sum target-list)
  (sum ( filter is-even (map triple target-list) ) )
)

(triple-even-sum '(1 2 3 4 5 6))

(triple-even-sum '())

(triple-even-sum '(4))
  1. Write a function that checks if all characters in a list are lowercase. Note that characters are different from strings (for example, this is a character #\b).
; is-valid? : element conditional -> boolean
(define ( is-valid? element conditional )
  ( conditional element )
)

; is-lowercase-character? : list -> boolean
(define (is-lowercase-character? element )
  (and ( char? element ) ( char-lower-case? element ) )
)

; all? : list function -> boolean
; note - need to return false if list is already empty
(define (all? target-list conditional)
  (define (end-of-list? target-list)
    (empty? (cdr target-list))
  )

  (define (first-element-matches? target-list)
    (is-valid? (car target-list) conditional)
  )

  (define (successful-match? target-list)
    (and (first-element-matches? target-list) ( end-of-list? target-list ) ) 
  )
  
  (cond
    [ (empty? target-list ) #f ]
    [ (successful-match? target-list) #t]
    [ (first-element-matches? target-list) (all? (cdr target-list) conditional)]
    [ else #f ]
   )
)

; all-lowercase-characters : list -> boolean
(define (all-lowercase-characters? target-list)
  (all? target-list is-lowercase-character? )
)

(all-lowercase-characters? '(1 2 3 4 5 6))

(all-lowercase-characters? '())

(all-lowercase-characters? '("alice"))

(all-lowercase-characters? '(#\b))

(all-lowercase-characters? '(#\b #\c #\d #\e))

(all-lowercase-characters? '(#\b #\c #\d #\E))
  1. Write map . map should take a function and a list as arguments. It should return a new list.
; map : function list -> list
(define (map function target-list)
  (
   if
   (empty? target-list )
   null
   (cons (function (car target-list)) (map function (cdr target-list)))
  )
)

; double : number -> number
(define (double x)
  (* 2 x)
)

(map double '(1 2 3 4 5) )

(map double '() )
  1. Write two functions greet-english and greet-spanish, using the greeting function you created above.
  • Without Currying
;greeting-getter : string -> string
(define (gretting-getter language)
  (
   case language
    [( "english" ) "hello" ]
    [( "spanish" ) "hola" ]
    [else "[language not found]" ]
   )
)

;greeting : string string -> string
(define ( greeting name language )
   (string-append ( gretting-getter language) " " name )
)

;greet-english : string -> string
(define (greet-english name)
  (greeting name "english")
)

;greet-spanish : string -> string
(define (greet-spanish name)
  (greeting name "spanish")
)

(greet-english "Alice")
(greet-spanish "Bob")
  • With Currying
;greeting-getter : string -> string
(define (gretting-getter language)
  (
   case language
    [( "english" ) "hello" ]
    [( "spanish" ) "hola" ]
    [else "[language not found]" ]
   )
)

;greeting : string string -> string
(define ( greeting name language )
   (string-append ( gretting-getter language) " " name )
)

;greet-curry : string -> procedure
(define (greet-curry name)
  (curry greeting name)
)

;greet-english : string -> string
(define (greet-english name)
  ((greet-curry name) "english")
)

;greet-spanish : string -> string
(define (greet-spanish name)
  ((greet-curry name) "spanish")
)

(greet-english "Alice")
(greet-spanish "Bob")
  • With Currying (Right-To-Left Argument Accumlation)
;greeting-getter : string -> string
(define (gretting-getter language)
  (
   case language
    [( "english" ) "hello" ]
    [( "spanish" ) "hola" ]
    [else "[language not found]" ]
   )
)

;greeting : string string -> string
(define ( greeting name language )
   (string-append ( gretting-getter language) " " name )
)

;greet-curryr : string -> procedure
(define (greet-curryr language)
  (curryr greeting language)
)

;greet-english : procedure
(define greet-english
  (greet-curryr "english")
)

;greet-spanish : procedure
(define greet-spanish
  (greet-curryr "spanish")
)

(greet-english "Alice")
(greet-spanish "Bob")
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment