> 1 <

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

Vera Naumova

Members


Статус

16 сообщений

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

#3637   2010-12-08 23:32 GMT+3 часа(ов)      
Добрый вечер, еще раз!! ЭТо опять я, еще с одним вопросом по этой задаче))) вариант решения задачи joba, мне очень понравился, простой и понятный, такой мне и нужен.. только не могли бы подсказать еще два нюанса. как сделать так, чтобы программа считала только правильные риммские числа и не считала неправильные - два случая:
1) пример: XXIVII - т.е. если число I стоит до V и после нее тоже... (это как пример)
2) пример: IIIX - и если перед X стоят три одинаковые цифры...
как эти правила внести в код joba?? подскажите пожалуйста, буду очень вам признательна!



сам код:

defun table (a)
(cond ((eq a 'I) 1)
((eq a 'V) 5)
((eq a 'X) 10)
((eq a 'L) 50)
((eq a 'C) 100)
((eq a 'D) 500)
((eq a 'M) 1000)))

(defun next (roman)
(table (car roman)))

(defun delta (i j)
(if (< i j) -1 1))

(defun helper (curr tail)
(if tail
(+ (F tail) (* curr (delta curr (next tail))))
curr))

(defun F (roman)
(if roman
(helper (next roman)
(cdr roman))))

P.S: извините за дублирование темы, но туда уже никто не заходит и не смотрит, а помощь мне очень нужна. спасибо за понимание, Вера Наумова.

Vera Naumova

Members


Статус

16 сообщений

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

#3640   2010-12-09 04:21 GMT+3 часа(ов)      
ребята, у кого-нибудь есть хоть какие-нибудь догадки?? поделитесь пожалуйста, я может быть сама додумаю и доделаю(

Vera Naumova

Members


Статус

16 сообщений

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

#3648   2010-12-09 22:55 GMT+3 часа(ов)      
up(

ander-skirnir

Members


Статус

227 сообщений
http://lisper.ru
Где: Ukraine
Род занятий: `'`,`',`',
Возраст: 30

#3649   2010-12-10 00:00 GMT+3 часа(ов)      
Зря к коду joba приклеились. Лучше бы попытались разобраться с вариантом VH и у него бы спросили, если что - он поотзывчивее и чаще здесь бывает.

Vera Naumova

Members


Статус

16 сообщений

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

#3717   2010-12-17 10:49 GMT+3 часа(ов)      
Неужели с кодом Joba нельзя ничего сделать?(( делала тоже с помощью eq, что если след. одинаковая, то увеличиваем... что-то ничего не выходит.. подтолкните хотя бы на мысль, пожалуйста

Fallen_s4e

Members


Статус

114 сообщений
http://lisper.ru
Где: Zimbabwe lisper.ru
Род занятий: fallen_s4e
Возраст: 8

#3718   2010-12-17 16:29 GMT+3 часа(ов)      
Ваши 2 случая:
Напишите предикат correctp(arg), который будет верен, если:
1)не существует такой подпоследовательности xyx, где x на 1 "ранг" меньше y.(I - 1, V - 2, X - 3 ...)
2)не существует такой подпоследовательности xxxy, где x на 1 "ранг" меньше y.(I - 1, V - 2, X - 3 ...)
Что-то в духе:
 
(reduce #'and-fn (append (maplist #'f1 (mapcar #'rank arg))
(maplist #'f2 (mapcar #'rank arg))))
(defun main(arg)
(when (correctp arg)
(jobas-code arg)))

отредактировал(а) Fallen_s4e: 2010-12-17 16:49 GMT+3 часа(ов)

leest

Members


Статус

12 сообщений

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

#3750   2010-12-21 16:41 GMT+3 часа(ов)      
Добрый вечер, всем!!! что касается меня и этой задачи, то я брал код Misha, он рабочий, в принципе несложный и понятный. Что касаемо двух ограничений, которые нужно вам дополнить, то я сдавал без них, к счастью))) Хотя вполне интересно. Код который предложил Joba тоже прост, но как внедрить туда эти условия, я пока не могу сообразить. Я подумаю... если вдруг что-нибудь придумаю, то обязательно сообщу.

Vera Naumova

Members


Статус

16 сообщений

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

#3818   2011-01-05 23:26 GMT+3 часа(ов)      
Ребята, С прошедшими праздниками вас!!! неужели ни у кого ни что не пришло на ум вместе с новогодними праздниками?)) помогите пожалуйста, поощрю небольшой суммой)) очень нужна помощь, просто очень, и очень и очень. жду и надеюсь

megamanx

Members


Статус

307 сообщений

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

#3819   2011-01-06 17:06 GMT+3 часа(ов)      
Переделай код joba
(defun table (a)
(cond ((eq a 'I) 1)
((eq a 'V) 5)
((eq a 'IV) 4)
((eq a 'IX) 9)
((eq a 'X) 10)
((eq a 'XL) 40)
((eq a 'L) 50)
((eq a 'XC) 90)
((eq a 'C) 100)
((eq a 'CD) 400)
((eq a 'D) 500)
((eq a 'CM) 900)
((eq a 'M) 1000)))

Единственно верное римское число из арабского
(defun a2r(n &KEY (as 'string))
(if (> n 99999) (error "too long number"))
(let ((a '("I" "IV" "V" "IX" "X" "XL" "L" "XC" "C" "CD" "D" "CM" "M"))
(b '(1 4 5 9 10 40 50 90 100 400 500 900 1000))
(c '(I IV V IX X XL L XC C CD D CM M))
(newn n))
(labels ((ret (i s)
(cond
((< newn (nth i b)) s)
(T (progn
(setq newn (- newn (nth i b)))
(ret i (concatenate 'string s (nth i a))))))))
(labels ((retSym (i s)
(cond
((< newn (nth i b)) s)
(T (progn
(setq newn (- newn (nth i b)))
(retSym i (append s (list (nth i c)))))))))
(cond
((eq as 'string)
(labels ((retString (i s)
(cond
((< i 0) s)
(T (retString (1- i) (concatenate 'string s (ret i nil)))))))
(retString (1- (length a)) nil)))
((eq as 'symbol)
(labels ((retSymbol (i s)
(cond
((< i 0) s)
(T (retSymbol (1- i) (append s (retSym i nil)))))))
(retSymbol (1- (length a)) nil)))
(T (princ "unknown")))))))

Например
(F (a2r 999 :as 'symbol))
>> 999
(a2r 999)
>> CMXCIX


исходный код
String integerToRoman(int n) {
String[] a = new String[]{"I","IV","V","IX","X","XL","L","XC","C","CD","D","CM","M"};
int[] b = new int[]{1,4,5,9,10,40,50,90,100,400,500,900,1000};
String s = "";
for (int i = a.length - 1; i >= 0; i--) {
while (n >= b[i]) {
s += a[i];
n -= b[i];
}
}
return s;
}

с первого сайта по запросу "перевод чисел из арабской"
I wish I'd made you angry earlier

ander-skirnir

Members


Статус

227 сообщений
http://lisper.ru
Где: Ukraine
Род занятий: `'`,`',`',
Возраст: 30

#3820   2011-01-07 00:47 GMT+3 часа(ов)      
Для того, что происходит в table, кстати, есть case:
(defun encode (sym)
(case sym
(I 1) (V 5) (IV 4) (IX 9)
(X 10) (XL 40) (L 50) (XC 90)
(C 100) (CD 400) (D 500) (CM 900)
(M 1000)))

ander-skirnir

Members


Статус

227 сообщений
http://lisper.ru
Где: Ukraine
Род занятий: `'`,`',`',
Возраст: 30

#3821   2011-01-07 20:55 GMT+3 часа(ов)      
Могу еще покритиковать, если интересно

megamanx

Members


Статус

307 сообщений

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

#3822   2011-01-07 21:55 GMT+3 часа(ов)      
заинтриговал... валяй.
I wish I'd made you angry earlier

ander-skirnir

Members


Статус

227 сообщений
http://lisper.ru
Где: Ukraine
Род занятий: `'`,`',`',
Возраст: 30

#3824   2011-01-08 01:02 GMT+3 часа(ов)      
Ну я чисто по стилю, по подходу критиковать как-то некорректно, потому что на Лиспе каждый всё-равно пишет по-своему - одни фп'шат, другие loop/iterate, третьи вообще как на асме с prog/tagbody/go, четвёртные городят какую-то научную фантастику с велосипедными континуациями, пятые "мультимоделируют" "предметную область" и под каждую задачу пишут edsl и т.д.

> (if (> n 99999) (error "too long number"))

Если в if'е используется только первая ветка, хорошим тоном считается использовать when, если вторая - unless.

>
(let ((a '("I" "IV" "V" "IX" "X" "XL" "L" "XC" "C" "CD" "D" "CM" "M")) ...
(c '(I IV V IX X XL L XC C CD D CM M)) ...

Символы знают своё имя, почему бы этим не воспользоваться ?:
(let* ((c '(I IV V IX X XL L XC C CD D CM M))
(a (mapcar #'symbol-name c)))
form*)


> (cond (pred form) (t otherwise-form))

Это же if:
(if pred form otherwise-form)


>
(labels ((foo ...))
(labels ((bar ...))
form*))

Всё-таки нам предлагают labels, а не label, почему бы тогда не ?:
(labels ((foo ...)
(bar ...))
form*))


+ уже сказанное про case

Итого, с учётом перечисленного:
(defun a2r (n &key (as 'string))
(when (> n 99999)
(error "too long number"))
(let* ((b '(1 4 5 9 10 40 50 90 100 400 500 900 1000))
(c '(I IV V IX X XL L XC C CD D CM M))
(a (mapcar #'symbol-name c))
(newn n))
(labels ((ret (i s)
(if (< newn (nth i b)) s
(progn (setq newn (- newn (nth i b)))
(ret i (concatenate 'string s
(nth i a))))))
(retSym (i s)
(if (< newn (nth i b)) s
(progn (setq newn (- newn (nth i b)))
(retSym i (append s (list (nth i c))))))))
(case as
(string
(labels ((retString (i s)
(if (< i 0) s
(retString (1- i)
(concatenate 'string s
(ret i nil))))))
(retString (1- (length a)) nil)))
(symbol
(labels ((retSymbol (i s)
(if (< i 0) s
(retSymbol (1- i)
(append s (retSym i nil))))))
(retSymbol (1- (length a)) nil)))
(otherwise
(error "unknown type-spec"))))))


CL вообще достаточно объёмный, без обмена опытом с другими Лисперами многие вещи могут долго оставаться за кулисами.
Я о многих вещах тоже узнал из критики своего кода.

misha

Moderators


Статус

1275 сообщений
http://racket-lang.org/
Где: Yemen
Род занятий:
Возраст:

#3825   2011-01-08 01:45 GMT+3 часа(ов)      
> четвёртные городят какую-то научную фантастику с велосипедными континуациями
О каком Лиспе идет речь? И что Вы имели ввиду под "велосипедными континуациями"?

ander-skirnir

Members


Статус

227 сообщений
http://lisper.ru
Где: Ukraine
Род занятий: `'`,`',`',
Возраст: 30

#3826   2011-01-08 02:26 GMT+3 часа(ов)      
> О каком Лиспе идет речь?
Пишу "Лисп" подразумеваю чаще всего CL, иногда - любой другой близкий Лисп ( как вот сейчас : ). Дело в том, что такие Лиспы, как maclisp, interlisp, zetalisp, microlisp, islisp, common-lisp похожи между собой, а Схемы концептуально уходят несколько в сторону, можно сказать, ответвляются в своё направление.

> что Вы имели ввиду под "велосипедными континуациями"?
cl-cont
arnesi/cps-tran

В Схеме, с континуациями, разумеется, всё ок, и там они не велосипедные

megamanx

Members


Статус

307 сообщений

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

#3833   2011-01-09 01:13 GMT+3 часа(ов)      
1. Спасибо. Действительно, так логичнее
2. Мой стиль, это... ну, в общем сильно зависит от того, что я последнее читал. Вот перед этим почитал let over lambda.
3. Что такое велосипедные инсинуации?
I wish I'd made you angry earlier

ander-skirnir

Members


Статус

227 сообщений
http://lisper.ru
Где: Ukraine
Род занятий: `'`,`',`',
Возраст: 30

#3834   2011-01-09 01:55 GMT+3 часа(ов)      
> инсинуации
Ну хорошо, из перечисленных концепций, я действительно недолюбливаю континуации конкретно в CL, потому что у нас они глючные, тормозные и совершенно немайнтабельные.

misha

Moderators


Статус

1275 сообщений
http://racket-lang.org/
Где: Yemen
Род занятий:
Возраст:

#3836   2011-01-09 17:04 GMT+3 часа(ов)      
> Ну хорошо, из перечисленных концепций, я действительно недолюбливаю континуации конкретно в CL, потому что у нас они глючные, тормозные и совершенно немайнтабельные.
Несмотря на кажущуюся простоту CPS преобразования, эффективная реализация продолжений(континуаций) является довольно нетривиальной задачей. А применяется оно в основном для создания трансляторов с ФЯП в Си(например). Представленные выше библиотеки повторяли идеи 36 летней давности, поэтому не стоит удивляться их глючности и медлительности.

ander-skirnir

Members


Статус

227 сообщений
http://lisper.ru
Где: Ukraine
Род занятий: `'`,`',`',
Возраст: 30

#3837   2011-01-09 17:06 GMT+3 часа(ов)      
Глючности их не стоит удивляться хотя-бы по причине наличия unwind-protect.

Vera Naumova

Members


Статус

16 сообщений

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

#3838   2011-01-09 20:11 GMT+3 часа(ов)      
Спасибо за обсуждение моей темы! но что-то это слишком сложное для меня.. мне вообще нужно написать на хlisp'e, а этот текст как раз на нем? или он на cl?? и все же хотелось бы просто добавить несколько условий в код joba, он мне намного понятнее(( если кто может, помогитееее. спасибо еще раз, Вера.
> 1 <


Онлайн :

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