المساعد الشخصي الرقمي

مشاهدة النسخة كاملة : سؤال


الأمل القادم
01-08-2016, 08:32 PM
السلام عليكم ورحمة الله وبركاته

طلبي
عندي في ملف أسماء ثلاثية كثيرة على الشكل التالي
"g6Y p5D zbA a0c u5D t9k y3T PBN r7N"
أريد اظهار الاسماء المتوفرة فيها الشروط :

- الحرف الأوسط يكون رقما
الحرف الذي يليه يكون مكتوب بشكل كبير مثل r7N
------------------------
علما أن بين الاسم و الاخر هناك مسافة واحدة

ما الطريقة لاظهار تلك الاسماء :abc_022:

عبد الهادي بهاب
01-08-2016, 09:19 PM
السلام عليكم ورحمة الله وبركاته

طلبي
عندي في ملف أسماء ثلاثية كثيرة على الشكل التالي
"g6y p5d zba a0c u5d t9k y3t pbn r7n"
أريد اظهار الاسماء المتوفرة فيها الشروط :

- الحرف الأوسط يكون رقما
الحرف الذي يليه يكون مكتوب بشكل كبير مثل r7n
------------------------
علما أن بين الاسم و الاخر هناك مسافة واحدة

ما الطريقة لاظهار تلك الاسماء :abc_022:

هذا من الطلبات المتيزة و التي تستفز الاستاذ ثامر

شكرا على التميز في الطلب

و لااعدك بجازب لانني لا اعرف

لكن ساحوال العمل على الحل

عبد الهادي بهاب
01-08-2016, 09:55 PM
محاولة طويلة جدا

اولا في قائمة list......نضع الاسماء التي نريد البحث فيها
يمكن ان تستدعيها من ملف تكسي txt ....الى القائمة list


search = "";
list = {"g6y","p5s","zba","a0c","u5f","t9b","y3T","PBs","r7N"};
num = {1,2,3,4,5,6,7,8,9,0};
Maj = {"A","B","D","E","D","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"};
Min = {"a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z"};
for i, n in pairs(list) do
n2 =String.ToNumber(String.Mid(n, 2, 1));
n3 = String.Mid(n, 3, 1);
for p, numbre in pairs(num) do
for f, lettre_maj in pairs(Maj) do
if n2 == numbre and n3 == lettre_maj then
search = list[i].."\r\n"..search;
end
end
end
end

Dialog.Message("abc4web" , search);



حتى نجد حلال مختصرا .....تحياتي

عبد الهادي بهاب
01-08-2016, 11:20 PM
حل أخر مختصر و اهل فهما من الاول
search = "";
list = {"g6y","p5s","zba","a0c","u5f","t9b","y3T","PBs","r7N"};
num = "123456789";
maj = "ABDEDFGHIJKLMNOPQRSTUVWXYZ";

for i, n in pairs(list) do
if String.Find(num, String.Mid(n, 2, 1) , 1, false) ~= -1 then
if String.Find(maj, String.Mid(n, 3, 1) , 1, true) ~= -1 then
search = list[i].."\r\n"..search;
end
end
end

Dialog.Message("abc4web" , search);

ثامر أبو بلقيس
02-08-2016, 08:03 PM
حل أخر مختصر و اهل فهما من الاول
search = "";
list = {"g6y","p5s","zba","a0c","u5f","t9b","y3t","pbs","r7n"};
num = "123456789";
maj = "abdedfghijklmnopqrstuvwxyz";

for i, n in pairs(list) do
if string.find(num, string.mid(n, 2, 1) , 1, false) ~= -1 then
if string.find(maj, string.mid(n, 3, 1) , 1, true) ~= -1 then
search = list[i].."\r\n"..search;
end
end
end

dialog.message("abc4web" , search);

أخي المحترف اقلي أنت كتبت ردين وكلاهما ممتازين
ويحكم أنك تهوى التنوع في الاجابات سأكتب لك كذلك ردين في كل منهما فائدة و معلومة جديدة جيد لو تقتنص
تلك المعلومات

عبد الهادي بهاب
02-08-2016, 08:45 PM
أخي المحترف اقلي أنت كتبت ردين وكلاهما ممتازين
ويحكم أنك تهوى التنوع في الاجابات سأكتب لك كذلك ردين في كل منهما فائدة و معلومة جديدة جيد لو تقتنص
تلك المعلومات

كنت انتظر تشرفيك للموضوع

و دعني اخمن .....ستستخدم الدالة هذه

c= string.find("م", "[ب-م]", 1);

