Source

Girl Develop It San Francisco, Teaching Materials, Exercises: Strings: MixUp

Description

Given two strings s1 and s2 and an integer n, swap the first n characters of s1 and s2 and concatenate the results, separated by a space. If either string is less than or equal to n characters in length, return them unmodified but concatenated, separated by a space.

1
2
'foo', 'bar', 3 ⟹ 'foo bar'
'foobar', 'bazqux', 3 ⟹ 'bazbar fooqux'

My solution

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#lang racket

(define (headswap s1 s2 n)
  (local [(define (ltn? s)
            (<= (string-length s) n))
          (define SHORT
            (or (ltn? s1) (ltn? s2)))
          (define (swap a b)
            (string-append
              (substring a 0 n) (substring b n)))]
    (cond [SHORT (string-append s1 " " s2)]
          [else
            (string-append
              (swap s2 s1) " " (swap s1 s2))])))


(provide headswap)

Tests

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#lang racket

(require rackunit rackunit/text-ui "headswap.rkt")

(define headswap-tests
  (test-suite "headswap tests"
  
    (test-case "Should leave strings unmodified"
        (check-equal? (headswap "foo" "bar" 3) "foo bar"))

    (test-case "Should modify strings"
        (check-equal? (headswap "foobar" "bazqux" 3) "bazbar fooqux"))

    ))

(run-tests headswap-tests)