2016-11-09 9 views
1

ローマ数字を10進形式に変換するlispプログラムがあります。有効な入力には効果的ですが、入力が有効なローマ数字であるかどうかを確認する方法がわかりません。たとえば、現在無効な入力( "MIM")が与えられている場合、それは誤って変換しようとします。代わりにERRORメッセージを返す必要があります。LISP - 有効なローマ数字のローマ数字変換器のチェック

(defun mapRomanToDecimal (chars nums string) 
    (loop as char across string 
     as i = (position char chars) 
     collect (and i (nth i nums)))) 

(defun parseThroughRoman (R) 
    (loop with nums = (mapRomanToDecimal "IVXLCDM" '(1 5 10 50 100 500 1000) R) 
    as (A B) on nums if A sum (if (and B (< A B)) (- A) A))) 

(defun romanToDecimal (RomanNumeral) 
    (format t "~d~%" (parseThroughRoman (numlist-to-string RomanNumeral)))) 

(defun numlist-to-string (lst) 
    (when lst 
    (concatenate 'string 
      (write-to-string (car lst)) (numlist-to-string (cdr lst))))) 


(romanToDecimal '(C D V)) -> 405 
(romanToDecimal '(M I M)) -> 1999 
+1

(1) ' "MIM"'と ' '(MIM)は'異なる値(リスト対列)であることに注意してください。 (2)入力を有効にするかどうかを指定する規則については、明確にする必要があります。その後、小切手を追加することができます。 (3)スタイル:ダッシュ区切り名、ラクダキャセない、してください。 – coredump

+0

私はMCMが1900年に有効であることを知っていますが、なぜMIMは1999年に有効ではありませんか? – Sylwester

+0

Common Lispのフォーマットは、すでに[ローマ数字で印刷](http://www.lispworks.com/documentation/HyperSpec/Body/22_cba.htm)であることにも注意してください。 –

答えて

2

スタイルについて少し...

  • データ型変換は
  • コードを簡単に、より汎用的なことができ、多くの場合、必要ありません

例:

(defvar *roman-chars* "IVXLCDM") 
(defvar *roman-nums* '(1 5 10 50 100 500 1000)) 

(defun roman-numeral-to-decimal (roman-numeral) 
    (let ((i (position (coerce roman-numeral 'character) *roman-chars*))) 
    (and i (nth i *roman-nums*)))) 

(defun map-roman-numerals-to-decimal (roman-numerals) 
    (map 'list #'roman-numeral-to-decimal roman-numerals)) 

(defun roman-to-decimal (roman) 
    (loop as (A B) on (map-roman-numerals-to-decimal roman) 
     if A sum (if (and B (< A B)) (- A) A))) 

これは、シンボル/文字/文字列、文字列、ベクトル記号/文字/文字列のリストを持つこと:

CL-USER 20 > (roman-to-decimal '(C D V)) 
405 

CL-USER 21 > (roman-to-decimal '("C" "D" "V")) 
405 

CL-USER 22 > (roman-to-decimal '(#\C#\D #\V)) 
405 

CL-USER 23 > (roman-to-decimal "CDV") 
405 

CL-USER 24 > (roman-to-decimal #(c d v)) 
405 
関連する問題