Back home

الفنون رقم 013

الفنون رقم 013

ARTS هو نشاط بدأه 由左耳朵耗子--陈皓: قم بإجراء سؤال واحد على الأقل عن خوارزمية leetcode كل أسبوع، واقرأ مقالًا تقنيًا واحدًا على الأقل باللغة الإنجليزية وعلق عليه، وتعلم مهارة فنية واحدة على الأقل، وشارك المقالة مع الآراء والأفكار. (أي أن الخوارزمية والمراجعة والنصائح والمشاركة يشار إليها باسم ARTS) وتستمر لمدة عام واحد على الأقل.

الفنون 013

هذه المادة 13

سؤال خوارزمية الخوارزمية

479. أكبر منتج Palindrome

الصعوبة: سهل

أوجد أكبر متناظر مكون من عددين مكونين من رقمين.

نظرًا لأن النتيجة قد تكون كبيرة جدًا، فيجب عليك إرجاع أكبر نموذج متناظر mod 1337.

مثال:

الإدخال: 2

الإخراج: 987

الشرح: 99 × 91 = 9009، 9009% 1337 = 987

ملاحظة:

نطاق n هو [1،8].

الحل

اللغة: ج

عنوان هذا السؤال سهل، وهو أصعب بالنسبة لي من الأسئلة الصعبة التي قمت بها من قبل. بعد أن رأيت العلامة سهلة لأول مرة، لم أهتم بها كثيرًا، لذلك استخدمت فقط بحث القوة الغاشمة للقيام بذلك، واجتياز جميع مجموعات الأرقام، والعثور على المنتج، ثم الحكم على ما إذا كان رقمًا متناظرًا. والنتيجة هي مهلة. لقد قمت باختباره واستغرق الأمر عدة دقائق للتشغيل عندما يكون n = 5.

