158 lines
11 KiB
Markdown
158 lines
11 KiB
Markdown
|
---
|
|||
|
title: Palindrome Checker
|
|||
|
localeTitle: Palindrome المدقق
|
|||
|
---
|
|||
|
![](//discourse-user-assets.s3.amazonaws.com/original/2X/c/ca86619bb0ec05531dbb02be3c0b7b8383e67f01.jpg)
|
|||
|
|
|||
|
![:triangular_flag_on_post:](https://forum.freecodecamp.com/images/emoji/emoji_one/triangular_flag_on_post.png?v=3 ": triangular_flag_on_post:") تذكر استخدام **`Read-Search-Ask`** إذا واجهتك مشكلة. حاول إقران البرنامج ![:busts_in_silhouette:](https://forum.freecodecamp.com/images/emoji/emoji_one/busts_in_silhouette.png?v=3 ": busts_in_silhouette:") واكتب الكود الخاص بك ![:pencil:](https://forum.freecodecamp.com/images/emoji/emoji_one/pencil.png?v=3 ":قلم:")
|
|||
|
|
|||
|
### ![:checkered_flag:](https://forum.freecodecamp.com/images/emoji/emoji_one/checkered_flag.png?v=3 ":العلم متقلب:") شرح المشكلة:
|
|||
|
|
|||
|
هدفنا لحل هذه المشكلة هو ترتيب السلسلة التي يتم تمريرها والتحقق مما إذا كانت في الواقع متناظرة.
|
|||
|
|
|||
|
* إذا لم تكن متأكداً مما هو متناظر ، فكلمة أو عبارة هي عندما تنقض تعويذ نفس الشيء للأمام أو للخلف. مثال بسيط هو `mom` ، عند عكس الحروف ، فإنها تنطق نفس الشيء! مثال آخر لالمتطابق هو `race car` . عندما نأخذ أي شيء ليس حرفًا ، يصبح `racecar` هو نفس الهجاء للأمام أو إلى الوراء!
|
|||
|
|
|||
|
بمجرد أن نحدد ما إذا كانت متناظرة أو لا نريد إرجاعها إما `true` أو `false` استنادًا إلى النتائج التي توصلنا إليها.
|
|||
|
|
|||
|
#### روابط ذات صلة
|
|||
|
|
|||
|
* [String.prototype.replace](http://forum.freecodecamp.com/t/javascript-string-prototype-replace/15942)
|
|||
|
* [String.prototype.toLowerCase](http://forum.freecodecamp.com/t/javascript-string-prototype-tolowercase/15948)
|
|||
|
|
|||
|
## ![:speech_balloon:](https://forum.freecodecamp.com/images/emoji/emoji_one/speech_balloon.png?v=3 ": speech_balloon:") تلميح: 1
|
|||
|
|
|||
|
يمكن استخدام التعبيرات العادية ، `RegEx` ، لإزالة الأحرف غير المرغوب فيها من السلسلة.
|
|||
|
|
|||
|
> _حاول أن تحل المشكلة الآن_
|
|||
|
|
|||
|
## ![:speech_balloon:](https://forum.freecodecamp.com/images/emoji/emoji_one/speech_balloon.png?v=3 ": speech_balloon:") تلميح: 2
|
|||
|
|
|||
|
و `Array.prototype.split` و `Array.prototype.join` الأساليب يمكن أن تكون ذات فائدة هنا. `For` `while` الحلقات هي بديل آخر ، أو لماذا لا حتى `map` !
|
|||
|
|
|||
|
> _حاول أن تحل المشكلة الآن_
|
|||
|
|
|||
|
## ![:speech_balloon:](https://forum.freecodecamp.com/images/emoji/emoji_one/speech_balloon.png?v=3 ": speech_balloon:") تلميح: 3
|
|||
|
|
|||
|
يمكن استخدام `String.prototype.toLowerCase` لإنشاء سلسلة صغيرة.
|
|||
|
|
|||
|
> _حاول أن تحل المشكلة الآن_
|
|||
|
|
|||
|
## تنبيه المفسد!
|
|||
|
|
|||
|
![علامة تحذير](//discourse-user-assets.s3.amazonaws.com/original/2X/2/2d6c412a50797771301e7ceabd554cef4edcd74d.gif)
|
|||
|
|
|||
|
**الحل في المستقبل!**
|
|||
|
|
|||
|
## ![:beginner:](https://forum.freecodecamp.com/images/emoji/emoji_one/beginner.png?v=3 ":مبتدئ:") الحل الأساسي للكود:
|
|||
|
|
|||
|
` function palindrome(str) {
|
|||
|
return str.replace(/[\W_]/g, '').toLowerCase() ===
|
|||
|
str.replace(/[\W_]/g, '').toLowerCase().split('').reverse().join('');
|
|||
|
}
|
|||
|
`
|
|||
|
|
|||
|
![:rocket:](https://forum.freecodecamp.com/images/emoji/emoji_one/rocket.png?v=3 ":صاروخ:") [تشغيل الكود](https://repl.it/CLjU/2)
|
|||
|
|
|||
|
### شرح الشفرة:
|
|||
|
|
|||
|
* نبدأ باستخدام التعبيرات العادية لاستبدال أي مساحة بيضاء أو أحرف غير أبجدية رقمية بدون أي شيء (أو `null` ) ، والتي تزيلها بشكل أساسي من السلسلة.
|
|||
|
|
|||
|
* نحن المقبل _سلسلة ل_ `.toLowerCase()` لإزالة أي حروف ل `A` هو حرف مختلفة من `a` . لم تطالبنا المشكلة بالقلق من التأكد من أن حالة الأحرف متطابقة ، فقط التهجئة.
|
|||
|
|
|||
|
* خطوتنا التالية هي أن نأخذ السلسلة و `.split()` ، `.reverse()` و ، وأخيرا `.join()` مرة أخرى معا.
|
|||
|
|
|||
|
* الخطوة الأخيرة هي التحقق من أن السلسلة هي نفسها إلى الأمام والخلف وإرجاع النتيجة!
|
|||
|
|
|||
|
|
|||
|
#### روابط ذات صلة
|
|||
|
|
|||
|
* [String.prototype.split](http://forum.freecodecamp.com/t/javascript-string-prototype-split/15944)
|
|||
|
* [Array.prototype.reverse](http://forum.freecodecamp.com/t/javascript-array-prototype-reverse/14300)
|
|||
|
* [Array.prototype.join](http://forum.freecodecamp.com/t/javascript-array-prototype-join/14292)
|
|||
|
|
|||
|
## ![:sunflower:](https://forum.freecodecamp.com/images/emoji/emoji_one/sunflower.png?v=3 ":دوار الشمس:") حل الشفرة المتوسطة:
|
|||
|
|
|||
|
` function palindrome(str) {
|
|||
|
str = str.toLowerCase().replace(/[\W_]/g, '');
|
|||
|
for(var i = 0, len = str.length - 1; i < len/2; i++) {
|
|||
|
if(str[i] !== str[len-i]) {
|
|||
|
return false;
|
|||
|
}
|
|||
|
}
|
|||
|
return true;
|
|||
|
}
|
|||
|
`
|
|||
|
|
|||
|
![:rocket:](https://forum.freecodecamp.com/images/emoji/emoji_one/rocket.png?v=3 ":صاروخ:") [تشغيل الكود](https://repl.it/CLjU/3)
|
|||
|
|
|||
|
### شرح الشفرة:
|
|||
|
|
|||
|
* نبدأ باستخدام نفس الأساليب لاستبدال الحروف التي لا نريدها في السلسلة باستخدام تعبيرات `RegEx` العادية ، ثم جعل السلسلة الخاصة بنا صغيرة.
|
|||
|
|
|||
|
* بعد ذلك قمنا بإعداد حلقة `for` ونعلن عن فهرس `i` لتتبع الحلقة. وضعناها لدينا تسلسل هروب إلى عندما `i` أكبر من طول السلسلة مقسوما على اثنين، الذي يحكي حلقة لوقف بعد منتصف الطريق من السلسلة. وأخيرًا ، `i` على الزيادة بعد كل حلقة.
|
|||
|
|
|||
|
* داخل كل حلقة نريد التحقق من أن الحرف في العنصر `[i]` يساوي الحرف في طول السلسلة ناقص i ، `[str.length - i]` . في كل حلقة ، يتحرك العنصر الذي يتم فحصه على جانبي السلسلة بالقرب من المركز حتى نتحقق من جميع الأحرف. إذا لم تتطابق الحروف في أي لحظة ، فإننا نرجع `false` . إذا اكتملت الحلقة بنجاح ، فهذا يعني أن لدينا متناظرًا ، وبالتالي نعود إلى `true` !
|
|||
|
|
|||
|
|
|||
|
#### روابط ذات صلة
|
|||
|
|
|||
|
* رجإكس
|
|||
|
|
|||
|
## ![:rotating_light:](https://forum.freecodecamp.com/images/emoji/emoji_one/rotating_light.png?v=3 ": rotating_light:") الحل المتقدم للكود (الأكثر أداء):
|
|||
|
|
|||
|
` //this solution performs at minimum 7x better, at maximum infinitely better.
|
|||
|
//read the explanation for the reason why. I just failed this in an interview.
|
|||
|
function palindrome(str) {
|
|||
|
//assign a front and a back pointer
|
|||
|
let front = 0
|
|||
|
let back = str.length - 1
|
|||
|
|
|||
|
//back and front pointers won't always meet in the middle, so use (back > front)
|
|||
|
while (back > front) {
|
|||
|
//increments front pointer if current character doesn't meet criteria
|
|||
|
if ( str[front].match(/[\W_]/) ) {
|
|||
|
front++
|
|||
|
continue
|
|||
|
}
|
|||
|
//decrements back pointer if current character doesn't meet criteria
|
|||
|
if ( str[back].match(/[\W_]/) ) {
|
|||
|
back--
|
|||
|
continue
|
|||
|
}
|
|||
|
//finally does the comparison on the current character
|
|||
|
if ( str[front].toLowerCase() !== str[back].toLowerCase() ) return false
|
|||
|
front++
|
|||
|
back--
|
|||
|
}
|
|||
|
|
|||
|
//if the whole string has been compared without returning false, it's a palindrome!
|
|||
|
return true
|
|||
|
|
|||
|
}
|
|||
|
`
|
|||
|
|
|||
|
![:rocket:](https://forum.freecodecamp.com/images/emoji/emoji_one/rocket.png?v=3 ":صاروخ:") [تشغيل الكود](https://repl.it/CLjU/4)
|
|||
|
|
|||
|
### شرح الشفرة:
|
|||
|
|
|||
|
* أعطيت هذه المشكلة في مقابلة (المفسد: لم أكن قد استأجرت ![:frowning:](https://forum.freecodecamp.com/images/emoji/emoji_one/frowning.png?v=3 ":عابس:") ) سرعان ما وصلت إلى الحل الأساسي ، وأخبرني القائم بالمقابلة أن أجعله أفضل. سيستغرق الأمر خوارزمية طويلة للغاية إذا اجتاز الكتاب المقدس كسلسلة. كان يريد أن يكون لحظة.
|
|||
|
|
|||
|
* تعمل الحلول البسيطة بشكل سيء جدًا على السلاسل الطويلة لأنها تعمل على السلسلة بأكملها عدة مرات (toLowerCase () ، الاستبدال () ، split () ، reverse () ، join ()) قبل مقارنة السلسلة **بأكملها** مرتين.
|
|||
|
|
|||
|
* جمال هذا الحل هو أنه لا **يحتاج** أبدا إلى قراءة السلسلة بأكملها ، ولو مرة واحدة ، لمعرفة أنها ليست متناظرة. لماذا تقرأ السلسلة الكاملة إذا كنت تستطيع أن تقول أنها ليست مجرد متناظرة بمجرد النظر إلى خطابين؟
|
|||
|
|
|||
|
* يستخدم حلقة while بدلاً من حلقة for كأفضل ممارسة - لأننا نستخدم متغيرين ، أحدهما يبدأ من بداية السلسلة ، ويبدأ الآخر في نهاية السلسلة.
|
|||
|
|
|||
|
|
|||
|
#### روابط ذات صلة
|
|||
|
|
|||
|
* [التعقيد Cyclomatic](https://en.wikipedia.org/wiki/Cyclomatic_complexity)
|
|||
|
|
|||
|
## ![:clipboard:](https://forum.freecodecamp.com/images/emoji/emoji_one/clipboard.png?v=3 ": الحافظة:") ملاحظات للمساهمات:
|
|||
|
|
|||
|
* ![:warning:](https://forum.freecodecamp.com/images/emoji/emoji_one/warning.png?v=3 ":تحذير:") **لا تقم** بإضافة حلول مشابهة لأي حلول موجودة. إذا كنت تعتقد أنها **_مشابهة ولكن أفضل_** ، فحاول دمج (أو استبدال) الحل المشابه الموجود.
|
|||
|
* أضف شرحًا لحلك.
|
|||
|
* تصنيف الحل في واحدة من الفئات التالية - **الأساسي** **والمتوسط** **والمتقدم** . ![:traffic_light:](https://forum.freecodecamp.com/images/emoji/emoji_one/traffic_light.png?v=3 ": traffic_light:")
|
|||
|
* الرجاء إضافة اسم المستخدم الخاص بك فقط إذا قمت بإضافة أي **محتويات رئيسية ذات صلة** . ( ![:warning:](https://forum.freecodecamp.com/images/emoji/emoji_one/warning.png?v=3 ":تحذير:") **_لا_** _تزيل أي أسماء مستخدمين حالية_ )
|
|||
|
|
|||
|
> نرى ![:point_right:](https://forum.freecodecamp.com/images/emoji/emoji_one/point_right.png?v=3 ": point_right:") [**`Wiki Challenge Solution Template`**](http://forum.freecodecamp.com/t/algorithm-article-template/14272) كمرجع.
|