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

فكر: لغز برمجي بسيط

بدأه MouhcineFD في 27 يوليو 2014 · 9 رد · 1,349 مشاهدة · في لغة C و ++C
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

لدي هدا الكود البرمجي

المطلوب تعديل الكود لجعله أسرع في التنفيد بنسبة أكتر من 50%

**مع كتابة استنتاج يعتمده المبرمج في كتابة برامجه

 

الشروط:

عدم اضافة أو ازالة أي حرف أو رقم أو رمز

عدم عدم تغيير فكرة عمل الكود

التعديل مسموح داخل الدالة الرئيسية فقط

 

 

المستوى: من مبتدأ الى متوسط

#include<stdio.h>

int cotin()
{
    int i,a=0;
    for(i=0; i<10000000; i++)
        a++;
    return a;
}

int couti()
{
    int i,a=0;
    for(i=0; i<100000; i++)
        a++;
    return a;
}

int cutin()
{
    int i,a=0;
    for(i=0; i<1000; i++)
        a++;
    return a;
}

int main()
{

    if(cotin()<=1000||cutin()<=1000||couti()<=1000)
    printf("MouhcineFD");

}

** سبب تعديل الموضوع

تم تعديل هذه المشاركة بواسطة MouhcineFD في 27 يوليو 2014 في 21:32

#2
#include<stdio.h>

int cotin()
{
    int i,a=0;
    for(i=0; i<10000000; i++)
        a++;
    return a;
}

int couti()
{
    int i,a=0;
    for(i=0; i<100000; i++)
        a++;
    return a;
}

int cutin()
{
    int i,a=0;
    for(i=0; i<1000; i++)
        a++;
    return a;
}

int main()
{

    if(cutin()<=1000 || cotin()<=1000||couti()<=1000)
    printf("MouhcineFD");

موضع التعديل : هو أن أجعل الدالة الآخيرة cutin هي الأولى في الشرط لأنها محققة في كل الأحوال 

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

1

vVIfFr.gif

مدونتي



إذا رأيتموني غبت فأطلت الغياب فربما أكون قد انتقلت عن الدنيا إلى الآخرة

فما أحوجني إلى دعوة صالحة من أخ لي كريم

 

http://www.tvquran.com/

 

LoGeCom

أول برنامج عربي للمحاسبة والتجارة وإدراة المخازن يعمل على اللينكس والماك والويندوز 

#3

عند بناء البرنامج مع تفعيل التحسينات، المصرف يحسب القيم التي تعيدها تلك الدوال ويحسب الشرط عند بناء البرنامج، في النهاية سيحذف جملة if من الدالة، كأن البرنامج:

#include <stdio.h>

int main()
{
  printf("MouhcineFD");
  return 0;
}

وبدون تعديل شيء.

 

لكن أظن أنك تلمح للـshort circuit evaluation.

تم تعديل هذه المشاركة بواسطة Mr.B في 27 يوليو 2014 في 20:25

1
#4
أحمد أبو عبد البر

 

وجدت الحل لكن لم تعدله بالشكل الأفضل

+ انظر الموضوع تمت اضافة طلب جديد

#5
Mr.B

 

من الشروط

 

عدم اضافة أو ازالة أي حرف أو رقم أو رمز

عدم تغيير فكرة عمل الكود

التعديل مسموح داخل الدالة الرئيسية فقط

#6
MouhcineFD كتب:

Mr.B

 

من الشروط

 

عدم اضافة أو ازالة أي حرف أو رقم أو رمز

عدم تغيير فكرة عمل الكود

التعديل مسموح داخل الدالة الرئيسية فقط

 

 

اظن ان Mr.B يقصد انه في كل الاحوال سيتم حذف الجملة الشرطية بسبب ال optimization (اذا كان مفعل) لذلك لا فرق بين ما كتبته انت وبين التعديل الذي ذكره الاخ احمد.

اذا وجدت ان مشاركتي قيمة بالنسبة لك، لا تنسى ان تضغط على السهم الاخضر الذي يظهر اسفل ردودي لكي تضيف لي نقاط ^^

سبحان الله وبحمده ..  سبحان الله العظيم

#7

أنا وضعت لغز بشروط

وليس موضوع للنقاش عن طريقة عمل المصرف

ما قاله Mr.B صحيح

ولكن ليس هو حل اللغز

#8
MouhcineFD كتب:

أحمد أبو عبد البر

 

وجدت الحل لكن لم تعدله بالشكل الأفضل

+ انظر الموضوع تمت اضافة طلب جديد

 

هل تقصد أن أجعل الدالة  cotin() هي الأخيرة

 

لو كنت تقصد ذلك فإن ذلك لا يغير من السرعة شيئا فإنك سواء أخرتها أو قدمتها فلن تستدعى الدالتين cotin() و couti() وسيتحقق الشرط عند استدعاء الدالة الأولى 

تم تعديل هذه المشاركة بواسطة أحمد أبو عبد البر في 28 يوليو 2014 في 00:57

1

vVIfFr.gif

مدونتي



إذا رأيتموني غبت فأطلت الغياب فربما أكون قد انتقلت عن الدنيا إلى الآخرة

فما أحوجني إلى دعوة صالحة من أخ لي كريم

 

http://www.tvquran.com/

 

LoGeCom

أول برنامج عربي للمحاسبة والتجارة وإدراة المخازن يعمل على اللينكس والماك والويندوز 

#9

نعم هدا ما أقصد

كما قلت فهو لن يغير شيئ لكن فقط في هده الحالة

لنفترض أننا لا نعرف شيئ عن الدالة الأولى هل ستتحقق أم لا يعني من الأفضل جعل cotin هي الأخير

على العموم اجابتك صحيحة

+ ماهو استنتاجك

#10

انا افكر اتركوا لي فرصة للاجابة!

 

تعديل:

-----

 

هذا هو الحل:

#include<stdio.h>

int cotin()
{
    int i, a = 0;
    for (i = 0; i < 10000000; i++)
        a++;
    return a;
}

int couti()
{
    int i, a = 0;
    for (i = 0; i < 100000; i++)
        a++;
    return a;
}

int cutin()
{
    int i, a = 0;
    for (i = 0; i < 1000; i++)
        a++;
    return a;
}

int main()
{

    if(cutin() <= 1000 || cotin() <= 1000 || couti() <= 1000)
    printf("MouhcineFD");
}

 العامل || سوف يقيّم المعامل الاول و هو دائما صحيح فاذا سيتجاهل باقي المعاملات و بهذه الطريقة نكون وفّرنا عناء ايّ من باقي الدالات

تم تعديل هذه المشاركة بواسطة adam-master في 25 أغسطس 2014 في 22:39

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