بلغتك البرمجية المفضلة - أٌكتب برنامج لحساب أكبر عدد من كلمات السر

تحية طيبة

باللغة البرمجية التي تتقنها، أُكتب برنامج يطلب من المستخدم أدخال أرقام وأحرف لإيحاد أكبر عدد من كلمات السر!

=======

مثال:

المستخدم: 123

المفروض من البرنامج أن يطبع:

123

132

213

231

312

321

=======

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

التعليقات

إذاً بلغتي المفضلة pascal

الكود

صورة

الكود يعمل في وقت جيد

نفس ال-algorithm بلغتي الثانية python :

يعمل في وقت جيد جداً أيضاً بلنسبة لغة interpreted هنا فاجأتني CPython فبحيث أنها تعمل أسرع من pypy

أما بالنسبة لل-code الذي يستخدم الكلاس itertools.permutations

فهو سريع جداً أسرع حتى من code حبيبتي ال-pascal

للامانة الععيلمية هذا المصدر الذي قرأت منه algorithm ال-backtracking :

في عملية الحيساب استعملت 8 أرقام (من 1 إلى 8) وكان هناك 8! فرضية يعني 40320

أذاكر كل أكواد (التجارب ) هنا :

في نيهية شكراً على هذا المشكل الذي نشاط عقلي قليلا

لم أجرب الكود خاصتك لضيق الوقت....

ولكن المفروض منه أن يطبع أكبر عدد من الأرقام و الأحرف أو كل منهم على حدى بدون أي مشاكل!

وشكراً :)

جهد جميل :)

طبعاً يملن أن يكون الحرف مكرر إذاً لحساب عدد الاحتللت

n ^ k

مع n هو عدد الأحرف في ال- password و-k هو عدد طول البسورد

أنت طلبت غير مكررة إذاً هي عدد ال-permutation تبع 3 caracters هي n! أو factorial of n

مع n هي عدد الكركترس

كما "إكتشف" الأخ afaki

هذه اول محاولة لي بالبايثون 

from random import sample
def possibilities(n):
    if n == 1:
        return 1
    else:
        return n * possibilities(n - 1)

word = list(input('>>> '))
res = []
count = 0
while count != possibilities(len(word)):
    x = sample(word,len(word))
    if x not in res:
        res.append(x)
        print(''.join(x))
        count += 1

إكتشفت أن عدد الاحتمالات هو فاكتوريال طول العدد فمثلاً 123 ثلاثة أعداد فاكتوريال 3 هو 6 إذاً عدد الاحتمالات هو 6 وهكذا ..

اتمنى إذا لديك اي إقتراحات لتحسين الكود أن تخبرني بها

كانك تقوم باختيار عشوائي وتضيفه لقائمة ثم تتاكد انّ هذا العنصر غير مكرر فيها؟ ياله من تعقيد خصوصا هذا السطر

    if x not in res:

هل لديك اقتراح؟

لماذا لا تمشي على كل الاحتمالات بدون استخدام فضاء عشوائي؟

عندك خطأ بالبرنامج!

الخطأ:

بالسطر الثامن:

TypeError: 'int' object is not iterable

اقترح بداية ان نحدد عد الأحتمالات، فإذا افترضنا عدد الأحرف الذي يدخلها المستخدم n، فما هو عدد الاحتمالات؟

عدد الاحتمالات هو فاكتوريال طول العدد

factorial(length(n))

احسنت

هل هناك مثيل للوظيفة factorial في لغة السي شارب

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

مثال فاكتوريال 5 = 1*2*3*4*5 = 120

الفاكتوريال عادة تنفذ باستخدام ال recursion او loop إذا لم تفهم جيداً ما هو الrecursion عليك مشاهدة هذا الفيديو

انا لا ابرمج بالسي شارب هذه بعض الامثلة الجاهزة recursion:

int Factorial(int i)
{
    if (i <= 1)
        return 1;
    return i * Factorial(i - 1);
}

loop:

int numberInt = int.Parse(factorialNumberTextBox.Text);
int result = numberInt;

for (int i = 1; i < numberInt; i++)
{
    result = result * i;
}

factorialAnswerTextBox.Text = result.ToString();

صحيح، لا بد منها!

هذا بلغة ++C

لكن على حد علمي أنه لابد من تحديد عدد الخانات (مثلاً هنا 3 ) بشكل مسبق

#include<iostream>
using namespace std;

int main ()
{
    const int size=3;
    char input[size];
    cin>>input;


    for (int i=0; i<size; i++)
      for (int j=0; j<size; j++)
        for (int q=0; q<size; q++)
          cout <<input[i]<<input[j]<<input[q]<<endl;


}

لست متأكداً إن كان هناك خوارزمية أخرى بإمكانها تلافي مشكلة تحديد الخانات مسبقاً ..!!

صحيح، يجب تحديد عدد الخانات!

برنامجك جيد، ولكنه يحتاج أن يكون الإدخال أحرف و أرقام!

حاليًا برنامجك يطبع فقط أرقام أو أحرف!

  • إضافة *

إذا كان لابد أن تحتوي كل كلمة سر على الثلاثة الأحرف معاً

يضاف هذا السطر قبل السطر الأخير (cout)

 if (input[i]!=input[j] && input[j]!=input[q] && input[i]!=input[q])

تستطيع من خلال الـــ char أن تستخدم الأحرف والأرقام والرموز ... كلها يعاملها على أنها أحرف

كمثال ادخل هذا (*a1) وسيظهر لك جميع التشكيلات الممكنة

بلغة الروبي، لكن تحتاج تحسينات بسيطة:

def permutation(list)
  if list.size == 1
    list
  else
    result = []
    list.each do |ch|
      permutation(list - [ch]).each { |l| result << [ch] + [l].flatten }
    end
    result
  end
end

p permutation([1, 2, 3])

الـ IDE الذي عندي ﻻ يدعم لغة روبي :')

عمومًا، المفروض من برنامجك أن يطبع الأرقام و الأحرف أو كل منهم على حدى بدون أي مشاكل

وشكرًا

طبعا بدون اي مشكل.

أنا أبرمج بباسكال وبيثون ولكن حلي ب-python بساطة بما أنها تقدم مكتبة قوية في stdlib

همسة : (أفضل pascal)

سطر واحد

%23file-oneliner-py

ساكتب الحل بباسكال بليعتمد على backtaracking غداً لأن مشغول حالياً

هذه تجربتي بلغة بايثون:

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

raed@u:~$ python perm.py 123 raed
123: 213 312 231 132 123 321
raed: erad reda aedr dear eadr dera rade edra daer aerd rdae read ared drae adre drea dare raed arde ader eard rdea edar erda

مثال لإيجاد حلول فريدة:

raed@u:~$ python perm.py aaaa
aaaa: aaaa

جميل، ولكن ﻻ أعلم ما المشكلة الكود ﻻ يعمل عندي! :\

هذا ما يظهر عند التنفيذ

Usage: python perm.py STRING [STRING ..]

عليك بإضافة ما تريد، يعني، إذا أردت ايجاد كل الاحتمالات لـ "mutaz" قم بكتابة التالي:

python perm.py mutaz

الكود ﻻ يعمل!

ربما السبب بالـ IDE ! :/

تستطيع إضافة مُدخلات عند تشغيل البرنامج عن طريق اعدادات Run في Ide. اسرع طريقة حاليا لتشغيله هيه من الطرفية terminal

طريقة أخرى سهلة:

ادخل على

و أضف الكود في المربع في القسم الأيسر و اضغط على Run في الأعلى. بعدها قم بكتابة

permutations('mutaz') 

في اليمين و اضغط Enter

التطبيق الخارق للحصول على كل التبديلات من الرمز اللي معاك كل التبديلات مطبوعة " فقط" على الشاشة مع سي بلاس بلاس