#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