47 lines
2.0 KiB
Common Lisp
47 lines
2.0 KiB
Common Lisp
(let ((sayılar (vector "" "一" "二" "三" "四" "五" "六" "七" "八" "九" "十"))
|
||
(basamaklar (vector "" "" "十" "百" "千" "万")))
|
||
(defun sayı->yazılış (sayı &optional (stream *standard-output*))
|
||
(labels ((öz (sayı basamak)
|
||
(multiple-value-bind (sayı rakam) (truncate sayı 10)
|
||
(when (> sayı 0)
|
||
(öz sayı (+ basamak 1)))
|
||
(case basamak
|
||
(1 (format stream "~a" (aref sayılar rakam)))
|
||
(t (case rakam
|
||
(0)
|
||
(1 (format stream "~a" (aref basamaklar basamak)))
|
||
(t (format stream "~a~a"
|
||
(aref sayılar rakam)
|
||
(aref basamaklar basamak)))))))))
|
||
(cond ((= sayı 0) (format stream "れい"))
|
||
((> sayı 99999) (error "sayı->yazılış: sayı 99999 dan küçük olmalı"))
|
||
(t (when (< sayı 0)
|
||
(format stream "マイナス"))
|
||
(öz (abs sayı) 1))))))
|
||
|
||
;; (defun sayı-sor (tip)
|
||
;; (let* ((sayı (random 99999))
|
||
;; (yazılış (with-output-to-string (str)
|
||
;; (sayı->yazılış sayı str))))
|
||
;; (case tip
|
||
;; (:rakam
|
||
;; (format t "~a hangi sayıdır? " yazılış)
|
||
;; (let ((girdi (read)))
|
||
;; (if (= girdi sayı)
|
||
;; (format t "doğru.~%")
|
||
;; (format t "yanlış, ~d." sayı))))
|
||
;; (:yazılış
|
||
;; (format t "~a nasıl yazılır? " sayı)
|
||
;; (let ((girdi (string-left-trim '(#\Space) (read-line))))
|
||
;; (if (string-equal girdi yazılış)
|
||
;; (format t "doğru.~%")
|
||
;; (format t "yanlış, ~d." yazılış)))))))
|
||
|
||
;; (let ((sayılar (vector "" "一" "二" "三" "四" "五" "六" "七" "八" "九" "十")))
|
||
;; (declare (ignorable sayılar))
|
||
;; (defun sayı->yazılış (sayı)
|
||
;; (let (rakam)
|
||
;; (loop :do (multiple-value-setq (sayı rakam) (truncate sayı 10))
|
||
;; :collect rakam
|
||
;; :while (> sayı 0)))))
|