على كل سانتظر و انا مع المنتظرين

ثامر أبو بلقيس
02-08-2016, 08:48 PM
السلام عليكم ورحمة الله وبركاته
الحل الأول : باستغلال الخطأ الدارج وهو أنه لا يمكن
التعامل مع قيمة تصية رياضيا .... أي نعم لا يمكن بأي حال
من الاحوال جمع أو طرح أو قسمة أوضرب قيمتين نصيتين
فهل يمكنك جمع مثلا : "t" مع "k" هل سيعطي الكود
التالي ناتجا ؟
Dialog.Message("" , "k"+"t");
طبعا لايمكن
لكن الاوتوبلاي تعطينا إمكانية المقارنة بينهما فبرنامجنا لا يقوم بإجراءات
حسابية على الحروف لكنه يقارن بينها بطريقة حسابية
كيف ؟؟
- يعتبر أن الحروف و المكتوبة بقطع صغير من a الى غاية z مرتبة من الأكبر إلى الأصغر
مثال : الحرف b أكبر من c لماذا ؟ لان c جاءت في ترتيبها بعد الــ b
كود يؤكد ذلك :
if "a" >= "b" then
Dialog.Message("" , "لالالالا");
else
Dialog.Message("" , "نعم صحيح");
end

نفس الشيء بالنبة للحروف بقطع كبير
if "A" >= "B" then
Dialog.Message("" , "لالالالا");
else
Dialog.Message("" , "نعم صحيح");
end
و الحروف ذات القطع الصغير كلها بمعنى أي واحد منها أقل من أي حرف ذات القطع
الكبير
ومنه فأصغر حرف " قطع كبير "وهو Z أصغر من كل الحروف ذات القطع الكبير لكنه
أكبر من كل حروف القطع الصغير
اذن سيكون هذا الحرف هو الحل
ما أصغر منه "حرف مكتوب بقطع صغير" و ما أكبر منه فهو حرف مؤكد مكتوب بقطع كبير

جرب كتابة حروف في مكان a وعاين النتائج
if "a" <= "Z" then
Dialog.Message("" , "قطع كبير");
else
Dialog.Message("" , "قطع صغير");
end

الان استغلال المعلومة لكتابة الحل :

ثامر أبو بلقيس
02-08-2016, 08:51 PM
--------------------------------------------------------
n ="g6Y p5D zbA a0c u5D t9k y3T PBN r7N"
p=""
--------------------------------------------------------
for k = 1,String.Length(n),4 do
result = String.Mid(n, k, 3);
c=String.ToNumber(String.Mid(result, 2, 1))
if String.Mid(result, 3, 1)<= "Z" and (c~=0 or String.Mid(result, 2, 1) =="0" ) then
p=p..result.."\r\n"
end
end
Dialog.Message("Notice",p );

ثامر أبو بلقيس
02-08-2016, 08:55 PM
الحل الثاني : سيكون قريبا مما لمحت به لكن سنعتمد
على مقاربة : استخراج التعبير المنتظم أي ExtractRegularExpression
سأكتب لك بلغة البازيك و لك يوم للبحث عن إسقاط لها في الاوتوبلاي
title$="g6Y p5D zbA a0c u5D"
If CreateRegularExpression(0, "[a-z][1-9][A-Z]")
Dim Result$(0)
NbFound = ExtractRegularExpression(0,title$, Result$())
For k = 0 To NbFound-1
MessageRequester("RegularExpression",Result$(k), 0)
Next
EndIf

موفق :abc_138:

عبد الهادي بهاب
02-08-2016, 10:01 PM
--------------------------------------------------------
n ="g6Y p5D zbA a0c u5D t9k y3T PBN r7N"
p=""
--------------------------------------------------------
for k = 1,String.Length(n),4 do
result = String.Mid(n, k, 3);
c=String.ToNumber(String.Mid(result, 2, 1))
if String.Mid(result, 3, 1)<= "Z" and (c~=0 or String.Mid(result, 2, 1) =="0" ) then
p=p..result.."\r\n"
end
end
Dialog.Message("Notice",p );


رائع جدا .... دعني استوضح بعض اللقطات منكم فضيلة الشيخ ؟

كيف نقارن سترينح بسترينج

String.Mid(result, 3, 1)<= "Z"

يعني هذا الكود يعني انه حررف اقل ترتيبا من z في الابجدية ....اذا صح يعني نضيف شرط البداية اي اكبر او يساوي A


لماذا اضفت التاكيد الى الشرط c=0 في الكود

(c~=0 or String.Mid(result, 2, 1) =="0" )

