لغز برمجي

rani_walhan

السلام عليكم جميعا

لا شك ان البرمجة هي طريقة تفكير و الخوارزمية هي طريقة حل المشكلة البرمجية

ويوجد حاليا اكثر من طريقة تفكير في البرمجة لن اسهب فيها

احببت ان اضيف الموضوع هنا وهو مساحة متواضعة لاضافة الالغاز البرمجية ويقوم الاعضاء هنا بحلها

ذلك سوف يساعد القادمين الجدد لتطوير قدراتهم و القدماء للمساعدة او لتعلم مهارات جديدة

و هذه تحية

اتصحو من غرورك والجماح = اذا ما الشمس تافل للرواح

خيارات عرض التعليقات

اختر طريقتك المفضلة لعرض التعليقات و اضغط "حفظ الإعدادات" لتفعيل تغييراتك.
rani_walhan

اللغز الاول

سوف ابدأ بالالغاز البسيطة و السهلة

رسم مربع

و سوف انتظر الحلول على اية لغة برمجة يتقنها المشارك او حتى بلغة عادية

الشكل المطلوب رسمه

*******
*******
*******
*******
*******

اتصحو من غرورك والجماح = اذا ما الشمس تافل للرواح

en.karam1989

for (i = 0 ; i < rowsCount, i++)
    for (j = 0 ; j < culomnsCount, j++)
        print('*')
    print('\n')

en.karam1989

طيب اكتب تابع يرسم الشكل التالي:
**********
*********
********
*******
******
*****
******
*******
********
*********
**********
*********
********
*******
******
*****
******
*******
********
*********
**********
*********
********
*******
******
*****
******
*******
********
*********
**********
*********
********
*******
******
*****
******
*******
********
*********
**********
*********
********
*******
******
*****
******
*******
********
*********
**********

إلخ Smile

bayrn

كتب en.karam1989:

