تحدي برمجي[004][سهل] : المصفوفة الاولية prime array

  • afaki

تسمى المصفوفة أولية إذا كان طولها (length) عددا أوليا وكان أي عدد أولي بداخلها يقع في فهرس (index) أولي

إذا تم إعطائك مصفوفة تحتوي على اعداد (integers) قم بإرجاع القيمة True إذا كانت أولية غير ذلك قم بإرجاع False

امثلة:

ex1 = [1,0,4,3,18]

هنا القيمة ستكون True لأن طول المصفوفة 5 و 3 عدد أولي يقع في الفهرس رقم 3

ex2 = [2112, 3224, 12334, 1244445]

هنا القيمةستكون False لأن طول المصفوفة ليس أوليا

تحقق من طول المصفوفة أولا
ex3 = []

القيمة False لأن المصفوفة فارغة

برمجة سعيدة

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

التعليقات

<?php 

// check if $number is prime return true otherwise return false
function isPrime($number)
{
    $x = str_repeat("1", $number);

    if( preg_match( '/^1?$|^(11+?)\1+$/', $x ) == 0 )
    {
        return true;
    }
    return false;
}


// check if array is prime or not
function isPreliminaryArray($array = [])
{
    // if count of array is not prime return false
    if(!isPrime(count($array))) return false;

    foreach($array as $key => $value)
    {
        // check if key is prime and his value is not prime -> return false
        if(isPrime($key) && !isPrime($value))
            return false;
    }

    // by default return true
    return true;
}


// how to use
$array = [5,5,5]; // its prime
// $array = [5,5]; // uts not prime 
echo (isPreliminaryArray($array) ? "its Prime Array" : "its not Prime Array");

هلا شرحت لنا الخوارزمية المُتبعة في تحديد العدد الأولي في التعبير القياسي:

/^1?$|^(11+?)\1+$/
mohab أضف ردا

أول جزء

^1?$|

يطابق 1 أو 0 (الرقمين غير أوليين).

ثاني جزء ^(11+?)\1+$ يحاول أولا أن يطابق أول 11 مع المتبقي من الواحدات (مرة أو أكثر، مثلا المتبقي 11 إذا العدد مطابق للتعبير القياسي، في هذه الحالة 4(1111)). إذا لم يتطابقوا يأخذ واحد زيادة (111) ويحاول أن يطابقهم مع الواحدات المتبقية (مرة أو أكثر). يكرر العملية حتى يجد أو يرجع خطأ، (لم يجد قاسم --> العدد أولي). مثلا:

العدد 5=11111
11 != 111
كرر:
111 != 11
كرر:
1111 != 1
كرر:
11111 != ""
العدد غير مطابق (أولي)

العدد 9 = 111111111
11 != 1111111
كرر:
111 == 111 111 (مطابقة مرتين)
العدد مطابق (غير أولي)

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

مجهول أضف ردا

التعبير القياسي يعمل على اكتشاف الارقام غير * الاولية* .

 preg_match( '/^1?$|^(11+?)\1+$/', $x ) == 0

0 تعني false

بداية الامر في السطر 

   $x = str_repeat("1", $number);

اعمل على استبدال العدد بالارقام واحد

مثلا ارسلت له 5 ستصبخ (11111)

بالنسبة للتعبير القياسي فهو يقوم بالتحقق ما اذا كان هذا العدد غير اولي

فـ 11 لا يعتبر اولي

111 اولي , وهكذا

التعبير القياسي /^1?$|^(11+?)\1+$/ لا يطابق 7 على سبيل المثال.

تحقق جيدا , فهو يعمل على جميع الارقام

أها، لم أنتبه أنك تحول الأرقام لواحدات أولا. حتى لو انتبهت لم أكن لأقتنع بالطريقة :)

الطريقة فعلا ذكية وملتوية، أول مرة أراها، تستخدم regex engine لتجد الأرقام غير الأولية، مع أنها ليست تعابير قياسية في الأساس.

من فهمي لطريقة عملها فإن تعقيدها O(n) . مثل الطرق الأخرى، لكن تبقى أنها مختصرة أكثر في الكتابة.

لست انا من اخترعها صديقي , دائما ما ابحث عن بعض الخدع في المدونات ما اراه جيد اقوم بتدوينه وحفظه , وهذه كانت احداها .

حتى لو انتبهت لم أكن لأقتنع بالطريقة

انا مثلك لم اقتنع حتى جربتها

نحتاج دوما لبعض الحيل ;)

php

<?php
    function check($arr){
        if(!prime(count($arr))) return false;
        foreach($arr as $index=>$value){
            if(prime($value) && !prime($index)) return false;
        }
        return true;
    }
    function prime($num){
        if($num < 2) return false;
        for($i=2;$i<=(int)sqrt($num);$i++){
            if($num%$i == 0) return false;
        }
        return true;
    }
    $arr =[1,0,4,3,18];
    echo check($arr);
?>

ملاحظة 2 عدد Prime اذا لن تعمل بمثالك بما ان 4 غير اولي

شكرا تم التعديل

كنت في عجلة من أمري لم أتحقق جيداً

المطلوب ليس كل index يكون مقابل لعدد أولي المطلوب هو أي عدد أولي يقابله index أولي

محمد عزيز الكناني أضف ردا

وكان أي عدد أولي بداخلها يقع في فهرس (index) أولي

اي لا تقصد كل هنا ؟ صحيح ؟ اسف لضعفي في اللغة -_-

الخطا مني ظننت يجب ان يتحقق الشرط لكل عناصر ال List حسب مافهمت الان يجب ان يتحقق الشرط لعنصر واحد ؟

ما أقصده هو إذا كان العدد 4 في الفهرس رقم 2 لا يجب ان تتحقق من الفهرس لأن 4 ليس أولي

مثال

if element isprime:
    if index_of_the_element isprime:
        return True
return False

++C

إذا كنا نرى الــ(1) غير أولي

bool checkNumber (int num)
{
     if (num<2)
        return false;

     for (int i=2; i<num; i++)
         if (num%i==0)
            return false;

     return true;     
}


bool checkArray (int * array,int size)
{
     if (!checkNumber(size))
        return false;

     for (int i=0; i<size; i++)
         if (checkNumber(array[i]))
            if ( ! checkNumber(i))
               return false;

     return true;
}