> 1 <

Автор Сообщение

donserj

Members


Статус

3 сообщений

Где: Moldavia
Род занятий:
Возраст:

#3961   2011-02-25 00:12 GMT+3 часа(ов)      
1.Определить функцию, которая отображает номера по буквам. Пример: 52- пятьдесят-две.
2.Определить функцию, которая преобразует число румынской системы нумерации в арабской. Пример:V-5, IV-4.
3.Определить функцию, которая отображает кокой год по китайскому календарю.Китайский календарь:Крыса,Бык,Тигр,Кролик, Дракон,Змея,Лошадь,Овца,Обезьяна,Петух,Собака,Свинья.Пример:2011-Кролик

megamanx

Members


Статус

307 сообщений

Где: Russia
Род занятий:
Возраст:

#3962   2011-02-25 01:59 GMT+3 часа(ов)      
из румынской в олбанскую
I wish I'd made you angry earlier

megamanx

Members


Статус

307 сообщений

Где: Russia
Род занятий:
Возраст:

#3963   2011-02-26 00:03 GMT+3 часа(ов)      
(defvar dig0 '("один" "два" "три" "четыре" "пять" "шесть" "семь" "восемь" "девять" "десять"))
(defvar dig10_19 '("одиннадцать" "двенадцать" "тринадцать" "четырнадцать" "пятнадцать" "шеснадцать" "семнадцать" "восемнадцать" "девятнадцать"))
(defvar dig1 '("двадцать" "тридцать" "сорок" "пятьдесят" "шестьдесят" "семьдесят" "восемьдесят" "девяносто"))
 
(defun n2w (n)
(cond
((< n 11) (nth (1- n) dig0))
((< n 20) (nth (- n 11) dig10_19))
((= (mod n 10) 0) (nth (- (truncate (/ n 10)) 2) dig1))
(T (concatenate 'string (nth (- (truncate (/ n 10)) 2) dig1) " " (nth (1- (mod n 10)) dig0)))))


Исправил
(defun init()
(let ((dig0 (make-hash-table))
(dig0f (make-hash-table))
(dig1 (make-hash-table))
(dig10_19 (make-hash-table))
(dig2 (make-hash-table))
(dig_all (make-hash-table))
(dig0_ '("один" "два" "три" "четыре" "пять" "шесть" "семь" "восемь" "девять" "десять"))
(dig0f_ '("одна" "две" "три" "четыре" "пять" "шесть" "семь" "восемь" "девять" "десять"))
(dig1_ '("десять" "двадцать" "тридцать" "сорок" "пятьдесят" "шестьдесят" "семьдесят" "восемьдесят" "девяносто"))
(dig10_19_ '("одиннадцать" "двенадцать" "тринадцать" "четырнадцать" "пятнадцать" "шеснадцать" "семнадцать" "восемнадцать" "девятнадцать"))
(dig2_ '("сто" "двести" "триста" "четыреста" "пятьсот" "шестьсот" "семьсот" "восемьсот" "девятьсот"))
(dig_all_ '(("тысяча" "тысячи" "тысяч" )
("миллион" "миллиона" "миллионов" )
("миллиард" "миллиарда" "миллиардов" )
("триллион" "триллиона" "триллионов" )
("квадриллион" "квадриллиона" "квадриллионов")
("квинтиллион" "квинтиллиона" "квинтиллионов")
("секстиллион" "секстиллиона" "секстиллионов")
("септиллион" "септиллиона" "септиллионов" )
("октиллион" "октиллиона" "октиллионов" )
("нониллион" "нониллиона" "нониллионов" )
("дециллион" "дециллиона" "дециллионов" ))))
(loop for i from 0 to 9 do (progn (setf (gethash i dig0) (nth i dig0_))
(setf (gethash i dig0f) (nth i dig0f_))
(setf (gethash i dig1) (nth i dig1_))
(setf (gethash i dig2) (nth i dig2_))
(setf (gethash i dig10_19) (nth i dig10_19_))))
(loop for i from 0 to (1- (length dig_all_)) do (setf (gethash i dig_all) (nth i dig_all_)))
(labels ((get-n-by-case (n)
"определение падежа по n = '(x x x)"
(if (= (length n) 1)
(let ((d0 (car n)))
(cond
((= d0 1) 0)
((member d0 '(2 3 4)) 1)
(T 2)))
(let ((d0 (car (last n)))(d1 (car (last (butlast n)))))
(if (= d1 1) 2
(cond
((= d0 1) 0)
((member d0 '(2 3 4)) 1)
(T 2))))))
(gen-very-long-num-name (d c)
(concatenate 'string "на 10^" (write-to-string (* 3 d))))
(get-range-with-case (c n)
(let ((q (- n 2)))
(if (< q 0) "" (concatenate 'string " " (nth (get-n-by-case c) (gethash q dig_all))))))
(make_number(nlist &optional retval)
"n вида '((1 2) (3 4 5) (6 7 8))"
(cond
((null nlist) retval)
((> (length nlist) 12) (make_number (cdr nlist) (concatenate 'string retval " " (n2w (car nlist) nil) " " (gen-very-long-num-name (length nlist) (get-n-by-case (car nlist))))))
((= (length nlist) 2) (make_number (cdr nlist) (concatenate 'string retval " " (n2w (car nlist) nil) " " (nth (get-n-by-case (car nlist)) (gethash 0 dig_all)))))
(T (make_number (cdr nlist) (concatenate 'string retval " " (n2w (car nlist)) (get-range-with-case (car nlist) (length nlist)))))))
(split-3 (str)
(let ((str (write-to-string str)))
(mapcar #'(lambda(L) (mapcar #'parse-integer L))
(reverse (loop for i from (length str) downto 1 by 3
collect ((lambda (str)
(cond
((minusp (- i 2)) (list (subseq str 0 1)))
((minusp (- i 3)) (list (subseq str 0 1) (subseq str 1 2)))
(T (list (subseq str (- i 3) (- i 2)) (subseq str (- i 2) (- i 1)) (subseq str (- i 1) i))))) str))))))
(n2w (n &optional (s T))
(case (length n)
(1 (dig_X (car n) s))
(2 (if (= 0 (cadr n))
(dig_X0 (car n))
(dig_XX (car n) (cadr n) s)))
(3 (if (= 0 (caddr n))
(if (= 0 (cadr n))
(dig_X00 (car n))
(dig_XX0 (car n) (cadr n)))
(if (= 0 (cadr n))
(dig_X0X (car n) (caddr n) s)
(dig_XXX (car n) (cadr n) (caddr n) s))))
(otherwise (error "n2w error [debug=1]: wrong number of arguments"))))
(dig_X0X (d2 d0 s)
(concatenate 'string (dig_X00 d2) " " (dig_X d0 s)))
(dig_XXX (d2 d1 d0 s)
(concatenate 'string (dig_X00 d2) " " (dig_XX d1 d0 s)))
(dig_X00 (n)
(gethash (1- n) dig2))
(dig_XX0 (d2 d1)
(concatenate 'string (dig_X00 d2) " " (dig_X0 d1)))
(dig_X (n s)
(if s
(gethash (1- n) dig0)
(gethash (1- n) dig0f)))
(dig_X0 (n)
(gethash (1- n) dig1))
(dig_XX (d1 d0 s)
(if (< d1 2)
(gethash (1- d0) dig10_19)
(concatenate 'string (dig_X0 d1) " " (dig_X d0 s)))))
(defun convert (n)
(make_number (split-3 n))))))
 
 
(init)
>>CONVERT
(convert 6143211172365472631472)
>>" шесть секстиллионов сто сорок три квинтиллиона двести одиннадцать квадриллионов сто семьдесят два триллиона триста шестьдесят пять миллиардов четыреста семьдесят два миллиона шестьсот тридцать одна тысяча четыреста семьдесят два"

отредактировал(а) megamanx: 2011-02-28 02:44 GMT+3 часа(ов)
I wish I'd made you angry earlier
> 1 <


Онлайн :

0 пользователь(ей), 15 гость(ей) :




Реклама на сайте: