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

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

مغلقرائج
بدأه Snack3r في 25 يونيو 2010 · 322 رد · 21,470 مشاهدة · في اختبر قداراتك
مشاركة: واتساب X فيسبوك تيليجرام
#76

أخي namespace, هل فترة الإختبار إنتهت؟ لماذا وضعت الإجابات؟

#77
هويدي كتب:

أخي namespace, هل فترة الإختبار إنتهت؟ لماذا وضعت الإجابات؟

تنتهي الأربعاء 10,30 مساءاً بإذن الله

لم أضع أية إجابات - كل ما سبق مجرد توضيحات

حتى الرسائل الخاصة إن كان بها توضيحات - أوردتها هنا مباشرة حتى يستفيد منها الجميع

البرمجة = الرياضيات

#78

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

ثانيا ان تقبلونى مشجعة هشجعكم بين الفترة و التانية :wub:

بالتوفيق

00020309t.gif

1958_1963.gif
#79
اسراء شلبى كتب:

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

ثانيا ان تقبلونى مشجعة هشجعكم بين الفترة و التانية :wub:

بالتوفيق

اهلا ومرحباً بالمشاركين والمشجعين ومنتظري الحلول حتى يستفيدوا - لكن بالمشاركة ستكون الفائدة أكبر

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

هناك طريقة لحل الجزء الثاني بأقل من 10 أسطر - على أية حال إن كان عندكم حل أطول من ذلك اعطوني إياه ما في مشكلة - لكن حتى الآن لا حل للجزء الثاني - يمكن الذي يحل الجزء الثاني سيكون الفائز

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

تم تعديل هذه المشاركة بواسطة namespace في 29 يونيو 2010 في 19:55

البرمجة = الرياضيات

#80
namespace كتب:

اهلا ومرحباً بالمشاركين والمشجعين ومنتظري الحلول حتى يستفيدوا - لكن بالمشاركة ستكون الفائدة أكبر

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

هناك طريقة لحل الجزء الثاني بأقل من 10 أسطر - على أية حال إن كان عندكم حل أطول من ذلك اعطوني إياه ما في مشكلة - لكن حتى الآن لا حل للجزء الثاني - يمكن الذي يحل الجزء الثاني سيكون الفائز

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

هل معنى ذلك أن ما أرسلته لك خاطئ :blink:

#81

ارى فى منتدى مهم جدا جدا لا داعى لذكر اسمه

عندما يفتح نقاش مهم بين طرفين

يكون فى موضوع منفصل و ممنوع منعا باتا اضافة اى رد لاى عضو اخر

و يفتح موضوع اخر للتعليقات من قبل الاعضاء

يعنى هنا نقوم بفتح موضوع نضع فيه اللغز و النتيجة و الموضوع الاخر يكون لمثل هذة الحوارات الجانبية

بالتوفيق

00020309t.gif

1958_1963.gif
#82
أبو دحيم كتب:

هل معنى ذلك أن ما أرسلته لك خاطئ :blink:

لم يصلني منك شيء حتى الآن

أعد الإرسال إذا تكرمت

- - - - - - - - - - - - - - - - - - - - - - - - - -

تعديل : تم استلام الحل

الحل صحيح - وهناك عدد من الزملاء أجابوا على اللغز كاملاً

أشكر تفاعلكم - وبانتظار الباقين

تم تعديل هذه المشاركة بواسطة namespace في 30 يونيو 2010 في 14:22

البرمجة = الرياضيات

#83

انتهت الفترة المحددة لحل اللغز الثاني

الأعضاء الذين حلوا اللغز كاملاً بجزأيه :

1- أبو دحيم

2- هويدي

الأعضاء الذين حلوا الجزء الأول من اللغز :

3- omani

aohammed -4

مبدئياً هذا حلي للجزء الثاني - صعب ؟ !

#include<iostream>
#include<cmath>
using namespace std;

bool repeated(int n)
{
	bool a[10]={false};

	while(n>0)
	{
		if(a[n%10]) return true;

		a[n%10]=true;

		n/=10;
	}

	return false;
}

int main()
{
	int n=sqrt(999999999);

	while(repeated(n*n))
		n--;

	cout<<n*n<<endl;

	return 0;
}

