تحية طيبة
باللغة البرمجية التي تتقنها، أُكتب برنامج يطلب من المستخدم أدخال أرقام وأحرف لإيحاد أكبر عدد من كلمات السر!
=======
مثال:
المستخدم: 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
أذاكر كل أكواد (التجارب ) هنا :
في نيهية شكراً على هذا المشكل الذي نشاط عقلي قليلا
هذه اول محاولة لي بالبايثون
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:
اقترح بداية ان نحدد عد الأحتمالات، فإذا افترضنا عدد الأحرف الذي يدخلها المستخدم n، فما هو عدد الاحتمالات؟
تنفيذها سهل الفاكتوريال ببساطة حاصل ضرب (جداء)الاعداد الصحيحة الموجبة الاصغر او تساوي الرقم المعطى
مثال فاكتوريال 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;
}
بلغة الروبي، لكن تحتاج تحسينات بسيطة:
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])
أنا أبرمج بباسكال وبيثون ولكن حلي ب-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
تستطيع إضافة مُدخلات عند تشغيل البرنامج عن طريق اعدادات Run في Ide. اسرع طريقة حاليا لتشغيله هيه من الطرفية terminal
طريقة أخرى سهلة:
ادخل على
و أضف الكود في المربع في القسم الأيسر و اضغط على Run في الأعلى. بعدها قم بكتابة
permutations('mutaz')
في اليمين و اضغط Enter
التطبيق الخارق للحصول على كل التبديلات من الرمز اللي معاك كل التبديلات مطبوعة " فقط" على الشاشة مع سي بلاس بلاس
التعليقات