Как найти первый элемент блока строк, первый символ которого соответствует входному символу?

Дано weapons: ["rock" "scissors" "paper"]

Если бы я сделал player-choice: ask "(r)ock, (p)aper, (s)cissors or (q)uit? "

как я могу найти символ, введенный пользователем в блоке со словом weapons прикреплен к нему

3 ответа

Если вы хотите только одно совпадение и использовать только фактические названия элементов в своем блоке, ваше собственное решение подойдет. Но одна из важных вещей в Red - это то, как вы можете структурировать свои данные, чтобы упростить задачу. Например, если вы хотите выбрать элементы из списка только на основе известного ключа (например, первого символа), вы можете сделать это явным, а не неявным.

weapons: ["r" "rock" "s" "scissors" "p" "paper"]
player-choice: ask "(r)ock, (p)aper, (s)cissors or (q)uit? "
print select weapons player-choice
>> abr: "p"
== "p"
>> parse weapons [some [into [x: abr (print x)] | skip]  ]
paper

или же

>> parse weapons [collect some [into [x: abr keep (x)] | skip]  ]
== ["paper"]
weapons: ["rock" "scissors" "paper"]
matching-weapon: func [abbrev][
    foreach weapon weapons [
        if (first weapon) = first abbrev [
            return weapon
        ]
    ]
]

Если вы хотите, чтобы блок начинался с того, что было найдено, удалите index?

switch player-choice [
    "r" [index? find weapons "rock"]
    "s" [index? find weapons "scissors"]
    "p" [index? find weapons "paper"]
    "q" ["quit"]
]
Другие вопросы по тегам