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

لغز برمجي, التحدي مفتوح بأي لغة برمجة

بدأه khatibe_30 في 6 سبتمبر 2012 · 41 رد · 3,713 مشاهدة · في الرياضيات والخوارزميات
مشاركة: واتساب X فيسبوك تيليجرام
#26

فهمت المسألة تماماً ...

ويمكنني حلها يدويا الآن ...(طبعا للحالات الصغيرة)

مثلاً من أجل L 5,6,7 هناك حلان فقط من أجل أي عدد للأنابيب N

المسألة تعتمد على تحليل العدد إلى مجموع مكون من 2 و 3 فقط دون تكرار ...

وخطوات الحل : تحليل العدد إلى مجموع --> إيجاد سلسلة أرقام تتزايد بمقادر 2 أو 3 في كل مرة تبدأ بالصفر وتنتهي بL --> سينتج لنا عدد من السلاسل هو عدد الحلول لأنبوب واحد ...

مثال على السلسلة:

0 --> 2 --> 5 -->7 السلسلة الأولى

0-->3-->5-->7 السلسلة الثانية

0-->2 --> 4-->7 السلسلة الثالثة

والآن نقارن كل سلسلة مع السلاسل الباقية كما يلي :

باستثناء أول وآخر قيمة 0وL إذا تشابهت أي قيمتان من أي سلستين ..فهذا يعني أنه لا يمكننا وضعهما قرب بعضهما ...

مثلاً لا يمكن وضع السلسلة الأولى مع أي من السلسلتين الثانية والثالثة لأنها تشابههما ب5 و 2

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

والآن نبدأ بعد الحتمالات فلو بدأنا من السلسلة 2 يجب أن نضع 3 بعدها ثم 2 ثم3 لإلى آخر عدد الأنابيب

ثم نبدأ من سلسلة أخرى 3 ,نضع بعدها 2 ثم 3 وهكذا ...

لا يمكن البدء بالسلسلة الأولى لأنه لا يوجد لها سلسلة مغايرة لجميع القيم ...

فيكون عدد الاحتمالات لN=7 هو 2 فقط ...

سأحتاج يوماً إضافيا لكتابة الكود ,,, laugh.giflaugh.giflaugh.gif

بالتوفيق للجميع

والسلام عليكم

#27

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

وأنهيت حتى الآن الجزء الخاص بإيجاد الاحتمالات بالنسبة لأنبوب واحد .. وحالياً سينتهي الجزء الذي يحدد الأنابيب القابلة للوضع بالقرب من بعضها ...

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

سيكون لدي ببساطة .. كل أنبوب مع الاحتمالات الصحيحة بعده .. وكل أنبوب منها سيفتح احتمالات بعده وهكذا ل10 مستويات .. أخشى ألا أضيع بين الأنابيب ...

ربما يوم الجمعة يكون الحل جاهزاً إن شاء الله تعالى...

بالتوفيق للجميع وأنتظر حل أخي linuxman لنرى من سيسبق في الحل laugh.gif

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

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

وأنهيت حتى الآن الجزء الخاص بإيجاد الاحتمالات بالنسبة لأنبوب واحد .. وحالياً سينتهي الجزء الذي يحدد الأنابيب القابلة للوضع بالقرب من بعضها ...

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

سيكون لدي ببساطة .. كل أنبوب مع الاحتمالات الصحيحة بعده .. وكل أنبوب منها سيفتح احتمالات بعده وهكذا ل10 مستويات .. أخشى ألا أضيع بين الأنابيب ...

ربما يوم الجمعة يكون الحل جاهزاً إن شاء الله تعالى...

بالتوفيق للجميع وأنتظر حل أخي linuxman لنرى من سيسبق في الحل laugh.gif

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

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

#29

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

وليس بصعب مضاعفة الأنابيب إلى أن تصل إلى عشرة ما دام أصل الخوارزمية صحيحا

ولكن عيبها أنها تعتمد على brut force ومع عشرة أنابيب سيأخذ ذلك وقتا طويلا فإن كنت على صواب فسأكمل الخوارزمية إلى عشرة أنا بيب ولكن لست مستعدا لتجربتها على جهازي لضعف إمكانياته وهذه هي

مع تعديلات وإصلاح للخطأ الذي كان فيها

