2015-10-25 134 views
1

我被困在我知道的事情上很琐碎,但我只是不知道该怎么做。我将一个字符串转换为一个列表,稍微改变列表,然后将其转换回字符串。将一个元素添加到列表的末尾,方案

我正在将单词翻译成猪拉丁文,但我无法在单词的结尾添加“ay”。我知道如何获取列表的第一个元素并将其发送到后面,但由于某种原因,我的代码不会添加“ay”。我之前在方案中附加了列表,这是相对直接的,但我不明白为什么它不在这里工作,我尝试了一些不同的方法。

下面是代码:

(define (member? item seq) 
    (sequence-ormap (lambda (x) 
        (equal? item x)) 
        seq)) 

(define (vowel? letter) 
    (member? letter '(a e i o u))) 

(define (first-to-last x) (append (cdr x) (list (car x)))) 

(define (piglatin wd) 
    (define stringlist (string->list wd)) 
    (cond 
    [(vowel? (car stringlist)) (append 'yay stringlist)] 
    [else (define pigstringlist (first-to-last stringlist)) (append pigstringlist '(ay)) (list->string pigstringlist)]) 
) 

我希望,看上去一切正常,除了不能追加到列表的末尾。我觉得我错过了一些简单的东西,但是我想学习来自C/Java背景的方案,而这些东西都是巨大的时间消费者。如果有人看到任何我会非常感激的。我可以使用一些建议并修改这些代码,因为它对我来说似乎有点儿意思。

这里的输出,对"home"

(piglatin "home") 
"omeh" 

回答

0
(define (piglatin wd) 
    (define stringlist (string->list wd)) 
    (cond 
    [(vowel? (car stringlist)) (append 'yay stringlist)] 
    [else (define pigstringlist (first-to-last stringlist)) 
      (append pigstringlist '(ay)) ;; 
      (list->string pigstringlist)])) 

您计算一个新列表,该列表'(ay)追加,但:

  1. '(ay)是包含一个符号列表。在这里,你应该操纵不同的字符列表。参见例如:

    (string->list "wow") 
    => (#\w #\o #\w) 
    
  2. append函数的结果被丢弃。请记住,append不会修改现有列表。因此,在else案件中返回的值是pigstringlist,又名(first-to-last stringlist)

else整个表达式可以是(第一版本):

... 
[else (list->string 
     (append (first-to-last stringlist) 
       '(#\a #\y)))]... 

这同样适用于'yay,上方,这是不列表。 您正在使用列表功能操作字符串,但你可以使用字符串相关的功能,如string-append

(define (pig-latin wd) 
    (cond 
    [(vowel? (string-ref wd 0)) (string-append "yay" wd)] 
    [else (string-append (first-to-last wd) "ay")])) 

当然,first-to-last应该被重新定义,因为它需要一个列表。实施这将是 方式一:

(define (first-to-last word) 
    (string-append (substring word 1) 
       (substring word 0 1))) 

当你定义vowel?,隶属测试总是因为再一次你比较字母,这是个字符,符号,这是识别失败。你或许应该考虑大写字母:

(define (vowel? letter) 
    (member letter '(#\a #\e #\i #\o #\u #\y) char-ci-=?)) 

我使用现有的member功能,它接受一个等式谓词。这里,该函数比较字符不区分大小写。

0

如果我是你,我不会将字符串转换为列表并返回。我会直接玩字符串。以下是我想到的解决方案:

  1. 排除字符串。
  2. 查找字符串中最长的初始辅音。
  3. 如果辅音运行是空的,那么只需将“yay”附加到字符串的末尾即可。
  4. 否则,取辅音运行后的子串,然后附加辅音运行和“ay”。
  5. 如果原始字符串以大写字母开头,则对结果字符串进行标记。 (这意味着,如果原词是在全大写,这会做错事太糟糕了,少喊为胜。)

下面的代码(需要SRFIs 1314):

(define vowels (char-set #\a #\e #\i #\o #\u)) 
(define (pig-latin word) 
    (define downcased (string-downcase word)) 
    (define index (string-index downcased vowels)) 
    (define result (if (zero? (or index 0)) 
        (string-append downcased "yay") 
        (string-append (substring downcased index) 
            (substring downcased 0 index) 
            "ay"))) 
    (if (and (not (zero? (string-length word))) 
      (char-upper-case? (string-ref word 0))) 
     (string-titlecase result) 
     result)) 
相关问题