В DrRacket, как проверить, имеет ли строка определенное количество символов, а также как определить, какой первый символ в строке - PullRequest
0 голосов
/ 05 июня 2019

В основном у меня есть проблема, вот информация, необходимая для ее решения.

PigLatin.Pig Latin - это способ перестановки букв в английских словах для развлечения.Например, предложение «свинья латинская глупо» становится «igpay atinlay isway upidstay».

Гласные («a», «e», «i», «o» и «u») обрабатываются отдельно от согласных (любая буква не является гласной).Для простоты мы будем считать «у» всегда согласной.Хотя существуют различные формы Pig Latin, мы будем использовать следующие правила:

(1) К словам из двух букв или менее просто добавляется «путь» в конце.Таким образом, «а» становится «прочь».

(2) В любом слове, начинающемся с согласных, согласные перемещаются до конца, и добавляется «ay».Если слово начинается с более чем двух согласных, двигайте только первые две буквы.Таким образом, «привет» становится «эллохай», а «строка» становится «рингстай».

(3) К любому слову, начинающемуся с гласной, просто добавляется «путь» в конце.Поэтому «объяснение» становится «объяснением».

Напишите функцию (pig-latin L), которая потребляет непустое значение (listof Str) и возвращает Str, содержащий слова в L, преобразованные в Pig Latin.Каждое значение в L должно содержать только строчные буквы и иметь длину не менее 1.

Я понимаю, что мне нужно установить три основных условия здесь, я борюсь с Racket и изучаю правильный синтаксис для записииз моих решений.сначала мне нужно создать условия, которые смотрят на строку и проверяют, равна ли она длине 2 или меньше, чтобы соответствовать условию (1).Для (2) мне нужно посмотреть на первые два символа в строке, я предполагаю, что я должен преобразовать строку в список символов (строка-> список).Для (3) я понимаю, что мне просто нужно посмотреть на первый символ в строке, я в основном должен повторить то, что я сделал с (2), но просто посмотреть на первый символ.

Хотя я не знаю, как управлять списком символов.Я также не знаю, как убедиться, что длина строки соответствует критериям.Любая помощь будет оценена.У меня практически нет кода для моей проблемы, так как я озадачен тем, что здесь делать.

Примером проблемы является

 (pig-latin (list "this" "is" "a" "crazy" "exercise")) => 
"isthay isway away azycray exerciseway"

1 Ответ

0 голосов
/ 05 июня 2019

Лучшая стратегия для решения этой проблемы:

  1. Отметьте в документации все доступные строковые процедуры. Нам не нужно преобразовывать входную строку в список символов для работы с ней, и вы обнаружите, что существуют процедуры, отвечающие всем нашим потребностям.
  2. Напишите вспомогательные процедуры. На самом деле нам нужна только процедура, которая сообщает нам, содержит ли строка гласный в данной позиции; проблема состоит в том, что используются только символы a-z, поэтому мы можем отменить эту процедуру, чтобы найти согласные.

Также важно определить лучший порядок записи условий, например: условия 1 и 3 могут быть объединены в одном случае. Это мое предложение:

(define (vowel-at-index? text index)
  (member (string-ref text index)
          '(#\a #\e #\i #\o #\u)))

(define (pigify text)
        ; cases 1 and 3
  (cond ((or (<= (string-length text) 2)
             (vowel-at-index? text 0))
         (string-append text "way"))
        ; case 2.1
        ((and (not (vowel-at-index? text 0))
              (vowel-at-index? text 1))
         (string-append (substring text 1)
                        (substring text 0 1)
                        "ay"))
        ; case 2.2
        (else
         (string-append (substring text 2)
                        (substring text 0 2)
                        "ay"))))

(define (pig-latin lst)
  (string-join (map pigify lst)))

Для последнего шага нам нужно только применить процедуру pigify к каждому элементу входных данных, и это то, что делает map. Работает как положено:

(pig-latin '("this" "is" "a" "crazy" "exercise"))
=> "isthay isway away azycray exerciseway"
...