function calcul:integer;
var i,j,x,h,f:integer;
  a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16:byte;
  table,addTable:array[1 .. 3329,1 .. 16] of byte;
  test:Boolean=false;
  begin
  i:=1; x:=0;
  for a1:=2 to 3 do
   for a2:=2 to 3 do
    for a3:=2 to 3 do
     for a4:=2 to 3 do
      for a5:=2 to 3 do
       for a6:=2 to 3 do
        for a7:=2 to 3 do
         for a8:=2 to 3 do
          for a9:=2 to 3 do
           for a10:=2 to 3 do
            for a11:=2 to 3 do
             for a12:=2 to 3 do
              for a13:=2 to 3 do
               for a14:=2 to 3 do
                for a15:=2 to 3 do
                 for a16:=2 to 3 do
 begin
  if a1+a2+a3+a4+a5+a6+a7+a8+a9+a10+a11+a12+a13+a14+a15+a16=32 then
  begin if format('%u%u%u%u%u%u%u%u%u%u%u%u%u%u%u%u',[a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16])<> wr then
  begin
   wr:=format('%u%u%u%u%u%u%u%u%u%u%u%u%u%u%u%u',[a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16]);
   table[i,1]:=a1;table[i,2]:=a2;table[i,3]:=a3;
   table[i,4]:=a4;table[i,5]:=a5;table[i,6]:=a6;table[i,7]:=a7;
   table[i,8]:=a8;table[i,9]:=a9;table[i,10]:=a10;table[i,11]:=a11;
   table[i,12]:=a12;table[i,13]:=a13;table[i,14]:=a14;table[i,15]:=a15;table[i,16]:=a16;
   i:=i+1; h:=16;    test:=true; end ;
  end
  else
  if a1+a2+a3+a4+a5+a6+a7+a8+a9+a10+a11+a12+a13+a14+a15=32 then
  begin if format('%u%u%u%u%u%u%u%u%u%u%u%u%u%u%u',[a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15])<> wr then
  begin
   wr:=format('%u%u%u%u%u%u%u%u%u%u%u%u%u%u%u',[a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15]);
  table[i,1]:=a1;table[i,2]:=a2;table[i,3]:=a3;
   table[i,4]:=a4;table[i,5]:=a5;table[i,6]:=a6;table[i,7]:=a7;
   table[i,8]:=a8;table[i,9]:=a9;table[i,10]:=a10;table[i,11]:=a11;
   table[i,12]:=a12;table[i,13]:=a13;table[i,14]:=a14;table[i,15]:=a15;
   i:=i+1;   h:=15;  test:=true;end ;
  end
  else
  if a1+a2+a3+a4+a5+a6+a7+a8+a9+a10+a11+a12+a13+a14=32 then
  begin if format('%u%u%u%u%u%u%u%u%u%u%u%u%u%u',[a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14])<> wr then
  begin
   wr:=format('%u%u%u%u%u%u%u%u%u%u%u%u%u%u',[a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14]);
   table[i,1]:=a1;table[i,2]:=a2;table[i,3]:=a3;
   table[i,4]:=a4;table[i,5]:=a5;table[i,6]:=a6;table[i,7]:=a7;
   table[i,8]:=a8;table[i,9]:=a9;table[i,10]:=a10;table[i,11]:=a11;
   table[i,12]:=a12;table[i,13]:=a13;table[i,14]:=a14;
   i:=i+1; h:=14;   test:=true; end ;
  end
  else
  if a1+a2+a3+a4+a5+a6+a7+a8+a9+a10+a11+a12+a13=32 then
  begin if format('%u%u%u%u%u%u%u%u%u%u%u%u%u',[a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13])<> wr then
  begin
   wr:=format('%u%u%u%u%u%u%u%u%u%u%u%u%u',[a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13]);
   table[i,1]:=a1;table[i,2]:=a2;table[i,3]:=a3;
   table[i,4]:=a4;table[i,5]:=a5;table[i,6]:=a6;table[i,7]:=a7;
   table[i,8]:=a8;table[i,9]:=a9;table[i,10]:=a10;table[i,11]:=a11;
   table[i,12]:=a12;table[i,13]:=a13;
   i:=i+1; h:=13;   test:=true; end ;
  end
  else
  if a1+a2+a3+a4+a5+a6+a7+a8+a9+a10+a11+a12=32 then
  begin if format('%u%u%u%u%u%u%u%u%u%u%u%u',[a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12])<> wr then
  begin
   wr:=format('%u%u%u%u%u%u%u%u%u%u%u%u',[a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12]);
   table[i,1]:=a1;table[i,2]:=a2;table[i,3]:=a3;
   table[i,4]:=a4;table[i,5]:=a5;table[i,6]:=a6;table[i,7]:=a7;
   table[i,8]:=a8;table[i,9]:=a9;table[i,10]:=a10;table[i,11]:=a11;
   table[i,12]:=a12;
   i:=i+1;  h:=12;   test:=true; end ;
  end
  else
  if a1+a2+a3+a4+a5+a6+a7+a8+a9+a10+a11=32 then
  begin if format('%u%u%u%u%u%u%u%u%u%u%u',[a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11])<> wr then
  begin
   wr:=format('%u%u%u%u%u%u%u%u%u%u%u',[a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11]);
  table[i,1]:=a1;table[i,2]:=a2;table[i,3]:=a3;
   table[i,4]:=a4;table[i,5]:=a5;table[i,6]:=a6;table[i,7]:=a7;
   table[i,8]:=a8;table[i,9]:=a9;table[i,10]:=a10;table[i,11]:=a11;
   i:=i+1; h:=11;  test:=true;  end ;
  end ;
  if test  then
   for j:=1 to h do
    begin
    x:=x+table[i-1,j];
     addTable[i-1,j]:=x;
    end;
  x:=0;
  test:=false;
  end;
