Я не совсем уверен, что полностью понял ваш вопрос, но, увидев подход другого ответа и ваш комментарий против него, я надеюсь, что я нахожусь в бальном парке.
Каквы заявили, что знаете, как получить пользовательский ввод и назначить его переменной, я не включил эти аспекты в свой сценарий ниже.
Вместо этого я создал фиктивное значение свойства, в котором хранится выдуманное значениеиз того, что я себе представлял, пользователь может ввести как кодовое имя.
property userInput : "GXTrZy"
Вы можете удалить эту строку и заменить любые вхождения userInput
в моем скрипте на имя переменной, которую вы использовали для хранения фактическогопользовательский ввод.
property userInput : "Dinosaur" -- A dummy value to take the place of user input
-------------------------------------------------------------------------------------
property resourcePath : "resources/images/web_images"
property resourceFolders : ["A-B", "C-F", "G-I", "J-O", "P-S", "T-Z"]
-------------------------------------------------------------------------------------
property alphabet : "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
-------------------------------------------------------------------------------------
(*
Your code to obtain user input
and assign it to a variable, etc.
I have put a dummy placeholder codename
in the property value 'userInput' at
the top of this script.
*)
set alpha to the first character of the userInput --> "D"
if alpha is not in the alphabet then return
set x to (alpha's id) mod 32 -- Alpha's ordinal position in the alphabet
set |?| to words of (resourceFolders as text) as text --> "ABCFGIJOPSTZ"
set the text item delimiters to {"/"} & |?|'s items
--> {"/", "A", "B", "C", "F", "G", "I", "J", "O", "P", "S", "T", "Z"}
set |?ₓ| to text 1 thru x of the alphabet --> "ABCD"
set |?₋| to text items of ("+" & |?ₓ|) as text --> "+///D"
set i to 0.49 + (offset of alpha in |?|) / 2 as integer --> 0
set j to the (number of words in |?₋|) * ((|?₋| contains alpha) as integer) --> 2
set n to i + j --> Index of folder item in resourceFolders list = 2
set resourceFolder to item n of resourceFolders --> "C-F"
set filepath to the {resourcePath, resourceFolder, [userInput, ".jpg"]} as text
set msg to ["The codename you input : ", userInput, linefeed, ¬
"The file for that codename is available at : ", filepath] as text
(*
The rest of your code will follow
below. You can use the message stored
in the variable 'msg' to append to
your email.
*)
Вот строка, представляющая особый интерес для вашего вопроса:
set alpha to the first character of the userInput --> "D"
Она получает первую букву кодового имени и сохраняет ее в переменнойalpha
.Строки кода, которые следуют из этой статьи, определяют правильную папку, в которой находится файл ресурсов кодового имени.
Комментарии после некоторых строк кода начинаются с --
или -->
, последняя изкоторый я использовал для распечатки результата на каждом этапе выполнения скрипта на основе предоставленного мною пользовательского ввода.Таким образом, обрабатываемая буква была "G"
, и показанные результаты относятся к этой букве, но будут отличаться для разных примеров ввода, которые используют другую первую букву.
После запуска этого скрипта конечный результат былстрока сообщения, хранящаяся в переменной msg
, которая содержала следующий текст:
"The codename you input : Dinosaur
The file for that codename is available at : resources/images/web_images/C-F/Dinosaur.jpg"
ОБНОВЛЕНИЕ: 2018-09-26 - Итерационный метод
Вот альтернативный метод достижения той же цели с использованием цикла repeat
для перебора каждого возможного имени папки ресурса и проверки, находится ли буква кодового имени между буквами имени папки:
property userInput : "Dinosaur" -- A dummy value to take the place of user input
-------------------------------------------------------------------------------------
property resourceFolders : ["A-B", "C-F", "G-I", "J-O", "P-S", "T-Z"]
-------------------------------------------------------------------------------------
set alpha to the first character of the userInput --> "D"
set ASCIIindices to the id of (words in (resourceFolders as text) as text)
set alphaIndex to ((alpha's id) mod 32) + 64 -- Case independent
repeat with i from 2 to the length of ASCIIindices by 2
if item i of ASCIIindices ≥ the alphaIndex then exit repeat
end repeat
set resourceFolder to item (i / 2) of the resourceFolders --> "C-F"
Код короче, и на самом деле это более очевидный метод для решения проблемы такого рода.Тем не менее, я склонен обобщать проблемы перед тем, как приступить к решению, из которого и вышло мое более математически ориентированное решение, приведенное выше.
Теоретические преимущества первого решения заключаются в том, что его скорость ввыполнение ограничено только скоростью встроенных функций AppleScript, таких как offset
, и функциями обработки текста, то есть фактически код AppleScript никогда не замедлит процесс независимо от длины алфавита.
Между тем, итеративный метод - это алгоритм O(n)
, который будет работать медленнее с более длинным алфавитом, поскольку его ограничивающим фактором в скорости является цикл repeat
, который потребует бесконечного времени с бесконечным алфавитом.
Но, учитывая, что у нас нет бесконечного алфавита, это действительно спорный вопрос, и поэтому вы можете выбрать более короткий, более простой для понимания метод.Мне лично не нравятся циклы repeat
, и я избегаю их всякий раз, когда это необходимо, но это моя особенная черта в кодировании.