نأسف لكوننا MIA خلال الأسابيع القليلة الماضية. لقد انتقلت إلى منزل جديد وحصلت على وظيفة جديدة، لذا لم تتح لي الفرصة للمشاركة في التحديات خلال هذا الوقت.
كل أسبوع يرسل محمد س. أنور التحدي الأسبوعي، وهو فرصة لنا جميعًا للتوصل إلى حلول لمهمتين أسبوعيتين. تتم كتابة الحلول الخاصة بي في Python أولاً، ثم يتم تحويلها إلى Perl. إنها طريقة رائعة لنا جميعًا للتدرب على بعض البرمجة.
التحدي، الحلول الخاصة بي
يتم إعطاؤك إحداثيات، وهي سلسلة تمثل إحداثيات مربع على رقعة الشطرنج كما هو موضح أدناه:
اكتب نصًا يُرجع صحيحًا إذا كان المربع فاتحًا، وخطأ إذا كان المربع داكنًا.
هذا أمر مستقيم نسبيًا. أول شيء أفعله هو التحقق من صحة الموضع المقدم (الحرف الأول هو a-h والحرف الثاني بين 1 و8).
أتحقق بعد ذلك مما إذا كان الحرف الأول هو a أو c أو e أو g وكان الرقم زوجيًا، أو كان الحرف الأول هو b أو d أو f أو h وكان الرقم فرديًا، وأرجع صحيحًا. وإلا فسيتم إرجاع خطأ.
def check_color(coords: str) -> bool: if not re.search('^[a-h][1-8]$', coords): raise ValueError('Not a valid chess coordinate!') if coords[0] in ('a', 'c', 'e', 'g') and int(coords[1]) % 2 == 0: return True if coords[0] in ('b', 'd', 'f', 'h') and int(coords[1]) % 2 == 1: return True return False
$ ./ch-1.py d3 true $ ./ch-1.py g5 false $ ./ch-1.py e6 true
يمكن للفارس في لعبة الشطرنج أن ينتقل من موضعه الحالي إلى أي مربع على بعد صفين أو عمودين بالإضافة إلى عمود أو صف واحد. لذلك في الرسم البياني أدناه، إذا بدأ بحرف S، فيمكنه الانتقال إلى أي من المربعات المميزة بـ E.
اكتب نصًا يأخذ موضع البداية وموضع النهاية ويحسب أقل عدد من الحركات المطلوبة.
هذا أكثر تفصيلاً. أبدأ بالمتغيرات التالية:
def knights_move(start_coord: str, end_coord: str) -> int: for coord in (start_coord, end_coord): if not re.search('^[a-h][1-8]$', coord): raise ValueError( f'The position {coord} is not a valid chess coordinate!') deltas = ([2, 1], [2, -1], [-2, 1], [-2, -1], [1, 2], [1, -2], [-1, 2], [-1, -2]) coords = [convert_coord_to_list(start_coord)] target = convert_coord_to_list(end_coord) moves = 1 seen = []
لدي بعد ذلك حلقة مزدوجة من قائمة الإحداثيات الحالية وقائمة الدلتا. قم بتعيين متغير new_pos الذي يمثل الإحداثيات الجديدة للفارس. إذا أدى هذا إلى موقع خارج اللوحة أو إلى إحداثيات وصلنا إليها بالفعل، فسوف أتخطى ذلك. إذا هبطت على الهدف، أعيد قيمة التحركات.
بعد الحلقة، أقوم بإعادة تعيين قائمة الإحداثيات إلى الإحداثيات التي تم جمعها من خلال التكرارات، وزيادة قيمة التحركات بمقدار واحد. ويستمر هذا حتى نصل إلى الإحداثيات المستهدفة.
while True: new_coords = [] for coord in coords: for delta in deltas: new_pos = (coord[0] delta[0], coord[1] delta[1]) if not 0أمثلة
$ ./ch-2.py g2 a8 4 $ ./ch-2.py g2 h2 3
تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.
Copyright© 2022 湘ICP备2022001581号-3