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

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

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

السلام عليكم

يبدو أن القسم نائم هذه الأيام, لذا بحثتُ البارحة في بقية الأقسام لعلي أجد سؤالا أو فكرة تستحق النقاش لأضعها هنا و بالتالي يستيقظ الأعضاء من هذا السبات العميق :D

فكرة السؤال الذي عثرتُ عليه جميلة جدا و هي إيجاد جميع الإحتمالات (و ليس عدد الإحتمالات) للأحرف و الأرقام الموجودة بين 000000000000 وحتى FFFFFFFFFFFF (الأحرف و الأرقام المُستخدمة هي تلك المُكونة لقاعدة الــ Hex).

لمعرفة التفاصيل : موضوع السؤال الأصلي.

تجدون في المشاركة الأخيرة مقدمة بسيطة للفكرة (إظهار جميع الإحتمالات الممكنة لــ ABCDEF, يوجد 46656 احتمال), و هذا الكود :

#include <stdio.h>#include <math.h>#include <stdlib.h>int main() {    int i, j, n = 6, p = 6;    char *Vect;    char **Liste;    FILE * File;    Vect = (char *) malloc(n * sizeof (char));    Vect = "ABCDEF";    Liste = (char **) malloc((int) pow((double) n, (double) p) * sizeof (char *));    for (i = 0; i < (int) pow((double) n, (double) p); i++) {        Liste = (char *) malloc(p * sizeof (char));    }    File = fopen("RandomFile.txt", "w");    for (i = 0; i < (int) pow((double) n, (double) p); i++) {        for (j = 0; j < p; j++) {            Liste[j] = Vect[(i / (int) pow((double) n, (double) (p - (j + 1)))) % n];            fprintf(File, "%c", Liste[j]);        }        fprintf(File, "%s", "\n");    }    free(Vect);    for (i = 0; i < (int) pow(n, p); i++) {        free(Liste);    }    free(Liste);    return 0;}

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

بانتظار إبداعاتكم.

تم تعديل هذه المشاركة بواسطة مصطفى 36a2 في 7 مارس 2014 في 16:55

#2

هل يمكن المشاركة من أقسام آخرى ؟؟

تقبل تحياتي :happy:

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


 


abPuw.1.gif

#3

مرحبا أخي bahbah :)

بالطيع, المشاركة مفتوحة للكل, لكن إن لم تستطع كتابة الكود بالسي أو بالسي++ فيمكنك كتابته على طريقة الــ Pseudo-code و حاول أن يكون قياسيا قدر الإمكان (لا تستخدم نوع بيانات خاص بلغة برمجة معينة).

بالتوفيق.

تم تعديل هذه المشاركة بواسطة أحمد الشنقيطي في 13 أغسطس 2012 في 18:54

#4

سأستخدم VB.NET ..

وإن شاء الله قدر الإمكان سيكون الكود قياسياً ...

ووصلت إلى هذه النتيجة وفيها خطأ ..

post-219398-032168800 1344876188_thumb.p

وعند الضغط مرة آخرى يصبح هكذا

post-219398-030360700 1344876213_thumb.p

طورت الفكرة ووصلت إلى هذه المرحلة

post-219398-006778400 1344876259_thumb.p

ولكن ما تزال المشكلة الثانية قيد الحل والتفكير فيها ..

تحياتي :happy:

المرفقات
1.png2.png3.png

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


 


abPuw.1.gif

#5

محاولات لا بأس بها, لكن إياك أن تستخدم إحدى دوال الــ VB.NET و تقول لي أنها معرفة مسبقا :D (أمزح فقط :happy: )

تم تعديل هذه المشاركة بواسطة أحمد الشنقيطي في 13 أغسطس 2012 في 19:53

#6

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

لقد إعتمدت في مثالي هذا على إستيراد مكتبة Text فهل ينفع هذا !! ..

Imports System.Text

....

والآن أحاول البحث عن حل للمشكلة التي أواجهها ..

تحياتي :happy:

إن شاء الله أستخدم المعرفة السابقة :lol:

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


 


abPuw.1.gif

#7

شكرا لك اخي احمد انت إنسان اصيل ربنا يبارك فيك اخي علي المساعدة

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

اولا اخواني الكرام البرنامج الذي صنعة لي صديقي صنعة ببرنامج الفيجوال بيسك

وكانت واجهة البرنامج شاشة دوس وصنعة خلال 5 دقائق لرؤية البرنامج في المرفقات

شكرا لكم جميعا عالي المساعدة

Random.rar

#8

ربنا يوفقق أخي bahbah

#9
hassan9599 كتب:

ربنا يوفقق أخي bahbah

يا الله .. ويوفقك معي ..

آخر التطورات ، إستعملت Function من صنعي ..

وهو يعتني بالخصائص القياسية وليس مختص باللغة كما أعتقد (معرفة سابقة :lol:)

post-219398-023678600 1344879888_thumb.p

تحياتي :happy:

وما تزال المشكلة الثانية قائمة في المثال الأول ،، في طريقي للحصول على حل ..

هذا هو البرنامج للتجربة ..

تحياتي :happy: ..

Ihtmal.zip