كل الشكر إلى لأعضاء والمشرفين الذين شاركوا وتميزوا بحل اللغز وإلى الذين اكتفوا بالمحاولة

ومع هذا العدد القليل من المشاركات فلا أحد خاسر

جاري تقييم الحلول - والنتائج المفصلة قريباً بإذن الله

تم تعديل هذه المشاركة بواسطة namespace في 30 يونيو 2010 في 23:21

البرمجة = الرياضيات

#84

هذا كود الزميل أبو دحيم للجزء الثاني

بحيث يخزن خانات العدد في المصفوفة a ثم يبحث عن كل خانة في الخانات التي على يمينها - فإن وجدها معناه أن لدينا خانة مكررة ويرجع false

#include"iostream.h"
#include"math.h"
bool cal(int x);
int main()
{
        int i=int(sqrt(999999999));
        int f=int(sqrt(99999999));
        for(i;i>f;i--)
        {
                if(cal(i*i))
                {
                        cout<<"the maximum perfect square number is : "<<i*i<<endl;
                        break;
                }
        }
        return 0;
}

bool cal (int x)
{
        int a[9];
        for(int i=8;i>=0;i--)
        {
                a=x%10;
                x=x/10;
        }
        for(i=0;i<9;i++)
        {
                for(int j=i+1;j<9 ;j++)
                        if(a==a[j])
                                return false;
        }
        return true;
}

كود مشرفنا هويدي :

#include <stdio.h>
#include <math.h>

#define MAX_COUNT 9
#define MAX_POSSIBLE_NUMBER 999999999

int is_too_long(long);
int contain_duplicate_digits(long);

int main(void){

	long i;
	for (i=sqrt(MAX_POSSIBLE_NUMBER); i>0; i--){
		long n = i*i;
		if (is_too_long(n) && !contain_duplicate_digits(n)){
			printf("%li\n", n);
			break;
		}
	}

	return 0;
}

int is_too_long(long x){
	unsigned short count=0;
	do{
		x/= 10;
		count++;
		if (count > MAX_COUNT) return 0;	// to save processing
	}while (x > 0);	
	return count==MAX_COUNT;
}

int contain_duplicate_digits(long x){
	int arr[MAX_COUNT+1]={0};
	do{
		int mod = x%10;
		if(arr[mod] > 0) return 1;
		arr[mod]++;
		x/= 10;
	}while (x > 0);
	return 0;
}

الكود نفسه بعد الاختصار :

#include <stdio.h>
#include <math.h>

int contain_duplicate_digits(int);

int main(void){

	int i=sqrt(999999999);
	int n=i*i;

	for (i; i>0 && contain_duplicate_digits(n); i--,n=i*i);

	printf("%li\n", n);
	return 0;
}

int contain_duplicate_digits(int x){
	int arr[10]={0};
	do{
		int mod = x%10;
		if(arr[mod] > 0) return 1;
		arr[mod]++;
		x/= 10;
	}while (x > 0);
	return 0;
}

الأمر الذي يجعله مشابهاً إلى حد كبير للحل النموذجي في الرد السابق .

تم تعديل هذه المشاركة بواسطة namespace في 2 يوليو 2010 في 09:07

البرمجة = الرياضيات

#85

بالنسبة لحل الجزء الأول من اللغز - أرجو التركيز معي إذا تفضلتم : : :

فرضاً كانت هذه هي العلامات :

20 19 17 17 15 14 9 5 5 4

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

19 17 14 5 4

20 17 15 9 5

وإذا نظرنا إلى العلامات بشكل عمودي نلاحظ أن العلامات في الأسفل جميعها أكبر أو تساوي العلامات في الأعلى ، وبهذا القسمة متحيزة للفريق الثاني - ليأتي المشرف omani وما أدراك ما المشرف omani ويكتب كوداً بحيث تكون القسمة كالآتي :

19 17 14 9 4

20 17 15 5 5

العنصر في السطر السفلي مرة يكون أكبر من العنصر في السطر العلوي ومرة يكون أقل منه

كيف فعل ذلك ؟ كما قام بتعريف مصفوفة منطقية من 10 عناصر وأعطاها قيماً منطقية كالتالي :

F T T F F T T F F T