for i:=1 to 3329 do
 for f:=1 to 3329 do
    begin
     test:=false;
      for j:=1 to 15 do
       for h:=1 to 15 do
         if (addtable[f,h] <> 0) and (addtable[f,h] <> 32) and (addtable[f,h]= addtable[i,j]) then
          test:=true;
      if test=false then begin result:=result+1 ; end;
     end;
  end; //end of function

أنا أعلم أنها ليست الأفضل لذلك أنا أنتظر حل الأخ الخطيب الذي قال أنه حلها في جزء من الثانية

تم تعديل هذه المشاركة بواسطة linuxman في 26 سبتمبر 2012 في 21:31

vVIfFr.gif

مدونتي



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

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

 

http://www.tvquran.com/

 

LoGeCom

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

#30
linuxman كتب:

مادامت البداية صحيحة فالباقي سيكون صحيح, و لكن وقت التنفيذ عامل مهم جدا, أكواد bruite force يمكن أن تأخذ عشرات السنين حتى تصل الى نتيجة في الحالات الكبيرة

لذلك, اذا كانت طريقتك بعد تعميمها على 10 أنابيب على الأقل تجد النتيجة في أقل من ثانية فهي طريقة مقبولة.

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

#31
اقتباس
لا تنتظر كثيرا يا مصطفى فقد وصلت للحل قبلك وهذه الخوارزمية تحسب احتمالات التقاء أنبوبين وناتجها هو عين ما ذكره الأخ الخطيب 37120

smile.gifينتهي التحدي عندما يضع أحدنا عدد الاحتمالات الكي ويكون صحيحاً ....wink.gif

انتهيت من كتابة الجزء الخاص بإيجاد ثنائيات الأنابيب القابلة للوضع قرب بعضها ...

يعني الآن يمكنني تشكيل كل السلاسل الممكنة ...

اقتربت كثيراً ...باقي بضعة أسطر وأنتهي (ربما 20سطر فقط)...

وأرجو أن أسبقك أخي linuxman في وضع الحل laugh.gif

بالتوفيق لك وللجميع أخي العزيز

_________________________

الحمد لله وصلت إلى عدد احتمالات انبوبين 37120 استغرق حوالي ... 17 ثانية laugh.giflaugh.giflaugh.gif

والحل الأخير قادم اليوم بإذن الله تعالى

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

#32

سلام عليك

أنبوبان أو ثلاثة أو عشرة .......

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

غاية أمري أني زدت حلقات الاختبار إلى عشرة

والوقت المسجل لدي في أنبوبين هو ما يقارب 20 ثانية

وهذه هي

