الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

لغز رياضي ..مفتوح للحل بأي طريقة

بدأه مصطفى 36a2 في 24 سبتمبر 2012 · 22 رد · 2,205 مشاهدة · في الرياضيات والخوارزميات
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

بسم الله الرحمن الرحيم

ما بدأه الأخ ياسين .. في وضع لغز رياضي ..واستكمالا للجهود المبذولة من الاخوة الأعضاء لجعل المنتدى على درجة عالية من التفاعل والنشاط ..

تتمة ل

أقدم لكم اليوم لغز جميل جداً ... فهمه سهل وبسيط .. ولكنه يحتاج إلى بعض الإبداع في الحل ..

نص اللغز :

لدينا حصان شطرنج موضوع على مربع أسود ضمن رقعة شطرنج لانهائية الأبعاد ...

أوجد عدد المربعات السوداء التي يمكن للحصان الوصول إليها ...بعد n .. خطوة ..

مثال :

0 خطوة ... 1 مربع ..

1 خطوة ... 0 مربع ..

ملاحظة : نص المسألة الأصلي ينتهي هنا ..(والباقي عليك ) ولكن سأدرج صورة صغيرة للتوضيح :

post-256536-022260300 1348489165_thumb.j

النقاط الخضراء تظهر احتمالات وجود الحصان بعد تحركه خطوة واحدة ..

النقاط البرتقالية تظهر احتمالات وجوده بعد خطوتين ...

وللمزيد من المساعدة يمكن تحميل هذه الرقعة مجاناً... للتجريبlaugh.gif

بالتوفيق ...

أنتظر التفاعل ... ويمكن إرسال الحل على الخاص لمن أراد ...

والسلام عليكم ورحمة الله وبركاته

المصدر

المرفقات
4.jpg
1
#2

استفسار/

اذا كانت هناك خانة سوداء يصل اليها الحصان بعد مجموعتين مختلفتين من الحركات, هل نحتسبها خانة واحدة او اثنان؟

يعني هل الاعادة باختلاف الحركات مسموحة او لا

ثم ضع لنا مثالا حتى نتحقق من النتيجة

مثلا في حالة n=15 كم النتيجة؟

[سبحان الله و بحمده, سبحان الله العظيم]

#3
اقتباس
اذا كانت هناك خانة سوداء يصل اليها الحصان بعد مجموعتين مختلفتين من الحركات, هل نحتسبها خانة واحدة او اثنان؟

ما رأيك أنت ؟؟wink.gif

طبعا سنحتسبها خانة واحدة وهذا مثال بسيط :

post-256536-069705800 1348500146_thumb.p

اقتباس
يعني هل الاعادة باختلاف الحركات مسموحة او لا

الإعادة مهما تكررت تحتسب مرة واحدة فقط لا غير...

اقتباس
ثم ضع لنا مثالا حتى نتحقق من النتيجة

وضعت مثالين :

اقتباس

0 خطوة ... 1 مربع ..

1 خطوة ... 0 مربع ..

من أجل n=15 لن أجيب على هذه الحالة لسبب ستعرفه عندما تحلها ..wink.gif

ولكن سأجيب عن n=16 والجواب :1857

بالتوفيق

المرفقات
q.png
#4

n=15 النتيجة 0

هل من أجل n=6 النتيجة 277 ؟؟؟

تم تعديل هذه المشاركة بواسطة khatibe_30 في 24 سبتمبر 2012 في 19:00

[سبحان الله و بحمده, سبحان الله العظيم]

#5
اقتباس
n=15 النتيجة 0

هل من أجل n=6 النتيجة 277؟؟؟

نعم smile.gifsmile.gif

#6
مصطفى 36a2 كتب:

نعم smile.gifsmile.gif

اذا, الكود الذي كتبته مبدئيا صحيح, n(8) = 481

و لكنه بطيء و لم يستطع ايجاد n(16) :lol: :lol:

على العموم سأحاول تحسينه

[سبحان الله و بحمده, سبحان الله العظيم]

#7
اقتباس

