From 699d792e5bfe9b9084239126791ee61d112beeb2 Mon Sep 17 00:00:00 2001 From: Markus-D-M <105434903+Markus-D-M@users.noreply.github.com> Date: Wed, 25 May 2022 20:57:53 +0200 Subject: [PATCH 1/4] Update codingcontracttypes.ts two encryption contracts --- src/data/codingcontracttypes.ts | 232 ++++++++++++++++++++++++++++++++ 1 file changed, 232 insertions(+) diff --git a/src/data/codingcontracttypes.ts b/src/data/codingcontracttypes.ts index b7fce1441..9c76f0481 100644 --- a/src/data/codingcontracttypes.ts +++ b/src/data/codingcontracttypes.ts @@ -1610,4 +1610,236 @@ export const codingContractTypesMetadata: ICodingContractTypeMetadata[] = [ return comprLZDecode(ans) === plain && ans.length <= comprLZEncode(plain).length; }, }, + { + desc: (data: [string, number]): string => { + return [ + "Caesar cipher is one of the simplest encryption technique.", + "It is a type of substitution cipher in which each letter in the plaintext ", + "is replaced by a letter some fixed number of positions down the alphabet.", + "For example, with a left shift of 3, D would be replaced by A, ", + "E would become B, and A would become X (because of rotation).\n\n", + "You are given the following plaintext\n", + `  ${data[0]}\n`, + `and a left shift of ${data[1]}\n\n`, + "Return the ciphertext as uppercase string. Spaces remains the same.", + ].join(" "); + }, + difficulty: 1, + gen: (): [string, number] => { + // return [plaintext, shift value] + const words = [ + "ARRAY", + "CACHE", + "CLOUD", + "DEBUG", + "EMAIL", + "ENTER", + "FLASH", + "FRAME", + "INBOX", + "LINUX", + "LOGIC", + "LOGIN", + "MACRO", + "MEDIA", + "MODEM", + "MOUSE", + "PASTE", + "POPUP", + "PRINT", + "QUEUE", + "SHELL", + "SHIFT", + "TABLE", + "TRASH", + "VIRUS", + ]; + return [ + words + .sort(() => Math.random() - 0.5) + .slice(0, 5) + .join(" "), + Math.floor(Math.random() * 26), + ]; + }, + name: "Encryption I: Caesar Cipher", + numTries: 10, + solver: (data: [string, number], ans: string): boolean => { + // data = [plaintext, shift value] + // build char array, shifting via map and join to final results + const cipher = [...data[0]] + .map((a) => (a === " " ? a : String.fromCharCode(((a.charCodeAt(0) - 65 - data[1] + 26) % 26) + 65))) + .join(""); + return cipher === ans; + }, + }, + { + desc: (data: [string, string]): string => { + return [ + "Vigenère cipher is a type of polyalphabetic substitution. It uses ", + "the Vigenère square to encrypt and decrypt plaintext with a keyword.\n\n", + "  Vignenère square:\n", + "         A B C D E F G H I J K L M N O P Q R S T U V W X Y Z \n", + "       +----------------------------------------------------\n", + "     A | A B C D E F G H I J K L M N O P Q R S T U V W X Y Z \n", + "     B | B C D E F G H I J K L M N O P Q R S T U V W X Y Z A \n", + "     C | C D E F G H I J K L M N O P Q R S T U V W X Y Z A B\n", + "     D | D E F G H I J K L M N O P Q R S T U V W X Y Z A B C\n", + "     E | E F G H I J K L M N O P Q R S T U V W X Y Z A B C D\n", + "                ...\n", + "     Y | Y Z A B C D E F G H I J K L M N O P Q R S T U V W X\n", + "     Z | Z A B C D E F G H I J K L M N O P Q R S T U V W X Y\n\n", + "For encryption each letter of the plaintext is paired with the corresponding letter of a repeating keyword.", + "For example, the plaintext DASHBOARD is encrypted with the keyword LINUX:\n", + "   Plaintext: DASHBOARD\n", + "   Keyword:   LINUXLINU\n", + "So, the first letter D is paired with the first letter of the key L. Therefore, row D and column L of the ", + "Vigenère square are used to get the first cipher letter O. This must be repeated for the whole ciphertext.\n\n", + "You are given the following plaintext\n", + `  ${data[0]}\n`, + `and a keyword ${data[1]}\n\n`, + "Return the ciphertext as uppercase string.", + ].join(" "); + }, + difficulty: 2, + gen: (): [string, string] => { + // return [plaintext, keyword] + const words = [ + "ARRAY", + "CACHE", + "CLOUD", + "DEBUG", + "EMAIL", + "ENTER", + "FLASH", + "FRAME", + "INBOX", + "LINUX", + "LOGIC", + "LOGIN", + "MACRO", + "MEDIA", + "MODEM", + "MOUSE", + "PASTE", + "POPUP", + "PRINT", + "QUEUE", + "SHELL", + "SHIFT", + "TABLE", + "TRASH", + "VIRUS", + ]; + const keys = [ + "ALGORITHM", + "BANDWIDTH", + "BLOGGER", + "BOOKMARK", + "BROADBAND", + "BROWSER", + "CAPTCHA", + "CLIPBOARD", + "COMPUTING", + "COMMAND", + "COMPILE", + "COMPRESS", + "COMPUTER", + "CONFIGURE", + "DASHBOARD", + "DATABASE", + "DESKTOP", + "DIGITAL", + "DOCUMENT", + "DOWNLOAD", + "DYNAMIC", + "EMOTICON", + "ENCRYPT", + "EXABYTE", + "FIREWALL", + "FIRMWARE", + "FLAMING", + "FLOWCHART", + "FREEWARE", + "GIGABYTE", + "GRAPHICS", + "HARDWARE", + "HYPERLINK", + "HYPERTEXT", + "INTEGER", + "INTERFACE", + "INTERNET", + "ITERATION", + "JOYSTICK", + "JUNKMAIL", + "KEYBOARD", + "KEYWORD", + "LURKING", + "MACINTOSH", + "MAINFRAME", + "MALWARE", + "MONITOR", + "NETWORK", + "NOTEBOOK", + "COMPUTER", + "OFFLINE", + "OPERATING", + "PASSWORD", + "PHISHING", + "PLATFORM", + "PODCAST", + "PRINTER", + "PRIVACY", + "PROCESS", + "PROGRAM", + "PROTOCOL", + "REALTIME", + "RESTORE", + "RUNTIME", + "SCANNER", + "SECURITY", + "SHAREWARE", + "SNAPSHOT", + "SOFTWARE", + "SPAMMER", + "SPYWARE", + "STORAGE", + "TERMINAL", + "TEMPLATE", + "TERABYTE", + "TOOLBAR", + "TYPEFACE", + "USERNAME", + "UTILITY", + "VERSION", + "VIRTUAL", + "WEBMASTER", + "WEBSITE", + "WINDOWS", + "WIRELESS", + "PROCESSOR", + ]; + return [ + words + .sort(() => Math.random() - 0.5) + .slice(0, 5) + .join(""), + keys.sort(() => Math.random() - 0.5)[0], + ]; + }, + name: "Encryption II: Vigenère Cipher", + numTries: 10, + solver: (data: [string, string], ans: string): boolean => { + // data = [plaintext, keyword] + // build char array, shifting via map and corresponding keyword letter and join to final results + const cipher = [...data[0]] + .map((a, i) => + (a === " " + ? a + : String.fromCharCode(((a.charCodeAt(0) - 2 * 65 + data[1].charCodeAt(i % data[1].length)) % 26) + 65)), + ) + .join(""); + return cipher === ans; + }, + }, ]; From 51ba358464ce5787ef472531e0bdb2b6b239955e Mon Sep 17 00:00:00 2001 From: Markus-D-M <105434903+Markus-D-M@users.noreply.github.com> Date: Wed, 25 May 2022 21:27:58 +0200 Subject: [PATCH 2/4] Update codingcontracttypes.ts prettier --- src/data/codingcontracttypes.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/data/codingcontracttypes.ts b/src/data/codingcontracttypes.ts index 9c76f0481..5effe8d73 100644 --- a/src/data/codingcontracttypes.ts +++ b/src/data/codingcontracttypes.ts @@ -1833,11 +1833,11 @@ export const codingContractTypesMetadata: ICodingContractTypeMetadata[] = [ // data = [plaintext, keyword] // build char array, shifting via map and corresponding keyword letter and join to final results const cipher = [...data[0]] - .map((a, i) => - (a === " " + .map((a, i) => { + return a === " " ? a - : String.fromCharCode(((a.charCodeAt(0) - 2 * 65 + data[1].charCodeAt(i % data[1].length)) % 26) + 65)), - ) + : String.fromCharCode(((a.charCodeAt(0) - 2 * 65 + data[1].charCodeAt(i % data[1].length)) % 26) + 65); + }) .join(""); return cipher === ans; }, From 1d06273858f78c84adc518eb09e0a8ce746fff70 Mon Sep 17 00:00:00 2001 From: Markus-D-M <105434903+Markus-D-M@users.noreply.github.com> Date: Thu, 26 May 2022 09:40:05 +0200 Subject: [PATCH 3/4] Specify api data + Adding description to doc. --- doc/source/basicgameplay/codingcontracts.rst | 32 ++++++++++++++++++++ src/data/codingcontracttypes.ts | 14 ++++----- 2 files changed, 39 insertions(+), 7 deletions(-) diff --git a/doc/source/basicgameplay/codingcontracts.rst b/doc/source/basicgameplay/codingcontracts.rst index e8fdabbd9..7dacae18e 100644 --- a/doc/source/basicgameplay/codingcontracts.rst +++ b/doc/source/basicgameplay/codingcontracts.rst @@ -370,3 +370,35 @@ The list contains the name of (i.e. the value returned by | | | aaaaaaaaaaaaa -> 1a91031 | | | | aaaaaaaaaaaaaa -> 1a91041 | +-----------------------------------------+------------------------------------------------------------------------------------------+ +| Encryption I: Caesar Cipher | | Caesar cipher is one of the simplest encryption technique. It is a type of | +| | | substitution cipher in which each letter in the plaintext is replaced by a letter some | +| | | fixed number of positions down the alphabet. For example, with a left shift of 3, D | +| | | would be replaced by A, E would become B, and A would become X (because of rotation). | +| | | You are given the an array with two elements.The first element is the plaintext, the | +| | | second element is the left shift value. Return the ciphertext as uppercase string. | +| | | Spaces remains the same. | ++-----------------------------------------+------------------------------------------------------------------------------------------+ +| Encryption II: Vigenère Cipher | | Vigenère cipher is a type of polyalphabetic substitution. It uses the Vigenère square | +| | | to encrypt and decrypt plaintext with a keyword. | +| | | Vignenère square: | +| | | A B C D E F G H I J K L M N O P Q R S T U V W X Y Z | +| | | +---------------------------------------------------- | +| | | A | A B C D E F G H I J K L M N O P Q R S T U V W X Y Z | +| | | B | B C D E F G H I J K L M N O P Q R S T U V W X Y Z A | +| | | C | C D E F G H I J K L M N O P Q R S T U V W X Y Z A B | +| | | D | D E F G H I J K L M N O P Q R S T U V W X Y Z A B C | +| | | E | E F G H I J K L M N O P Q R S T U V W X Y Z A B C D | +| | | ... | +| | | Y | Y Z A B C D E F G H I J K L M N O P Q R S T U V W X | +| | | Z | Z A B C D E F G H I J K L M N O P Q R S T U V W X Y | +| | | For encryption each letter of the plaintext is paired with the corresponding letter of | +| | | a repeating keyword. For example, the plaintext DASHBOARD is encrypted with the | +| | | keyword LINUX: | +| | | Plaintext: DASHBOARD | +| | | Keyword: LINUXLINU | +| | | So, the first letter D is paired with the first letter of the key L. Therefore, row D | +| | | and column L of the Vigenère square are used to get the first cipher letter O. This | +| | | must be repeated for the whole ciphertext. | +| | | You are given an array with two elements. The first element is the plaintext, the | +| | | second element is the keyword. Return the ciphertext as uppercase string. | ++-----------------------------------------+------------------------------------------------------------------------------------------+ diff --git a/src/data/codingcontracttypes.ts b/src/data/codingcontracttypes.ts index 5effe8d73..48b16ae17 100644 --- a/src/data/codingcontracttypes.ts +++ b/src/data/codingcontracttypes.ts @@ -1618,9 +1618,9 @@ export const codingContractTypesMetadata: ICodingContractTypeMetadata[] = [ "is replaced by a letter some fixed number of positions down the alphabet.", "For example, with a left shift of 3, D would be replaced by A, ", "E would become B, and A would become X (because of rotation).\n\n", - "You are given the following plaintext\n", - `  ${data[0]}\n`, - `and a left shift of ${data[1]}\n\n`, + "You are given the an array with two elements:\n", + `  ["${data[0]}", ${data[1]}]\n`, + "The first element is the plaintext, the second element is the left shift value.\n\n", "Return the ciphertext as uppercase string. Spaces remains the same.", ].join(" "); }, @@ -1659,7 +1659,7 @@ export const codingContractTypesMetadata: ICodingContractTypeMetadata[] = [ .sort(() => Math.random() - 0.5) .slice(0, 5) .join(" "), - Math.floor(Math.random() * 26), + Math.floor(Math.random() * 25 + 1), ]; }, name: "Encryption I: Caesar Cipher", @@ -1695,9 +1695,9 @@ export const codingContractTypesMetadata: ICodingContractTypeMetadata[] = [ "   Keyword:   LINUXLINU\n", "So, the first letter D is paired with the first letter of the key L. Therefore, row D and column L of the ", "Vigenère square are used to get the first cipher letter O. This must be repeated for the whole ciphertext.\n\n", - "You are given the following plaintext\n", - `  ${data[0]}\n`, - `and a keyword ${data[1]}\n\n`, + "You are given an array with two elements:\n", + `  ["${data[0]}", "${data[1]}"]\n`, + "The first element is the plaintext, the second element is the keyword.\n\n", "Return the ciphertext as uppercase string.", ].join(" "); }, From 30687ce74e1192a92608ce2da78052fb383b4fa2 Mon Sep 17 00:00:00 2001 From: Markus-D-M <105434903+Markus-D-M@users.noreply.github.com> Date: Thu, 26 May 2022 21:08:28 +0200 Subject: [PATCH 4/4] Typo --- doc/source/basicgameplay/codingcontracts.rst | 2 +- src/data/codingcontracttypes.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/source/basicgameplay/codingcontracts.rst b/doc/source/basicgameplay/codingcontracts.rst index 7dacae18e..d2fadbab7 100644 --- a/doc/source/basicgameplay/codingcontracts.rst +++ b/doc/source/basicgameplay/codingcontracts.rst @@ -374,7 +374,7 @@ The list contains the name of (i.e. the value returned by | | | substitution cipher in which each letter in the plaintext is replaced by a letter some | | | | fixed number of positions down the alphabet. For example, with a left shift of 3, D | | | | would be replaced by A, E would become B, and A would become X (because of rotation). | -| | | You are given the an array with two elements.The first element is the plaintext, the | +| | | You are given an array with two elements.The first element is the plaintext, the | | | | second element is the left shift value. Return the ciphertext as uppercase string. | | | | Spaces remains the same. | +-----------------------------------------+------------------------------------------------------------------------------------------+ diff --git a/src/data/codingcontracttypes.ts b/src/data/codingcontracttypes.ts index 48b16ae17..9e85ae1de 100644 --- a/src/data/codingcontracttypes.ts +++ b/src/data/codingcontracttypes.ts @@ -1618,7 +1618,7 @@ export const codingContractTypesMetadata: ICodingContractTypeMetadata[] = [ "is replaced by a letter some fixed number of positions down the alphabet.", "For example, with a left shift of 3, D would be replaced by A, ", "E would become B, and A would become X (because of rotation).\n\n", - "You are given the an array with two elements:\n", + "You are given an array with two elements:\n", `  ["${data[0]}", ${data[1]}]\n`, "The first element is the plaintext, the second element is the left shift value.\n\n", "Return the ciphertext as uppercase string. Spaces remains the same.",