عبد الهادي بهاب
02-08-2016, 10:06 PM
السلام عليكم ورحمة الله وبركاته
الحل الأول : باستغلال الخطأ الدارج وهو أنه لا يمكن
التعامل مع قيمة تصية رياضيا .... أي نعم لا يمكن بأي حال
من الاحوال جمع أو طرح أو قسمة أوضرب قيمتين نصيتين
فهل يمكنك جمع مثلا : "t" مع "k" هل سيعطي الكود
التالي ناتجا ؟
dialog.message("" , "k"+"t");
طبعا لايمكن
لكن الاوتوبلاي تعطينا إمكانية المقارنة بينهما فبرنامجنا لا يقوم بإجراءات
حسابية على الحروف لكنه يقارن بينها بطريقة حسابية
كيف ؟؟
- يعتبر أن الحروف و المكتوبة بقطع صغير من a الى غاية z مرتبة من الأكبر إلى الأصغر
مثال : الحرف b أكبر من c لماذا ؟ لان c جاءت في ترتيبها بعد الــ b
كود يؤكد ذلك :
if "a" >= "b" then
dialog.message("" , "لالالالا");
else
dialog.message("" , "نعم صحيح");
end

نفس الشيء بالنبة للحروف بقطع كبير
if "a" >= "b" then
dialog.message("" , "لالالالا");
else
dialog.message("" , "نعم صحيح");
end
و الحروف ذات القطع الصغير كلها بمعنى أي واحد منها أقل من أي حرف ذات القطع
الكبير
ومنه فأصغر حرف " قطع كبير "وهو z أصغر من كل الحروف ذات القطع الكبير لكنه
أكبر من كل حروف القطع الصغير
اذن سيكون هذا الحرف هو الحل
ما أصغر منه "حرف مكتوب بقطع صغير" و ما أكبر منه فهو حرف مؤكد مكتوب بقطع كبير

جرب كتابة حروف في مكان a وعاين النتائج
if "a" <= "z" then
dialog.message("" , "قطع كبير");
else
dialog.message("" , "قطع صغير");
end

الان استغلال المعلومة لكتابة الحل :


لا داع للاجابة ....الان قرات الجواب

فعلا شيء متميز جدا

ساحاول توظيفه ان امكن

ثامر أبو بلقيس
03-08-2016, 11:59 PM
الحل الثاني : سيكون قريبا مما لمحت به لكن سنعتمد
على مقاربة : استخراج التعبير المنتظم أي ExtractRegularExpression
سأكتب لك بلغة البازيك و لك يوم للبحث عن إسقاط لها في الاوتوبلاي
title$="g6Y p5D zbA a0c u5D"
If CreateRegularExpression(0, "[a-z][1-9][A-Z]")
Dim Result$(0)
NbFound = ExtractRegularExpression(0,title$, Result$())
For k = 0 To NbFound-1
MessageRequester("RegularExpression",Result$(k), 0)
Next
EndIf

موفق :abc_138:

---- يرفـــع لإجراء عملية الاسقــــاط :abc_138:

ثامر أبو بلقيس
04-08-2016, 12:12 AM
باختصار شديـــد التعليمة : string.match قوية في التعامل مع استخراج التعبير المنتظم
ولها استعمالات عدة مفيدة
n= "g6y p5s zba a0c u5f t9b P3T PBs r7N"
p=""
for k = 1,String.Length(n),4 do
result = String.Mid(n, k, 3);
c=string.match(result, '.*[1-9][A-Z]')
if c ~= nil then
p=p..c.."\r\n"
end
end
Dialog.Message("Notice",p );
بالتوفيق :abc_051:

عبد الهادي بهاب
04-08-2016, 02:43 AM
باختصار شديـــد التعليمة : string.match قوية في التعامل مع استخراج التعبير المنتظم
ولها استعمالات عدة مفيدة
n= "g6y p5s zba a0c u5f t9b P3T PBs r7N"
p=""
for k = 1,String.Length(n),4 do
result = String.Mid(n, k, 3);
c=string.match(result, '.*[1-9][A-Z]')
if c ~= nil then
p=p..c.."\r\n"
end
end
Dialog.Message("Notice",p );
بالتوفيق :abc_051:

هذه هي اللقطة .....يعني تحتصر لك كتابة مصوفتين بكل الحروف و الارقام

c=string.match(result, '.*[1-9][A-Z]')

جميل جدا....صح يجب ان اترك اكواد الاوتوبلاي و اتفرغ لاكواد lua

بارك الله فيكم و في علمكم الغزير :abc_152::abc_152: