287 lines
12 KiB
C#
287 lines
12 KiB
C#
|
using System;
|
|||
|
using System.Collections.Generic;
|
|||
|
using System.Linq;
|
|||
|
using System.Text;
|
|||
|
using System.Threading.Tasks;
|
|||
|
using Newtonsoft.Json;
|
|||
|
using System.IO;
|
|||
|
using System.Windows.Forms;
|
|||
|
using static System.Console;
|
|||
|
using static System.Threading.Thread;
|
|||
|
|
|||
|
namespace cce {
|
|||
|
class Transcoder {
|
|||
|
static internal string result = "";
|
|||
|
static private Dictionary<string, string> extended_dict = null;
|
|||
|
static private Dictionary<string, string> common_dict = null;
|
|||
|
static private Dictionary<char, char> substitution = new Dictionary<char, char>{
|
|||
|
{'a','a' },
|
|||
|
{'b','t' },
|
|||
|
{'c','y' },
|
|||
|
{'d','p' },
|
|||
|
{'e','e' },
|
|||
|
{'f','t' },
|
|||
|
{'g','j' },
|
|||
|
{'h','k' },
|
|||
|
{'i','i' },
|
|||
|
{'j','t' },
|
|||
|
{'k','k' },
|
|||
|
{'l','p' },
|
|||
|
{'m','s' },
|
|||
|
{'n','t' },
|
|||
|
{'o','o' },
|
|||
|
{'p','k' },
|
|||
|
{'q','r' },
|
|||
|
{'r','t' },
|
|||
|
{'s','y' },
|
|||
|
{'t','p' },
|
|||
|
{'u','u' },
|
|||
|
{'v','t' },
|
|||
|
{'w','j' },
|
|||
|
{'x','k' },
|
|||
|
{'y','y' },
|
|||
|
{'z','b' }
|
|||
|
};
|
|||
|
static private Dictionary<char, string> decode_key = new Dictionary<char, string>{
|
|||
|
{'a',"a" },
|
|||
|
{'t',"bfjnrv"},
|
|||
|
{'y',"csy" },
|
|||
|
{'p',"dlt" },
|
|||
|
{'e',"e" },
|
|||
|
{'j',"gw" },
|
|||
|
{'k',"hkpx" },
|
|||
|
{'i',"i" },
|
|||
|
{'s',"m" },
|
|||
|
{'o',"o" },
|
|||
|
{'r',"q" },
|
|||
|
{'u',"u" },
|
|||
|
{'b',"z" }
|
|||
|
|
|||
|
};
|
|||
|
static private Dictionary<string, string> path = new Dictionary<string, string>{
|
|||
|
{"common","common_dict.json" },
|
|||
|
{"extended","extended_dict.json"}
|
|||
|
};
|
|||
|
static internal void Teacher() {
|
|||
|
var pos = CursorTop;
|
|||
|
Write("Please enter the encrypted word: ");
|
|||
|
var cyphered = Console.ReadLine().ToLower();
|
|||
|
if (cyphered == "") return;
|
|||
|
CursorTop = pos;
|
|||
|
string translation = "";
|
|||
|
while (true) {
|
|||
|
Write($"Please enter a translation for \"{cyphered}\": ");
|
|||
|
translation = ReadLine().ToLower();
|
|||
|
if (raw_encode(cyphered).ToLower() == cyphered) {
|
|||
|
Console.BackgroundColor = ConsoleColor.Green; Console.ForegroundColor = ConsoleColor.Black;
|
|||
|
WriteLine("Cypher Match!"); ResetColor(); break;
|
|||
|
}
|
|||
|
Console.BackgroundColor = ConsoleColor.Red;
|
|||
|
WriteLine("Words don't match");
|
|||
|
ResetColor();
|
|||
|
}
|
|||
|
var entered = false;
|
|||
|
char cki;
|
|||
|
do {
|
|||
|
Utils.LagWrite(@"Where do you want to save the translation?
|
|||
|
[1] Common words dictionary
|
|||
|
[2] Extended words dictionary
|
|||
|
>>> ".Replace("\r\n", "\n"));
|
|||
|
cki = ReadKey().KeyChar;
|
|||
|
WriteLine();
|
|||
|
if (extended_dict == null || common_dict == null) init();
|
|||
|
switch (cki) {
|
|||
|
case '1':
|
|||
|
if (common_dict.ContainsKey(translation)) {
|
|||
|
WriteLine("Error: Unable to add a new translation. Translation already present.");
|
|||
|
} else common_dict.Add(translation, cyphered);
|
|||
|
entered = true;
|
|||
|
break;
|
|||
|
case '2':
|
|||
|
if (extended_dict.ContainsKey(translation)) {
|
|||
|
WriteLine("Error: Unable to add a new translation. Translation already present.");
|
|||
|
} else extended_dict.Add(translation, cyphered);
|
|||
|
entered = true;
|
|||
|
break;
|
|||
|
default:
|
|||
|
CursorLeft--; WriteLine("Not a valid option");
|
|||
|
break;
|
|||
|
}
|
|||
|
} while (!entered);
|
|||
|
Console.BackgroundColor = cki == '1' ? ConsoleColor.Green : ConsoleColor.Blue; Console.ForegroundColor = ConsoleColor.Black;
|
|||
|
WriteLine("Translation Added"); ResetColor();
|
|||
|
update();
|
|||
|
}
|
|||
|
static internal void Encode(string entry) {
|
|||
|
result = raw_encode(entry);
|
|||
|
WriteLine("Transcoding:\n{0}\n", entry);
|
|||
|
Utils.LagWrite(result);
|
|||
|
}
|
|||
|
static internal void Decode(string entry) {
|
|||
|
var sentence = entry.ToLower();
|
|||
|
//120x30, buffer 240x60
|
|||
|
if (sentence.Length >= 120) { BufferWidth = sentence.Length * 2; WindowWidth = sentence.Length + 20; }
|
|||
|
Clear();
|
|||
|
CursorVisible = false;
|
|||
|
if (extended_dict == null || common_dict == null) init();
|
|||
|
var cleaned = new char[sentence.Length];
|
|||
|
var symbols = new char[sentence.Length];
|
|||
|
var writeout = new char[sentence.Length];
|
|||
|
for (int i = 0; i < sentence.Length; i++) {
|
|||
|
if (sentence[i] >= 'a' && sentence[i] <= 'z') { cleaned[i] = sentence[i]; symbols[i] = 'x'; writeout[i] = '_'; } else { writeout[i] = symbols[i] = sentence[i]; cleaned[i] = ' '; }
|
|||
|
}
|
|||
|
var decode = string.Join("", cleaned).ToLower().Split(' ');
|
|||
|
//var decoded = new List<List<string>>();
|
|||
|
Console.BackgroundColor = ConsoleColor.Green;
|
|||
|
Console.Write(" "); ResetColor(); Console.WriteLine(" Frequent Words");
|
|||
|
Console.BackgroundColor = ConsoleColor.Blue;
|
|||
|
Console.Write(" "); ResetColor(); Console.WriteLine(" Infrequent Words");
|
|||
|
Console.BackgroundColor = ConsoleColor.Red;
|
|||
|
Console.Write(" "); ResetColor(); Console.WriteLine(" Letter decypher");
|
|||
|
WriteLine("Transcoding:\n{0}\n", entry);
|
|||
|
int memTop = CursorTop;
|
|||
|
int left = 0;
|
|||
|
Write(string.Join("", writeout));
|
|||
|
for (int i = 0; i < decode.Length; i++) {
|
|||
|
if (symbols[left] != 'x') left++;
|
|||
|
//var options = new List<string>();
|
|||
|
CursorTop = memTop;
|
|||
|
Console.BackgroundColor = ConsoleColor.Green;
|
|||
|
Console.ForegroundColor = ConsoleColor.Black;
|
|||
|
wordwrite(common_dict, decode[i], entry, left, i);
|
|||
|
/*foreach (var item in common_dict) {
|
|||
|
if (item.Value == decode[i]) {
|
|||
|
CursorLeft = left;
|
|||
|
//options.Add(item.Key);
|
|||
|
for (int j = 0; j < item.Key.Length; j++) {
|
|||
|
Write(Char.IsUpper(entry[i]) ? char.Parse(item.Key[j].ToString().ToUpper()) : char.Parse(item.Key[j].ToString().ToLower()));
|
|||
|
}
|
|||
|
Write(item.Key.ToUpper());
|
|||
|
Sleep(100);
|
|||
|
CursorTop++;
|
|||
|
}
|
|||
|
}*/
|
|||
|
Console.BackgroundColor = ConsoleColor.Blue;
|
|||
|
Console.ForegroundColor = ConsoleColor.Black;
|
|||
|
wordwrite(extended_dict, decode[i], entry, left, i);
|
|||
|
ResetColor();
|
|||
|
List<List<char>> letter_decode = new List<List<char>>();
|
|||
|
for (int j = 0; j < decode[i].Length; j++) {
|
|||
|
if (decode_key.TryGetValue(decode[i][j], out string substituted)) {
|
|||
|
var letterlist = new List<char>();
|
|||
|
for (int h = 0; h < substituted.Length; h++) {
|
|||
|
letterlist.Add(substituted[h]);
|
|||
|
}
|
|||
|
letter_decode.Add(letterlist);
|
|||
|
} else {
|
|||
|
letter_decode.Add(new List<char> { sentence[j] });
|
|||
|
}
|
|||
|
}
|
|||
|
int top = CursorTop;
|
|||
|
int letterleft = left;
|
|||
|
Console.BackgroundColor = ConsoleColor.Red;
|
|||
|
Console.ForegroundColor = ConsoleColor.Black;
|
|||
|
for (int j = 0; j < letter_decode.Count; j++) {
|
|||
|
for (int h = 0; h < letter_decode[j].Count; h++) {
|
|||
|
CursorLeft = letterleft;
|
|||
|
Write(Char.IsUpper(entry[CursorLeft]) ? Char.ToUpper(letter_decode[j][h]) : Char.ToLower(letter_decode[j][h]));
|
|||
|
Sleep(10);
|
|||
|
CursorTop++;
|
|||
|
}
|
|||
|
CursorTop = top;
|
|||
|
letterleft++;
|
|||
|
}
|
|||
|
Sleep(80);
|
|||
|
left += decode[i].Length;
|
|||
|
}
|
|||
|
ResetColor();
|
|||
|
//return string.Join(" ", decoded);
|
|||
|
}
|
|||
|
static internal void head_transcribe() {
|
|||
|
if(!File.Exists("dev")) {
|
|||
|
Clear();
|
|||
|
BackgroundColor = ConsoleColor.Red;
|
|||
|
Utils.LagWrite(" \n" +
|
|||
|
" Unable to comply. Not a dev version \n"+
|
|||
|
" ", true);
|
|||
|
ResetColor();
|
|||
|
return;
|
|||
|
}
|
|||
|
raw_transcribe("common_dict.txt", "common_dict.json");
|
|||
|
raw_transcribe("extended_dict.txt", "extended_dict.json");
|
|||
|
uniquire();
|
|||
|
}
|
|||
|
static private void update() {
|
|||
|
uniquire();
|
|||
|
File.WriteAllText(path["extended"], JsonConvert.SerializeObject(extended_dict));
|
|||
|
File.WriteAllText(path["common"], JsonConvert.SerializeObject(common_dict));
|
|||
|
}
|
|||
|
static private string raw_encode(string entry) {
|
|||
|
var sentence = entry.ToLower();
|
|||
|
char[] encoded = new char[entry.Length];
|
|||
|
for (int i = 0; i < sentence.Length; i++) {
|
|||
|
if (substitution.TryGetValue(sentence[i], out char substituted)) {
|
|||
|
encoded[i] = Char.IsUpper(entry[i]) ? Char.ToUpper(substituted) : Char.ToLower(substituted);
|
|||
|
} else {
|
|||
|
encoded[i] = entry[i];
|
|||
|
}
|
|||
|
}
|
|||
|
return String.Join("", encoded);
|
|||
|
}
|
|||
|
static private void init() {
|
|||
|
if (common_dict != null && extended_dict != null) return;
|
|||
|
WriteLine("[Loading Dictionary]");
|
|||
|
if (File.Exists(path["extended"])) extended_dict = JsonConvert.DeserializeObject<Dictionary<string, string>>(File.ReadAllText(path["extended"]));
|
|||
|
else WriteLine("File missing");
|
|||
|
if (File.Exists(path["common"])) common_dict = JsonConvert.DeserializeObject<Dictionary<string, string>>(File.ReadAllText(path["common"]));
|
|||
|
else WriteLine("File missing");
|
|||
|
}
|
|||
|
static private void uniquire() {
|
|||
|
init();
|
|||
|
foreach (var item in common_dict) {
|
|||
|
if (extended_dict.ContainsKey(item.Key)) extended_dict.Remove(item.Key);
|
|||
|
}
|
|||
|
}
|
|||
|
static private void raw_transcribe(string input, string output) {
|
|||
|
var lines = File.ReadAllLines(input);
|
|||
|
for (int i = 0; i < lines.Length; i++) {
|
|||
|
lines[i] = lines[i].ToLower();
|
|||
|
}
|
|||
|
var English = new string[lines.Length];
|
|||
|
lines.CopyTo(English, 0);
|
|||
|
for (int i = 0; i < English.Length; i++) {
|
|||
|
var word = new char[English[i].Length];
|
|||
|
for (int j = 0; j < English[i].Length; j++) {
|
|||
|
if (substitution.TryGetValue(English[i][j], out char substituted)) {
|
|||
|
word[j] = substituted;
|
|||
|
}
|
|||
|
else {
|
|||
|
word[j] = English[i][j];
|
|||
|
}
|
|||
|
}
|
|||
|
lines[i] = String.Join("", word);
|
|||
|
WriteLine($"{English[i]}:{lines[i]}");
|
|||
|
}
|
|||
|
Dictionary<string, string> vals = new Dictionary<string, string>();
|
|||
|
for (int i = 0; i < English.Length; i++) {
|
|||
|
if (vals.ContainsKey(English[i])) continue;
|
|||
|
vals.Add(English[i], lines[i]);
|
|||
|
}
|
|||
|
File.WriteAllText(output, JsonConvert.SerializeObject(vals));
|
|||
|
}
|
|||
|
static private void wordwrite(Dictionary<string, string> collection, string decode, string entry,int left, int i) {
|
|||
|
foreach (var item in collection) {
|
|||
|
if (item.Value == decode) {
|
|||
|
CursorLeft = left;
|
|||
|
//options.Add(item.Key);
|
|||
|
for (int j = 0; j < item.Key.Length; j++) {
|
|||
|
Write(Char.IsUpper(entry[CursorLeft]) ? Char.ToUpper(item.Key[j]) : Char.ToLower(item.Key[j]));
|
|||
|
}
|
|||
|
Utils.VarSleep(10, low: 20,high:100);
|
|||
|
CursorTop++;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|