int largestPalindrome(int n) {
    if (n==1) {
        return 9;
    }
    long int left = 0;
    for (long int i = 0; i < n; i++) {
        left = left*10 + 9;
    }
    long int right = left;
    long int low = pow(10,n-1);

    int maxpalindrome = 0;

    for (; left >0; left--) {
        right=left;
        for (; right >0; right--) {
            int count = left * right;
            int count1=count;
            int palindrome = 0;
            for (; count >0; ) {
                palindrome = palindrome *10 + count%10;
                count = count/10;
            }

            if (palindrome == count1) {
                if (palindrome > maxpalindrome) {
                    maxpalindrome =palindrome;
                }
            }
        }

    }
        return maxpalindrome%1337;;

لا أستطيع إلا أن أغير رأيي. أقوم أولاً بالعثور على عدد المتناظرات، ثم أقوم بتقسيمها لمعرفة ما إذا كانت تستوفي المتطلبات. النتيجة لا تزال مهلة. لقد طبعته ووجدت أن هناك عددًا كبيرًا جدًا من المتناظرات.

int largestPalindrome(int n) {
    if (n==1) {
        return 9;
    }
    long int left = 0;
    for (long int i = 0; i < n; i++) {
        left = left*10 + 9;
    }
    long int right = left;

    long int low = pow(10,n-1);
    
    for (long int i = left * right; i>0; i--) {
        long int count = i;
        long int count1=count;
        long int palindrome = 0;
        for (; count >0; ) {
            //找回文数  1234 4321
            palindrome = palindrome *10 + count%10;
            count = count/10;
            if (count<palindrome) {
                break;
            }
            
            if (count == palindrome) {
                if (count > right) {
                    break;
                }
                for (long int j = left; j>count1/right; j--) {
                    if (count1%j ==0 ) {
                        return count1 % 1337;
                    }
                  
                }
            }
        }

    }
    return 0;
}

في النهاية، ما زلت غير قادر على التوصل إلى إجابة لم تنته بعد. الإجابات أدناه هي من الآخرين. استخدمها لتتعلم منها:


long int creatPalindrome(long int num,int n){
    long int p=num*pow(10,n);
    for(int i=0;i<n;i++){
        p=p+(num/(long int)pow(10,n-i-1))*(long int)pow(10,i);
        num=num%(long int)pow(10,n-i-1);
    }
    return p;
}
int largestPalindrome(int n) {
    if(n==1){return 9;}
    long int p=pow(10,n)-1;
    long int q=p;
    long int temp=pow(10,n-1);
    long int ret=0;
    long int ret1=0;
    while(p>=temp){
        ret=creatPalindrome(p,n);
        for(int i=q;i>=temp;i--){
            ret1=ret/i;
            if(ret1>=i){break;}
            if(ret1>=temp&&ret%i==0)
            {
                return ret%1337;

            }
        }
        p--;
    }
    return NULL;
}


مراجعة

  1. هذه المقالة تأتي من https://medium.freecodecamp.org/how-i-launched-an-ios-app-with-a-teenager-926b5a65a991 تتحدث هذه المقالة بشكل أساسي عن تعليم الطفل المراهق كيفية تنفيذ تطبيق متعلق بالسباحة يعمل بنظام iOS.

    https://medium.freecodecamp.org/how-i-launched-an-ios-app-with-a-teenager-926b5a65a991

كيف أطلقت تطبيق iOS مع مراهق

كيفية الانتقال من الصفر إلى تطبيق iPhone في متجر التطبيقات كيفية الحصول على تطبيق iPhone من الصفر في متجر التطبيقات

كمتابعة لاثنين من مقالاتي السابقة، (كيفية تدريس البرمجة للمراهقين ودليل المبتدئين إلى Raspberry Pi)، أريد أن أشارك تجاربي في مساعدة المراهق على الانتقال من البرمجة في Scratch إلى إنشاء تطبيق iOS ونشره. كمتابعة لمقالتي السابقتين، (كيفية تدريس البرمجة للمراهقين ودليل المبتدئين إلى Raspberry Pi)، أود أن أشارك تجربتي في مساعدة المراهق على الانتقال من البرمجة من الصفر إلى إنشاء تطبيق iOS ونشره.

كما ذكرت في إحدى مقالاتي السابقة، لاحظت أن المراهقين لديهم رغبة قوية في القيام بشيء يبدو أكثر واقعية. لذلك، كان السؤال الطبيعي الذي طرح بشكل متكرر في العديد من فصولي الدراسية هو “هل يمكننا إنشاء تطبيق iPhone؟”. شعرت أن الوقت مناسب للطلاب لإنشاء تطبيق، وطلبت منهم طرح فكرة ما. كما ذكرت في إحدى مقالاتي السابقة، لاحظت أن المراهقين لديهم رغبة قوية في القيام بأشياء تبدو أكثر واقعية. لذا، فإن السؤال الطبيعي الذي يطرح نفسه مرارًا وتكرارًا في العديد من فصولي الدراسية هو “هل يمكننا تطوير تطبيق iPhone؟” أشعر أن الوقت قد حان للطلاب لتطوير التطبيقات، وأطلب من كل منهم أن يأتي بفكرة.

وبعد أسبوع، عاد أحد الطلاب بفكرة وبدت مثيرة للاهتمام حقًا، لذلك قررنا قضاء بعض الوقت خارج وقت الفصل العادي وبناءها معًا. وانتهى بنا الأمر بتطبيق رائع يسمى SwimGrader. وبعد أسبوع، عاد أحد الطلاب بفكرة بدت مثيرة للاهتمام حقًا، لذلك قررنا قضاء بعض الوقت خارج وقت الفصل العادي والقيام بذلك معًا. لقد انتهى بنا الأمر إلى تطوير تطبيق رائع يسمى Swim Grader.

كيف نشأت لعبة SwimGrader؟ ما هو برنامج SwimGrader؟

طالبي سباح متعطش وكان دائمًا يشعر بالفضول حول مدى جودة سباحته. إن تقييم قدرتك على السباحة ليس أمرًا واضحًا حقًا، وغالبًا ما تحتاج إلى بعض الخبراء ليخبرك بمدى براعتك. يحب طالبي السباحة ويشعر دائمًا بالفضول لمعرفة مدى جودة مهاراته في السباحة. إن تقييم قدرتك على السباحة ليس أمرًا واضحًا دائمًا، وغالبًا ما تحتاج إلى بعض الخبراء ليخبرك بمدى براعتك.

نعلم جميعًا أن تقليل وقت الدورة هو الهدف الذي يسعى إليه معظم الرياضيين، لذلك يحاول الكثير من الأشخاص القيام بذلك. ومع ذلك، من الصعب جدًا أن تعرف بالتفصيل ما يجب عليك العمل عليه لتحقيق أوقات دورات أقل. بالطبع، يمكنك فقط محاولة الركل بشكل أسرع والتدرب أكثر لاكتساب المزيد من عضلات السباحة، لكن هذه ليست الطريقة الأفضل لتحسين مهاراتك في السباحة. نعلم جميعًا أن تقليل أوقات اللفات هو هدف معظم الرياضيين، لذلك يحاول الكثيرون القيام بذلك. ومع ذلك، من الصعب جدًا معرفة ما عليك فعله لتحقيق أوقات دورات أقل. بالطبع، يمكنك تجربة ركلات أسرع والمزيد من التمارين لاكتساب المزيد من عضلات السباحة، لكن هذه ليست الطريقة الأفضل لتحسين مهاراتك في السباحة.

ومن هذا المنطلق، اعتقد طالبي أن الناس بحاجة إلى شيء يمكنه تحديد منطقة السباحة التي يجب عليهم العمل عليها بعد ذلك. لذلك، كانت فكرته الرائعة هي إنشاء تطبيق يمكنه تقييم الجوانب المختلفة لسباحتك ويخبرك بالمجال الذي يجب أن تعمل على تحسينه. من هذه النقطة، قرر طلابي أن الناس بحاجة إلى شيء ما لتحديد مجالات السباحة التي يجب عليهم دراستها بعد ذلك. لذلك، كانت فكرته الرائعة هي إنشاء تطبيق من شأنه تقييم كل جانب من جوانب السباحة الخاصة بك ويخبرك بالمجالات التي يجب عليك تحسينها.

وبعد معرفتي من خلال تجربتي بمدى صعوبة تحسين مستواي في السباحة، أعجبت حقًا بفكرته. لم أسمع به من قبل وكان له حالة استخدام محددة يمكن أن تفيد الكثير من الأشخاص. ومع ذلك، نظرًا لأن طالبي لم يقم بإنشاء تطبيق iPhone من قبل، فقد قررنا العمل عليه معًا من البداية. وبعد معرفتي من خلال تجربتي بمدى صعوبة تحسين مستواي في السباحة، أعجبت بأفكاره. لم أسمع بهذا من قبل، وله حالة استخدام محددة يمكن أن تفيد الكثير من الأشخاص. ومع ذلك، نظرًا لأن طلابي لم يطوروا تطبيق iPhone من قبل، فقد قررنا أن نبدأ من الصفر معًا.

البدء

لم أكن سباحًا تنافسيًا وأعتقد أيضًا أن ذلك سيكون تمرينًا فكريًا جيدًا، فقد طلبت من طلابي التوصل إلى تصميم التطبيق والمقاييس التي يمكننا استخدامها لتقييم السباح في التطبيق. لم أكن سباحًا تنافسيًا، واعتقدت أن هذا سيكون تمرينًا جيدًا للتفكير، فطلبت من طلابي التوصل إلى تصميمات للتطبيق، ومقاييس يمكننا استخدامها لتسجيل نقاط السباحين داخل التطبيق.انتهت هذه العملية إلى أن تكون تجربة تعليمية جيدة حقًا. لم يساعد هذا التمرين الطالب على توضيح تفاصيل المشروع فحسب، بل ساعد أيضًا في الحفاظ على توقعاتي وتوقعات طلابي. كما ذكرت في مقالاتي حول تعليم المراهقين، لدى المراهقين توقعات عالية بشأن القيام بأي شيء يتعلق بالبرمجة. لذلك، بعد الحديث عن كل التفاصيل التي يجب جمع البيانات منها، والصفحات التي سيتم إنشاؤها، وكيفية عمل كل انتقال للصفحة والمقاييس التي يجب إظهارها، كان على كل منا أن يحدد أهدافه وتوقعاته بوضوح. وانتهى الأمر بهذه العملية لتكون تجربة تعليمية رائعة. لم يساعد هذا التمرين الطلاب على فهم تفاصيل المشروع فحسب، بل سمح لي أيضًا بالتوافق مع توقعات الطلاب. كما ذكرت في مقالتي حول تعليم المراهقين، لدى المراهقين توقعات عالية للبرمجة. لذلك، بعد مناقشة البيانات التي يجب جمعها بالتفصيل، والصفحات التي يجب إنشاؤها، وكيفية عمل كل تحويل للصفحة، والمقاييس التي يجب إظهارها، أصبح لدينا جميعًا أهدافنا وتوقعاتنا واضحة.

ومعرفة المنتج النهائي الدقيق الذي كنا نخطط لتصنيعه ساعد الطالب على البقاء منخرطًا باستمرار. إن معرفة المنتج النهائي الذي نخطط لإنتاجه يساعد الطلاب على الاستمرار في المشاركة.

بالانحراف قليلاً عن الموضوع الرئيسي، غالبًا ما نتعلم أشياء لا نعرف متى سنطبقها في حياتنا. هذا يمكن أن يجعلنا نشعر وكأننا نسير في نفق طويل مظلم بدون ضوء في النهاية. غالبًا ما نتعلم أشياء لا نعرف متى سنطبقها في حياتنا. هذا يمكن أن يجعلنا نشعر وكأننا نسير في نفق طويل مظلم بدون ضوء في النهاية.

وينطبق هذا بشكل خاص عندما تكون أصغر سنًا، حيث يُطلب منك على الأرجح أن تتعلم أشياء معينة. أعتقد أن هذا يتسبب في عدم تحمس العديد من الطلاب لما يتعلمونه. لقد تعلمت أن تحديد التوقعات الصحيحة من خلال إظهار نهاية رحلة تمرين التعلم يساعد حقًا في تحفيز الطلاب ويزيد من كفاءة تمرين التعلم نفسه. وينطبق هذا بشكل خاص عندما تكون صغيرًا، حيث يُطلب منك على الأرجح أن تتعلم أشياء معينة. أعتقد أن هذا يؤدي إلى عدم اهتمام العديد من الطلاب بما يتعلمونه. لقد تعلمت أن تحديد التوقعات الصحيحة من خلال توضيح أين ستنتهي عملية التعلم هو أمر مفيد حقًا في تحفيز الطلاب وجعل عملية التعلم نفسها أكثر كفاءة.

لذا، عد إلى تصميم التطبيق ومقاييسه التي اقترحها الطالب: اقترح طالبي أولاً أن التطبيق، بشكل عام، لا ينبغي أن يضيف أي أعباء إضافية للسباح. لقد أراد إنشاء تطبيق يمكنه جمع الإحصائيات دون إعاقة أداء السباح. لذا، عد إلى تصميم ومقاييس التطبيقات التي يقترحها الطلاب: اقترح طلابي أولاً تطبيقات، بشكل عام، لا ينبغي أن تضيف أي أعباء إضافية على السباحين. لقد أراد تطوير تطبيق يجمع الإحصائيات دون التأثير على أداء السباح.

كان لدى الطالب بالفعل جهاز قياس في ذهنه لخدمة هذا الغرض بالتحديد، والذي سأشاركه في القسم التالي. بعد بعض المناقشة للتوصل إلى الحد الأدنى من المنتج القابل للتطبيق، قررنا أنه يجب علينا التركيز على جمع مقياسين محددين: معدل ضربات الرأس وسرعة الدوران. كان لدى الطالب بالفعل جهاز قياس في ذهنه لهذا الغرض، والذي سأشاركه معك في القسم التالي. بعد بعض المناقشة، توصلنا إلى الحد الأدنى من المنتج القابل للتطبيق وقررنا أنه يجب علينا التركيز على جمع مقياسين محددين: مانع الانفجار الرأسي وسرعة الدوران.

نظرًا لأن حركات الرأس هي في الغالب حركة دخيلة يمكن أن تقلل من كفاءة السباحة، إذا تمكنا ببساطة من حساب عدد حركات الرأس خلال فترة زمنية معينة، فقد اعتقدنا أنه يمكننا اقتراح تقليل حركات الرأس الدخيلة. نظرًا لأن ضربة الرأس هي حركة غريبة يمكن أن تقلل من كفاءة السباحة، إذا تمكنا ببساطة من حساب عدد ضربات الرأس على مدار فترة من الوقت، فقد اعتقدنا أنه يمكننا التوصية بتقليل حركة الرأس الخارجية.

واتفقنا أيضًا على أن المنعطفات السريعة ضرورية لتقليل أوقات اللفات. لذا، إذا تمكنا من قياس الوقت الذي يستغرقه السباح للانعطاف في نهاية المسار، فيمكننا تصنيف السباح على أساس الوقت. نحن نتفق أيضًا على أن الانعطاف السريع ضروري لتحسين أوقات اللفات. لذا، إذا تمكنا من قياس المدة التي يستغرقها السباح للالتفاف في نهاية المسار، فيمكننا تسجيل السباح بناءً على ذلك الوقت.

وبالنظر إلى هذا التصميم والفكرة، لم يكن علينا سوى البدء في تنفيذه باستخدام المستشعر المناسب. مع وضع هذا التصميم والفكرة في الاعتبار، نحتاج فقط إلى البدء في تنفيذه باستخدام أجهزة الاستشعار المناسبة.

إذًا، ما هي الأجهزة التي جعلت تطبيق SwimGrader ممكنًا؟ إذًا، ما هي الأجهزة التي جعلت تطبيق SwimGrader ممكنًا؟

على الرغم من أن أحدث أجهزة iPhone مقاومة للماء، ربما لا يرغب السباحون في المخاطرة بأخذ هواتف iPhone باهظة الثمن إلى حمام السباحة. لذا، اقترح طالبي أن نستخدم مستشعرًا من mbientlab ونضعه في علبة مقاومة للماء. في حين أن أحدث أجهزة iPhone مقاومة للماء، فقد لا يرغب السباحون في المخاطرة بأخذ جهاز iPhone باهظ الثمن إلى حمام السباحة. لذا، اقترح طلابي أن نستخدم مستشعرًا من mbientlab ونضعه في علبة مقاومة للماء.

يتيح لك هذا المستشعر جمع بيانات مختلفة من البيئة المحيطة ومن تحركاتك، حيث أنه يحتوي على مقياس تسارع وجيروسكوب ومقياس ضغط جوي ومقياس حرارة وما إلى ذلك. لديهم أيضًا بعض نماذج التعليمات البرمجية التي يمكنك استخدامها لبدء تطبيقك حتى تتمكن من جمع البيانات محل الاهتمام على الفور. يتيح لك هذا المستشعر جمع البيانات المتنوعة من البيئة وحركاتك، حيث يحتوي على مقياس التسارع والجيروسكوب والبارومتر ومقياس الحرارة والمزيد. بالإضافة إلى ذلك، لديهم بعض نماذج التعليمات البرمجية التي يمكنك استخدامها لبدء التطبيق الخاص بك لجمع البيانات محل الاهتمام على الفور.لذا، كانت فكرتنا هي وضع المستشعر داخل قبعة السباحة الخاصة به. لقد شعر أن هذا من شأنه أن يؤثر بشكل طفيف على قدرة السباحين على السباحة، وهو ما اتفق معه. اشترينا على الفور اثنين من هذه المستشعرات وبدأنا في إنشاء تطبيقنا. لن أتطرق إلى تفاصيل إنشاء تطبيق iOS بسيط متعدد الصفحات باستخدام Swift، لأنها غطت آلاف المقالات الأخرى (إليك مقالة متوسطة جيدة تعرض الكثير منها). لذا، كانت الفكرة هي وضع المستشعر داخل قبعة السباحة الخاصة به. إنه يشعر أن هذا سيكون له تأثير ضئيل على قدرة السباح على السباحة، وأنا أتفق معه. اشترينا على الفور اثنين من هذه المستشعرات وبدأنا في إنشاء تطبيقنا. لن أخوض في تفاصيل إنشاء تطبيق iOS بسيط متعدد الصفحات باستخدام Swift، حيث تمت تغطيتها في آلاف المقالات الأخرى (إليك مقالة متوسطة جيدة من بين الكثير).

نافذة تطبيق SwimGrader

نقدم لكم سويم جرايدر

لذلك، بعد ساعات من البرمجة والتعامل مع Apple للحصول على الموافقة على تطبيقنا في متجر التطبيقات، تمكنا أخيرًا من إطلاق SwimGrader. لقد كان من المفاجئ حقًا رؤية ذلك، لأنني ساعدت فقط في الإعداد الأولي للمشروع، والذي يتكون من إعداد مشروع Swift لتطبيق صفحة واحدة والمساعدة في إضافة الأزرار والحقول النصية، وتكامل الأجهزة البسيط لاسترداد البيانات من المستشعر. لذلك، بعد ساعات من البرمجة، والحصول على موافقة متجر التطبيقات من خلال Apple على تطبيقنا، أصبحنا جاهزين أخيرًا لإطلاق Swim Grader. لقد كان من المفاجئ حقًا رؤية ذلك لأنني ساعدت فقط في الإعداد الأولي للمشروع، والذي تضمن إعداد مشروع Swift لتطبيق صفحة واحدة، والمساعدة في إضافة الأزرار والحقول النصية، وتكامل الأجهزة البسيط لاسترداد البيانات من أجهزة الاستشعار.

ولإعطاء فكرة عن مدى سهولة تكامل الأجهزة، إليك مقتطف من التعليمات البرمجية لجعل مؤشر LED الموجود على المستشعر يومض باللون الأخضر. كان استرداد البيانات بسيطًا تمامًا، كما يتبين من المثال أدناه. لتوضيح مدى سهولة تكامل الأجهزة، إليك مقتطف التعليمات البرمجية الذي يجعل مؤشر LED الموجود على المستشعر يظهر باللون الأخضر. يعد استرداد البيانات أمرًا بسيطًا للغاية، كما هو موضح في المثال أدناه.

import MetaWear
import MetaWearCpp
MetaWearScanner.shared.startScan(allowDuplicates: true) { (dev) in
    // We found a MetaWear board, see if it is close by
    if dev.rssi.intValue > -50 {
        // We found a MetaWear board!
        MetaWearScanner.shared.stopScan()
        // Connect to the board we found
        dev.connectAndSetup().continueWith { t in
            if let error = t.error {
                // Sorry we couldn't connect
                print(error)
            } else {
                // We are connected! Flash its LED!
                var pattern = MblMwLedPattern()
                mbl_mw_led_load_preset_pattern(
                    &pattern, MBL_MW_LED_PRESET_PULSE)
                mbl_mw_led_stop_and_clear(device.board)
                mbl_mw_led_write_pattern(
                    device.board, &pattern, MBL_MW_LED_COLOR_GREEN)
                mbl_mw_led_play(device.board)
            }
        }
    }
}

نظرًا لعدد محدود من المساعدة، تجاوز طالبي توقعاتي كثيرًا لإنشاء خوارزمية تصنيف وواجهة رسومية. لقد استعاد بيانات X وY وZ من المستشعر وأعطى درجة لمدى تحرك الرأس في كل اتجاه. لقد بحث عبر الإنترنت عن مكتبة الرسوم البيانية على نظام التشغيل iOS وعرض ما أبلغ عنه المستشعر الخاص به. وبعد الانتهاء من تطبيقه، قام باختبار تطبيقه في حوض السباحة! وبمساعدة محدودة، تجاوز طلابي توقعاتي كثيرًا وقاموا ببناء خوارزمية تسجيل وواجهة رسومية. فهو يأخذ بيانات X وY وZ من المستشعر ويعطي درجة حركة الرأس في كل اتجاه. يقوم بالبحث في الويب عن مكتبات الرسومات على نظام التشغيل iOS ويعرض ما تبلغ عنه أجهزة الاستشعار. وبعد الانتهاء من الطلب، واصل اختبار تطبيقه في المسبح!

إنه مجهود قام به طالب في المدرسة الإعدادية، لذا لن يبدو الأمر رائعًا مثل Clash of Clans. ومع ذلك، أعتقد أنه أمر مثير للإعجاب حقًا، لأنه يأتي من طالب شاب لم يقم بإنشاء تطبيق iPhone من قبل! وبعد الانتهاء من ذلك سألني الطالب: إنه جهد المدرسة المتوسطة، لذا فهو لا يبدو رائعًا مثل Clash of Clans. ومع ذلك، اعتقدت أن هذا كان أمرًا مثيرًا للإعجاب حقًا، فقد جاء من طالب شاب لم يقم مطلقًا بتطوير تطبيق iPhone! وبعد أن فعلت ذلك سألني الطالب:

هل يمكننا إنشاء تطبيق Apple Watch لهذا الغرض؟ هل يمكننا إنشاء تطبيق Apple Watch لهذا الغرض؟

أخبرته أنه يمكنه بالتأكيد إنشاء إصدار Apple Watch من التطبيق في المستقبل، ولكن من المحتمل أن يتمكن من إنشائه دون مساعدتي :). أخبرته أنه يمكنه بالتأكيد تطوير إصدار Apple Watch من التطبيق في المستقبل، لكنه ربما لن يحتاج إلى مساعدتي للقيام بذلك :).

