2015-10-25 165 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)) 
相關問題