function calcul:integer;
var i,j,x,h,f,r,g,z:integer;
  a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16:integer;
  j1,j2,j3,j4,j5,j6,j7,j8,j9,j10:integer;
  table,addTable:array[1 .. 3329,1 .. 16] of byte;
  test:Boolean=false;
  id:array[2 .. 30,1 .. 3329] of integer;
  count,count2:real;
  powr:array[2 .. 30] of real;
  wr,srt:string;
  begin
  i:=1; x:=0;
  for a1:=2 to 3 do
   for a2:=2 to 3 do
    for a3:=2 to 3 do
     for a4:=2 to 3 do
      for a5:=2 to 3 do
       for a6:=2 to 3 do
        for a7:=2 to 3 do
         for a8:=2 to 3 do
          for a9:=2 to 3 do
           for a10:=2 to 3 do
            for a11:=2 to 3 do
             for a12:=2 to 3 do
              for a13:=2 to 3 do
               for a14:=2 to 3 do
                for a15:=2 to 3 do
                 for a16:=2 to 3 do
 begin
  if a1+a2+a3+a4+a5+a6+a7+a8+a9+a10+a11+a12+a13+a14+a15+a16=32 then
  begin if format('%u%u%u%u%u%u%u%u%u%u%u%u%u%u%u%u',[a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16])<> wr then
  begin
   wr:=format('%u%u%u%u%u%u%u%u%u%u%u%u%u%u%u%u',[a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16]);
   table[i,1]:=a1;table[i,2]:=a2;table[i,3]:=a3;
   table[i,4]:=a4;table[i,5]:=a5;table[i,6]:=a6;table[i,7]:=a7;
   table[i,8]:=a8;table[i,9]:=a9;table[i,10]:=a10;table[i,11]:=a11;
   table[i,12]:=a12;table[i,13]:=a13;table[i,14]:=a14;table[i,15]:=a15;table[i,16]:=a16;
   i:=i+1; h:=16;    test:=true; end ;
  end
  else
  if a1+a2+a3+a4+a5+a6+a7+a8+a9+a10+a11+a12+a13+a14+a15=32 then
  begin if format('%u%u%u%u%u%u%u%u%u%u%u%u%u%u%u',[a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15])<> wr then
  begin
   wr:=format('%u%u%u%u%u%u%u%u%u%u%u%u%u%u%u',[a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15]);
  table[i,1]:=a1;table[i,2]:=a2;table[i,3]:=a3;
   table[i,4]:=a4;table[i,5]:=a5;table[i,6]:=a6;table[i,7]:=a7;
   table[i,8]:=a8;table[i,9]:=a9;table[i,10]:=a10;table[i,11]:=a11;
   table[i,12]:=a12;table[i,13]:=a13;table[i,14]:=a14;table[i,15]:=a15;
   i:=i+1;   h:=15;  test:=true;end ;
  end
  else
  if a1+a2+a3+a4+a5+a6+a7+a8+a9+a10+a11+a12+a13+a14=32 then
  begin if format('%u%u%u%u%u%u%u%u%u%u%u%u%u%u',[a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14])<> wr then
  begin
   wr:=format('%u%u%u%u%u%u%u%u%u%u%u%u%u%u',[a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14]);
   table[i,1]:=a1;table[i,2]:=a2;table[i,3]:=a3;
   table[i,4]:=a4;table[i,5]:=a5;table[i,6]:=a6;table[i,7]:=a7;
   table[i,8]:=a8;table[i,9]:=a9;table[i,10]:=a10;table[i,11]:=a11;
   table[i,12]:=a12;table[i,13]:=a13;table[i,14]:=a14;
   i:=i+1; h:=14;   test:=true; end ;
  end
  else
  if a1+a2+a3+a4+a5+a6+a7+a8+a9+a10+a11+a12+a13=32 then
  begin if format('%u%u%u%u%u%u%u%u%u%u%u%u%u',[a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13])<> wr then
  begin
   wr:=format('%u%u%u%u%u%u%u%u%u%u%u%u%u',[a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13]);
   table[i,1]:=a1;table[i,2]:=a2;table[i,3]:=a3;
   table[i,4]:=a4;table[i,5]:=a5;table[i,6]:=a6;table[i,7]:=a7;
   table[i,8]:=a8;table[i,9]:=a9;table[i,10]:=a10;table[i,11]:=a11;
   table[i,12]:=a12;table[i,13]:=a13;
   i:=i+1; h:=13;   test:=true; end ;
  end
  else
  if a1+a2+a3+a4+a5+a6+a7+a8+a9+a10+a11+a12=32 then
  begin if format('%u%u%u%u%u%u%u%u%u%u%u%u',[a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12])<> wr then
  begin
   wr:=format('%u%u%u%u%u%u%u%u%u%u%u%u',[a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12]);
   table[i,1]:=a1;table[i,2]:=a2;table[i,3]:=a3;
   table[i,4]:=a4;table[i,5]:=a5;table[i,6]:=a6;table[i,7]:=a7;
   table[i,8]:=a8;table[i,9]:=a9;table[i,10]:=a10;table[i,11]:=a11;
   table[i,12]:=a12;
   i:=i+1;  h:=12;   test:=true; end ;
  end
  else
  if a1+a2+a3+a4+a5+a6+a7+a8+a9+a10+a11=32 then
  begin if format('%u%u%u%u%u%u%u%u%u%u%u',[a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11])<> wr then
  begin
   wr:=format('%u%u%u%u%u%u%u%u%u%u%u',[a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11]);
  table[i,1]:=a1;table[i,2]:=a2;table[i,3]:=a3;
   table[i,4]:=a4;table[i,5]:=a5;table[i,6]:=a6;table[i,7]:=a7;
   table[i,8]:=a8;table[i,9]:=a9;table[i,10]:=a10;table[i,11]:=a11;
   i:=i+1; h:=11;  test:=true;  end ;
  end ;
  if test  then
   for j:=1 to h do
    begin
    x:=x+table[i-1,j];
     addTable[i-1,j]:=x;
    end;
  x:=0;
  test:=false;
  end;