ووضع العناصر T في مجموعة والعناصر F في مجموعة أخرى ، لاحظ أن الانتقال من T إلى F والعكس يكون عند العناصر الزوجية 0 2 4 . . .

وهذا الكود :

#include<iostream>
using namespace std;

const int total=10;

void printlist(char a,bool team_student[total],int marks[total]);

void main()
{
	int marks[total],i;

	bool ct=false;
	bool team_student[total];

	//Geting the Marks from User
	cout<<"Enter the marks for("<<total <<") Students\n";

	for( i=0;i<total;i++)
		cin>>marks;

	//Deviding Teams mark to A and B
	for(i=1;i<=total;i++)
	{
		//shift between 2 teams
		if(i%2==0)
			ct=(ct==false)?true:false;

		//put the student in team ct
		team_student[i-1]=ct;
	}

	//Print the Team A Member and Marks
	cout<<"MEMBERS OF TEAM A \n";
	printlist('A',team_student,marks);

	//Print the Team B Member and Marks
	cout<<"MEMBERS OF TEAM B \n";
	printlist('B',team_student,marks);

	system("pause");
}

//Print the OutPut and Show degrees

void printlist(char t,bool team_student[total],int marks[total])
{
	int m=0;
	bool a;

	//get the Team values
	//Team A = false and B=True
	a=(t=='A')?false:true;

	for(int i =0;i<total;i++)
		if(team_student==a)
		{
			m += marks;
			cout<<"\t"<<(i+1);
		}

	cout<<"\nTotal Degree for Team ("<<t<<")="<<m<<endl<<endl;
}

وهو في الحقيقة كشف أحد حلولي للمسألة والذي كنت كتبته كالآتي ( يعطي نفس النتيجة لكنني استخدمت مصفوفة 5×2 للاختصار ) :

#include<iostream>
using namespace std;

void print(int a[])
{
	int sum=0;

	for(int k=0 ; k<5 ; k++)
	{
		cout<<a[k]<<" ";
		sum+=a[k];
	}

	cout<<"Total is : "<<sum<<endl;
}

int main()
{
	int marks[10]={4,5,5,9,14,15,17,17,19,20};

	int teams[2][5];

	int turn=0;

	for(int i=0,j=0 ; i<10 ; i++)
	{
		teams[turn][j]=marks;

		if(i%2==0) turn=1-turn; else j++;
	}

	print(teams[0]);
	print(teams[1]);

	return 0;
}

يتبع . . .

تم تعديل هذه المشاركة بواسطة namespace في 1 يوليو 2010 في 18:31

البرمجة = الرياضيات

#86

أما الزميل أبو دحيم فقد حل على هذا الأساس ، مرة تعطى الأفضلية للفريق الأول ومرة للفريق الثاني ، لكنه كتب الكود بطريقة مختلفة بحيث يكون توزيع الفريقين A و B كالتالي :

A A

A B B A

A B A A B A

A B A B B A B A

A B A B A B B A B A

لاحظ أنه يقوم بتعبئة المصفوفة من الأطراف وينتقل إلى الداخل من كلا الجانبين ، والتفسير كالتالي : مجموع العناصر على الطرفين A A يساوي تقريباً مجموع العنصرين الذين يليانهما B B حيث الزيادة من اليسار إلى اليمين يصاحبها نقصان بانتقالنا من اليمين إلى اليسار وهذا يبقي المجموع ثابتاً تقريباً ، مشكور على الفكرة الجميلة .

التحقق : بالرجوع إلى العلامات ...

20+4 = 19+5

لكن للأسف فإن الوضع لا يبقى كذلك لأن الفروقات بين العلامات ليست ثابتة ، بينما لو كانت ثابتة كالتالي :

10 9 8 7 6 5 4 3 2 1

حينها : 10+1 = 9+2 = 8+3 = 7+4 = 6+5

والكود الذي كتبه هو :

#include"iostream.h"  
int main()  
{  
        int a[10]={65,54,44,41,38,31,28,22,15,3};  
        int aa[5];  
        int ab[5];  
        for(int i=0;i<5;i++)  
        {  
                if(i==4)  
                {  
                        aa=a;  
                        ab=a[i+1];  
                        break;  
                }  
                if(!(i%2))  
                {  
                        aa=a;  
                        aa[i+1]=a[9-i];  
                }  
                else  
                {  
                        ab[i-1]=a;  
                        ab=a[9-i];  
                }  
        }  
        int x=0,y=0;  
        for(i=0;i<5;i++)  
        {  
                x+=aa;  
                y+=ab;  
        }  
        cout<<x<<"\t"<<y<<endl;  
        return 0;  
}