المرفقات
1.png

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


 


abPuw.1.gif

#10
اقتباس
لقد إعتمدت في مثالي هذا على إستيراد مكتبة Text فهل ينفع هذا !! ..

لا ينفع, ممنوع استيراد أسلحة برمجية من الخارج :D

اقتباس
طورت الفكرة ووصلت إلى هذه المرحلة

post-219398-006778400%201344876259.png

جيد, لكن المطلوب هو إظهار الإحتمالات المُكونة من 12 خانة فقط !!

اقتباس
آخر التطورات ، إستعملت Function من صنعي ..

فكرة الــ Function جيدة مع أنها ثانوية بعض الشيئ لأن المطلوب هو إظهار جميع الإحتمالات دفعة واحدة.

#11
اقتباس
جيد, لكن المطلوب هو إظهار الإحتمالات المُكونة من 12 خانة فقط !!

هذه المشكلة التي أواجهها !!!

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

أنا إستوردت رصاصة فقط !! .. :lol:

وهذا سيلغي المثال الأول ويجب علي العمل على المثال الثاني وهذا ينهي جميع مشاكلي ..

اقتباس
فكرة الــ Function جيدة مع أنها ثانوية بعض الشيئ لأن المطلوب هو إظهار جميع الإحتمالات دفعة واحدة.

سأعدل عليها لكي تكون دفعة واحدة فقط ..

تحياتي :happy:

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


 


abPuw.1.gif

#12

أخي أحمد ممكن أرى نتائج كودك ؟؟

تعبت في التعديل على كودي ..

وعندما أرى كودك وأحاول الفهم ، أتعقد صراحة :wacko: !!

تحياتي :happy:

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


 


abPuw.1.gif

#13
اقتباس
أنا إستوردت رصاصة فقط !! .. :lol:

لكنها رصاصة من العيار الثقيل :P

اقتباس
وهذا سيلغي المثال الأول ويجب علي العمل على المثال الثاني وهذا ينهي جميع مشاكلي ..

لا بأس, استخدم هذا الحل و أرنا إياه ريثما تصل إلى الحل المطلوب :)

اقتباس
أخي أحمد ممكن أرى نتائج كودك ؟؟

تفضل : حمل الملف التنفيذي

#14

أفكر في الإعتزال .. :sleep:

واجهتني مشكلة ..

وهي عندما أقوم بعمل جملة For ..

للعدد معين من الإحتمالات تظهر عدة نتائج مكررة وهكذا ولم أصل إلى الآن للنتيجة تذكر ..

وها أنا أحاول ، وأتمنى إيجاد حل للمشكلتي ..

تحياتي :happy:

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


 


abPuw.1.gif

#15

أحم .. أحم, أعتقد أنه يجب أن نفكر في طريقة جديدة لمعالجة هذه المشكلة, لأن الطرق لكلاسيكية لا تنفع !

