freeCodeCamp/guide/arabic/miscellaneous/algoritmo-mensaje-secreto/index.md

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()` .
> **ملاحظة:** الرجاء إضافة اسم المستخدم الخاص بك فقط إذا قمت بإضافة **محتوى ذي صلة** إلى المقالة. (يرجى عدم إزالة أي اسم موجود).