nilang 0.4.1

A scripting language interpreter for Advent of Code
Documentation
// Vigenere Cipher implementation
// This program encrypts text using the Vigenere cipher

// Create alphabet mapping
fn create_alphabet() {
  chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
  char_to_num = {};
  num_to_char = [];

  i = 0;
  for c in chars {
    char_to_num[c] = i;
    num_to_char << c;  // Push character into list
    i = i + 1;
  }

  return {char_to_num: char_to_num, num_to_char: num_to_char};
}

// Convert string to uppercase (simplified - only handles lowercase letters)
fn to_upper(text) {
  lower = "abcdefghijklmnopqrstuvwxyz";
  upper = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";

  // Create lowercase to uppercase map
  map = {};
  i = 0;
  for c in lower {
    upper_char = upper[i];
    map[c] = upper_char;
    i = i + 1;
  }

  result = "";
  for c in text {
    if map[c] != null {
      result = `{result}{map[c]}`;
    } else {
      result = `{result}{c}`;
    }
  }

  return result;
}

// Check if character is a letter
fn is_letter(c, alphabet) {
  return alphabet.char_to_num[c] != null;
}

// Encrypt text using Vigenere cipher
fn vigenere_encrypt(text, key, alphabet) {
  text = to_upper(text);
  key = to_upper(key);

  if #key == 0 {
    return text;
  }

  result = "";
  key_index = 0;

  for c in text {
    if is_letter(c, alphabet) {
      // Get numeric values
      text_num = alphabet.char_to_num[c];
      key_char = key[key_index % #key];
      key_num = alphabet.char_to_num[key_char];

      // Apply Vigenere shift
      encrypted_num = (text_num + key_num) % 26;
      encrypted_char = alphabet.num_to_char[encrypted_num];

      result = `{result}{encrypted_char}`;
      key_index = key_index + 1;
    } else {
      // Non-letter characters pass through unchanged
      result = `{result}{c}`;
    }
  }

  return result;
}

// Decrypt text using Vigenere cipher
fn vigenere_decrypt(text, key, alphabet) {
  text = to_upper(text);
  key = to_upper(key);

  if #key == 0 {
    return text;
  }

  result = "";
  key_index = 0;

  for c in text {
    if is_letter(c, alphabet) {
      // Get numeric values
      text_num = alphabet.char_to_num[c];
      key_char = key[key_index % #key];
      key_num = alphabet.char_to_num[key_char];

      // Apply Vigenere reverse shift
      decrypted_num = (text_num - key_num + 26) % 26;
      decrypted_char = alphabet.num_to_char[decrypted_num];

      result = `{result}{decrypted_char}`;
      key_index = key_index + 1;
    } else {
      // Non-letter characters pass through unchanged
      result = `{result}{c}`;
    }
  }

  return result;
}

// Main program
alphabet = create_alphabet();

print("Vigenere Cipher");
print("===============");
print("");
print("Enter encryption key:");
key = read;

print("Enter text to encrypt:");
text = read;

print("");
print("Original text: ");
print(text);

encrypted = vigenere_encrypt(text, key, alphabet);
print("");
print("Encrypted text:");
print(encrypted);

decrypted = vigenere_decrypt(encrypted, key, alphabet);
print("");
print("Decrypted text:");
print(decrypted);