الأفكار النهائية

كبالغين، أعتقد أنه من الصعب حقًا الحفاظ على أفكارنا جديدة وجامحة وحديثة. لذا، أعتقد أنه من المفيد حقًا الاستماع إلى ما يقوله هؤلاء الطلاب الشباب ودعم ما يريدون القيام به بكل الطرق الممكنة. كبالغين، أعتقد أنه من الصعب حقًا أن نبقي عقولنا طازجة وجامحة وذات صلة. لذا، أعتقد أنه من المفيد جدًا الاستماع إلى هؤلاء الطلاب الشباب ودعم ما يريدون القيام به.

لا تفتح هذه الفرص البوابة لبناء منتجات جديدة ومثيرة فحسب، بل إن دعم الطلاب لعرض أفكارهم وبناءها يمنحهم أفضل التجارب التعليمية. رؤية طالبي يطلب من الناس تنزيل تطبيقه يجعلني أبتسم. آمل أن أتمكن من إنشاء تطبيق رائع يومًا ما وعرضه على أصدقائي. على الرغم من أن تلميذي سبقني بذلك :) ولا تفتح هذه الفرص الباب لتطوير منتجات جديدة ومثيرة فحسب، بل تدعم أيضًا الطلاب في التسويق وبناء أفكارهم الخاصة لمنحهم أفضل تجربة تعليمية ممكنة. يجعلني أضحك عندما أرى طالبي يطلب من الأشخاص تنزيل تطبيقه. آمل أن أتمكن يومًا ما من تطوير تطبيق رائع وعرضه على أصدقائي. على الرغم من أن طلابي سبقوني في ذلك :)