ثم جاء الزميل aohammed ليتحفنا بطريقة جميلة تفوقت على طريقة الزميلين السابقين ، وطريقة معالجة الأمور مختلفة تماماً ، تذكروا ما قلناه في البداية :

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

19 17 14 5 4

20 17 15 9 5

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

في البداية عمل على تقسيم الفريقين كما سبق تمهيداً لتحسين النتيجة بجملة دوران while ؛ من المعلوم أن مجموع علامات الطلاب في الفريق الثاني أكبر منه في الأول ، لذا ، وبداخل ذلك الدوران يقوم بتبديل العنصرين في الأعمدة من اليمين إلى اليسار وفي كل مرة يحسب المجموع لتقييم التغيير الذي حصل ، يخرج من الدوران عندما يصبح مجموع العناصر في الفريق الأول أكبر منه أو يساويه في الفريق الثاني . ما يميز هذا الكود عن غيره أن به قواسم مشتركة مع الكود الذي سترونه في النهاية بإذن الله والذي يعتبر عادلاً 100% ، من هذه القواسم المشتركة أنه استخدم فكرة التبديل swap يقوم بالتبديل حتى يصل إلى حالة مستقرة ، أترككم مع الكود :

#include<iostream>  
using namespace std;  
void main()  
{  
	int a[10]={1,4,7,7,9,11,15,16,17,20};  

	int a1[5];  
	int a2[5]; 

	int i1=0,
		i2=0;

	// divide the (a) array by one skip one  
	for(int i=0;i<10;i++)  
	{  
		if(i%2)  
		{  
			a1[i1]=a;  
			i1++;  
		}  
		else  
		{         
			a2[i2]=a;  
			i2++;  
		}  
	}  

	// sum the arrays  
	int sum1,sum2;  

	int end=4; 

	do  
	{  
		// Swap between the biggest  
		int t=a2[end];
		a2[end]=a1[end];
		a1[end]=t;  
		end--;

		sum1=sum2=0;  
		// Sum the arrays  
		for(int i=0;i<5;i++)  
		{
			sum1+=a1;
			sum2+=a2;
		}
	}
	while(sum2<sum1);

	sum1=sum2=0;
	// ### Printing ###
	for(i=0;i<5;i++)
	{  
		cout<<a1<<'\t'<<a2<<endl;
		sum1+=a1;
		sum2+=a2;
	}  
	cout<<'\n'<<sum1<<'\t'<<sum2<<endl;
}

تم تعديل هذه المشاركة بواسطة namespace في 2 يوليو 2010 في 01:08

البرمجة = الرياضيات

#87

ما شاء الله .. مبدع يا أبو دحيم و كمان مشرفنا الغالي هويدي و جميع المشاركين في المسابقة :wub:

أعتذر عن عدم مشاركتي في الإختبار الثاني من هذه المسابقة لأنني كنت منشغلا في تكملة الإصدار الثاني من كتاب الكافي :) و سأحاول قدر المستطاع أن أشارك معكم في الإختبار الثالث من هذه المسابقة بإذن الله :)

ننتظر إعلان الفائز في الإختبار الثاني من الأخ namespace :wink:

#88

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

كما في محاولة الزميل aohammed فقد وزع الفريقين ، العناصر الفردية في فريق ( السفلي ) والعناصر الزوجية في فريق آخر ( العلوي )

19 17 14 5 4

20 17 15 9 5

يجمع العلامات كلاً على حدة ، ويطرح علامات الفريق الزوجي من علامات الفريق الفردي ، الجواب موجباً بالطبع ، فكما أسلفنا العلامات في الأسفل أكبر منها في الأعلى ، إن كان الفارق أكبر من 1 فإننا بصدد عملية تحسين للقسمة لتكون اكثر عدلاً . .

