Как бих превел числа в думи в Scheme?

Току-що започнахме със схемата в университета и имам нужда от помощ, за да изпълня задачата си.

Ще напишем програма, която превежда числата в думи, например: 1 към "едно".

Трябва да работи за всички числа до 10 ^ 9. Нямам истинска представа как да направя това.
Основната ми идея е да създам някакъв масив или списък, където да дефинирам тези числа като думи като тази:

('ZERO', 0) ('ONE', 1) ('TWO', 2) ('THREE', 3) ('FOUR', 4) ('FIVE', 5) ('SIX', 6)
('SEVEN', 7) ('EIGHT', 8) ('NINE', 9) ('TEN', 10) ('ELEVEN', 11) ('TWELVE', 12)
('THIRTEEN', 13) ('FOURTEEN', 14) ('FIFTEEN', 15) ('SIXTEEN', 16)
('SEVENTEEN', 17) ('EIGHTEEN', 18) ('NINETEEN', 19) ('TWENTY', 20) ('THIRTY', 30)
('FORTY', 40) ('FIFTY', 50) ('SIXTY', 60) ('SEVENTY', 70) ('EIGHTY', 80) 
('NINETY', 90) ('HUNDRED', 100) ('THOUSAND', 1000) ('MILLION', 1000000) 
('BILLION', 1000000000) ('TRILLION', 1000000000000) 
('QUADRILLION', 1000000000000000)

След това по някакъв начин проверете входната стойност с този списък и заменете числата с думите.

Но прилагането на това ми създава известни проблеми.

Основният въпрос, който ме тревожи, е дали Scheme може да прави поднизове и дали мога да направя списък, в който да дефинирам тези числа като думи (така че дефинирайте 1 като едно).


person user1039240    schedule 10.11.2011    source източник
comment
Не съм запознат със Scheme, така че мога само да помогна в логиката зад решението. Първо вижте дали можете да конвертирате число между 0 и 999 включително в думата. След това работете по пътя си, за да преобразувате числа от по-големи порядъци. Освен това може да помогне, ако дефинирате тези двойки в обратен ред, т.е. (0, „нула“) (1, „едно“) и т.н. Ако схемата има речникова структура като python, това наистина ще помогне при решаването на проблема .   -  person ladaghini    schedule 10.11.2011


Отговори (1)


  • Не можете да "измамите" и да направите (дефинирайте 1 едно), тъй като 1 вече е дефинирано като число :)

  • Не мисля, че трябва да се притеснявате за подниз в този проблем, вие изграждате низ от поднизове, а не обратното...

    • You do need an operation for string concatenation though. I don't remember how they do strings in scheme though...

Единственият "твърд" проблем тук е, че трябва да кодирате произволните правила от английския език, така че...

//pseudocode, doing things the "dumb way" tons of ifs, aka cond
define to_str n = 
    if n == 1 then "one"
    ...
    if n == 3 then "thirteen"
    ..
    if 20 <= n < 30 then
       'twenty-' concatenated to  (to_str (n - 20))
    ...

След като накарате версия като тази да работи, можете да помислите за абстрахиране на повтарящия се контролен поток чрез речник или списък с асоциации, подобен на този, който споменахте във въпроса.

person hugomg    schedule 10.11.2011
comment
Благодаря за помощта. Но с тази система трябва да дефинирам квадрилиони числа на ръка, нали? - person user1039240; 11.11.2011
comment
Проблемът е, че английският език има квадрилиони числа :P. Просто трябва да използвате приблизително тези числа, които вече изброихте (например: проверете как трябва да дефинирам само префикса twenty- за twenties - последната цифра се обработва от рекурсия). Основното ми предложение беше просто първо да се опитате да кодирате твърдо числата и логиката, преди да се опитате да направите нещо по-сложно като предаване на списъка с числа като параметър... - person hugomg; 11.11.2011
comment
string-append ще свърже два низа. Също така опитайте да потърсите assq. - person erjiang; 14.11.2011