148 lines
8.0 KiB
Markdown
148 lines
8.0 KiB
Markdown
|
---
|
||
|
title: Algoritmo Mensaje Secreto
|
||
|
localeTitle: خوارزمية الرسائل السرية
|
||
|
---
|
||
|
![](//discourse-user-assets.s3.amazonaws.com/original/2X/7/70cf3cc5462f69c2f770ad42d0f24f240a8d8f13.jpg)
|
||
|
|
||
|
### التفسير:
|
||
|
|
||
|
هذه المشكلة بسيطة للغاية ، ستحصل على سلسلة تمثل عبارة في الشفرة الثنائية ، وسيكون عليك ترجمتها إلى كلمات. لا توجد طريقة مباشرة للقيام بذلك ، لذلك عليك أن تترجم مرتين.
|
||
|
|
||
|
## فكرة: 1
|
||
|
|
||
|
يجب عليك أولاً التحويل من **ثنائي** إلى **عشري** ومن ثم ترجمتها إلى أحرف.
|
||
|
|
||
|
## فكرة: 2
|
||
|
|
||
|
تكون الأمور أسهل إذا ركزت على أجزاء صغيرة ، وقم بتقسيم الرسالة إلى ما تتلقاه والتركيز على حرف واحد في كل مرة.
|
||
|
|
||
|
## فكرة: 3
|
||
|
|
||
|
تأكد بعد تحويل الشفرة الثنائية إلى الحرف العشري لإعادة تعيين أي من المتغيرات التي استخدمتها لتنفيذ الترجمة. أيضا ، لا تنس أن تضع كل شيء مرة أخرى على سلسلة واحدة.
|
||
|
|
||
|
## تنبيه المفسد!
|
||
|
|
||
|
![علامة تحذير](//discourse-user-assets.s3.amazonaws.com/original/2X/2/2d6c412a50797771301e7ceabd554cef4edcd74d.gif)
|
||
|
|
||
|
**الحل أدناه!**
|
||
|
|
||
|
## حل الرمز:
|
||
|
|
||
|
`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");
|
||
|
`
|
||
|
|
||
|
![:rocket:](//forum.freecodecamp.com/images/emoji/emoji_one/rocket.png?v=2 ": صاروخ:") [في REPL!](https://repl.it/CLnm/0)
|
||
|
|
||
|
# شرح الكود:
|
||
|
|
||
|
* نحن نفصل السلسلة في صفيف من السلاسل المفصولة بفراغات.
|
||
|
* نخلق متغيرًا سيكون ضروريًا على طول الطريق ، وهذا الاسم لا يحتاج إلى شرح.
|
||
|
* نكرر من خلال المصفوفة الثنائية الجديدة.
|
||
|
* نقوم بتحويلها إلى قيمة عشرية باستخدام 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");
|
||
|
`
|
||
|
|
||
|
![:rocket:](//forum.freecodecamp.com/images/emoji/emoji_one/rocket.png?v=2 ": صاروخ:") [في REPL!](https://repl.it/CLno/0)
|
||
|
|
||
|
# شرح الكود:
|
||
|
|
||
|
* لكل سلسلة ثنائية نتحقق منها وتجاهل الأصفار.
|
||
|
* لأولئك الذين هم واحد أو نشط نقوم بتحويلها إلى عشري. هذا يأخذ في الاعتبار الموقف والسلطة المناسبة التي يجب أن تكون مرتفعة.
|
||
|
* نقوم بحفظ الطاقة في الطاقة المتغيرة مضيفًا إلى **الطاقة** السابقة في متغير **القيمة 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");
|
||
|
`
|
||
|
|
||
|
![:rocket:](//forum.freecodecamp.com/images/emoji/emoji_one/rocket.png?v=2 ": صاروخ:") [في REPL!](https://repl.it/CLnp/0)
|
||
|
|
||
|
# شرح الكود:
|
||
|
|
||
|
* أولاً نستخدم `split()` لكي نتمكن من عمل كل حرف كعنصر مصفوفة.
|
||
|
* ثم نستخدم `map()` لمعالجة كل عنصر ثنائي إلى عشري باستخدام `pareseInt()`
|
||
|
* وأخيرًا ، يمكننا استخدام `String.fromCharCode()` لتحويل كل رقم ASCII إلى الحرف المطابق له.
|
||
|
* ومع ذلك ، يتوقع `fromCharCode()` سلسلة من الأرقام بدلاً من مصفوفة. يمكننا استخدام ES6 Spread Operator لتمرير مجموعة من الأرقام كأرقام فردية. مزيد من المعلومات: [https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/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");
|
||
|
`
|
||
|
|
||
|
![:rocket:](//forum.freecodecamp.com/images/emoji/emoji_one/rocket.png?v=2 ": صاروخ:") [في REPL!](https://repl.it/CLnr/0)
|
||
|
|
||
|
# شرح الكود:
|
||
|
|
||
|
* في هذا الحل نستخدم `String.replace()` للعثور على جميع الأرقام الثنائية وتحويلها إلى أحرف.
|
||
|
* نستخدم أولاً تعبيرًا عاديًا للعثور على جميع الأرقام الثنائية والمساحات النهائية الاختيارية.
|
||
|
* بعد ذلك ، نقوم بتعريف دالة تقوم بتحويل كل أول subcoincidence إلى رقم مع `parseInt()` ثم حرف مع `String.fromCharCode()` . عن طريق عدم استخدام subcoincidence الثاني نترك جانبا جميع المسافات التي بين كل رقم ثنائي.
|
||
|
* وأخيرًا نستخدم تعبيرنا المعتاد والوظيفة المحددة كمعلمة من `String.replace()` .
|
||
|
|
||
|
> **ملاحظة:** الرجاء إضافة اسم المستخدم الخاص بك فقط إذا قمت بإضافة **محتوى ذي صلة** إلى المقالة. (يرجى عدم إزالة أي اسم موجود).
|