Тема:
Параметры
Аргументы
Продвинутые строки
Функции
Строки
Условные операторы
Цели:
Найди шпиона.
Введение:
Эти странные статуи возле ворот содержат чёрную магию!
Если пройдёте через неё без защиты, вы потеряете солдат.
Посылайте только горцев которые имеют иммунитет к волшебству! Сделайте поиск по именам ваших союзников, чтобы выяснить, кто из них являются горцами.
Заметки:
Поиск .по строкам сложная работа, но разберите каждую частью шаг за шагом!
Python:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
haystack = "Hello, world!" needle = "o, w" needleIndex = 0 for i in range(len(haystack)): letter = haystack[i] # Проверяем буква в переменной letter соответствует букве в текущем индексе в needle if letter == needle[needleIndex]: # Увеличиваем индекс на единицу для следующей итерации for-цикла # Предыдущая проверка if с сравнением двух символов всё ещё значима. needleIndex += 1 # Проверка needleIndex привысил ли он длины needle. if needleIndex >= len(needle): # Так как мы прошли все needle нашей строки, мы знаем, что содержится! hero.say("Да! " + needle + " содержится в " + haystack + "!"); break else: # Сбрасываем индекс, так как подстрока не соответствует. needleIndex = 0 |
JavaScript:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
var haystack = "Hello, world!"; var needle = "o, w"; var needleIndex = 0; for(var i = 0; i < haystack.length; i++) { var letter = haystack[i]; // Проверяем буква в переменной letter соответствует букве в текущем индексе в needle if(letter === needle[needleIndex]) { // Увеличиваем индекс на единицу для следующей итерации for-цикла // Предыдущая проверка if с сравнением двух символов всё ещё значима. needleIndex += 1; // Проверка needleIndex привысил ли он длины needle. if(needleIndex >= needle.length) { // Так как мы прошли все needle нашей строки, мы знаем, что содержится! hero.say("Yep! " + needle + " is in " + haystack + "!"); break; } } else { // Сбрасываем индекс, так как подстрока не соответствует. needleIndex = 0; } } |
CoffeScript:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
haystack = "Hello, world!" needle = "o, w" needleIndex = 0 for i in [0..haystack.length-1] letter = haystack[i] # Проверяем буква в переменной letter соответствует букве в текущем индексе в needle if letter == needle[needleIndex] # Увеличиваем индекс на единицу для следующей итерации for-цикла # Предыдущая проверка if с сравнением двух символов всё ещё значима. needleIndex += 1 # Проверка needleIndex привысил ли он длины needle. if needleIndex >= needle.length # Так как мы прошли все needle нашей строки, мы знаем, что содержится! @say "Yep! " + needle + " is in " + haystack + "!" break else # Сбрасываем индекс, так как подстрока не соответствует. needleIndex = 0 @say "All ok" |
Clojure:
1 |
;; |
LUA:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
local haystack = "Hello, world!" local needle = "o, w" local needleIndex = 0 for i=1, #haystack do local letter = haystack[i] -- Проверяем буква в переменной letter соответствует букве в текущем индексе в needle if letter = needle[needleIndex] then -- Увеличиваем индекс на единицу для следующей итерации for-цикла -- Предыдущая проверка if с сравнением двух символов всё ещё значима. needleIndex = needleIndex +1 -- Проверка needleIndex привысил ли он длины needle. if needleIndex >= #needle then -- Так как мы прошли все needle нашей строки, мы знаем, что содержится! self:say("Yep! " + needle + " is in " + haystack + "!") break end else -- Сбрасываем индекс, так как подстрока не соответствует. needleIndex = 1 end end |
От себя:
Алгоритм из заметок для поиска подстроки в строке, нельзя применять в реальной жизни.
например в строке haystack = «lalala mmacla»
подстроку needle = «mac»
этот алгоритм не найдёт.
Так на восьмом шаге мы увидим символ m и счётчик needleIndex увеличиться на 1.
Следующий шаг алгоритма, мы будем сравнивать вторую «m» из массива haystack с «a» из массива needle. Они не равны и счётчик needleIndex сброситься, но повторно символ m проверяться не будет. И перейдёт к следующей букве массива haystack тоесть к «a».
Так мы пропустили «mac»
Награда:
Шпион среди нас, прохождение:
Python:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
# Вы должны победить огров # Но они исопльзуют чёрную магию! # Только солдаты горцы обладают иммунитетом. # Найди горцев. Их имена всегда содержат "mac" highlanderName = "mac" # Эта функция ищет подстроку в строке def wordInString(string, word): lenString = len(string) lenWord = len(word) # Пройди индексом (i) от 0 до (lenString - lenWord) for i in range(lenString-lenWord): # Для каждого из индеска пройдись индексом (j) до конца длины слова for j in range(lenWord): # Если [i + j] я буква строки не равна [j] й букве слова, разорви (break) цикл if string[i+j] != word[j]: break # Если [j] это последняя буква слова (j == lenWord - 1), return True if j==lenWord-1: return True # Если цикл закончился, то слова внутри строки нет. return False return False #return True # ∆ Удалите это, когда функция будет написана # Посмотрите на ваших солдат и выбирете только горцев. soldiers = hero.findFriends() for soldier in soldiers: if wordInString(soldier.id, highlanderName): hero.say(soldier.id + " be ready.") # hero.say("ATTACK!!!") |
JavaScript:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
// Вы должны победить огров // Но они исопльзуют чёрную магию! // Только солдаты горцы обладают иммунитетом. // Найди горцев. Их имена всегда содержат "mac" var highlanderName = "mac"; // Эта функция ищет подстроку в строке function wordInString(string, word) { var lenString = string.length; var lenWord = word.length; // Пройди индексом (i) от 0 до (lenString - lenWord) for (var i = 0; i<lenString - lenWord;i ++){ // Для каждого из индеска пройдись индексом (j) до конца длины слова for (var j = 0; j<lenWord; j ++){ // Если [i + j] я буква строки не равна [j] й букве слова, разорви (break) цикл if (string[i+j] != word[j]){ break; } // Если [j] это последняя буква слова (j == lenWord - 1), return True if (j == lenWord-1){ return true; } } } // Если цикл закончился, то слова внутри строки нет. return False return false; //return true; // ∆ Удалите это, когда функция будет написана } // Посмотрите на ваших солдат и выбирете только горцев. var soldiers = hero.findFriends(); for (var i = 0; i < soldiers.length; i++) { var soldier = soldiers[i]; if (wordInString(soldier.id, highlanderName)) { hero.say(soldier.id + " be ready."); } } // hero.say("ATTACK!!!"); |
CoffeScript:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
# Внутренние двери могут задержать огров на очень длительное время. # Но один из крестьян орг-шпион! # У нас есть подсказка: имя шпиона содержит букву "z" # Эта функция делает проверку содержится ли в массиве некий number: @numberInArray = (array, numb) -> # Перебрать каждый индекс строки и проверить, соответствует ли символ букве: for i in [0..array.length-1] if array[i] == numb return true return false # Эта функция должна проверять, содержит ли строка определенный символ: @letterInWord = (word, letter) -> for i in [0..word.length-1] if word[i] == letter return true return false spyLetter = "z" friends = @findFriends() for j in [0..friends.length-1] friendName = friends[j].id if @letterInWord friendName, spyLetter # Выявить шпиона! @say friendName + " is a spy!" #else # @say friendName + " is a friend."# ∆ Удалите эту строку после вызова функции letterInWord @say "All ok" |
Clojure:
1 |
;; |
LUA:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
-- Внутренние двери могут задержать огров на очень длительное время. -- Но один из крестьян орг-шпион! -- У нас есть подсказка: имя шпиона содержит букву "z" -- Эта функция делает проверку содержится ли в массиве некий number: function self.numberInArray(array, numb) for i=1, #array do if array[i] == numb then return true end end return false end -- Эта функция должна проверять, содержит ли строка определенный символ: function self.letterInWord(word, letter) -- Перебрать каждый индекс строки и проверить, соответствует ли символ букве: for i=1, #word do if word[i] == letter then return true end end return false end local spyLetter = "z" local friends = self:findFriends() for j=1, #friends do local friendName = friends[j].id if self.letterInWord(friendName, spyLetter) then -- Выявить шпиона! self:say(friendName + " is a spy!") --else --self:say(friendName + " is a friend.") -- ∆ Удалите эту строку после вызова функции letterInWord end end |
Комментарии:
Комментарии 1