مجموع الفريق الفردي يزيد على مجموع الفريق الزوجي بمقدار 7 ( 59 - 66 ) ، نستطيع تجاوز الفارق إذا بحثنا عن عنصر في الفريق الفردي وآخر في الفريق الزوجي الفرق بينهما 3 ( 7/2 ) ، وقمنا بتبديلهما ، سينتقل الفرق لصالح الفريق الزوجي ، وبذلك سيقل الفارق الكلي بمقدار 3*2 ويصبح 1 ( التبديل سيجري بين 14 في الفريق الأول و 17 في الفريق الثاني ) ، طبعاً هذا في أحسن الأحوال ، أحياناً أكبر فرق أقل أو يساوي 3 يمكن أن يكون 2 ، مما يجعل هذه الطريقة لا تكفي مع أنها الأفضل مقارنة مع ما تقدم . أترككم مع الكود :

#include<ctime>
#include<cstdlib>
#include<stdio.h>
#include<iostream.h>

int marks[10];

int teamA[5];
int teamB[5];

void init(int[],int, int[], int[]);
void adjust(int[],int[], int, int);
int count(int[], int);
int Howaidi();

int main()
{
        srand(time(0));

        marks[0]=rand()%10;

        for(int k=1;k<10;k++)
                marks[k]=marks[k-1]+rand()%10;

        for(int i=0;i<5;i++)
        {
                teamA=marks[2*i];
                teamB=marks[2*i+1];
        }

        cout<<Howaidi()<<endl;

        return 0;
}

void adjust(int marks_odd[],int marks_even[], int arr_size, int diff){
        void swap(int*, int*);

        int max = 0;
        int _even_index = 0, _odd_index = 0;
        int x,y;

        for (x=0; x<5;x++){     // compare every element in the `odd` array with every element in `even` array
                for (y=0; y<5;y++)
                {
                        int _diff = marks_odd[x] - marks_even[y];

                        if ( _diff > max && _diff <= diff/2) // get max diff not greater than the diff between the two counts/2
                        { 
                                max = _diff;
                                _odd_index = x;
                                _even_index = y;
                        }
                }
        }

        swap(&marks_odd[_odd_index], &marks_even[_even_index]);
}

int count(int arr[], int size)
{
        int count=0;

        for (int i=0; i<size; i++)
                count += arr;

        return count;
}

void swap(int* x, int* y)
{
        int tmp= *x;
        *x = *y;
        *y = tmp;
}

int Howaidi()
{
        int const arr_size = 10;  // supposing the original array has even numbers

        int c_even = count(teamA, arr_size/2);
        int c_odd = count(teamB, arr_size/2);

        int diff = c_odd - c_even; // c_odd should be >= c_even (as soon as the input is a sorted array)

        if (diff >1)
        {
                adjust(teamB, teamA, arr_size, diff);
        }// else, 1 is an acceptable difference

        int dif1 = count(teamB, arr_size/2) - count(teamA, arr_size/2);
        if(dif1<0) dif1=-dif1;
        return dif1;
}

تصرفت بالكود الشيء القليل بسبب ظهور أخطاء ناجمة عن اختلاف المترجمات ، من ذلك الاقتران الرئيسي الذي كتبته بحيث يعطي marks القيم بشكل عشوائي وتصاعدياً ، ثم يفصلها إلى teamA و teamB .

ملاحظة بسيطة : من الطريف أن تعديلاً بسيطا على جزء من الكود حسن الناتج بشكل ملحوظ :

if ( _diff > max && _diff <= diff/2)

يصبح :

if ( _diff > max && _diff <= diff/2+1)

:lol:

تم تعديل هذه المشاركة بواسطة namespace في 2 يوليو 2010 في 10:39

البرمجة = الرياضيات

#90
اقتباس
أما إذا تكلمنا عن الإبداع ، فاعلم أننا نتكلم عن مشرفنا هويدي ، نحن الآن بصدد حالة فريدة من نوعها من مبرمج فريد من نوعه ، أفضل المحاولات السابقة بلا منازع

مبروك يا مشرفنا الغالي .. فعلا تستحق هذا الكلام على إبداعك المتميز :wub:

ننتظر لغزك الجديد بفارغ الصبر :)

#91

لسلام عليكم

فعلا حلول رائعة و مبدعة.

للاسف لم اتمكن من المشاركة لاني حاليا مشغول جدا بالعمل .

ان شاء الله سأحاول مع التمارين اللاحقة .