فكرتُ في تقسيم مهام الكود إلى جزئين, باستخدام أكثر من (Computing Element (CE عن طريق البرمجة المتوازية (parallel programming) حيث نُقسم process البرنامج الرئيسيى إلى two processes, الأول يتولى حساب الإحتمالات الممكنة لــ ABCDEF و الثاني يتولى حساب الإحتمالات الممكنة لــ 0123456789 و في الأخير نخلط الإحتمالات السابقة لنحصل على الإحتمالات الكلية ..

لكن ما لبثتُ أفكر في الأمر حتى عرفتُ أنه من المستحيل إنجازه بهذه الطريقة !! ..

قد تسأل مالسبب ؟؟

أقول لك : السبب في غاية البساطة ..

.. هل تعرف كم يوجد من احتمال بين 000000000000 و FFFFFFFFFFFF ؟؟

يوجد

mimetex.cgi?16^{16}
احتمال, أي ما يُعادل:

18446744073709551616

و بالتالي ظهرت مشكلة جديدة في حل السؤال بالسي++ و هي : التعامل مع الــ BigInteger !!

أيضا, هناك سؤال آخر مهم : ما هو نوع البيانات المناسب لتخزين مثل هذا الكم الهائل من البيانات ؟؟

لا تحزنوا .. يبدوا أن السؤال يحتاج إلى تحريك الجمجمة :D

#16

بالرجوع إلى دورتي السابقة وجدت هذا التوضيح للمتغيرات ..

%25D8%25A7%25D9%2584%25D9%2585%25D8%25AA%25D8%25BA%25D9%258A%25D8%25B1%25D8%25A7%25D8%25AA.png

فأعتقد أنه إما Long أو Decimal ..

تحياتي :happy:

لماذا لم يشارك أي أحد في الموضوع من القسم ؟؟

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


 


abPuw.1.gif

#17

والله انا ما عارف اقول لكم اية اخواني

الف شكرا لكم علي المساعدة وإن شاء الله توصلو لحل

ربنا يوفقكم يارب ويبارك فيكم

#18
hassan9599 كتب:

والله انا ما عارف اقول لكم اية اخواني

الف شكرا لكم علي المساعدة وإن شاء الله توصلو لحل

ربنا يوفقكم يارب ويبارك فيكم

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

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


 


abPuw.1.gif

#19
اقتباس
أعتقد أنه إما Long أو Decimal ..

في C++, القيمة العُظمى للنوع unsigned long long int حسب المعيار C99 هي :

MAXVALUE(unsigned long long int) = 2^64 - 1 = 18 446 744 073 709 551 615 //64 bits
MAXVALUE(unsigned long long int) = 2^32 - 1 = 4 294 967 295 //32 bits

لكن إن أردنا التعامل مع الــ BigInteger في السي/السي++ فيجب أن نستخدم إحدى المكتبتين :

GMP (GNU Multiple Precision Arithmetic Library)

MIRACL (Multiprecision Integer and Rational Arithmetic C/C++ Library)

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

  • أولا : يجب علينا حجز مصفوفة بطول 18446744073709551616, حتى نستطيع تخزين كل احتمال في خانة منفردة.
  • ثانيا : استخدام for تبدأ من صفر و تنتهي عند 18446744073709551616, للمرور على جميع الإحتمالات.

اقتباس
لماذا لم يشارك أي أحد في الموضوع من القسم ؟؟

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

لكن لا تقلق, فهم يُتابعونا أولا بأول !! :blush:

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

في C++, القيمة العُظمى للنوع unsigned long long int حسب المعيار C99 هي :

MAXVALUE(unsigned long long int) = 2^64 - 1 = 18 446 744 073 709 551 615 //64 bits
MAXVALUE(unsigned long long int) = 2^32 - 1 = 4 294 967 295 //32 bits

لكن إن أردنا التعامل مع الــ BigInteger في السي/السي++ فيجب أن نستخدم إحدى المكتبتين :

GMP (GNU Multiple Precision Arithmetic Library)

MIRACL (Multiprecision Integer and Rational Arithmetic C/C++ Library)

لا أعرف شئ عن الـC++

  • اقتباس
    • أولا : يجب علينا حجز مصفوفة بطول 18446744073709551616, حتى نستطيع تخزين كل احتمال في خانة منفردة.
    • ثانيا : استخدام for تبدأ من صفر و تنتهي عند 18446744073709551616, للمرور على جميع الإحتمالات.

أولاً أنا معك ، ثانياً ، قد لا أكون معك ..

فمشكلتي هي في for قد يكون الدوت نيت بطئ لدي بحيث أن يكرر الناتج عدة مرات ..

اقتباس

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

لكن لا تقلق, فهم يُتابعونا أولا بأول !! :blush:

هذه هي المشكلة ..

متابع بدون كلام ، لا فائدة منه !! ..

تحياتي :happy:

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


 


abPuw.1.gif

#21

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

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

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

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

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

post-219439-005426600 1344905703_thumb.p

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

المرفقات
SizeFile.png

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

#22

أعتقد أن الإحتمالات يجب أن لا تحتوي على رقم أو حرف مُكرر حتى يقل عددها و يُصبح منطقيا !

تُوفر مكتبة STL في C++ الدالة next_permutation, و هذا وصفها من MSDN :

L'algorithme d' next_permutation modifie l'ordre des éléments dans la plage [First, Last) à la permutation lexicographique suivante et retourne true. S'il n'y a aucun next_permutation, il positionne la séquence pour être la première permutation et retourne false.

انظر المثال:

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

void print(char *v, const int size)
{
  if (v != 0) {
    for (int i = 0; i < size; i++) {
      cout<<v;
    }
    cout<<endl;
  }
}

void permutation(char T[], int size )
{
   std::sort( T, T + size );
   do
   {
       print( T, size );
   }
   while( std::next_permutation( T, T + size ) );
}
int main(){
    char array[]= "ABCD";
    permutation(array,4);
    return 0;
}

مُخرجات الكود:

post-219439-009731800 1344908545_thumb.p

أعرف أنه يُمنع الإستعانة بمكتبات خارجية و لكنني وضعتُ المثال للإستفادة فقط :)

المرفقات
Console.png
#23
اقتباس
فمشكلتي هي في for قد يكون الدوت نيت بطئ لدي بحيث أن يكرر الناتج عدة مرات ..

نفس الخطأ وقع فيه الأخ الذي كتب البرنامج لــ hassan9599 !!

جرب البرنامج لترى النتائج :happy:

مالمشكلة التي يُواجهها مبرمجوا الــ VB مع for ؟ :blink:

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

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

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

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

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

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

post-219439-005426600 1344905703_thumb.p

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

عمل رائع بالتوفيق ..

اقتباس

نفس الخطأ وقع فيه الأخ الذي كتب البرنامج لــ hassan9599 !!

جرب البرنامج لترى النتائج

مالمشكلة التي يُواجهها مبرمجوا الــ VB مع for ؟

المشكلة هي أن لغة الـvb.net أصبحت بطئة بحيث أنها تترجم إلى اللغة الوسيطة ثم إلى لغة الآلة ..

وفي طول هذه الفترة وخصوصاً عمل الـRandom أي العشوائية يحتاج إلى وقت فتتكرر النتائج ..

تحياتي :happy:

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


 


abPuw.1.gif

#25

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

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

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

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


 


abPuw.1.gif

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

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