for a1:=1 to 3329 do
 for a2:=1 to 3329 do
  for a3:=1 to 3329 do
   for a4:=1 to 3329 do
    for a5:=1 to 3329 do
     for a6:=1 to 3329 do
      for a7:=1 to 3329 do
       for a8:=1 to 3329 do
        for a9:=1 to 3329 do
         for a10:=1 to 3329 do
    begin
     test:=false;
      for j1:=1 to 15 do
       for j2:=1 to 15 do
        for j3:=1 to 15 do
         for j4:=1 to 15 do
          for j5:=1 to 15 do
           for j6:=1 to 15 do
            for j7:=1 to 15 do
             for j8:=1 to 15 do
              for j9:=1 to 15 do
               for j10:=1 to 15 do
         if (addtable[f,h] <> 0) and (addtable[f,h] <> 32) then
         if(
          addtable[a1,j1]= addtable[a2,j2]) or
         (addtable[a2,j2]= addtable[a3,j3]) or
         (addtable[a3,j3]= addtable[a4,j4]) or
         (addtable[a4,j4]= addtable[a5,j5]) or
         (addtable[a5,j5]= addtable[a6,j6]) or
         (addtable[a6,j6]= addtable[a7,j7]) or
         (addtable[a7,j7]= addtable[a8,j8] )or
         (addtable[a8,j8]= addtable[a9,j9]) or
         (addtable[a9,j9]= addtable[a10,j10]
         ) then
          test:=true;      
      if test=false then begin result:=result+1 ; end;
     end;
  end; //end of function

vVIfFr.gif

مدونتي



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

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

 

http://www.tvquran.com/

 

LoGeCom

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

#33

بارك الله فيك هل تأكدت من صحة الإجابة ... smile.gif؟؟

#34

لا ما جربتها لأنها ستأخذ أياما .... :sad: ولكن أنا على يقين بصحتها ومع ذلك التحدي لا يزال قائما لتحسين الخوارزمية

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

vVIfFr.gif

مدونتي



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

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

 

http://www.tvquran.com/

 

LoGeCom

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

#35
اقتباس
ا ومع ذلك التحدي لا يزال قائما لتحسين الخوارزمية

بل التحدي لإيجاد الجواب ...laugh.gif

أنا انتهيت تقريبا باقي بعض الرتوش هنا وهناك ... حوالي ساعة على الأكثر إن شاء الله تعالى ...

#36
linuxman كتب:

سلام عليك

أنبوبان أو ثلاثة أو عشرة .......

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

غاية أمري أني زدت حلقات الاختبار إلى عشرة