ملاحظة : يوجد خطأ بسيط في هذا الجزء حيث يجب تغيير النوع int الى long


#include <math.h>

int contain_duplicate_digits(long);

int main(void){

int i=sqrt(999999999);
int n=i*i;

for (i; i>0 && contain_duplicate_digits(n); i--,n=i*i);

printf("%li\n", n);
return 0;
}

int contain_duplicate_digits(int x){
int arr[10]={0};
do{
int mod = x%10;
if(arr[mod] > 0) return 1;
arr[mod]++;
x/= 10;
}while (x > 0);
return 0;
}
 #include <stdio.h>

تم تعديل هذه المشاركة بواسطة xpero في 2 يوليو 2010 في 02:11

#92

السلام عليكم

أنا جديد هنا و هذه أول مشاركة لي

و ان شاء الله معاكم و في انتظار اللغز القادم.........

#93
xpero كتب:

ملاحظة : يوجد خطأ بسيط في هذا الجزء حيث يجب تغيير النوع int الى long

من هنا http://msdn.microsoft.com/en-us/library/s3f49ktz%28VS.80%29.aspx

يظهر أن استخدام long int أسلم من استخدام int وحدها - خصوصاً في مثالنا

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

اقتباس
ان شاء الله سأحاول مع التمارين اللاحقة .

أتمنى ذلك

TheBigBiss كتب:

السلام عليكم

أنا جديد هنا و هذه أول مشاركة لي

و ان شاء الله معاكم و في انتظار اللغز القادم ....

أهلاً ومرحباً بك زميلنا الجديد

أتمنى لك مشاركة موفقة

البرمجة = الرياضيات

#94
namespace كتب:

من هنا http://msdn.microsof...28VS.80%29.aspx

يظهر أن استخدام long int أسلم من استخدام int وحدها - خصوصاً في مثالنا

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

أتمنى لك مشاركة موفقة

العدد ليس كبيرا جدا و int كافية.

انا تحدث عن توقيع الدالة


int contain_duplicate_digits(long);

و عند عمل ال implementation تم تغيير التوقيع الى:


int contain_duplicate_digits(int x)
{
......
}

1
#95

شكرا للأستاذين أحمد المتألق و namespace و شكرا لك جميعا..

جقيقة لقد أفدتموني جدا :D

#96
xpero كتب:

و عند عمل ال implementation تم تغيير التوقيع

أها . . وصلت الفكرة - سقطت مني سهواً

لكنني لا اكتب كوداً هنا إلا بعد أن أتأكد منه - وأذكر أنه اشتغل معي

التفسير أنني عندما أعمل تراجع ctrl + z أحياناً أفعل ذلك مرتين متتاليتين سهواً

بعد أن غيرت long إلى int تراجعت عن ذلك بالخطأ - وهذا حصل معي سابقاً

أشكر ملاحظتك - تم التصحيح

تم تعديل هذه المشاركة بواسطة namespace في 2 يوليو 2010 في 09:23

البرمجة = الرياضيات

#97

لعل الفائز في هذه المسابقة أصبح معروفاً للجميع - مبارك لمشرفنا

المشرف هويدي

وقد أخبرني أنه مشغول حتى الأحد - وذلك من مصلحتي لأنه لا يزال هناك الكثير مما لم أقله

تريدون مشاهدة المقارنة بين نتائج الزملاء لعينة عشوائية من العلامات ؟ تريدون معرفة كيف حكمت على الحلول وقيمتها ؟ تريدون معرفة حلاً آخر جميلاً ؟

تريدون معرفة الحل الصحيح 100% وكيف فعلت ذلك ؟ لا يزال الحل الصحيح العادل 100% معي ، دار البعض حوله لكن سنرى ما هو . . تابعونا . .

1

البرمجة = الرياضيات

#98
اقتباس
تريدون مشاهدة المقارنة بين نتائج الزملاء لعينة عشوائية من العلامات ؟ تريدون معرفة كيف حكمت على الحلول وقيمتها ؟ تريدون معرفة حلاً آخر جميلاً ؟

تريدون معرفة الحل الصحيح 100% وكيف فعلت ذلك ؟ لا يزال الحل الصحيح العادل 100% معي ، دار البعض حوله لكن سنرى ما هو . . تابعونا . .

