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

هل يمكنك إيجاد جميع الإحتمالات !؟

مغلقرائج
بدأه Snack3r في 13 أغسطس 2012 · 70 رد · 6,776 مشاهدة · في لغة C و ++C
مشاركة: واتساب X فيسبوك تيليجرام
#26

هكذا كان حلي لسؤالك الشنقيطيhappy.gif

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

int main()
{
int i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,Num[16]={0};
char a[16][2], b[1][17];
FILE *ptr=NULL;
ptr=fopen ("on.txt","w");
if(ptr==NULL) exit(0);

for(i=0;i<16;i++)
for(j=0;j<16;j++)
{
	for(k=0;k<16;k++)
{
	for(l=0;l<16;l++)
{
	for(m=0;m<16;m++)
{
	for(n=0;n<16;n++)
{
	for(o=0;o<16;o++)
{
	for(p=0;p<16;p++)
{
	for(q=0;q<16;q++)
{
	for(r=0;r<16;r++)
{
	for(s=0;s<16;s++)
{
	for(t=0;t<16;t++)
{
	for(u=0;u<16;u++)
{
	for(v=0;v<16;v++)
{
	for(w=0;w<16;w++)
{
	for(x=0;x<16;x++)
{
for(y=0;y<16;y++)itoa(Num[y],a[y],16);
sprintf(b[0],"%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c"\
,a[0][0],a[1][0],a[2][0],a[3][0],a[4][0],a[5][0]\
,a[6][0],a[7][0],a[8][0],a[9][0],a[10][0],a[11][0]\
,a[12][0],a[13][0],a[14][0],a[15][0]);
puts(b[0]); //fprintf(ptr,"%s\n",b[0]);
Num[15]++; if(Num[15]==16) Num[15]=0;
}
Num[14]++; if(Num[14]==16) Num[14]=0;
}
Num[13]++; if(Num[13]==16) Num[13]=0;
}
Num[12]++; if(Num[12]==16) Num[12]=0;
}
Num[11]++; if(Num[11]==16) Num[11]=0;
}
Num[10]++; if(Num[10]==16) Num[10]=0;
}
Num[9]++; if(Num[9]==16) Num[9]=0;
}
Num[8]++; if(Num[8]==16) Num[8]=0;
}
Num[7]++; if(Num[7]==16) Num[7]=0;
}
Num[6]++; if(Num[6]==16) Num[6]=0;
}
Num[5]++; if(Num[5]==16) Num[5]=0;
}
Num[4]++; if(Num[4]==16) Num[4]=0;
}
Num[3]++; if(Num[3]==16) Num[3]=0;
}
Num[2]++; if(Num[2]==16) Num[2]=0;
}
Num[1]++; if(Num[1]==16) Num[1]=0;
}

fclose(ptr);
	return 0;
}

يشتغل معي الكود بشكل جيد ولكن لا أعرف إذا كان بالمستوى المطلوب

ولحد الآن لازال البرنامج يبحث عن الإحتمالات و بعد مرور ربع ساعة من تشغيل البرنامجblink.gif

تحياتي

i love you mama

#27

يا مسهل يارب

شكرا لك اخي مومو للمساعدة

#28
hassan9599 كتب:

يا مسهل يارب

شكرا لك اخي مومو للمساعدة

للإفادة فقط لمعرفة جميع الإحتمالات بهذه الطريقة ستستهلك الكثير من الوقت (ممكن لأيام!!):wink:

وبالنسبة للملف الذي ستخزن فيه هذا الكم الهائل من البيانات سيكون حجمه عشرات إن لم نقل المئات من الجيغابايت:wacko:

هذه ملاحظتي أثناء تشغيل البرنامج

مع كل التوفيق لك ولباقي الزملاء

i love you mama

#29
مومو (momo) كتب:

للإفادة فقط لمعرفة جميع الإحتمالات بهذه الطريقة ستستهلك الكثير من الوقت (ممكن لأيام!!):wink:

وبالنسبة للملف الذي ستخزن فيه هذا الكم الهائل من البيانات سيكون حجمه عشرات إن لم نقل المئات من الجيغابايت:wacko:

هذه ملاحظتي أثناء تشغيل البرنامج

مع كل التوفيق لك ولباقي الزملاء

الوقت طبيعي يكون أكثر من أيام .. ، لأن طول السلسلة طويل جداً ، فما بالك بسلسلة طولها 100 أو 200 .. أو قل 20 لا نبتعد أكثر ..

وبالنسبة للملف حجمه مبالغ 100 جيجا ..

مستحيل ..

أنا إستغرقت الكثير من الوقت وهذا مثالي بالتايمر .. بعد التطوير ..

post-219398-034076900 1345073161_thumb.p

تحياتي :happy:

المرفقات
1.png

رجعت ومازال الفريق خاملاَ  :( 


 


abPuw.1.gif

#30

@ أحمد الشنقيطي

ما الهدف أظن هناك اشياء اكثر نفعا (وقدرة يمكن عملها)

GoodBye

#31

النسخة النهائية من البرنامج ..

إدعوا لنا بالتوفيق ، تم الإكتمال بإستعمال التايمر إذا كانت هناك مشكلة من إستعمال التايمر للمشاركة ..

في الموضوع فأخبروني ..

صورة من النسخة النهائية ..

post-219398-052622400 1345074579_thumb.p

تحياتي :happy:

وإن شاء الله من الآن للآذان الفجر سأرى كم إحتمال أصل ..

MohamedIBrahim كتب:

@ أحمد الشنقيطي

ما الهدف أظن هناك اشياء اكثر نفعا (وقدرة يمكن عملها)

إقترح أخي الكريم .. وسأشارك معك فيه ..

أعتقد أنه قام بعمل هذا الشئ للتنشيط القسم كما ذكر في بداية الموضوع وأيضاً ..

الموضوع مفيد ، فأنا تعلمت أشياء جديدة وإستخدامات جديدة ..

المرفقات
1.png

رجعت ومازال الفريق خاملاَ  :( 


 


abPuw.1.gif

#32
أحمد الشنقيطي كتب:

لا زال التفكير جار في حل السؤال :)

حتى الساعة, حصلتُ على 167 772 16 احتمال ..

أي ما يُعادل مليار و ستة ملايين و سبعمائة و سبعون ألفا و مئتان و ستة عشر !! :wacko:

مع العلم أن طول السلسلة لم يتجاوز 8 :blink:

المشكلة الجديدة هي أن حجم الملف النصي أصبح يساوي 160Mb, انظروا :

post-219439-005426600 1344905703_thumb.p

كنتَ أتمنى أن أرفع لكم الملف لتُشاهدوه .. :happy:

تعديل أخي الكريم ..

الرقم الذي وصلت له ستة عشر مليون وسبعمائة وسبعة وسبعون الفا ومئتان وستة عشر ..

رجعت ومازال الفريق خاملاَ  :( 


 


abPuw.1.gif

#33
مومو (momo) كتب:

هكذا كان حلي لسؤالك الشنقيطيhappy.gif

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

int main()
{
int i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,Num[16]={0};
char a[16][2], b[1][17];
FILE *ptr=NULL;
ptr=fopen ("on.txt","w");
if(ptr==NULL) exit(0);

for(i=0;i<16;i++)
for(j=0;j<16;j++)
{
	for(k=0;k<16;k++)
{
	for(l=0;l<16;l++)
{
	for(m=0;m<16;m++)
{
	for(n=0;n<16;n++)
{
	for(o=0;o<16;o++)
{
	for(p=0;p<16;p++)
{
	for(q=0;q<16;q++)
{
	for(r=0;r<16;r++)
{
	for(s=0;s<16;s++)
{
	for(t=0;t<16;t++)
{
	for(u=0;u<16;u++)
{
	for(v=0;v<16;v++)
{
	for(w=0;w<16;w++)
{
	for(x=0;x<16;x++)
{
for(y=0;y<16;y++)itoa(Num[y],a[y],16);
sprintf(b[0],"%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c"\
,a[0][0],a[1][0],a[2][0],a[3][0],a[4][0],a[5][0]\
,a[6][0],a[7][0],a[8][0],a[9][0],a[10][0],a[11][0]\
,a[12][0],a[13][0],a[14][0],a[15][0]);
puts(b[0]); //fprintf(ptr,"%s\n",b[0]);
Num[15]++; if(Num[15]==16) Num[15]=0;
}
Num[14]++; if(Num[14]==16) Num[14]=0;
}
Num[13]++; if(Num[13]==16) Num[13]=0;
}
Num[12]++; if(Num[12]==16) Num[12]=0;
}
Num[11]++; if(Num[11]==16) Num[11]=0;
}
Num[10]++; if(Num[10]==16) Num[10]=0;
}
Num[9]++; if(Num[9]==16) Num[9]=0;
}
Num[8]++; if(Num[8]==16) Num[8]=0;
}
Num[7]++; if(Num[7]==16) Num[7]=0;
}
Num[6]++; if(Num[6]==16) Num[6]=0;
}
Num[5]++; if(Num[5]==16) Num[5]=0;
}
Num[4]++; if(Num[4]==16) Num[4]=0;
}
Num[3]++; if(Num[3]==16) Num[3]=0;
}
Num[2]++; if(Num[2]==16) Num[2]=0;
}
Num[1]++; if(Num[1]==16) Num[1]=0;
}

fclose(ptr);
	return 0;
}

يشتغل معي الكود بشكل جيد ولكن لا أعرف إذا كان بالمستوى المطلوب

ولحد الآن لازال البرنامج يبحث عن الإحتمالات و بعد مرور ربع ساعة من تشغيل البرنامجblink.gif

تحياتي

أخ مومو ممكن البرنامج التنفيذي لأجرب البرنامج ؟؟ ..

تحياتي :happy:

رجعت ومازال الفريق خاملاَ  :( 


 


abPuw.1.gif

#34

بعد الآذان بـ12 دقيقة ..

أرفع لكم ملف الإحتمالات ..

طبعاً ليس كل الإحتمالات ولا إلى الإحتمالات التي وصل إليها الأخ أحمد ..

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

حجم الملف : 5 ميجا تقريباً ...

عدد الإحتمالات : 293778 أي مائتان و ثلاثة وتسعون ألفاً و سبعمائة وثمانية وسبعون إحتمالاً .. ولله الحمد ..

تحياتي :happy:

الإحتملات.rar

رجعت ومازال الفريق خاملاَ  :( 


 


abPuw.1.gif

#35
bahbah كتب:

بعد الآذان بـ12 دقيقة ..

أرفع لكم ملف الإحتمالات ..

طبعاً ليس كل الإحتمالات ولا إلى الإحتمالات التي وصل إليها الأخ أحمد ..

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

حجم الملف : 5 ميجا تقريباً ...

عدد الإحتمالات : 293778 أي مائتان و ثلاثة وتسعون ألفاً و سبعمائة وثمانية وسبعون إحتمالاً .. ولله الحمد ..

تحياتي :happy:

تسلم يا غالي ولكن يوجد مشكلة :

يجب ان تكون الحروف كابيتال يعني كبيرة مثل ABCDEF وليس abcdef

#36
bahbah كتب:

أخ مومو ممكن البرنامج التنفيذي لأجرب البرنامج ؟؟ ..

تحياتي :happy:

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

عوض أن نحجز مساحة كبيرة من الذاكرة تتسع لهذا الكم الهائل من الأعداد نقوم فقط

بحجز مساحة صغيرة (ما يكفي لعدد واحد مكون من 16 رقم) و نحررها في كل مرة انتهينا من هذا الرقم

الكود بعد التعديل

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

int main()
{

int i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,Num[16]={0};
char  *str=NULL;

	for(i=0;i<16;i++)

	for(j=0;j<16;j++)
{
	for(k=0;k<16;k++)
{
	for(l=0;l<16;l++)
{
	for(m=0;m<16;m++)
{
	for(n=0;n<16;n++)
{
	for(o=0;o<16;o++)
{
	for(p=0;p<16;p++)
{
	for(q=0;q<16;q++)
{
	for(r=0;r<16;r++)
{
	for(s=0;s<16;s++)
{
	for(t=0;t<16;t++)
{
	for(u=0;u<16;u++)
{
	for(v=0;v<16;v++)
{
	for(w=0;w<16;w++)
{
	for(x=0;x<16;x++)
{
	{   	str=(char*)calloc(17,sizeof(char));
        	sprintf(str,"%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x",Num[0],\
        	Num[1],Num[2],Num[3],Num[4],Num[5],Num[6],Num[7],Num[8],\
        	Num[9],Num[10],Num[11],Num[12],Num[13],Num[14],Num[15]);
        	Num[15]++;
        	if(Num[15]==16) Num[15]=0;
        	puts(str);
        	free(str);
	}

}
Num[14]++; if(Num[14]==16) Num[14]=0;
}
Num[13]++; if(Num[13]==16) Num[13]=0;
}
Num[12]++; if(Num[12]==16) Num[12]=0;
}
Num[11]++; if(Num[11]==16) Num[11]=0;
}
Num[10]++; if(Num[10]==16) Num[10]=0;
}
Num[9]++; if(Num[9]==16) Num[9]=0;
}
Num[8]++; if(Num[8]==16) Num[8]=0;
}
Num[7]++; if(Num[7]==16) Num[7]=0;
}
Num[6]++; if(Num[6]==16) Num[6]=0;
}
Num[5]++; if(Num[5]==16) Num[5]=0;
}
Num[4]++; if(Num[4]==16) Num[4]=0;
}
Num[3]++; if(Num[3]==16) Num[3]=0;
}
Num[2]++; if(Num[2]==16) Num[2]=0;
}
Num[1]++; if(Num[1]==16) Num[1]=0;
}

	return 0;
}

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

فنعوض هذا الجزء من الكود

str=(char*)calloc(17,sizeof(char));
        	sprintf(str,"%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x",Num[0],\
        	Num[1],Num[2],Num[3],Num[4],Num[5],Num[6],Num[7],Num[8],\
        	Num[9],Num[10],Num[11],Num[12],Num[13],Num[14],Num[15]);
        	Num[15]++;
        	if(Num[15]==16) Num[15]=0;
        	puts(str);
        	free(str);

بهذا دون الإستعانة بالحجز الديناميكي

printf("%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x\n",Num[0],\
        	Num[1],Num[2],Num[3],Num[4],Num[5],Num[6],Num[7],Num[8],\
        	Num[9],Num[10],Num[11],Num[12],Num[13],Num[14],Num[15]);
        	Num[15]++;
        	if(Num[15]==16) Num[15]=0;

بالنسبة للملف التنفيذي الذي طلبته مني أخ bahbah

تفضل من هنا momo.rar

تحياتي

i love you mama

#37
مومو (momo) كتب:

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

عوض أن نحجز مساحة كبيرة من الذاكرة تتسع لهذا الكم الهائل من الأعداد نقوم فقط

بحجز مساحة صغيرة (ما يكفي لعدد واحد مكون من 16 رقم) و نحررها في كل مرة انتهينا من هذا الرقم

الكود بعد التعديل

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

int main()
{

int i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,Num[16]={0};
char  *str=NULL;

	for(i=0;i<16;i++)

	for(j=0;j<16;j++)
{
	for(k=0;k<16;k++)
{
	for(l=0;l<16;l++)
{
	for(m=0;m<16;m++)
{
	for(n=0;n<16;n++)
{
	for(o=0;o<16;o++)
{
	for(p=0;p<16;p++)
{
	for(q=0;q<16;q++)
{
	for(r=0;r<16;r++)
{
	for(s=0;s<16;s++)
{
	for(t=0;t<16;t++)
{
	for(u=0;u<16;u++)
{
	for(v=0;v<16;v++)
{
	for(w=0;w<16;w++)
{
	for(x=0;x<16;x++)
{
	{   	str=(char*)calloc(17,sizeof(char));
        	sprintf(str,"%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x",Num[0],\
        	Num[1],Num[2],Num[3],Num[4],Num[5],Num[6],Num[7],Num[8],\
        	Num[9],Num[10],Num[11],Num[12],Num[13],Num[14],Num[15]);
        	Num[15]++;
        	if(Num[15]==16) Num[15]=0;
        	puts(str);
        	free(str);
	}

}
Num[14]++; if(Num[14]==16) Num[14]=0;
}
Num[13]++; if(Num[13]==16) Num[13]=0;
}
Num[12]++; if(Num[12]==16) Num[12]=0;
}
Num[11]++; if(Num[11]==16) Num[11]=0;
}
Num[10]++; if(Num[10]==16) Num[10]=0;
}
Num[9]++; if(Num[9]==16) Num[9]=0;
}
Num[8]++; if(Num[8]==16) Num[8]=0;
}
Num[7]++; if(Num[7]==16) Num[7]=0;
}
Num[6]++; if(Num[6]==16) Num[6]=0;
}
Num[5]++; if(Num[5]==16) Num[5]=0;
}
Num[4]++; if(Num[4]==16) Num[4]=0;
}
Num[3]++; if(Num[3]==16) Num[3]=0;
}
Num[2]++; if(Num[2]==16) Num[2]=0;
}
Num[1]++; if(Num[1]==16) Num[1]=0;
}

	return 0;
}

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

فنعوض هذا الجزء من الكود

str=(char*)calloc(17,sizeof(char));
        	sprintf(str,"%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x",Num[0],\
        	Num[1],Num[2],Num[3],Num[4],Num[5],Num[6],Num[7],Num[8],\
        	Num[9],Num[10],Num[11],Num[12],Num[13],Num[14],Num[15]);
        	Num[15]++;
        	if(Num[15]==16) Num[15]=0;
        	puts(str);
        	free(str);

بهذا دون الإستعانة بالحجز الديناميكي

printf("%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x%x\n",Num[0],\
        	Num[1],Num[2],Num[3],Num[4],Num[5],Num[6],Num[7],Num[8],\
        	Num[9],Num[10],Num[11],Num[12],Num[13],Num[14],Num[15]);
        	Num[15]++;
        	if(Num[15]==16) Num[15]=0;

بالنسبة للملف التنفيذي الذي طلبته مني أخ bahbah

تفضل من هنا momo.rar

تحياتي

شكراً .. أخي ..

اقتباس
تسلم يا غالي ولكن يوجد مشكلة :

يجب ان تكون الحروف كابيتال يعني كبيرة مثل ABCDEF وليس abcdef

للعلم فإن البرنامج النسخة النهائية فيها هذه الكفاءة في مربع النص "حالة الأحرف" لو ضبطته على 1 فسيقوم بعمل حروف كابيتال ولكن لو ضبطته على 2 فسيكون سمليتر ..

ولكن يجب كتابة الأحرف في مربع نص "الحروف والأرقام" الحروف الصغيرة السمليتر ..

رجعت ومازال الفريق خاملاَ  :( 


 


abPuw.1.gif

#38

النسخة النهائية من البرنامج ، ولكن توجد مشكلة بسيطة ..

وهي لو أصبحت الإحتمالات كبيرة يصبح هناك خطأ في حذف الإحتمالات المتكررة ..

وأيضاً هناك مشكلة لو كان هناك طول الإحتمال أكبر أو أصغر من 16 ، ستستمر الإحتمالات للـ16 فقط .. ولن تكمل أو تتوقف قبل هذا ..

إستمتعوا بالتجربة ..

تحياتي :happy:

Ihtmal.zip

رجعت ومازال الفريق خاملاَ  :( 


 


abPuw.1.gif

#39

أظن أن البرنامج الخاص بي لن يصلح ..

لأنه لا يجلب جميع الإحتمالات .. فيكون نصفها أو ربعها مكرر والبقية لا يجلبهم ..

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

لأنه منذ رأيت كلمة إحتمالات مباشرة إتجه نظري للعشوائية ..

تحياتي :happy:

رجعت ومازال الفريق خاملاَ  :( 


 


abPuw.1.gif

#40

السلام عليكم

انشغلتُ عن متابعة الموضوع نظرا لوفاة ابن عمي الأصغر في حادث سير, لا تنسوه من دعائكم في السجود.

بالنسبة لمحاولات الأعضاء حول الموضوع ...

اقتباس
هل يمكن إستعمال التايمر فهو الحل ..

يُمكن استخدام أي شيء تريده :)

هناك حلان للمسألة:

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

لا ننسى أيضا أن الحصول على جميع الإحتمالات سيحقق للأخ hassan9599 ما يريد و هذا أيضا من الأهداف التي نسعى إليها.

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

اقتباس
وملاحظة أعلى متغير هو Decimal ..

ولكن فقط إلى 1844674407370955161 وليس إلى 18446744073709551616

كما قلتُ لك, الحل المناسب لمثل هذه الأعداد هو الــ BigInteger, أظن أن الــ VB تُوفره (مثل الــ Java و C#).

اقتباس
يشتغل معي الكود بشكل جيد ولكن لا أعرف إذا كان بالمستوى المطلوب

ولحد الآن لازال البرنامج يبحث عن الإحتمالات و بعد مرور ربع ساعة من تشغيل البرنامج

جيد كبداية, لكن سرعة البرنامج في الوصول إلى جميع الإحتمالات مهمة جدا.

قمتُ بكتابة الكود التالي بالسي++ (اكتفيتُ بــ 10 أحرف و أرقام كبداية) :

#include <iostream>
#include <cstring>
#include <fstream>
#include <algorithm>
using namespace std;

ofstream fout("Data.txt", ios::out);

int NumberOfPermutation(char Array[], int size) {
    int NumberOfPermutation = 0;
    std::sort(Array, Array + size);
    do {
        if (Array != 0)
            for (int i = 0; i < size; i++)
                fout << Array;
        fout << endl;
        NumberOfPermutation++;
    } while (std::next_permutation(Array, Array + size));
    return NumberOfPermutation;
}

int main() {
    char arr[] = "ABCDEF1234";
    fout << "---------------" << endl << "Number of permutations = "
            << strlen(arr) << "! = " << NumberOfPermutation(arr, strlen(arr));
    return 0;
}

الكود يُخزن 3 ملايين و ستُّ مائة و ثمانٌ و عشرونَ ألفاً و ثمانُ مائة احتمال (3628800) في ملف نصي اسمه Data.txt.

طبعا, الإحتمالات لا تحوي تكرار لأي حرف و إلا لكان العدد أكبر بكثير ..

وقت تنفيذ البرنامج هو (بطيئ شيئا ما !):

Process returned 0 (0x0)   execution time : 560.977 s

Press any key to continue.

لتنفيذ البرنامج مباشرة, يُمكنك تجربة الملف التنفيذي الموجود في المرفقات.

ملاحظة : افتح الملف الناتج بــ NotePad++ لأن نوتباد الويندوز بطيئ جدا ...

اقتباس
بالنسبة للملف الذي ستخزن فيه هذا الكم الهائل من البيانات سيكون حجمه عشرات إن لم نقل المئات من الجيغابايت

نعم, هذه إحدى المشاكل التي نواجهها حاليا, حجم الملف النصي يكون كارثي جدا حتى لو وصلنا إلى جميع الإحتمالات ...!

اقتباس
ما الهدف أظن هناك اشياء اكثر نفعا (وقدرة يمكن عملها)

مالهدف من ماذا ؟ :)

إن كنت تقصد الهدف من الموضوع فأرى أن الهدف يكمن في النقاط الثلاثة التالية:

  1. إعادة نشاط القسم من خلال طرح مواضيع جيدة (مثل موضوعنا هذا), تحتوي على مسائل برمجية تستحق التفكير.
  2. خلق جو من النقاش و الحوار و تبادل الأفكار البرمجية بين الأعضاء.
  3. تقديم حل مجاني للأخ hassan9599 الذي عُرضت عليه عدة حلول بمقابل مادي :)

اقتباس
الرقم الذي وصلت له ستة عشر مليون وسبعمائة وسبعة وسبعون الفا ومئتان وستة عشر ..

شُكرا لك, تم التعديل.

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

سأجرب الكود لاحقا و أخبرك برأيي فيه.

اقتباس
أظن أن البرنامج الخاص بي لن يصلح ..

لأنه لا يجلب جميع الإحتمالات .. فيكون نصفها أو ربعها مكرر والبقية لا يجلبهم ..

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

لأنه منذ رأيت كلمة إحتمالات مباشرة إتجه نظري للعشوائية ..

جيد أنك انتبهتَ إلى هذه النقطة مبكرا :)

الترتيب مهم جدا في عملية العرض حيث يُساعدنا في معرفة العدد الصحيح للإحتمالات الممكنة (انظر البرنامج المُرفق).

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

NumberOfPermutation.rar

تم تعديل هذه المشاركة بواسطة أحمد الشنقيطي في 17 أغسطس 2012 في 03:49 — السبب: إضافة ملاحظة.

#41

إذاً سيكون برنامجي كالساعة !!

كل ثانية تزيد .. :lol: ..

اقتباس
انشغلتُ عن متابعة الموضوع نظرا لوفاة ابن عمي الأصغر في حادث سير, لا تنسوه من دعائكم في السجود.

لقد قرأت الخبر في أحد المواضيع .. لذلك لم أتسرع في أن تكون متواجداً بيننا :sad: ..

تحياتي :happy:

رجعت ومازال الفريق خاملاَ  :( 


 


abPuw.1.gif

#42
اقتباس
كما قلتُ لك, الحل المناسب لمثل هذه الأعداد هو الــ BigInteger, أظن أن الــ VB تُوفره (مثل الــ Java و C#).

سأتحقق من الموضوع وأخبرك ..

رجعت ومازال الفريق خاملاَ  :( 


 


abPuw.1.gif

#43

بالفعل BigInteger موجودة ولكن في الفريم وورك 4 ..

وأنا أعمل على الفريم وورك 3 و3.5 ..

وهذا هو الرابط :إضغط هنا ..

سأحاول تثبيت الفريم وورك 4 وإستعمال الـbiginteger ..

تحياتي :happy:

رجعت ومازال الفريق خاملاَ  :( 


 


abPuw.1.gif

#44

السلام عليكم

باستخدام خوارزمية جديدة و بالاستعانة بالدالة write الموجودة في المكتبة unistd.h يُمكننا عرض جميع الإحتمالات المطلوبة في وقت وجيز شيئا ما (الملف التنفيذي في المرفقات باسم NumberOfPermutation_1) :

#include <stdio.h>
#include <unistd.h>
#define	NB	12
char base[] = "ABCDEF0123456789";

void fonction(char tab[NB + 1], int rank) {
    int i;
    if (rank <= NB) {
        for (i = 0; base != '\0'; i++) {
            tab[rank] = base;
            fonction(tab, rank + 1);
        }
        for (i = 0; i < NB; i++)
            write(1, &tab, 1);
        write(1, "\n", 1);
    }
}

int main() {
    char tab[NB + 1];
    int i;
    for (i = 0; i < NB; i++)
        tab = base[0];
    fonction(tab, 0);
    return (0);
}

لكن بإلغاء التكرار و تطوير الخوارزمية السابقة, سيكون البرنامج أسرع بكثير (الملف التنفيذي في المرفقات باسم NumberOfPermutation_2) :

#include <stdio.h>
#define echanger(a, b)  do {int temp=(a); (a)=(b); (b)=temp;} while (0)

char *suivant(char *p, int n) {
    int i, j = n - 1, k = n - 1;
    while (k > 0 && p[k - 1] > p[k])
        k--;
    if (k != 0) {
        while (p[j] < p[k - 1])
            j--;
        echanger(p[k - 1], p[j]);
        for (i = k, j = n - 1; i < j; i++, j--)
            echanger(p, p[j]);
    }
    return k == 0 ? 0 : p;
}

int main() {
    char mot[] = "ABCDEF";
    size_t nb_lettres = (sizeof mot / sizeof *mot) - 1;
    do
        printf("%s\n", mot); while ((suivant(mot, nb_lettres)) != 0);
    return 0;
}

يُمكننا تطوير الخوارزمية السابقة لتصبح أسرع و أقل تكلفة (راجع Knuth, tome 3), الملف التنفيذي في المرفقات باسم NumberOfPermutation_3 :

#include <stdio.h>
#define echanger(a, b)  do {int temp=(a); (a)=(b); (b)=temp;} while (0)

void perm(char *t, int n, int k) {
    int i;
    if (k == n - 1)
        printf("%s\n", t);
    else
        for (i = k; i < n; i++) {
            echanger(t[k], t);
            perm(t, n, k + 1);
            echanger(t, t[k]);
        }
}

int main() {
    char t[] = "ABCDEF";
    perm(t, sizeof t / sizeof *t - 1, 0);
    return 0;
}

توجد مقالة رائعة جدا للدكتور James McCaffrey بعنوان Série de tests: Permutations de chaînes, يمكنك الإطلاع عليها من خلال الرابط التالي:

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

عوض أن نحجز مساحة كبيرة من الذاكرة تتسع لهذا الكم الهائل من الأعداد نقوم فقط بحجز مساحة صغيرة (ما يكفي لعدد واحد مكون من 16 رقم) و نحررها في كل مرة انتهينا من هذا الرقم

فكرة جيدة, أعتقد أن الكود سيكون أسرع هكذا :

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

void faire_combi(char * str, char * tmp, int len, int ind) {
    int i;
    if (ind >= len) {
        puts(tmp);
        return;
    }
    for (i = 0; i < len; i++) {
        if (str > 0) {
            char pt = str;
            str = -1;
            tmp[ind] = pt;
            faire_combi(str, tmp, len, ind + 1);
            str = pt;
        }
    }
}

void combinaisons(char * str) {
    int len = strlen(str);
    char * tmp = (char*) malloc(len + 1);
    tmp[len] = '\0';
    faire_combi(str, tmp, len, 0);
    free(tmp);
}

int main() {
    char str[] = "ABCDEF";
    combinaisons(str);
    return 0;
}

hassan9599@

خذ إحدى الخوارزميات الثلاثة السابقة, ستكفيك.

أخيرا, ما رأيكم في تحويل الموضوع إلى نقاش فى بعض خوارزميات التبديل المتقدمة مثل خوارزمية Kenneth Rosen أو Addison-Wesley.

NumberOfPermutation_1.rar

NumberOfPermutation_2.rar

NumberOfPermutation_3.rar

1
#45
أحمد الشنقيطي كتب:

أخيرا, ما رأيكم في تحويل الموضوع إلى نقاش فى بعض خوارزميات التبديل المتقدمة مثل خوارزمية Kenneth Rosen أو Addison-Wesley.

هنا نحتاج إلى موضوع جديد ...

تحياتي :happy:

رجعت ومازال الفريق خاملاَ  :( 


 


abPuw.1.gif

#46

لا مشكلة و لكن هل الأعضاء مستعدين لمناقشة الموضوع ؟

#47

Permutations صعب قليلا + تقيل عندما يكون عدد الخانات كبيرة.

#48
أحمد الشنقيطي كتب:

لا مشكلة و لكن هل الأعضاء مستعدين لمناقشة الموضوع ؟

أنا مش مستعد !! ..

خصوصاً بلغة لا أعرف إلا اسمها ..

بس إن شاء الله أول المشاركين في الموضوع ..

تحياتي :happy:

رجعت ومازال الفريق خاملاَ  :( 


 


abPuw.1.gif

#49

النقاش سيكون حول خوارزميات التبديل المتقدمة و بالتالي لا علاقة له بالسي++, يمكنك كتابة الخورازميات باللغة التي تعجبك !

أيضا, قد لا أضع الموضوع في هذا القسم إن لم أرى العدد الكافي من المشاركين, لأن المكان الأصلي لمثل هذه المواضيع هو قسم الخوارزميات.

#50
أحمد الشنقيطي كتب:

النقاش سيكون حول خوارزميات التبديل المتقدمة و بالتالي لا علاقة له بالسي++, يمكنك كتابة الخورازميات باللغة التي تعجبك !

أيضا, قد لا أضع الموضوع في هذا القسم إن لم أرى العدد الكافي من المشاركين, لأن المكان الأصلي لمثل هذه المواضيع هو قسم الخوارزميات.

إذاً فلنبدأ ..

رجعت ومازال الفريق خاملاَ  :( 


 


abPuw.1.gif

هذا الموضوع مغلق.

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