8.0 KiB
title | localeTitle |
---|---|
Algoritmo Mensaje Secreto | خوارزمية الرسائل السرية |
التفسير:
هذه المشكلة بسيطة للغاية ، ستحصل على سلسلة تمثل عبارة في الشفرة الثنائية ، وسيكون عليك ترجمتها إلى كلمات. لا توجد طريقة مباشرة للقيام بذلك ، لذلك عليك أن تترجم مرتين.
فكرة: 1
يجب عليك أولاً التحويل من ثنائي إلى عشري ومن ثم ترجمتها إلى أحرف.
فكرة: 2
تكون الأمور أسهل إذا ركزت على أجزاء صغيرة ، وقم بتقسيم الرسالة إلى ما تتلقاه والتركيز على حرف واحد في كل مرة.
فكرة: 3
تأكد بعد تحويل الشفرة الثنائية إلى الحرف العشري لإعادة تعيين أي من المتغيرات التي استخدمتها لتنفيذ الترجمة. أيضا ، لا تنس أن تضع كل شيء مرة أخرى على سلسلة واحدة.
تنبيه المفسد!
الحل أدناه!
حل الرمز:
`function binaryAgent(str) { biString = str.split(' '); uniString = [];
// Utilizando el parámetro base en parseInt podemos convertir el número // binario a número decimal mientras simultáneamente lo convertimos a carácter.
for(i=0;i < biString.length;i++){ uniString.push(String.fromCharCode(parseInt(biString[i], 2))); } // Simplemente unimos la cadena. return uniString.join(''); }
// realizamos el test binaryAgent("01000001 01110010 01100101 01101110 00100111 01110100 00100000 01100010 01101111 01101110 01100110 01101001 01110010 01100101 01110011 00100000 01100110 01110101 01101110 00100001 00111111"); `
شرح الكود:
- نحن نفصل السلسلة في صفيف من السلاسل المفصولة بفراغات.
- نخلق متغيرًا سيكون ضروريًا على طول الطريق ، وهذا الاسم لا يحتاج إلى شرح.
- نكرر من خلال المصفوفة الثنائية الجديدة.
- نقوم بتحويلها إلى قيمة عشرية باستخدام parseInt ( binary ، 2) (مع المعلمة الثانية نخبرك على أي أساس لدينا أرقام حاليا)
- في النهاية ، نعيد الرسالة المحولة.
الحل الثاني:
`function binaryAgent(str) { // Separamos el código binario por sus espacios. str = str.split(' '); var power; var decValue = 0; var sentence = '';
// Comprobamos cada número binario de la matriz. for (var s = 0; s < str.length; s++) { // Comprobamos cada bit del número binario. for (var t = 0; t < str[s].length; t++) { // Esto solo toma en consideración los activos. if (str[s][t] == 1) { // Esto es equivalente a 2 ** posición. power = Math.pow(2, +str[s].length - t - 1); decValue += power;
// Guardamos el valor decimal sumándolo al anterior.
}
}
// Luego de que el número binario es convertido a decimal, lo convertimos en una cadena y lo guardamos.
sentence += (String.fromCharCode(decValue));
// Reseteamos el valor decimal para el próximo número binario.
decValue = 0;
}
return sentence; }
// realizamos el test binaryAgent("01000001 01110010 01100101 01101110 00100111 01110100 00100000 01100010 01101111 01101110 01100110 01101001 01110010 01100101 01110011 00100000 01100110 01110101 01101110 00100001 00111111"); `
شرح الكود:
- لكل سلسلة ثنائية نتحقق منها وتجاهل الأصفار.
- لأولئك الذين هم واحد أو نشط نقوم بتحويلها إلى عشري. هذا يأخذ في الاعتبار الموقف والسلطة المناسبة التي يجب أن تكون مرتفعة.
- نقوم بحفظ الطاقة في الطاقة المتغيرة مضيفًا إلى الطاقة السابقة في متغير القيمة decValue . سيستمر هذا المتغير في إضافة صلاحيات الأصول إلى نهاية الحلقة ثم إرجاع رقم عشري.
- نقوم بتحويل الرقم العشري النهائي إلى ASCII وإضافته إلى متغير الجملة مع أي سلسلة نصية أخرى تم تحويلها وتخزينها بالفعل.
- نقوم بإعادة تعيين قيمة متغير decValue لتجنب الأرقام العشرية الخاطئة قبل الاستمرار في الحلقة الخارجية.
الحل الثالث:
`function binaryAgent(str) { return String.fromCharCode(...str.split(" ").map(function(char){ return parseInt(char, 2); })); }
// realizamos el test binaryAgent("01000001 01110010 01100101 01101110 00100111 01110100 00100000 01100010 01101111 01101110 01100110 01101001 01110010 01100101 01110011 00100000 01100110 01110101 01101110 00100001 00111111"); `
شرح الكود:
- أولاً نستخدم
split()
لكي نتمكن من عمل كل حرف كعنصر مصفوفة. - ثم نستخدم
map()
لمعالجة كل عنصر ثنائي إلى عشري باستخدامpareseInt()
- وأخيرًا ، يمكننا استخدام
String.fromCharCode()
لتحويل كل رقم ASCII إلى الحرف المطابق له. - ومع ذلك ، يتوقع
fromCharCode()
سلسلة من الأرقام بدلاً من مصفوفة. يمكننا استخدام ES6 Spread Operator لتمرير مجموعة من الأرقام كأرقام فردية. مزيد من المعلومات: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Spread_operator
الحل الرابع:
`function binaryAgent(str) { var re = /(\d+)(\s?)/g; function convertToChar(match,p1,p2){ return String.fromCharCode(parseInt(p1, 2)); } return str.replace(re, convertToChar); }
// realizamos el test binaryAgent("01000001 01110010 01100101 01101110 00100111 01110100 00100000 01100010 01101111 01101110 01100110 01101001 01110010 01100101 01110011 00100000 01100110 01110101 01101110 00100001 00111111"); `
شرح الكود:
- في هذا الحل نستخدم
String.replace()
للعثور على جميع الأرقام الثنائية وتحويلها إلى أحرف. - نستخدم أولاً تعبيرًا عاديًا للعثور على جميع الأرقام الثنائية والمساحات النهائية الاختيارية.
- بعد ذلك ، نقوم بتعريف دالة تقوم بتحويل كل أول subcoincidence إلى رقم مع
parseInt()
ثم حرف معString.fromCharCode()
. عن طريق عدم استخدام subcoincidence الثاني نترك جانبا جميع المسافات التي بين كل رقم ثنائي. - وأخيرًا نستخدم تعبيرنا المعتاد والوظيفة المحددة كمعلمة من
String.replace()
.
ملاحظة: الرجاء إضافة اسم المستخدم الخاص بك فقط إذا قمت بإضافة محتوى ذي صلة إلى المقالة. (يرجى عدم إزالة أي اسم موجود).