Skip to main content

Lab 2 — String Encryptors

Purpose

Learn how to define functions, and about string library

Skills: 1

Introduction

You’ve stumbled upon a malfunctioning encryption device that scrambles secret messages into code. Unfortunately, the documentation went missing! Your mission is to reverse-engineer each of the device’s ten black-box functions so that you can replicate their behavior in Pyret.

How it works

The device exposes ten functions, named support.encryptor1 through support.encryptor10.

Each encryptor takes in a String and returns a new, “encrypted” String. Alongside each encryptor, there’s a corresponding tester routine — support.test-encryptor1, support.test-encryptor2, and so on that — checks whether your replication matches the original for all possible inputs.

Instructions

  1. Experiment

    1. Call each support.encryptorN with a variety of sample strings.
    2. Observe how the output changes and identify the pattern or rule it applies.
    3. Keep a written log of the inputs you tried and the outputs you observed (remember, you are acting as a detective here!).
  2. Recreate

    1. For each encryptor, write your own function, for example:
    fun my-encryptor1(s :: String) -> String: ... end

    which implements the same transformation you discovered.

    1. Use Pyret’s String library functions (e.g. string-length, string-substring, string-index-of, etc.) to build your own version.
  3. Verify

    1. Pass your function to the provided tester:
support.test-encryptor1(my-encryptor1)

If the tester completes without errors, your encryption logic is correct!

The goal of the lab is to recreate as many of the encryptors as you can!

Here’s how we built an encryptor that returns only the first character of any string:

fun encryptor0(s :: String) -> String:
doc: "returns the first letter of the string"
string-substring(s, 0, 1)
where:
# Doesn't work on empty strings
encryptor0("") raises "index"
# Otherwise, returns first letter
encryptor0("a") is "a"
encryptor0(" ") is " "
encryptor0("hello") is "h"
encryptor0("1, ") is "1"
end

More Hints!

  • When choosing Strings to use as inputs to the encryptors, it will be useful to vary your inputs – think about why this could be. In what ways can you vary your Strings?
  • Think about scenarios where we might see strings of text, such as a book or report. What symbols might you commonly see in that text, other than alphabetical letters?
  • Remember that Strings in Pyret are 0-indexed. This means that the first character in a string will be assigned index 0 (not 1).
  • Encryptor 9 is one of the trickiest. Try strings of various lengths that start with the same letters. What do you notice?