/**
* Math Assignment Decoding w/o Equation
*
* A simple decoder.
*
* @author RepeaterCreeper
* @since 03/21/2018 18:08:00
* @site https://repeatercreeper.me
*/
var codes = [142, 92, 152, 102, 122, 62, 42, 107, 92, 152, 117, 22, 32, 92, 152, 27, 42, 77, 77, 157],
tempA = [],
tempB = [];
// Assigning of Letters to key
var letters = {
1: 'A',
2: 'B',
3: 'C',
4: 'D',
5: 'E',
6: 'F',
7: 'G',
8: 'H',
9: 'I',
10: 'J',
11: 'K',
12: 'L',
13: 'M',
14: 'N',
15: 'O',
16: 'P',
17: 'Q',
18: 'R',
19: 'S',
20: 'T',
21: 'U',
22: 'V',
23: 'W',
24: 'X',
25: 'Y',
26: 'Z',
27: ' ',
28: '!',
29: '?',
30: '@',
};
/**
* All the equations are provided by the checkPossibleEquations function.
*
* @param {arrays} equations This parameter is a multidimensional array, contains pair of values.
*/
function bruteForce(equations) {
var decodedMessage = "",
currentEquation = 0;
equations.forEach(function(data){
decodedMessage += "(" + data[0] + ", " + data[1] +")[";
for (var letterCode = 0; letterCode < codes.length; letterCode++) {
for (var letter = 1; letter <= 30; letter++) {
var solved = (data[0] * letter) + data[1];
if (codes[letterCode] == solved) {
decodedMessage += letters[letter];
}
}
}
decodedMessage += "]";
currentEquation += 1;
});
console.log(decodedMessage);
}
/**
* Will check all possible equations, that works for AT LEAST two
* values.
*
* @return array Returns all equations that seem to work for TWO values.
*/
function checkPossibleEquations() {
var possibleEquations = [];
for (var i = 0; i < tempA.length; i++) {
for (var j = 0; j < tempB.length; j++) {
if (JSON.stringify(tempA[i]) == JSON.stringify(tempB[j])) {
possibleEquations.push(tempA[i]);
}
}
}
return possibleEquations;
}
/**
* Tries all possible combinations in the range of 1-50 and stores
* in temporary array variable.
*
* Equation: (i * letter) + k
*/
for (var i = 1; i <= 50; i++) {
for (var k = 1; k <= 50; k++) {
for (var letter = 0; letter < 30; letter++) {
var encValPos = (i * letter) + k;
// var encValNeg = i * letter - k;
if (encValPos == codes[0]) {
var temp = [];
temp.push(i);
temp.push(k);
tempA.push(temp);
}
if (encValPos == codes[1]) {
var temp2 = [];
temp2.push(i);
temp2.push(k);
tempB.push(temp2);
}
}
}
}
bruteForce(checkPossibleEquations());介绍所以,这基本上是一项数学作业,但我决定为它编写一个程序,因为它将使我的生活变得容易得多。我们基本上得到了一组代码,它告诉我们要得到它的方程,它说:接近我当前的方法,因为它是线性的,它是(i *字符)+ j。基本上是循环遍历,并检查值是否匹配。如果它真的把它作为一个“可能”的等式传递进去。以后会用到的。给定
使用说明
活动1这是我的秘密信息。这一次,看看你是否可以“破解代码”,而不是我给你的编码功能。帮助提示:编码函数是一个线性函数。尝试查看编码数字之间的差异,以找到编码函数。
编码消息
51、103、75、47、91、119、135、127、47、91、23、27、127、23、127、95、75、55、31、63、39、91、95、131
字符分配
1: a,2: B,3: C,4: d,5: e,6: F,7: G,8: h,9: I,10: J,11: K,12:'L',13: M,14: n,15:'O',16:'P',17:'Q',18:'R',19:'S',20:'T',21:'U',22:'V',23:'W',24:'X',25:'Y',26:'Z',27:‘',28:'!',29:“?”30:“@”
问题
所以,在看到所有这些之后。我很确定这个脚本可以做很多改进。我已经尽我所能把它清理干净了,但这是我所能得到的。对此的回答是:“饿了吗?拿个斯尼克!”
发布于 2018-03-23 05:56:39
非常巧妙的项目!干得好。你是正确的,有几个改进可以作出。
tempA是什么?tempB?从名称上看,我绝对没有关于数组中包含的内容的信息。把它们重命名为有用的东西。currentEquation在bruteForce方法中是不使用的,去掉它。j将与官方的答案不同,而且你可以很容易地用一个额外的字符来填充字母数组,以避免这一点)。bruteForce中的硬编码值。temp或temp。您可以编写tempA.push([i, k])。let或const而不是var。ECACDCA肯定不是谜语的答案。我建议过滤方程,删除任何解码长度不等于编码长度的东西。这里有一个替代的解决方案,我认为它更容易遵循。
const messages = [
[142, 92, 152, 102, 122, 62, 42, 107, 92, 152, 117, 22, 32, 92, 152, 27, 42, 77, 77, 157],
[51, 103, 75, 47, 91, 119, 135, 127, 47, 91, 23, 27, 127, 23, 127, 95, 75, 55, 31, 63, 39, 91, 95, 131]
];
// To avoid typing out a bunch of quotes
const letters = '❌ABCDEFGHIJKLMNOPQRSTUVWXYZ !?@'.split('');
/**
* Helper function to fill an array from 0 to n (exclusive)
* range(5) => [0, 1, 2, 3, 4]
* @param n the length of the resulting array
*/
const range = n => Array.from({ length: n }).map((_, i) => i);
const limit = 50;
/*
* If we assume codedLetter = (letter * i) + j, we can solve this equation for letter.
* letter = (codedLetter - j) / i
* If letter is not an integer, or is out of bounds of the letters array, the equation
* is not valid.
*/
function solve(message) {
console.log(`Trying to solve [${message.slice(0, 5).join(', ')}, ...]`);
for (const i of range(limit)) {
for (const j of range(limit)) {
const isValidLetter = code => {
const letter = (code - j) / i;
return Number.isInteger(letter) && letter < letters.length && letter >= 0;
}
if (!message.every(isValidLetter)) {
continue;
}
const decoded = message.map(code => letters[(code - j) / i]).join('');
console.log(`(i = ${i}, j = ${j}) -> [${decoded}]`);
}
}
}
messages.forEach(solve).as-console-wrapper { max-height: 100% !important; top: 0; }https://codereview.stackexchange.com/questions/190154
复制相似问题