في ملاحظة جانبية، تعلمت أن إنشاء تطبيق iOS رائع أصبح أسهل من أي وقت مضى. هناك العديد من المقالات التي تساعدك على إنشاء تطبيقات لكل الأغراض الممكنة: الألعاب، وتطبيقات العرض الفردي، وتطبيقات الشبكات الاجتماعية وغيرها الكثير. بالإضافة إلى ذلك، هناك المزيد من الأجهزة التي يمكنك توصيلها بهاتفك بسهولة وتوسيع قدرات هاتفك. بالمناسبة، تعلمت أن إنشاء تطبيق iOS رائع أصبح أسهل من أي وقت مضى. هناك العديد من المقالات التي تساعدك على تطوير التطبيقات لجميع الأغراض الممكنة: الألعاب، وتطبيقات العرض الفردي، وتطبيقات الشبكات الاجتماعية، والمزيد. بالإضافة إلى ذلك، يوجد الآن المزيد من الأجهزة التي يمكنك توصيلها بسهولة بهاتفك وتوسيع وظائف هاتفك.

آمل أن أتمكن قريبًا من مشاركة تجارب إنشاء تطبيقي الخاص. أنا فقط قلقة إذا كان طلابي سيجدون تطبيقي رائعًا… آمل أن أتمكن من مشاركة تجربتي في تطوير التطبيقات قريبًا. أنا فقط قلق بشأن ما إذا كان طلابي سيعتقدون أن تطبيقي رائع أم لا…شكرا لقراءة هذا المقال! آمل أن أتمكن من إقناعك بالعمل مع طلابك أو أطفالك والبدء في إنشاء تطبيق بسيط! أنا أيضًا منفتح لسماع أفكار تطبيقاتك الرائعة. شكرا لقراءة هذا المقال! آمل أن أتمكن من إقناعك بالعمل مع طلابك أو أطفالك والبدء في إنشاء تطبيق بسيط! أود أيضًا أن أسمع أفكارك للتطبيقات الرائعة.

  1. قمت هذا الأسبوع بترجمة الجزء غير المترجم من الفصل الأول الأسبوع الماضي. تمت ترجمة الفصل الأول: https://dandan2009.github.io/2018/10/26/Instruments-chinese-translation/

