Printable Version of Topic
Click here to view this topic in its original format
თბილისის ფორუმი > Web Programming > JS მარტივი includes()


Posted by: levan88 2 Jul 2020, 05:42
გამარჯობათ , მოკლედ ასეთ რამეს წავაწყდი და ცოტა გაუკრვევლობაში დამტოვა . მაქვს ფუნქცია სადაც

functi0n isPangram(sentence) {
let lowerCased = sentence.toLowerCase();
for (let char of 'abcdefghijklmnopqrstuvwxyz') {
if (!lowerCased.includes(char)) {
return false;
}
}
return true;
}
//

მოკლედ ეს ფუქცია მუშაობს ჩვეულებრივად (ყველას ასოს მთხოვს შეიცავდეს) , მაგრამ როცა ამ მონაკვეთს ვცვლი

if ( lowerCased.includes(char)) {
return true;

ანუ თუ შეიცავს , მაშინ დააბრუნოს true . რატო ხდება რომ 2 ასო მაინც რო დაემთხვას მაინც True აბრუნებს ?

ანუ იდეას მივხვდი , თუ რომელიმე ასოს მაინც შეიცავს (2 იქნება თუ ყველა) True მიბრუნებს , უბრალოდ იმას ვერ მივხვდი რატო აკეთებს ამას
მხოლოდ includes() შემთხვევაშია ასე თუ სადმე კიდე შემხვდება მსგავსი სიტუაცია

Posted by: ქარრერა 2 Jul 2020, 16:58
ტყუილად ცვლი ლოგიკას და იმიტომ.

რა ვარიანტიც გიწერია , თუ რომელიმე კონკრეტულ ასოს არ შეიცავს ადრე დაბრუნება false, და თუ გაივლის ამ ყველაფერს true დაბრუნება , სწორია. თუ არცერთხელ არ დააბრუნა ფუნქციამ ადრევე, მაშინ ყველა ასო უპოვნია.

მაგრამ შებრუნებული, რასაც ცვლი, ადრე აბრუნებს თუ რომელიმე კონკრეტული ასო იპოვნა. ასეთ შემთხვევაში ადრე დაბრუნდება a-ზე ან b-ზე ... z-ზე მაგრამ სხვებს აღარ ამოწმებს. თან თუ წინა ასოზე ჩავარდა ამას გავლენა შემდგომ პროცესზე არ აქვს , შესაბამისად თუ a-ზე გაიმაზა , შემდგომი ციკლზე char b-ს აიღებს და თუ იპოვა true-ს დააბრუნებს ადრე.

includes არაფერ შუაშია აქ.

Posted by: levan88 2 Jul 2020, 18:53
ქარრერა
მივხვდი მერე მგონი , დაახლოებით ასე იკითხე თუ ერთ ასოს მაინც შეიცავს აბრუნებს True , თუ ერთ ასოს მაინც არ შეიცავს აბრუნებს False .

უბრალოდ , რა მაინტერესებს იცი (ასე ვფიქრობ მეც ) ფუნქციის დაწერისას ჯობია

if (რაღაც ბრძანებები){
return false }
else {return true }

ვიდრე


if (რაღაც ბრძანებები){
return true }
else {return false }

Posted by: DoomDev 11 Jul 2020, 15:02
იმიტომ რომ როდესაც ლუპს აკეთებ ამომწემ თუ რომელიმე შემოსული ასოს შეიცავს მომაცემები
გიბრუნებს თრუს
ანუ ფუნქცია რეთურნს აკეთებს და აღარ გააგრჩელებს მოქმედებას
ამიტომ ერთი დაემთხვევა თუ ჩვიდმეტი არ აქვს მნიშვნელობა
დააბრუნებ True -s და გაჩერედება

როგორც ვხედავ დამწყები ხარ ჯს ში
და ჩემი პირადი რჩევა იქნება time complexity ის მიაქციე ყურადღება(იგივე big O notation ალგორითმი)
აღარ ვისაუბრებ ხსენებულ ალგორითმზე დაგუგლე wink.gif
ამ შემთხვევაში როდესაც აკეთებ ლუპს და შიგნით იყენებ ინქლუდ მეთოდს ჩეკისთვის
ხდება კიდევ ლუპი ანუ რელაურად 2 ლუპი კეთდება მანდ რეალურად O(n²) ხსენებული ალგორითმის მიხედვით
რაც შეგიძლია გააუმჯობესო და O(n) გააკეთო
რაშიც დაგვეხმარება Set ობიექტი. შესამოწმებლად შეიცავს თუ არა ჩაშვებულ ასოს სეთის has მეთოდი
რომელიც ინქლუდისგან განსხვავებით ითერეიშენს არ აკეთებს ამიტომ მივიღებთ O(n) ნოთეიშენს

ინქლუდ მეთოდის პილიფილი
CODE

if (!String.prototype.includes) {
 String.prototype.includes = functi0n(search, start) {
   'use strict';

   if (search instanceof RegExp) {
     throw TypeError('first argument must not be a RegExp');
   }
   if (start === undefined) { start = 0; }
   return this.indexOf(search, start) !== -1;
 };
}



ეს შენი ვარიანტი ინქლუდის გამოყენებით
CODE

// O(n²)
functi0n isPangram(sentence) {
 let lowerCased = sentence.toLowerCase();
 const letters = Array.from({ length: 26 }, (_, i) =>
   String.fromCharCode(65 + i).toLowerCase()
 );

 for (let char of letters) {
   if (lowerCased.includes(char)) {
     return true;
   }
 }
 return false;
}


ეს better solution სეთის გამოყენებით
CODE

// O(n)
functi0n isPangram(sentence) {
 let lowerCased = new Set(sentence.toLowerCase());
 const letters = Array.from({ length: 26 }, (_, i) =>
   String.fromCharCode(65 + i).toLowerCase()
 );

 for (let char of letters) {
   if (lowerCased.has(char)) {
     return true;
   }
 }
 return false;
}

Posted by: DoomDev 20 Mar 2021, 17:40
ედითედ
ფაქტიურად იგივე დავწერე facepalm.gif

!lowerCased.includes(char) ნიშნავს რომ მხოლოდ მაშინ გააჩერებს ლუპს თუ !false => true ყველა ჩარს არ შეიცავს

რეთარნს ლუპის გარეთ რომ აკეთებ მაგას დააბრუნებს როდესაც მორჩება ლუპს
რაც იმას ნიშნავს რომ გავიდა ბოლოში და ყველა ასოს შეიცავს
ზევით სულ სხვა რამე გიპასუხე
თუმცა შესრულების დროზე იგივე აზრზე დავრჩები

ასევე ევერი მეთოდით შეიძლება მაგ ამოცანის ამოხსნა

CODE

const isPangram = (sentence) => {
 let lowerCased = new Set(sentence.toLowerCase());
 return Array.from({ length: 26 }, (_, i) =>
   String.fromCharCode(65 + i).toLowerCase()
 ).every((letter) => lowerCased.has(letter));
};



btw თემაში შევამჩნიე ჩემი სახელი და ამოვქექე

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)