والوقت المسجل لدي في أنبوبين هو ما يقارب 20 ثانية

هذا الكود, نظريا صحيح و سيعطي نتيجة, و لكن عمليا, لا يمكن أن يعطيك نتيجة

إذا كانت نتيجة أنبوبين و هي -حسب طريقتك- عبارة عن 33292عملية تحقق من توافق الأنابيب تأخذ معك 1 ثانية فقط و ليس 20

فإن التحقق من 10 أنابيب و الذي سيكون -حسب طريقتك- عبارة عن 332910عملية تحقق

أي سيكون 33292 * 33298 عملية تحقق من توافق الانابيب

و سيأخذ من الوقت 1*33298 ثانية

و هذا أكثر من 478303715279 مليار سنة حسب حساباتي

حتى باستعمال سوبر سوبر سوبر كومبيوتر فسيأخذ هذا الكود حتى يجد حلا عشرات أو مئات ملايين السنين و ربما أكثر بكثير

تم تعديل هذه المشاركة بواسطة khatibe_30 في 27 سبتمبر 2012 في 22:34

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

#37

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

إخواني ادعولي بالمغفرة ... والله نعم الله تعالى تغمرني من كل صوب ... اللهم هب لنا من لدنك رحمة وهيّئ لنا من أمرنا رشداً ...

ولا حول ولا قوة إلا بالله العلي العظيم ...

_______________________________________

أخي ياسين ..

جواب سؤالك هو :806844323190414

ولله الحمد ...

الكود طويل ومعقد ... ولكنه يحل المشكلة بإدخال L,N وهو يكمل الباقي ...

أمامي خياران ...

أن أضع الكود الآن ..وأعدك أني لن أفكر في العودة إليه مرة أخرى ...

أو أن أضع الكود مع الشرح الوافي والكافي بإذن الله تعالى ...

وشرح للخوارزمية ..بعد حوالي أسبوع من الآن ....

فما قولك ....

جزاك الله خيراً...فقد استخدمت كل ما أعطانيه الله تعالى من علم في حل هذه المسألة ... واستغرقت معي 4 أيام من التفكير المتواصل ...(يعني حوالي 2-3 ساعات من يومي )

أسأل الله أن يرزقني عملاً صالحاً مخلصاً ...

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

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

جواب سؤالك هو :806844323190414

ولله الحمد ...

الكود طويل ومعقد ... ولكنه يحل المشكلة بإدخال L,N وهو يكمل الباقي ...

أمامي خياران ...

أن أضع الكود الآن ..وأعدك أني لن أفكر في العودة إليه مرة أخرى ...

أو أن أضع الكود مع الشرح الوافي والكافي بإذن الله تعالى ...

وشرح للخوارزمية ..بعد حوالي أسبوع من الآن ....

فما قولك ....

جزاك الله خيراً...فقد استخدمت كل ما أعطانيه الله تعالى من علم في حل هذه المسألة ... واستغرقت معي 4 أيام من التفكير المتواصل ...(يعني حوالي 2-3 ساعات من يومي )

أسأل الله أن يرزقني عملاً صالحاً مخلصاً ...

أجل, تهانينا, الحل صحيح :happy: :happy:

أعتقد أن حلك = حل linuxman + إضافة مميزة (و هي مفتاح اللغز)

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

#39

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

vVIfFr.gif

مدونتي



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

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

 

http://www.tvquran.com/

 

LoGeCom

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

#40

أظن أن الأخ مصطفى غائب,

هذا حل مصطفى:

#include<cstdio>
int num(int a)
{
        if(a==1)
        return 0;
        else if(a==2)
        return 1;
        else if(a==3)
        return 1;
        else return num(a-2)+num(a-3);
}
int number=0;
class tree
{
private:
        int value;
        int ID;
        tree*prev;
        tree*next1;
        tree*next2;
public:
        tree(int);
        tree(int,tree*);
        int treesize(int);
        int getleaf(int,int);
};
tree **b;
tree::  tree(int a)
        {
        value=a;
        next1=new tree(value-2,this);
        next2=new tree(value-3,this);
        }