نصائح

لقد واجهت هذا الأسبوع مشكلة مع NSCharacterSet، لذلك قمت بدراسة NSCharacterSet ووجدت أن وظيفة NSCharacterSet قوية جدًا.

NSCharacterSet

كائن يمثل مجموعة ثابتة من قيم أحرف Unicode لاستخدامها في عمليات البحث. كائن يمثل مجموعة ثابتة من قيم أحرف Unicode المستخدمة في عمليات البحث.

نظرة عامة

يمثل كائن NSCharacterSet مجموعة من الأحرف المتوافقة مع Unicode. تستخدم كائنات NSString وNSScanner كائنات NSCharacterSet لتجميع الأحرف معًا لعمليات البحث، حتى يتمكنوا من العثور على أي مجموعة معينة من الأحرف أثناء البحث. تعلن الفئتان العامتان للمجموعة، NSCharacterSet وNSMutableCharacterSet، عن الواجهة البرمجية لمجموعات الأحرف الثابتة والديناميكية، على التوالي. يمثل كائن NSCharacterSet مجموعة أحرف متوافقة مع Unicode (متوافقة). تستخدم كائنات NSString وNSScanner كائنات NSCharacterSet لتجميع الأحرف لعمليات البحث حتى يتمكنوا من العثور على مجموعة محددة من الأحرف أثناء عملية البحث. تعلن الفئتان العامتان للمجموعة، NSCharacterSet وNSMutableCharacterSet، عن واجهات برمجة لمجموعات الأحرف الثابتة والديناميكية على التوالي.