بانتظارك يا أستاذ :)

#99

◄ الحل النهائي ►

سنصل إلى الحل النهائي على مرحلتين :

اقتباس
فرضاً كانت هذه هي العلامات :

20 19 17 17 15 14 9 5 5 4

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

19 17 14 5 4

20 17 15 9 5

في البداية بعد الوصول إلى التوزيع السابق ، سنمر على الأعمدة بجملة دوران في كل مرة نحسب sum1 ليساوي مجموع عناصر الفريق الأول وحتى i ، و sum2 ليساوي مجموع عناصر المجموعة الثانية وحتى i ، حيث i هو متغير الدوران يأخذ القيم 1 2 3 4 ، sum1 يأخذ القيمة الابتدائية 4 و sum2 القيمة 5 ، داخل الدوران نختبر هل sum2 > sum1 ؟ إن كان كذلك فالأفضلية للفريق الثاني ، وحتى لا يستمر الوضع كذلك نستبدل قيم الأعمدة من i =1 وحتى تنتقل الأفضلية إلى الفريق الأول . ليس هناك عدد محدد من مرات الاستبدال .

في محاولة الزميل omani تم الاستبدال في الأعمدة الفردية فقط .

وفي محاولة الزميل aohammed تم حساب sum لعناصر الفريق كاملاً في كل مرة ، هنا يتم حساب sum للعناصر من 0 وحتى i فقط وعلى أساسه يتم التقييم ، أيضاً في طريقته يتم التوقف فور حصول الأفضلية للفريق الأول ، هنا يتم المرور على كل الأعمدة . ربما هذا السبب الذي جعل الفرق بين علامات الفريقين هنا نصفه في محاولة الزميل aohammed ( إلا أنه اقترب كثيراً من هذه الطريقة ) وحتى أقل من القروق في المحاولات جميعها رغم قصر الكود . للأمانة عند تعديل كود الزميل هويدي بإضافة +1 :

if ( _diff > max && _diff <= diff/2+1)

فسنحصل على نتائج أفضل من هذه الطريقة ، وهذا هو الكود :

#include<iostream>
using namespace std;

void swap(int* x, int* y) 
{ 
	int tmp = *x; 
	*x = *y; 
	*y = tmp; 
} 

int main()
{
	int marks[10]={4,5,5,9,14,15,17,17,19,20}; 

	int teamA[5];
	int teamB[5];

	for(int i=0 ; i<5 ; i++) 
	{ 
		teamA=marks[2*i]; 
		teamB=marks[2*i+1]; 
	}

	int sum1=teamA[0];
	int sum2=teamB[0];

	for(i=1 ; i<5 ; i++)
	{
		if(sum2>sum1)
			swap(&teamA,&teamB);

		sum1+=teamA;
		sum2+=teamB;
	}

	cout<<sum1<<" "<<sum2<<endl;

	return 0;
}

المشكلة هنا أنه لو وصلنا إلى العمود الرابع وكان الفرق بين sum1 و sum2 هو 2 ، وتفاجأنا في العمود الخامس والأخير بعنصرين الفرق بينهما 10 ! ما العمل ؟ سنزيد الطين بلة ، سيزداد الفرق الكلي في حين أننا نحاول إنقاصه ، ما السبب ؟

من المستحيل سد المسامات الصغيرة بمادة أكبر من المسامات نفسها ، من المستحيل التخلص من الفرق الكلي 2 باستخدام فرق أكبر منه ، فالفكرة كالآتي : المسامات الكبيرة يتم سدها حتى تصغر ، وحين تصغر نحتاج لمادة أصغر وأنعم حتى نسد المسامات الجديدة ، زتتكرر العملية حتى تختفي .

فالحل إذاً يكمن في الكود السابق نفسه ولكن بعد ترتيب الأعمدة تنازلياً من اليسار إلى اليمين حسب الفروقات بينها ، ليصبح ترتيب العناصر داخل الفريقين كالتالي :

17 14 4 19 5

17 15 5 20 9

العناصر في الفريق الواحد بقيت نفسها ، لكن ترتيبها اختلف ، فالفرق في العمود الأيسر هو 4 ( 5 - 9 ) يتناقص ويصل إلى الصفر عند العمود الأيمن ( 17 - 17 ) بعد ذلك ننفذ العملية التي في الكود السابق بحذافيرها ، وليس من طريقة تعطي نتائج أفضل منها :