اذا, الكود الذي كتبته مبدئيا صحيح, n(8) = 481

و لكنه بطيء و لم يستطع ايجاد n(16)

نعم صحيح ... الفكرة بسيطة ولكن لبّ السؤال هو :

اقتباس
سأحاول تحسينه

نعم ... تحسين الخوارزمية هو الأهم ...

وأراهن أنك ستتعلم الكثير أخي ياسين عندما تحلّه ...لأن ::

هل أصدمك إذا قلت أن الكود الذي لدي يمكنه حساب( n(2^16 خلال جزء من الثانية وبدون مبالغة laugh.giflaugh.giflaugh.giflaugh.gif

سترى في النهاية أن التعمق في حل المسألأة أهم من كتابة الكود ...

Work Smarter ...Not Harder

تحياتي لك ... وشكرا لمشاركتك( الفكرة ككل موجهة لك من الأصل laugh.gif)

بالتوفيق

#8

أنا لم أعتمد على اي صيغة رياضية, فقط لعب كل الاحتمالات و استخدام البرمجة الديناميكة في اللعب

حسنته قليلا و أعطاني النتيجة n(30) = 6421

سأحاول أن أجد كود أفضل من هذا لاحقا...سلام مؤقت

[سبحان الله و بحمده, سبحان الله العظيم]

#9

سؤال/

بالنسبة لطريقتك, هل تعتمد على صيغة رياضية محددة أم أنك تلعب كل الاحتمالات و تحسب؟

[سبحان الله و بحمده, سبحان الله العظيم]

#10
اقتباس
بالنسبة لطريقتك, هل تعتمد على صيغة رياضية محددة أم أنك تلعب كل الاحتمالات و تحسب؟

عليك استنتاج ذلك من الزمن الذي تستغرقه في الحل ... يعني لا يُعقل أن تبحث كل الاحتمالات بعد مليون خطوة في أجزاء من الثانية ..

بالتوفيق

#11

مصطفى

من ضمن ما أكره من الألغاز أكره الألغاز المتعلقة بلوحة الشطرنج خصوصا و ألغاز الصيغ الرياضية عموما

لست جيدا في مشاكل الـ combinations و n-chooses-k ما شابه و أستعمل bruit force دائما في حل هذه المشاكل

المهم, قمت بحساب النتيجة في ربع لوحة شطرنج ثم أضاعفها 4 مرات و اضيف 1 الخاص بنقطة البداية

تحقق لي من هذه النتائج, أتحصل عليها في جزء من الثانية و لست متأكد من صحتها

n(100) = 70401

n(2000) = 28008001

n(216) = 30065033217

n(224) = 1970324904083457

تم تعديل هذه المشاركة بواسطة khatibe_30 في 25 سبتمبر 2012 في 10:23

2

[سبحان الله و بحمده, سبحان الله العظيم]

#12
اقتباس
و أستعمل bruit force دائما في حل هذه المشاكل

نعم أنا مثلك ..ويجب أن نغير هذه العادة السيئة laugh.giflaugh.gif

اقتباس
تحقق لي من هذه النتائج, أتحصل عليها في جزء من الثانية و لست متأكد من صحتها

إذا تأكد .. إنها صحيحة ..أحسنت ..

تم حل المسألة ..

أرجو أن يقوم المشرف ..بتحويل 20 نقطة من حسابي إلى الأخ ياسين ... ياااا أخ مشرف ..

ملاحظة إذا كنت قد حصلت على معادلة رياضية فاحتفظ بها ولا تضعها هنا ..للأجيال القادمة wink.gif

بارك الله فيك ..

نلتقي في لغز آخر smile.gif

#13
مصطفى 36a2 كتب:

إذا تأكد .. إنها صحيحة ..أحسنت ..

تم حل المسألة ..

الحمد لله

مصطفى 36a2 كتب:

أرجو أن يقوم المشرف ..بتحويل 20 نقطة من حسابي إلى الأخ ياسين ... ياااا أخ مشرف ..

ههههههههههه, اذ فعلها المشرف فيجب أن يحول من حسابي 20 نقطة اليك

مصطفى 36a2 كتب:

ملاحظة إذا كنت قد حصلت على معادلة رياضية فاحتفظ بها ولا تضعها هنا ..للأجيال القادمة wink.gif

أجل حصلت على طريقة حسابية و تبين انها شغااالة :lol: :lol: :lol:

[سبحان الله و بحمده, سبحان الله العظيم]

#14

السلام عليكم

كيف الحال مصطفى , نرجوا أن تكون فى تمام العافية

اقتباس

مثال :

0 خطوة ... 1 مربع ..

1 خطوة ... 0 مربع ..

كيف هذا , فهل كل خطوة تلغى ما قبلها ؟

أظن أنك تقصد :

0 خطوة .. 1 مربع ..

1 خطوة .. 1 مربع ..

وهكذا ...

وهذا لأننا بدأنا من على مربع أسود ففى حالة n عدد فردى يستحيل على الحصان مقدرة الوصل لمربع أسود وبالتالى يصير عدد المربعات التى تم الوصول إليها هى عدد المربعات فى العدد السابق لهذا العدد .

وعلى هذا :

اقتباس
n=15 النتيجة 0
ستكون N=15 تساوى نتيجة N=14

تم تعديل هذه المشاركة بواسطة ahmedsaoud31 في 25 سبتمبر 2012 في 15:31

لاتحسبن العلم ينفع وحده مالم يتوج ربه بخلاق

لا إله إلا أنت سبحانك إني كنت من الظالمين

#15

السلام عليكم

أكبر رقم وصلت إليه هو (2200000 )n بواسطة بايثون

def f(n):
	if n % 2 == 0:
		opt = n * 4 + 1
    		result = opt * opt / 2
    		result -= n * n
    		result += 1
	else:
		result = 0
	return result
f(2 ** 200000)
2
#16
biginner2000 كتب:

السلام عليكم

أكبر رقم وصلت إليه هو (2200000 )n بواسطة بايثون

def f(n):
	if n % 2 == 0:
		opt = n * 4 + 1
    		result = opt * opt / 2
    		result -= n * n
    		result += 1
	else:
		result = 0
	return result
f(2 ** 200000)

هذه أفضل من الطريقة التي استخدمتها أنا

هلا تكرمت و شرحت لي كيف وصلت اليها

تم تعديل هذه المشاركة بواسطة khatibe_30 في 25 سبتمبر 2012 في 19:21

[سبحان الله و بحمده, سبحان الله العظيم]

#17

السلام عليكم

اقتباس
أكبر رقم وصلت إليه هو (2200000 )n بواسطة بايثون
كود رائع أخى الكريم , يبدوا أن المكتبة الرياضية المدمجة بهذه اللغة قوية لأن هذا المدى كبير جداً .

كتبت كود ظننته سريع ولكن كودك الأسرع , فتحيه لك

ولكن العدد الفردى ناتجة 0 راجع المشاركة 14 , لأن النتائج المرتبة على ذلك خطأ .

تم تعديل هذه المشاركة بواسطة ahmedsaoud31 في 25 سبتمبر 2012 في 19:54

لاتحسبن العلم ينفع وحده مالم يتوج ربه بخلاق

لا إله إلا أنت سبحانك إني كنت من الظالمين

#18

مرحبا بك أخي أحمد اشتقت لك ..

اقتباس
كيف هذا , فهل كل خطوة تلغى ما قبلها ؟

أظن أنك تقصد :

0 خطوة .. 1 مربع ..

1 خطوة .. 1 مربع ..

وهكذا ...

لا تنسى أن السؤال يهتم بعدد المربعات السوداء التي يصل إليها ...

فبعد عدد فردي من الحركات سيكون دائما على مربعات بيضاء ... وبالتالي أي رقم فردي سيكون جوابه 0 وهذه ما بينته حضرتك في هذا الكلام

اقتباس
وهذا لأننا بدأنا من على مربع أسود ففى حالة n عدد فردى يستحيل على الحصان مقدرة الوصل لمربع أسود وبالتالى يصير عدد المربعات التى تم الوصول إليها هى عدد المربعات فى العدد السابق لهذا العدد .

ولكن الفكرة تكمن في إيجاد عدد المربعات التي يقف عليها بعد n حركة ... وليست عدد المربعات التي مرّ عليها خلال n حركة ...(ركّز في الجمله السابقة وستفهم كل شيءlaugh.giflaugh.gif)

ما شاء الله عليك أخي bigginner2000

ولكن يبدو أنك لا تحب الرياضيات كثيراً ...laugh.giflaugh.gif..درست القليل من بايثون في الفترة الماضية واجمل ما فيها Bigintegers !!!!!smile.gif

لماذا هذا التعقيد :

   	if n % 2 == 0:
                opt = n * 4 + 1
                result = opt * opt / 2
                result -= n * n
                result += 1

يمكننا اختصاره كما يلي :

      if n % 2 == 0:

                result = ((n * 4 + 1)^2)/2 - n^2 +1

وبفك الأقواس ستحصل على الحل بأبسط صيغة على الإطلاق ..

بارك الله فيك ... أنت مبدع بالفعل ...وفقك الله وسدد خطاك ... وننتظر جديدك دائما smile.gifsmile.gif

بالتوفيق

تم تعديل هذه المشاركة بواسطة مصطفى 36a2 في 25 سبتمبر 2012 في 20:47

#19

السلام عليكم

اقتباس

ما شاء الله عليك أخي bigginner2000

ولكن يبدو أنك لا تحب الرياضيات كثيراً ...laugh.giflaugh.gif..درست القليل من بايثون في الفترة الماضية واجمل ما فيها Bigintegers !!!!!smile.gif

لماذا هذا التعقيد :

expand plain text

if n % 2 == 0:

opt = n * 4 + 1

result = opt * opt / 2

result -= n * n

result += 1

يمكننا اختصاره كما يلي :

expand plain text

if n % 2 == 0:

result = ((n * 4 + 1)^2)/2 - n^2 +1

وبفك الأقواس ستحصل على الحل بأبسط صيغة على الإطلاق ..

بارك الله فيك ... أنت مبدع بالفعل ...وفقك الله وسدد خطاك ... وننتظر جديدك دائما smile.gifsmile.gif

بالتوفيق

شكرا لك

اقتباس

إقتباس

أكبر رقم وصلت إليه هو (2200000 )n بواسطة بايثون كود رائع أخى الكريم , يبدوا أن المكتبة الرياضية المدمجة بهذه اللغة قوية لأن هذا المدى كبير جداً .

كتبت كود ظننته سريع ولكن كودك الأسرع , فتحيه لك

ولكن العدد الفردى ناتجة 0 راجع المشاركة 14 , لأن النتائج المرتبة على ذلك خطأ .

شكرا لك لقد قمت بتعديل الكود ليتعامل مع الأعداد الفردية

اقتباس
هلا تكرمت و شرحت لي كيف وصلت اليها

بالقيام بحساب عدد خانات المربع الذي ينتج عن أقصى حركة يقوم بها الحصان ثم نقوم بالقسمة على 2

ثم نطرح عدد الحركات مضروب في نفسه

def f(n):
	if n % 2 == 0:
		result = (((n * 4 + 1)** 2) / 2) - n** 2  + 1
	else:
		result = f(n - 1)
	return result

تم تعديل هذه المشاركة بواسطة biginner2000 في 25 سبتمبر 2012 في 21:19

#20

هذه الصيغة التي وصلت اليها:

#include<stdio.h>
#include<stdlib.h>

int main(){
	unsigned long long n;
	printf("n = ");
	scanf("%llu", &n);
	if(n%2)
		printf("0\n");
	else{
		unsigned long long p, diff, bCells = 2*n*n+n-1;
		if(n==2)
			diff = 1;
		else
			diff = (n/2)*(n/2)-1;
		bCells -= diff;
		printf(" f(n) = ");
		printf("%llu\n", bCells*4+1);
	}
	system("pause");
	return 0;
}

أقوم بحساب اجمالي عدد الخانات السوداء التي تقع ضمن المساحة التي يتجول عليها الحصان على ربع لوحة شطرنج, ثم انقص منه الخانات السوداء التي لا يستطيع الوصول اليها من تلك المجموعة و اطرح ايضا عدد الخانات لسوداء التي يصل اليها على الخط الأفقي أو العمودي, حتى أتحصل على ربع عدد خانات كل لوح الشطرنج بالضبط, اضاعف 4 مرات و اضيف واحد.

ليست صيغة مثالية و لكنها تفي بالغرض ^_^

تم تعديل هذه المشاركة بواسطة khatibe_30 في 26 سبتمبر 2012 في 01:52

1

[سبحان الله و بحمده, سبحان الله العظيم]

#21

السلام عليكم

ونحن إشتقنا لك أكثر يا درش "دلع مصطفى بالمصرى"smile.gif

اقتباس
ولكن الفكرة تكمن في إيجاد عدد المربعات التي يقف عليها بعد n حركة ... وليست عدد المربعات التي مرّ عليها خلال n حركة ...(ركّز في الجمله السابقة وستفهم كل شيءlaugh.giflaugh.gif)
أنت لم تقل هذا فى اللغز happy.gif , وأيضاً عدد المربعات السوداء التى يقف عليها بعد n حركة تساوى عدد المربعات السوداء التى مرّ عليها بعد n حركة , ولكن تختلف فى حالة العدد الفردى فتكون 0 فى الحالة الأولى ومساوية لقيمة الرقم الزوجى السابق فى الحالة الثانية .
اقتباس
شكرا لك لقد قمت بتعديل الكود ليتعامل مع الأعداد الفردية
بارك الله فيك أخى الكريم , أرجو أن يتسع صدرك ففى حالة n=2 ناتج الكود هو 37 ولكن الناتج الصحيح هو 33 لأن n=2 تشذ عن القاعدة , وباقى القيم يتم حسابها بشكل مظبوط بهذا الكود .

لاتحسبن العلم ينفع وحده مالم يتوج ربه بخلاق

لا إله إلا أنت سبحانك إني كنت من الظالمين

#22
if ((i + j) % 2 != 0) 
<br id=".reactRoot[1].[1][2][1]{comment426023890769711_426102500761850}..[1]..[1]..[0].[2]..[3]..[5]">   {
<br id=".reactRoot[1].[1][2][1]{comment426023890769711_426102500761850}..[1]..[1]..[0].[2]..[3]..[7]">// It means black sq     <br id=".reactRoot[1].[1][2][1]{comment426023890769711_426102500761850}..[1]..[1]..[0].[2]..[3]..[9]">NumOfMove = MoveGenerator(N) ; // N = Knight      <br id=".reactRoot[1].[1][2][1]{comment426023890769711_426102500761850}..[1]..[1]..[0].[2]..[3]..[11]">Black_Sqr = NumOfMove;
<br id=".reactRoot[1].[1][2][1]{comment426023890769711_426102500761850}..[1]..[1]..[0].[2]..[3]..[13]">   }

صورة توضح

chessboard-knight-moves.gif

تم تعديل هذه المشاركة بواسطة MohamedIBrahim في 27 سبتمبر 2012 في 03:32

GoodBye

#23

يبدو أن تنسيق الكتابة اختلط بالكود أخي محمد ...

لم أفهم ما كتبته داخل وسم الكود ...هلا تفضلت بإعادة كتابته ...حتى يتسنى قراءته ...

ثم : خذ وقتك في الحل... أظن أنك تحب هذا النوع من الألغاز ..

بانتظارك أخي العزيز

بالتوفيق

______________________

ولا تنس أن الحصان يجب أن يبدأ من مربع أسود ..smile.gif

تم تعديل هذه المشاركة بواسطة مصطفى 36a2 في 27 سبتمبر 2012 في 12:43

مواضيع مشابهة

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…