تتم الإشارة إلى الكائنات التي تقوم بإنشائها باستخدام هذه الفئات على أنها كائنات مجموعة أحرف (وفي حالة عدم حدوث أي ارتباك، فإنها مجرد مجموعات أحرف). نظرًا لطبيعة مجموعات الفئات، فإن كائنات مجموعة الأحرف ليست مثيلات فعلية لفئات NSCharacterSet أو NSMutableCharacterSet ولكنها إحدى فئاتها الفرعية الخاصة. على الرغم من أن فئة كائن مجموعة الأحرف خاصة، إلا أن واجهتها عامة، كما هو موضح بواسطة هذه الفئات الفائقة المجردة، NSCharacterSet وNSMutableCharacterSet. تعتمد الفئات بروتوكولات NSCopying وNSMutableCopying، مما يجعلها ملائمة لتحويل مجموعة أحرف من نوع إلى آخر. تسمى الكائنات التي تم إنشاؤها باستخدام هذه الفئات كائنات مجموعة الأحرف (فقط مجموعات الأحرف عندما لا يكون ذلك مربكًا). نظرًا لطبيعة تجميع الفئات، فإن كائن مجموعة الأحرف ليس مثيلًا فعليًا لفئة NSCharacterSet أو NSMutableCharacterSet، ولكنه مثيل لإحدى فئاتها الفرعية الخاصة. على الرغم من أن فئة كائن مجموعة الأحرف خاصة، إلا أن واجهتها عامة، ويتم الإعلان عنها بواسطة الفئات الفائقة المجردة NSCharacterSet وNSMutableCharacterSet. تعتمد فئة مجموعة الأحرف بروتوكولات NSCopying وNSMutableCopying، مما يجعلها ملائمة لتحويل نوع واحد من مجموعة الأحرف إلى نوع آخر من مجموعة الأحرف.

