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

تحدي : بدون استخدام الحلقات !

بدأه مصطفى 36a2 في 5 نوفمبر 2013 · 12 رد · 646 مشاهدة · في لغة C و ++C
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم ورحمة الله وبركاته ...

بدون أن تستخدم أي نوع من الحلقات ( for ,while ,do while)  أو goto  أو حتى العودية (أصلا لن تعمل ) .. ولا أي نوع من التحكم بدفق البرنامج ..

عليك قراءة مليون رقم بالضبط من الدخل .. ثم طباعتها بشكل معكوس ... :)

ينتهي التحدي في 10/11/2013

بالتوفيق :)

1
#2

شكرا لك أخ مصطفى ..

فقط للتصحيح ...العودية تعمل ..و طالما انها مستثناة من الحل سأضع الحل هنا :

#include <cstdlib>#include <iostream>//#define MAX 1000000#define MAX 10using namespace std;int arr[MAX];int i = 0;int j = MAX - 1;void my_in(){     if(i < MAX)     {          cin >> arr;          i ++;          my_in();     }     }void my_out(){     if(j >= 0)     {          cout << arr[j] << endl;          j --;          my_out();     }     }int main(int argc, char *argv[]){   my_in();   my_out();   return EXIT_SUCCESS;}

سؤال آخر للتأكد فقط : تعتبر تعليمة if  من تعليمات التدفق بالبرنامج ؟؟ يعني لا يجوز استخدامها ؟

نتمنى من العباقرة أن لا يتبعوا الطريقة التالية في الحل  , لأني سبقتهم إليها : 

#include <cstdlib>
#include <iostream>

using namespace std;


int main(int argc, char *argv[])
{
    int a1;
    int a2;
    int a3;
    int a4;
    //.....
    //.....
    int a1000000;
    cin >> a1;
    cin >> a2;
    cin >> a3;
    cin >> a4;
    //.....
    //......
    cin >> a1000000;
    
    cout << a1000000 << endl;
    //.....
    cout << a4 << endl;
    cout << a3 << endl;
    cout << a2 << endl;

    cout << a1 << endl;
        
    
    return 0;
}

:haha:  :haha: 

1

لا إله إلا الله ... محمد رسول الله

لو كانت مشاركتي مفيدة و تريد تشجيعي على المزيد من العطاء , فضلا قم بتقييم المشاركة

المعرًف القديم : houssam11350_11350

من مواضيعي : ArabGenCode : مولد كود و إجراءات مخزنة و واجهات لجداول سيكوال سيرفر

#3

أخي حسام أهلاً بك :)

ولكن بالنسبة للعودية (ألم يحدث عندك Stack Over Flow ? ) لهذا قلت أنها لن تعمل ! على كل حال بالعودية ستضطر لاستخدام الشرط لذلك مرفوض :D

 

أما بالنسبة للكود الثاني .. تابع به وأكمله فقد اقتربت من الحل الصحيح :) ... لكن راعي أن يكون الكود أقل من 5000 بايت :)

بالتوفيق

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

أخي حسام أهلاً بك :)

ولكن بالنسبة للعودية (ألم يحدث عندك Stack Over Flow ? ) لهذا قلت أنها لن تعمل ! على كل حال بالعودية ستضطر لاستخدام الشرط لذلك مرفوض :D

 

أما بالنسبة للكود الثاني .. تابع به وأكمله فقد اقتربت من الحل الصحيح :) ... لكن راعي أن يكون الكود أقل من 5000 بايت :)

بالتوفيق

بالنسبة للعودية , فمعك حق ... انا قمت بالتجريب من أجل 10 و ليس مليون .. 

بالنسبة للكود الثاني , أكملت به (طبعا عن طريق كود آخر يولد الكود المطلوب) و نتج حجم الكود حوالي (54 ميغابايت) (لا يمكن الاختصار لأقل من 7 ميغابايت برأيي) .... و عند ترجمته نتج خطأ (can not allocate memory)  .....

حسنا .. حسنا ... علينا التفكير باتجاه آخر على ما يبدو .... -_-  .

بانتظار محاولات باقي الاعضاء ....

لا إله إلا الله ... محمد رسول الله

لو كانت مشاركتي مفيدة و تريد تشجيعي على المزيد من العطاء , فضلا قم بتقييم المشاركة

المعرًف القديم : houssam11350_11350

من مواضيعي : ArabGenCode : مولد كود و إجراءات مخزنة و واجهات لجداول سيكوال سيرفر

#5

سأعدّل السؤال .. فعند تجريب حلّي كاد الكوبايلر أن ينفجر ..

من مرّت معه في حياته هذه الرسالة :

اقتباس
fatal error C1060: compiler is out of heap space

 

سأعدّل السؤال إلى  1000 عنصر والكود في 1000 بايت .. أعتذر للخطأ الحاصل .. :p

#6

إليك الكود بطريقتين:

 

الطريقة الأولي: بإستخدام setjmp و longjmp

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

const int loop_count = 5; //1000000;

int main()
{
	jmp_buf j;
	int i=0;
	setjmp(j);
	if (i++ < loop_count)
	{
		int q = 0;
		cin >> q;
		cout << "ID " << i << " = " << q << endl;
		longjmp(j, 0);
	}

	return 0;
}

نفس الطريقة بدون إستخدام if:

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

const int loop_count = 5; //1000000;

jmp_buf j;

// must return value to use function call in ternary expression
inline int call(int id)
{
	int q = 0;
	cin >> q;
	cout << "ID " << id << " = " << q << endl;
	longjmp(j, 0);
}

int main()
{
	int i=0;
	setjmp(j);
	(i++ < loop_count)? call(i): 0;

	return 0;
}

