Lua: строка: оцените, расположены ли символы в порядке возрастания

#lua

#lua

Вопрос:

Как можно, если оценить, находятся ли все символы, составляющие строку, в строгом порядке возрастания / убывания?

например:

 print(is_strictly_asc_or_desc("abcdefghijklmnopqrstuvwxyz")) --> true
print(is_strictly_asc_or_desc("abba")) --> false
print(is_strictly_asc_or_desc("dj")) --> true
print(is_strictly_asc_or_desc("ace")) --> true
print(is_strictly_asc_or_desc("cent")) --> true
print(is_strictly_asc_or_desc("foot")) --> true
print(is_strictly_asc_or_desc("old")) --> true
print(is_strictly_asc_or_desc("file")) --> false
print(is_strictly_asc_or_desc("")) --> true
print(is_strictly_asc_or_desc("b")) --> true
  

Я что-то пробовал (но это не работает, и даже если исправлено, я сомневаюсь, что это будет эффективно …):

 function is_strictly_asc_or_desc(s)
    local alphabet = {a=1,b=2,c=3,d=4,e=5,f=6,g=7,h=8,i=9,j=10,k=11,l=12,m=13,n=14,o=15,p=16,q=17,r=18,s=19,t=20,u=21,v=22,w=23,x=24,y=25,z=26}
    if alphabet[s[1]] < alphabet[s[2]] then
        for i,letter in ipairs(s) do
            if alphabet[s[i]] > alphabet[s[i 1]] then
                return false
            end
        end
    else
        for i,letter in ipairs(s) do
            if alphabet[s[i]] < alphabet[s[i 1]] then
                return false
            end
        end
    end
    return true
end
  

Мы можем предположить, что слова состоят исключительно из символов в «abcdefghijklmnopqrstuvwxyz», т. Е. Только из строчных букв; НАПРИМЕР: «abc!f» -> недопустимо; «Hello» -> недопустимо; и т.д.

Комментарии:

1. Имеют ли приоритет заглавные / строчные буквы?

2. @warspyking вы можете использовать только нижний регистр

3. Смотрите редактирование моего ответа, у меня было немного свободного времени, поэтому я упростил выбор между возрастанием / убыванием с помощью необязательного аргумента. 🙂

Ответ №1:

Чтобы решить эту проблему, мы можем выполнить итерацию по строке и проверить их байтовые значения!

 function Validate(str,asc)
    local temp = asc and 0 or math.huge
    local temp2
    for i = 1,#str do
        temp2 = str:sub(i,i):byte()
        if (ask and temp2 < temp) or temp2 < temp then
            return false
        else
            temp = temp2
        end
    end
    return true
end
  

РЕДАКТИРОВАТЬ: Исправлена функция, принимающая необязательный аргумент по возрастанию, это позволяет вам определять, является ли он возрастающим или убывающим отдельно. Я чувствую, что это более эффективно, поскольку вы можете использовать его в разных ситуациях.

Комментарии:

1. Моя вина, если я допустил какие-либо ошибки, в настоящее время я не могу протестировать решение! Но я знаю, что моя логика остается в силе.

Ответ №2:

Аналогичный вариант для возрастания или убывания:

 function is_strictly_asc_or_desc(s)
  while #s > 2 and s:sub(2,2) == s:sub(1,1) do s = s:sub(2) end
  local temp = s:sub(1,1)
  local up = s:sub(2,2) > temp
  for c = 2, #s do
    c = s:sub(c,c)
    if up and c < temp or not up and c > temp then return false end
    temp = c
  end
  return true
end