تعلن فئة NSCharacterSet عن الواجهة البرمجية لكائن يدير مجموعة من أحرف Unicode (راجع مواصفات مجموعة فئة NSString للحصول على معلومات حول Unicode). توفر الطريقة البدائية الرئيسية لـ NSCharacterSet، CharacterIsMember:، الأساس لجميع أساليب المثيلات الأخرى في واجهته. تحتاج الفئة الفرعية من NSCharacterSet فقط إلى تنفيذ هذه الطريقة، بالإضافة إلى mutableCopyWithZone:، للحصول على السلوك المناسب. للحصول على الأداء الأمثل، يجب أن تتجاوز الفئة الفرعية أيضًا bitmapRepresentation، والتي تعمل بخلاف ذلك عن طريق استدعاء CharacterIsMember: لكل قيمة Unicode ممكنة. تعلن فئة NSCharacterSet عن واجهة برمجة لكائن يدير مجموعة أحرف Unicode (راجع مواصفات مجموعة فئة NSString للحصول على معلومات حول Unicode). الطريقة البدائية الرئيسية لـ NSCharacterSet، CharacterIsMember: توفر الأساس لجميع أساليب المثيل في واجهته. تحتاج الفئة الفرعية من NSCharacterSet فقط إلى تنفيذ هذه الطريقة، بالإضافة إلى طريقة mutableCopyWithZone: للحصول على السلوك الصحيح. للحصول على أفضل أداء، يجب أيضًا أن تتجاوز الفئات الفرعية تمثيل الصورة النقطية، وإلا فاستدعاء CharacterIsMember: لجميع قيم Unicode الممكنة.

إن NSCharacterSet عبارة عن “جسر مجاني” مع نظيرتها الأساسية، CFCharacterSetRef. راجع خدمة التوصيل المجاني للحصول على مزيد من المعلومات حول خدمة التوصيل المجاني. إن NSCharacterSet عبارة عن “جسر مجاني” مع نظيرتها الأساسية CFCharacterSetRef. لمزيد من المعلومات حول جسر مجاني، راجع جسر مجاني.

يمكن لمجموعة NSCharacter معالجة السلاسل بسهولة

على سبيل المثال، تحديد ما إذا كانت السلسلة تبدأ برقم


NSString * string = "3dfdfsa";
unichar c = [string characterAtIndex:0];
if ([[NSCharacterSet decimalDigitCharacterSet] characterIsMember:c]) {
return YES;
} else {
return NO;
}
}

طريقتان في NSString تتعلقان بـ NSCharacterSet: // قم بتنظيف الأحرف الموجودة على طرفي السلسلة وفقًا لمجموعة الأحرف

  • (NSString *)stringByTrimmingCharactersInSet:(NSCharacterSet *)set; // قم بتقسيم السلسلة وفقًا لفاصل مجموعة الأحرف
  • (NSArray<NSString *> *)componentsSeparatedByCharactersInSet:(NSCharacterSet *)separator;

NSString *string = @“123abc123”;

string = [string stringByTrimmingCharactersInSet:[NSCharacterSet decimalDigitCharacterSet]];

NSLog(@“%@”,string);//الإخراج abc

//字符集的二进制数据,用于传输、归档、保存成文件
@property (readonly, copy) NSData *bitmapRepresentation;


//一个除了数字字符之外的所有字符的字符集
[[NSCharacterSet decimalDigitCharacterSet] invertedSet]


//判断aCharacter是否包含在字符集中
- (BOOL)characterIsMember:(unichar)aCharacter;
//功能貌似是一样的,入参是UTF-32的字符???不知道这两个方法的区别,知道的朋友不吝赐教
- (BOOL)longCharacterIsMember:(UTF32Char)theLongChar;

//判断theOtherSet是不是自身的子集
- (BOOL)isSupersetOfSet:(NSCharacterSet *)theOtherSet;


- (BOOL)hasMemberInPlane:(uint8_t)thePlane;


تشفير السلسلة:

NSString * string =  @"11 =Essential ,Coding Interview Questions + Coding Exercises!" ;
[string  stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet alphanumericCharacterSet]];

AlphanumericCharacterSet جميع الأرقام والحروف (غير حساسة لحالة الأحرف)

النتيجة بعد التشفير هي:

11%20%3DEssential%20%2CCoding%20Interview%20Questions%20%2B%20Coding%20Exercises%21

يمكنك أن ترى أن النتيجة أعلاه تقوم بترميز جميع الأحرف باستثناء جميع الأرقام والحروف.

ثم انظر إلى وظيفة invertedSet

[string stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet alphanumericCharacterSet].invertedSet]

النتيجة بعد إضافة invertedSet هي كما يلي:


%31%31 =%45%73%73%65%6E%74%69%61%6C ,%43%6F%64%69%6E%67 %49%6E%74%65%72%76%69%65%77 %51%75%65%73%74%69%6F%6E%73 + %43%6F%64%69%6E%67 %45%78%65%72%63%69%73%65%73!

يمكنك أن ترى أنه يتم تشفير الأرقام والحروف فقط.

بمعنى آخر، يمكن لـ NSCharacterSet تحديد الأحرف المراد تشفيرها بسهولة. من الممكن أيضًا استخدام characterSetWithCharactersInString للأحرف المشفرة المخصصة بالكامل

NSCharacterSet *dd = [NSCharacterSet characterSetWithCharactersInString@"^~_>+=\"#%/<>?@\\^`{|}"];
```مدونة ذات صلة: https://nshipster.cn/nscharacterset/
#### واجهات برمجة التطبيقات شائعة الاستخدام
/** مجموعة من الطرق المختصرة شائعة الاستخدام (شائعة الاستخدام، وتلبي معظم الاحتياجات) */
 (NSCharacterSet *)controlCharacterSet; // أحرف التحكم، بما في ذلك أحرف السطر الجديد (\n)، وأحرف علامة التبويب (\t)، وما إلى ذلك. ليس من الواضح ما هي.
(NSCharacterSet *)whitespaceCharacterSet; //مساحة
(NSCharacterSet *)whitespaceAndNewlineCharacterSet;// المسافات والخطوط الجديدة
(NSCharacterSet *)decimalDigitCharacterSet; //الأرقام من 0 إلى 9
(NSCharacterSet *)letterCharacterSet; // جميع الحروف
(NSCharacterSet *)lowercaseLetterCharacterSet; //أحرف صغيرة
(NSCharacterSet *)uppercaseLetterCharacterSet; // الحروف الكبيرة
(NSCharacterSet *)nonBaseCharacterSet; // غير قاعدة
(NSCharacterSet *) AlphanumericCharacterSet؛ // جميع الأرقام والحروف (الأحرف الكبيرة والصغيرة)
(NSCharacterSet *)decomposableCharacterSet; // قابل للتحلل
(NSCharacterSet *)illegalCharacterSet; //غير قانوني
(NSCharacterSet *)علامات الترقيمCharacterSet; // تشير علامات الترقيم إلى الرموز المستخدمة لفصل النص
(NSCharacterSet *)capitalizedLetterCharacterSet; // بالأحرف الكبيرة
(NSCharacterSet *)symbolCharacterSet; // أحرف الرموز، باستثناء علامات الترقيم، مثل الرموز مثل ¥ و$
(NSCharacterSet *)newlineCharacterSet NS_AVAILABLE(10_5, 2_0);// حرف السطر الجديد



/** الحصول على كائن NSCharacterSet بناءً على سلسلة محددة */
+ (NSCharacterSet *)characterSetWithCharactersInString:(NSString *)aString;

/** قيود السلسلة المعاكسة [راجع الأمثلة التالية للحصول على التفاصيل] */
@property (للقراءة فقط، نسخة) NSCharacterSet *invertedSet;

- الشخصية العضو:


وظيفة NSCharacterSet تشبه إلى حد ما الوظيفة العادية
:
https://nshipster.cn/nscharacterset/

NSString وUnicode:
https://objccn.io/issue-9-1/#peculiar-unicode-features


مدونة iOS باللغة الإنجليزية: https://nshipster.com/
النسخة الصينية المقابلة أعلاه: https://nshipster.cn/

إذا كنت في حيرة بشأن ماهية تشفير الأحرف (حتى لو كانت لديك معرفة مهنية جيدة)، فعليك اغتنام هذه الفرصة لقراءة وإعادة قراءة هذه المقالة الكلاسيكية لجويل سبولسكي: https://www.joelonsoftware.com/2003/10/08/the-absolute-minimum-every-software-developer-absolutely-positively-must-know-about-unicode-and-character-sets-no-excuses/



## شارك

1. قم أولاً بمشاركة موقع ويب يمكنك من خلاله التحقق من مكتبات الجهات الخارجية التي تستخدمها التطبيقات ذات التنزيلات الكبيرة أو التطبيقات الشائعة في App Store: https://www.appsight.io

2. اسمحوا لي بمشاركة بعض مواقع الويب الخاصة بخوارزميات التعلم، بعضها عبارة عن مواقع فيديو، وبعضها يحتوي على رسوم متحركة:

    * فيديو خوارزمي لشاب هندي يتعلم خوارزمية اللغة الإنجليزية في نفس الوقت: https://www.youtube.com/channel/UCx-kFfzekMbhODaBss-ZnsA
    
    * البرنامج التعليمي للخوارزمية: https://notes.diguage.com/mysql/#_%E6%97%B6%E9%97%B4%E5%A4%8D%E6%9D%82%E5%BA%A6
    
   * الخوارزمية الرسومية: https://visualgo.net/zh
   *
    * يمكن أن تساعدك هذه الرسوم المتحركة على فهم الخوارزمية: https://www.cs.usfca.edu/~galles/visualization/Algorithms.html
    
    * شرح متحرك للخوارزميات شائعة الاستخدام: https://www.toptal.com/developers/sorting-algorithms
    
    * هذه الرسوم المتحركة جيدة أيضًا ورائعة جدًا: http://sorting.at/

3. يوصي بدورة أخرى لقاعدة البيانات: https://15445.courses.cs.cmu.edu/fall2017/schedule.html