الطريقة الثانية: بإستخدام inline assembly

#include <iostream>
using namespace std;

const int loop_count = 5; //1000000;

int main()
{
	int id  = 0;
	int cnt = loop_count;

KEEP:
	++id;
	--cnt;
	int q = 0;
	cin >> q;
	cout << "ID " << id << " = " << q << endl;

	__asm
	{
		cmp cnt, 0
		je DONE
		jmp KEEP
	}
DONE:

	return 0;
}

و الله ولي التوفيق

تم تعديل هذه المشاركة بواسطة C++er في 6 نوفمبر 2013 في 09:21

1

مدونتي: C++ Tips and Tricks

#7

الطرق السابقة صحيحة .. ولكن في الآولى استعملت if  وفي الثانية استعملت عامل الشرط الثلاثي .. وكلاهما من بنى التحكم بسير الكود ..

وفي كود الأسمبلي :) استعملت cmp ثم jmp  أيضا فيها تحكم بسير الكود ..

 

كما أن الأكواد السابقة جميعاً فقط لقراءة المدخلات .. يبقى الطباعة بشكل معاكس للإدخال :)

 

الفكرة التي أرغب بالوصول إليها ستعحبكم بإذن الله .. استمرّوا بالتفكير ..

بالتوفيق

#8

لا تزعل، أبدل سطر ternay operator بالتالي:

(i++ < loop_count) && (call(i), true);

و الله ولي التوفيق

تم تعديل هذه المشاركة بواسطة C++er في 6 نوفمبر 2013 في 11:31

1

مدونتي: C++ Tips and Tricks

#9

:D ما شاء الله عليك .. طريقة الدارة القصيرة ... محسوبة لك بالفعل :)

ولكن استدعاءات call  عددا كبيرا من المرات قد تسبب Stack OverFlow أليس كذلك :) على العموم 1000 مرة لن تضر ... وانتظر رؤية حلّي (مثل فكرة الأخ حسام التي ضحك عليها )

#10
اقتباس
ولكن استدعاءات call  عددا كبيرا من المرات قد تسبب Stack OverFlow أليس كذلك

لن يحدث overflow لعدم وجود إستدعاء ذاتي. يعمل حتى مع مليار مرة (إبدل الإدخال اليدوي بعداد).

 

 

و الله ولي التوفيق

مدونتي: C++ Tips and Tricks

#11

بالنسبة لحلّي فهو بسيط جدا .. كما أنه مقرمش :D

الكود التالي يقرأ عشرة آلاف قيمة من الدخل ويطبعها إلى الخرج بترتيب معكوس دون استخدام أي حلقة أو شرط أو مكتبة عدا stdio

أرجو أن يعحبكم :)

#include<cstdio>

#define e scanf("%i",&X[i++]);
#define d e e e e e e e e e e
#define c d d d d d d d d d d
#define b c c c c c c c c c c
#define a b b b b b b b b b b  

#define E printf("%i\n",X[--i]);
#define D E E E E E E E E E E
#define C D D D D D D D D D D
#define B C C C C C C C C C C
#define A B B B B B B B B B B

int main()
{
    int *X=new int[10001],i=0;
    a;
    A;
    return 0;
}

:) ما رأيكم .. دام فضلكم

هذه نسخة لعشر مدخلات لمن أحب التجريب

#include<cstdio>

#define b scanf("%i",&X[i++]);
//#define d e e e e e e e e e e
//#define c d d d d d d d d d d
//#define b c c c c c c c c c c
#define a b b b b b b b b b b  

#define B printf("%i\n",X[--i]);
//#define D E E E E E E E E E E
//#define C D D D D D D D D D D
//#define B C C C C C C C C C C
#define A B B B B B B B B B B

int main()
{
    int *X=new int[11],i=0;
    a;
    A;
    return 0;
}

ولا ننسى طبعاً ... نسخة المليون إدخال التي تفجّر الــCompiler

#include<cstdio>

#define g scanf("%i",&X[i++]);
#define f g g g g g g g g g g
#define e f f f f f f f f f f
#define d e e e e e e e e e e
#define c d d d d d d d d d d
#define b c c c c c c c c c c
#define a b b b b b b b b b b  

#define G printf("%i\n",X[--i]);
#define F G G G G G G G G G G
#define E F F F F F F F F F F
#define D E E E E E E E E E E
#define C D D D D D D D D D D
#define B C C C C C C C C C C
#define A B B B B B B B B B B  

int main()
{
    int *X=new int[1000001],i=0;
    a;
    A;
    return 0;
}

يمكنك من خلالها الحصول على خطأ : fatal error C1060: compiler is out of heap space وأشك بأنك قد تحصل عليه في حالة أخرى بدون #define

 

الحمد لله :)

شكرا للأخ حسام والأخ C++er كنت أتمنى مشاركة الأخ Snack3er وطبعاً Mr.B أيضاً .. ولكن نلتقي في مرة أخرى :)

 

والسلام عليكم ورحمة الله

4
#12

:clapping:  :clapping:  :clapping:  :clapping:  :clapping:  :clapping:  :clapping:  :clapping:

حل ذكي  ..بصراحة .

1

لا إله إلا الله ... محمد رسول الله

لو كانت مشاركتي مفيدة و تريد تشجيعي على المزيد من العطاء , فضلا قم بتقييم المشاركة

المعرًف القديم : houssam11350_11350

من مواضيعي : ArabGenCode : مولد كود و إجراءات مخزنة و واجهات لجداول سيكوال سيرفر

#13

والله فكرتك اخي مصطفى جد ذكية اعجبتني كتيرا  :thumb_up:

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

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