#include<iostream>
using namespace std;

void swap(int* x, int* y) 
{ 
	int tmp= *x; 
	*x = *y; 
	*y = tmp; 
} 

int main()
{
	// initializing marks
	int marks[10]={4,5,5,9,14,15,17,17,19,20};

	int teamA[5];
	int teamB[5];

	// dividing marks into teamA & teamB
	for(int i=0;i<5;i++) 
	{ 
		teamA=marks[2*i]; 
		teamB=marks[2*i+1]; 
	}

	// sorting teamA & teamB according to differences
	for(int k=0;k<4;k++)
	{
		int max=0;
		int index=0;

		for(int j=k;j<5;j++)
			if((teamB[j]-teamA[j])>=max)
			{
				max=(teamB[j]-teamA[j]);
				index=j;
			}

		swap(&teamA[k],&teamA[index]);
		swap(&teamB[k],&teamB[index]);
	}

	// processing & swapping between teams A & B to reach minimum difference
	int sum1=teamA[0];
	int sum2=teamB[0];

	for(i=1;i<5;i++)
	{
		if(sum2>sum1)
			swap(&teamA,&teamB);

		sum1+=teamA;
		sum2+=teamB;
	}

	cout<<sum1<<" "<<sum2<<endl;

	return 0;
}

ترتيب الحلول حسب دقة النتائج كالتالي

Namespace with sorting

2- Howaidi modified

3- Namespace

4- Howaidi

5- Aohammed

6- Omani & AbuDaheem

تم تعديل هذه المشاركة بواسطة namespace في 3 يوليو 2010 في 15:48

البرمجة = الرياضيات

#100

ذلك كان الحل النهائي

العادل بنسبة 100% ضمن العلامات المتاحة

قد يتساءل البعض كيف حكمت على الحلول ؟ هذا أفضل من ذاك ! قبل التعديل وبعد التعديل ! في الواقع كانت العملية متعبة ، كتبت الكود التالي يعطي العلامات تصاعدياً وبشكل عشوائي ، ثم ينفذ طرق الزملاء كل كود كتبوه في اقتران باسم الشخص نفسه ، وتتكرر العملية 300 مرة تجمع الفروقات خلالها ويتم التقييم على ذلك الأساس ، الكود الذي يعطي فرقاً أقل بين علامات الفريقين خلال الـ 300 تجربة يكون الأفضل .

int main()
{
	srand(time(0));

	int dif_Howaidi=0;
	int dif_AboDaheem=0;
	int dif_Aohammed=0;
	int dif_Omani=0;
	int dif_Namespace=0;

	for(int y=0;y<300;y++)
	{
		marks[0]=rand()%10;

		for(int k=1;k<10;k++)
			marks[k]=marks[k-1]+rand()%10;

		for(int i=0;i<5;i++)
		{
			a1=teamA=marks[2*i];
			a2=teamB=marks[2*i+1];
		}

		dif_Howaidi+=Howaidi();
		dif_AboDaheem+=AboDaheem();
		dif_Aohammed+=Aohammed();
		dif_Omani+=Omani();
		dif_Namespace+=Namespace();
	}

	cout<<"dif_Howaidi = "<<dif_Howaidi<<'\n'
		<<"dif_AboDaheem = "<<dif_AboDaheem<<'\n'
		<<"dif_Aohammed = "<<dif_Aohammed<<'\n'
		<<"dif_Namespace = "<<dif_Namespace<<'\n'
		<<"dif_Omani = "<<dif_Omani<<endl;

	return 0;
}

الكود كاملاً بالمرفقات .

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

أشكر الزميل هويدي

أشكر الزميل أبو دحيم

أشكر الزميل aohammed

أشكر الزميل omani

وإلى لقاء آخر مع لغز جديد - حتى ذلك الحين أعطي المجال للزميل هويدي ليطرح لغزه يوم الأحد بإذن الله ، والسلام عليكم ورحمة الله وبركاته .

puzzle.rar

تم تعديل هذه المشاركة بواسطة namespace في 3 يوليو 2010 في 20:46

البرمجة = الرياضيات

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

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

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

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

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

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