for (i = 0 ; i < rowsCount, i++) for (j = 0 ; j < culomnsCount, j++) print('*&#39<img src="http://www.csc-sy.net//misc/smileys/icon_wink.gif" title="Wink" alt="Wink" /> print('\n&#39<img src="http://www.csc-sy.net//misc/smileys/icon_wink.gif" title="Wink" alt="Wink" />

Foot in mouth I think you've made out a homework

إذا عاش امرؤٌ ستين عاماً فنصف العمر تمحقه الليالي
ونصف النصف يذهب ليس يدري لغفلته يميناً من شمالِ
وباقي النصف أسقامٌ وهمٌ وشغلٌ بالمكاسبِ والعيالِ
الإمام الشافعي

en.karam1989

And I gave him another Mr. Green

إذا حولها للغة المطلوبة منو بالوظيفة .. حلال عليه Razz

rani_walhan

اهلا اكرم

سوف اعتبر اللغز الذي قمت انت بوضعه اللغز الثاني

هذا حلي بالنسبة للغز الاول

for (i=0 to rows*col)
{

cout<< "*";
if(!(i%col)) cout<<"\n";
}

ة للشكل الذي وضعته صديقي
يبدأ بنصف شكل و يستمر الى ما لا نهاية شكل كامل

انظر

نصف شكل
10**********
09*********
08********
07*******
06******
05*****

شكل كامل
06******
07*******
08********
09*********
10**********
09*********
08********
07*******
06******
05*****

بالنسبة للحل للغزك سوف اضعه و لكن يوجد لا بد حل ابسط

[code]

int l= 5
int rows = 10
int i;
int j;
int s=1;

while (true)
{

for (i=0 ; i

اتصحو من غرورك والجماح = اذا ما الشمس تافل للرواح

ChArLoK_16

    char s[10] = '*';
    while (1)
    {
        foreach (i; 5..s.length)
            writeln(s[0..i]);
        foreach_reverse (i; 6..s.length - 1)
            writeln(s[0..i]);
    }

ChArLoK_16.

rani_walhan

كتب bayrn:

كتب en.karam1989:

for (i = 0 ; i < rowsCount, i++) for (j = 0 ; j < culomnsCount, j++) print('*&#39<img src="http://www.csc-sy.net//misc/smileys/icon_wink.gif" title="Wink" alt="Wink" /> print('\n&#39<img src="http://www.csc-sy.net//misc/smileys/icon_wink.gif" title="Wink" alt="Wink" />

Foot in mouth I think you've made out a homework

no it is not homework

اتصحو من غرورك والجماح = اذا ما الشمس تافل للرواح

mrabooode

try this one its fun
**********\
**********\\
**********\\\
**********\\\\
**********\\\\\
**********\\\\\\
**********\\\\\\\
**********\\\\\\\\
**********\\\\\\\\\
**********\\\\\\\\\\
__________\\\\\\\\\\
 __________\\\\\\\\\
  __________\\\\\\\\
   __________\\\\\\\
    __________\\\\\\
     __________\\\\\
      __________\\\\
       __________\\\
        __________\\
         __________\

rani_walhan

كتب ChArLoK_16:
    char s[10] = '*';
    while (1)
    {
        foreach (i; 5..s.length)
            writeln(s[0..i]);
        foreach_reverse (i; 6..s.length - 1)
            writeln(s[0..i]);
    }

سعيد بمشاركتك

ربما هي ليست لغة ولكن بسيدو كود

و تحية

اتصحو من غرورك والجماح = اذا ما الشمس تافل للرواح

rani_walhan

كتب mrabooode:
try this one its fun
**********\
**********\\
**********\\\
**********\\\\
**********\\\\\
**********\\\\\\
**********\\\\\\\
**********\\\\\\\\
**********\\\\\\\\\
**********\\\\\\\\\\
__________\\\\\\\\\\
 __________\\\\\\\\\
  __________\\\\\\\\
   __________\\\\\\\
    __________\\\\\\
     __________\\\\\
      __________\\\\
       __________\\\
        __________\\
         __________\

اذا هذا هو اللغز رقم 3 بالنسبة للاشكال

نعم الشكل ممتع وبسيط الى حد ما وهو ابسط من اللغز 2

لن اقوم بوضع الحل حتى اترك الفرصة للاعضاء لتجربة عمل الشكل

وتحية

اتصحو من غرورك والجماح = اذا ما الشمس تافل للرواح

mpcabd

كتب mrabooode:
try this one its fun
**********\
**********\\
**********\\\
**********\\\\
**********\\\\\
**********\\\\\\
**********\\\\\\\
**********\\\\\\\\
**********\\\\\\\\\
**********\\\\\\\\\\
__________\\\\\\\\\\
__________\\\\\\\\\
__________\\\\\\\\
__________\\\\\\\
__________\\\\\\
__________\\\\\
__________\\\\
__________\\\
__________\\
__________\

count = 10
print "\n".join([("\\" * i) + ("*" * count) for i in range(1, count + 1)])
print "\n".join([("\\" * i) + ("_" * count) for i in range(count, 0, -1)])
mrabooode

count = 10
print "\n".join([("\\" * i) + ("*" * count) for i in range(1, count + 1)])
print "\n".join([("\\" * i) + ("_" * count) for i in range(count, 0, -1)])

this is rejected Mr. Green

rani_walhan

كتب mpcabd:
كتب mrabooode:
try this one its fun
**********\
**********\\
**********\\\
**********\\\\
**********\\\\\
**********\\\\\\
**********\\\\\\\
**********\\\\\\\\
**********\\\\\\\\\
**********\\\\\\\\\\
__________\\\\\\\\\\
__________\\\\\\\\\
__________\\\\\\\\
__________\\\\\\\
__________\\\\\\
__________\\\\\
__________\\\\
__________\\\
__________\\
__________\

count = 10
print "\n".join([("\\" * i) + ("*" * count) for i in range(1, count + 1)])
print "\n".join([("\\" * i) + ("_" * count) for i in range(count, 0, -1)])

شكرا على احضار الحل سوف اقوم بتحليل الشكل

الشكل عبارة عن
10 صفوف * و \
10 صفوف - و \

بالنسبة للاعمدة فهي 10 بالنسبة لكل من * و -

و بالنسبة للـ \ فهو
متزايد يبدأ ب 1 ويصل 10 عندما ياتي بعد *
متناقص يبدأ ب 10 و ينتهي ب 1 بعد الــ -

10 + 1
**********\1
**********\\2
**********\\\3
**********\\\\4
**********\\\\\5
**********\\\\\\6
**********\\\\\\\7
**********\\\\\\\\8
**********\\\\\\\\\9
**********\\\\\\\\\\10
__________\\\\\\\\\\10
__________\\\\\\\\\9
__________\\\\\\\\8
__________\\\\\\\7
__________\\\\\\6
__________\\\\\5
__________\\\\4
__________\\\3
__________\\2
__________\1
10 + 1

اتصحو من غرورك والجماح = اذا ما الشمس تافل للرواح

rani_walhan

حسنا

لقد ابلينا بلاءا حسنا

سوف انتقل الى مرحلة اخرى في اللغز و ابتعد عن الاشكال مؤقتا

حيث قمت بالتنقل في ارجاء المنتدى و استوحيت من احد المواضيع
كتابة كود

طبعا اشكر صاحب الموضوع وان لم استطع ذكر الاسماء لكي لا اكشف اللغز

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



int traceme(char c)
{
int b=2;
if ((c>64)&&(c<91)) c+=32;
if ((c==115)||(c==11<img src="http://www.csc-sy.net//misc/smileys/icon_cool.gif" title="Cool" alt="Cool" />) b=1;
if (c>120) b=1;

if ((c>96)&&(c<123)) c-=97;

if (c>22) return -1;
else return (c/3)+b;
}


اتصحو من غرورك والجماح = اذا ما الشمس تافل للرواح

mrabooode

لا شكرا عندي منه الكثير Mr. Green

rani_walhan

ما هو الذي عندك منه الكثير ؟؟

اتصحو من غرورك والجماح = اذا ما الشمس تافل للرواح

rani_walhan

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

مثلا لو ادخلنا حرف s الى الاجراء

طبعا حرف الـ s موجود على الزر 7

و حرف الــ s معروف ان رقمه بشيفرة آسكي هو 115

c= 115-97
c=18

القيمة المرجعة سوف تكون

(18/3) +1
6 +1

النتيجة 7

وهذا جزء من حل مسابقة الخوارزميات شاهدتها خلال تصفحي
المنتدى لكن لاني اعتقدت ان الموضوع قديم ففضلت ان ارسل الاجراء هنا

وتحية



int char2num(char c)
{
int b=2;
if ((c>64)&&(c<91)) c+=32;
if ((c==115)||(c==11<img src="http://www.csc-sy.net//misc/smileys/icon_cool.gif" title="Cool" alt="Cool" />) b=1;
if (c>120) b=1;

if ((c>96)&&(c<123)) c-=97;

if (c>22) return -1;
else return (c/3)+b;
}


اتصحو من غرورك والجماح = اذا ما الشمس تافل للرواح

عروة ديرانية

أنا أحب الألغاز الموجزة التي صعوبتها في النوع لا في الكم (في نوعية التفكير المراد لحلها لا في كميته). إنه يصدف أيضًا أن هذه الألغاز هي الأنفع في تطوير التفكير. بالنسبة لي، كان لغز أبراج هانوي مثالاً بارزًا على لغز وجدته صعبًا جدًا لكن حله كان موجزًا أكثر بكثير مما ظننت.

rani_walhan

اهلا اخي عروة

نعم الالغاز تنمي القدرات البرمجية و التفكير

ولغز ابراج هانوي كما قلت ممتع

واعتقد القدرة على حل الالغاز دون الرجوع الى خوارزميات معروفة

هو الطريقة المثلى لتصميم خوارزميات جديدة

حسنا اليكم اللغز الخامس

[code]
int a

cin >> a

if (a>5) cout<

اتصحو من غرورك والجماح = اذا ما الشمس تافل للرواح

foaad

كتب rani_walhan:

المطلوب اعادة كتابة البرنامج البسيط السابق ليؤدي تماما نفس النتيجة بشرط عدم استخدام جمل الشرط و غير مسموح ايضا استخدام التكرار المشروط

طبعاً في كتير طرق بدون استخدام جمل شرط صراحةً (متل استخدام min أو max ...)
مثلاً ممكن نكتب:

int x = (int)(bool)(a / 6);
cout << a*7 + a*5*x;

قيمة x بتكون 0 في حال a أصغر من 6 وإلا 1
بس بظن (bool)(int) ممكن نعتبرها بمثابة شرط؟!

rani_walhan

اهلا اخي فؤاد

حلك صحيح مئة بالمئة

نعم قد تعتبر البول شرط

لان الشرط يحول بالنهاية الى امر cmp بالاسمبلي

وايضا يتبع الشرط نوع من انواع jmp على حسب المقارنة
je ، Jb

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

دعني فقط يا صديقي احاول اعادة ترتيب الكود


int a

cin >> a


a = a *((12*(a>5))+(7*(a<=5)));

// there is no need for typecasting 
//a>5 will return 0 or 1

cout << a;

اتصحو من غرورك والجماح = اذا ما الشمس تافل للرواح

foaad

طيب نفس السؤال السابق بس بدون استخدام تعليمات cmp, test, je, jne ... Smile
يعني بدون تعليمات شرطية نهائياً (بدون عمليات مقارنة وبدون تحويل من أو إلى bool)

EDIT:
ممكن تعتبر a من النمط unsigned int

rani_walhan

ممكن عمل ذلك باستخدام بوابات المنطق و اوامر الازاحة و الاسناد و القسمة و الضرب و باقي القسمة
وربما لن يتم استخدام كل هؤلاء في الاعلى ولكن هذه كلها اسلحة مشروعة قد تستخدم

سوف اضع حل انت اوحيت ان استخدم لـ unsigned و فضلت ان اقوم بهذا بالـ signed

لن استخدم القسمة ولا باقي القسمة واللتان تاخذان دورات عديدة من المعالج مقارنة بدورة واحدة ل and

ببساطة سوف استخدم الطرح والضرب و الازاحة و بوابة and و not

ان طرحت 6 من الرقم
واذا كانت النتيجة سالبة سوف يكون اول بت في الرقم 1
ويمكن الحصول على 1 عن طريق قناع بوابة and
و ثم ازاحة الى اليسار shl
و ضرب الازاحة بالرقم و ب 7
وضرب عكس نتيجة الازاحة بالرقم و ب 12 و جمع القيمتين

سوف اكتبها بالبسيدو كود

b = a -6
// >= 5

c = 1 shl 31

d = b and c

e = d shr 31

er = not e

a = (a*7*e)+(a*12*er);

و سوف اضع لغز جديد قريبا

وتحية

اتصحو من غرورك والجماح = اذا ما الشمس تافل للرواح

foaad

كتب rani_walhan:

واذا كانت النتيجة سالبة سوف يكون اول بت في الرقم 1

فكرة حلوة.
بس يمكن في غلط صغير بالكود...
قيمة e هي إما 1 أو 0 وبالتالي er رح تصير إما -2 أو -1 (أو رقم موجب كبير حسب اللغة) إلا اذا كان المقصود عملية not المنطقية بس بهالحالة منكون استخدمنا التحويل من وإلى bool
بس ممكن نحسب er بغير طريقة:

er=1-e

الطريقة الي خطرتلي (في حال كانت a من نوع unsigned int) هي الطريقة المعروفة للتخلص من التعليمات الشرطية, استخدام جدول (مصفوفة)

arr[0]=7
arr[1]=7
...
arr[5]=7
arr[6]=12
arr[7]=12
...

المشكلة هون انو عدد الاحتمالات كبير 2^32
بس ممكن نختصرهم باستخدام تابع تقطيع مناسب
مثلاً باستخدام القسمة الصحيحة والازاحة وعملية AND

int x = (a / 6);
x = (x & 1)+(x>>1 & 1)+(x>>2 & 1)+...+(x>>31 & 1);

int arr[31] = {7, 12, 12, ..., 12};

cout << a * arr[x];

sh_que_L

عند المقارنة يقوم المعالج بعملية طرح

b = a - 6

الازاحة تكفي لمعرفة الاشارة

e = b shr 31

نستفيد من النتيجة لتوليد الرقم المناسب قبل الجداء

a = (12 - e * 5) * a

لا جديد في حلي، سوى بعض الاختصار
شكرا

rani_walhan

طريقتك ايضا صحيحة

نعم يوجد خطأ باستخدام not
كان يجب استخدام xor

er = 1 xor e

و لكن ايضا استخدام 1- حل جيد

وممكن استخدام المصفوفة كما قلت

وحسب رايي الشخصي انه حتى لو كان يوجد سلبيات لطريقة ما فلا بد انه يمكن استخدامها في ظروف معينة و تكون هي المثلى في تلك الظروف

كتب foaad:
كتب rani_walhan:

واذا كانت النتيجة سالبة سوف يكون اول بت في الرقم 1

فكرة حلوة.
بس يمكن في غلط صغير بالكود...
قيمة e هي إما 1 أو 0 وبالتالي er رح تصير إما -2 أو -1 (أو رقم موجب كبير حسب اللغة) إلا اذا كان المقصود عملية not المنطقية بس بهالحالة منكون استخدمنا التحويل من وإلى bool
بس ممكن نحسب er بغير طريقة:

er=1-e

الطريقة الي خطرتلي (في حال كانت a من نوع unsigned int) هي الطريقة المعروفة للتخلص من التعليمات الشرطية, استخدام جدول (مصفوفة)

arr[0]=7
arr[1]=7
...
arr[5]=7
arr[6]=12
arr[7]=12
...

المشكلة هون انو عدد الاحتمالات كبير 2^32
بس ممكن نختصرهم باستخدام تابع تقطيع مناسب
مثلاً باستخدام القسمة الصحيحة والازاحة وعملية AND

int x = (a / 6);
x = (x & 1)+(x>>1 & 1)+(x>>2 & 1)+...+(x>>31 & 1);

int arr[31] = {7, 12, 12, ..., 12};

cout << a * arr[x];

اتصحو من غرورك والجماح = اذا ما الشمس تافل للرواح

rani_walhan

الحل صحيح مئة بالمئة ومختصر

قمت بالاستفادة من الجمع الرقمين واولوية الضرب على الطرح

الحل مثالي

تقبل تحيتي

كتب sh_que_L:

عند المقارنة يقوم المعالج بعملية طرح

b = a - 6

الازاحة تكفي لمعرفة الاشارة

e = b shr 31

نستفيد من النتيجة لتوليد الرقم المناسب قبل الجداء

a = (12 - e * 5) * a

لا جديد في حلي، سوى بعض الاختصار
شكرا

اتصحو من غرورك والجماح = اذا ما الشمس تافل للرواح

rani_walhan

اللغز الجديد

كيفية فحص رقم معين لاكتشاف ان كان عبارة عن 2 مرفوعة لاس

اي 2^x

او

a ?? = 2^x

قيمة x غير مطلوبة و لكن اعادة true او flase

اتصحو من غرورك والجماح = اذا ما الشمس تافل للرواح

sh_que_L

نتيجة رفع ٢ لأس ما، بحسب نظام العد الثنائي
هو عدد يحوي أصفارا في جميع خاناته باستثناء خانة واحدة
(وهي الخانة المقابلة لقيمة الأس!!).

وبالتالي يكفي التأكد من أن هناك خانة واحدة، وواحدة فقط، تحوي ١

برمجيا
معالجات Intel مثلا
نجد تعليمتين لمسح خانات رقم ما، وهي تًرجع موقع أول خانة تحوي ١
التعليمة الأولى تبدآ من الخانة الأصغر، وتدعي BSF (مسح خانة أمامي Bit Scan Forward)
والثانية تبدأ من الخانة الأكبر، وتدعى BSR (مسح خانة عكسي Bit Scan Reverse)
فيكفي أن تتساوى قيمة المسح الأمامي مع قيمة المسح الخلفي.

أما باستخدام لغة ما كـ Pascal، فربما تصلح العبارات التالية

//Scan bits one by one
iBit := 2;
i := 1; //0..31
cnt := 0;
while (cnt<2) and (i<32) do
begin
if ((Num1 and iBit)>1) then
cnt:=cnt+1;

//Next bit
iBit:=iBit*2;
inc(i);
end;
Result := (cnt=1);

ارتباطات