ORD и CHAR в Scratch

Я сталкиваюсь со все большим количеством ситуаций в Scratch, когда мне нужно преобразовать число в его символ ACSII или наоборот. Для этого в блоках нет встроенной функции.

Мое решение состоит в том, чтобы создать список размером 26 и добавить буквы A-Z в каждую последовательность, используя переменную с именем Alphabet = "abcdefghijklmnopqrstuvwxyz" и перебирая ее с помощью блока Repeat и добавляя LETTER COUNT ALPHABET в список. Результатом являются данные списка. структура с буквами A_Z между ячейками с 1 по 26. В результате создается моя собственная таблица ASCII.

Чтобы выполнить преобразование, скажем, от номера 26 до «Z», мне нужно перебрать список, чтобы получить правильное значение CHAR. Это действительно замедляет работу программы, которая сильно зависит от функции CHR(). Есть ли лучшее или более эффективное решение?


person Timothy Lawman    schedule 12.05.2015    source источник
comment
У вас возникли проблемы с получением буквы с номера или наоборот?   -  person Scimonster    schedule 20.05.2015
comment
в обоих случаях, поскольку одна функция обратна другой, обе ситуации часто возникают при написании программ для работы со строками. Например, я делаю некоторые шифровальные программы.   -  person Timothy Lawman    schedule 21.05.2015


Ответы (2)


Мое решение состоит в том, чтобы создать список размером 26 и добавить буквы от A до Z в каждую последовательность, используя переменную с именем Alphabet = "abcdefghijklmnopqrstuvwxyz"

Остановись прямо там. Вам даже не нужно преобразовывать его в список. Вы можете просто посмотреть его прямо из строки.

Получить символ из индекса очень просто. Просто используйте блок (letter () of []).

Получить индекс символа сложнее. К сожалению, в Scratch нет встроенного способа сделать это. Здесь я бы определил index of [] in [] пользовательский блок псевдорепортера:

define index of (char) in (str)
set [i v] to [1]
repeat until <<(i) = (length of (str))> or <(letter (i) of (str)) = (char)>>
    change [i v] by (1)

просмотреть онлайн< /под>

Затем вы можете вызвать блок как index of [a] in (alphabet), и он установит переменную i в 1.

В этом коде нет случая, если символ не найден, но ссылка, которую я предоставил, включает это, если вам нужно.

person Scimonster    schedule 21.05.2015
comment
Да, я согласен с первым решением и обычно использую этот метод в Python. Ваше второе решение с использованием репортерного блока, кажется, повторяет N раз в худшем случае, поэтому на самом деле не решает вторую проблему. Возможно, это то, что делает ord(), но я подозреваю, что он использует поиск в постоянное время из-за того, что набор символов ascii встроен в набор микросхем электронным способом? Разница во времени работы программ шифрования огромна при использовании нуля и Python. - person Timothy Lawman; 23.05.2015
comment
Я согласен, что это прискорбно, но именно так вы должны сделать это в Scratch. - person Scimonster; 24.05.2015
comment
Как насчет бинарного поиска? - person Roland Illig; 17.10.2019

Вы также можете использовать Snap!, который похож на Scratch, но имеет больше блоков. Щелчок! имеет блок юникода, который преобразует символ в его значение ASCII или юникод.

person Kate Fractal    schedule 27.07.2015
comment
Да, в Snap есть встроенные функции преобразования символа в значение ASCII и обратно: unicode of [] и unicode () as letter. Коды Unicode и ASCII одинаковы для символов, имеющих код ASCII. - person Kate Fractal; 27.07.2015