tree::  tree(int a,tree*b)
        {
        value=a;prev=b;
        if(a==1)
                value=0;
        else if(a!=2&&a!=3)
        {
                next1=new tree(value-2,this);
                next2=new tree(value-3,this);
        }
        else if(a==2||a==3)
        {
                ID=number++;
                ::b[ID]=this;
        }
        }
int tree::treesize(int end)
        {
        tree *buffer=this;
        int i;
        for(i=0;buffer->value!=end;i++)
                buffer=buffer->prev;
        return i;
        }
int tree::getleaf(int end,int j)
        {
        tree *buffer=this;
        int i;
        for(i=0;buffer->value!=end;i++)
        {
                if(i==j)return buffer->value;
                buffer=buffer->prev;
        }
        return 0;
        }
typedef char Byte;
bool linearsearch(int *a,int size,int target)
{
        for(int i=0;i<size;i++)
        if(a==target)return 1;
        return 0;
}
int **series;
int *counterSeries;
void initseries(int L)
{
        series=new int*[num(L)];
        counterSeries=new int[num(L)];
}
void wich_next(int**c,int L)
{
        initseries(L);
        int Size=num(L);
        int counter=Size,counter2=Size;
        int i,j,k;
        int indeX=0;
        for(i=0;i<num(L);i++)
        {
        series=new int[Size];
        counter=Size,counter2=Size;
        for(j=0;j<Size;j++)series[j]=j;
        for(j=0;j<b->treesize(L);j++)
        {
                for(k=0;k<counter2;k++)
                {
                if(
                        linearsearch
                        (c[series[k]],
                        b[series[k]]->treesize(L),
                        c[j]))
                {series[k]=-1;counter--;}
                }
                int *buffer=new int[counter];
                int index=0;
                for(k=0;k<counter2;k++)
                if(series[k]!=-1)
                        buffer[index++]=series[k];
                series=buffer;
                counter2=counter;
        }counterSeries[indeX++]=counter;
        }
}
main()
{
        unsigned int L;
        unsigned int N;
        printf("Enter L :");scanf("%u",&L);
        printf("Enter N :");scanf("%u",&N);
        b=new tree*[num(L)];
        tree a(L);
        int i,j,k;
        int**c=new int*[num(L)];
        for(i=0;i<num(L);i++)
        {
        int X=b->treesize(L);
        c=new int[X];
        for(int j=0;j<X;j++)
                c[j]=b->getleaf(L,j);
        }
        wich_next(c,L);

        long long **array;
        array=new long long*[N];
        array[0]=new long long[num(L)];
        for(j=0;j<num(L);j++)array[0][j]=1;
   for(i=1;i<N;i++)
        {
        array=new long long[num(L)];
        for(k=0;k<num(L);k++)array[k]=0;
        for(j=0;j<num(L);j++)
        {
                for(k=0;k<counterSeries[j];k++)
                array[series[j][k]]+=array[i-1][j];
        }
        }
        long long int SUPERSUM=0;
        SUPERSUM=0;
        for(i=0;i<num(L);i++)SUPERSUM+=array[N-1];
        printf("%llu\n",SUPERSUM);
        return 0;
}

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

#41

linuxman

الكود الذي كتبته أنت ينقصه شيء واحد حتى يتم تنفيذه في وقت معقول, و هو تخزين النتائج

تلاحظ أنه يوجد الكثير الكثير من الحسابات التي تتكرر

مثلا إذا وصلت ألى الأنبوب رقم 2, و كانت الطريقة الحالية لملء الأنبوب هي رقم r من الطرق 3329, طبعا ستحسب الطرق التي توافقها في الأنبوب 3 و الطرق التي توافق الطرق التي توافقها في الانبوب 4...الخ الى ان تصل الى الانبوب 10

لذلك, يجب أن تقوم بتخزين هذه النتائج في مصفوفة مثلا

m(2, r) = result;

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

اذا سبق و حسبتها, استعمل النتيجة المخزنة و اخرج من الحلقة و انتقل الى الحالة الموالية و هكذا

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

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

#42
اقتباس
أظن أن الأخ مصطفى غائب,

جزاك الله خيراً أخي ياسين ... أعتذر لغيابي فقد انقطع الاتصال نهائياً ..عندنا ... أرجو العودة قريباً ...

وأكرر شكري لك ... لوضعك الحل .. فلا شيء مغلق هنا laugh.giflaugh.gif

والسلام عليكم

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