Имя: Пароль:
IT
 
головоломка с Паскалем!!! Римские цифры
0 program345
 
29.07.14
13:30
Всем привет!

if you want's ломать голову then для ВАС:

Каким образом составить алгоритм для перевода римских цифр в арабские? для простоты только римские I V X.
Алгоритм должен учитывать, что XI - одиннадцать,
IX - девять
VV - вываливается ошибка ввода

и т.д.
1 Euguln
 
29.07.14
13:32
ИМХО. обрабатывать как строку, символьный анализ.
2 vde69
 
29.07.14
13:32
халявщик?
v8: конкурс по оптимизации кода pascal

первую тебе решили, давай сумму выкатывай за вторую...
3 Garykom
 
гуру
29.07.14
13:33
(0) ЭЭЭ форумом ошибся? Не?
4 vde69
 
29.07.14
13:33
(0)

XIX - это сколько?
5 Asmody
 
29.07.14
13:34
(0) пиши конечный автомат
6 NikVars
 
29.07.14
13:34
(0) Я так мыслю. Сначала нужно задачу решить математически. Какие у тебя математические варианты?
7 NikVars
 
29.07.14
13:35
(0) VV - это сколько?
8 NikVars
 
29.07.14
13:36
10 или 55?
9 fmrlex
 
29.07.14
13:36
Я тоже за автомат
10 Garykom
 
гуру
29.07.14
13:37
(4) ну я думаю 19 но не уверен ))
(5) зачем оно если банальное СтрЗаменить не осилит ))
типа IIII > 4, VI > 6
тока учесть порядок замены ))

(8) ошибка ввода уже написано в (0)
11 Фокусник
 
29.07.14
13:37
(7) Это ошибка, и в (0) про это сказано: "VV - вываливается ошибка ввода" ;)
12 fmrlex
 
29.07.14
13:37
13 Asmody
 
29.07.14
13:37
(7) VV — это ошибка. 55 это LV
14 Любопытная
 
29.07.14
13:38
(10) а четыре разве не IV записываеся?
15 NikVars
 
29.07.14
13:38
(13) Зачем кайф ломаешь?!
:))
16 Garykom
 
гуру
29.07.14
13:38
(14) правильно, у меня просто пример ))
17 Ymryn
 
29.07.14
13:41
(4) это 19, ибо 1110 - это ошибка. Вообще интересная задача.
18 Garykom
 
гуру
29.07.14
13:43
(14) и (16)+ хотя по вики

"Повсеместно записывать число «четыре» как «IV» стали только в XIX веке, до этого наиболее часто употреблялась запись «IIII». Однако запись «IV» можно встретить уже в документах манускрипта «Forme of Cury», датируемых 1390 годом. На циферблатах часов в большинстве случаев традиционно используется «IIII» вместо «IV», главным образом, по эстетическим соображениям: такое написание обеспечивает визуальную симметрию с цифрами «VIII» на противоположной стороне, а перевёрнутую «IV» прочесть труднее, чем «IIII». Существует и версия, что IV на циферблате не писалось потому, что IV - первые буквы имени бога Юпитера (IVPITER)."
19 NikVars
 
29.07.14
13:44
(17) Это задача уровня школьной олимпиады. Оригинальная, но типовая. Причем если речь идет о числах, то чуток посложнее, а тут в (0) речь идет о цифрах. Чел не может 10 вариантов перебрать.
20 NikVars
 
29.07.14
13:45
В самой постановке вопрос в (0) противоречие.
XI - одиннадцать - это не арабские цифры и не римские цифры.
21 Ymryn
 
29.07.14
13:46
(19) а в примерах числа. Тем более, что задача о цифрах вообще неинтересна.
22 Lama12
 
29.07.14
13:47
(0) Старая, старая книжка - "128 советов начинающему программисту". Там есть код программы выполняющей перевод, причем на нескольких языках. В том числе и на паскале.
Тут на яве. http://habrahabr.ru/post/136646/
Берем и переводим в паскаль.
Проблем-то...
23 Garykom
 
гуру
29.07.14
13:49
(22) проблема-то что обратно нужно из арабов в латинян ))
24 Фокусник
 
29.07.14
13:49
(19) ИМХО. Начиная с определенного года рождения "цифры" = "числа" ;)
25 Asmody
 
29.07.14
13:51
Перевод без проверки корректности:

    Перевод = СтрЗаменить(
            СтрЗаменить(
            СтрЗаменить(
            СтрЗаменить(
            СтрЗаменить(
            СтрЗаменить(
            СтрЗаменить(
            СтрЗаменить(
            СтрЗаменить(
            СтрЗаменить(
            СтрЗаменить(
            СтрЗаменить(
            СтрЗаменить(
            Римское
            , "IV", "4+")
            , "IX", "9+")
            , "XXX", "30+")
            , "XX", "30+")
            , "XIII", "13+")
            , "XII", "12+")
            , "XI", "11+")
            , "X", "10+")
            , "VIII", "8+")
            , "VII", "7+")
            , "VI", "6+")
            , "V", "5+")
            , "III", "3+")
            , "II", "2+")
            , "I", "1+");
    Сообщить(Перевод);
    Перевод = Перевод + "0";
    Сообщить(Вычислить(Перевод));
26 1Сергей
 
29.07.14
13:51
кошмар, сколько мистюков римских чисел не знают...
27 Garykom
 
гуру
29.07.14
13:51
(24) это про проблему 86?
28 Timon1405
 
29.07.14
13:52
БСП POWER:

Функция ПреобразоватьЧислоВАрабскуюНотацию(РимскоеЧисло, ИспользоватьКириллицу = Истина) Экспорт
    
    АрабскоеЧисло=0;
    
    Если ИспользоватьКириллицу Тогда
        c1 = "1"; c5 = "У"; c10 = "Х"; c50 = "Л"; c100 ="С"; c500 = "Д"; c1000 = "М";
        
    Иначе
        c1 = "I"; c5 = "V"; c10 = "X"; c50 = "L"; c100 ="C"; c500 = "D"; c1000 = "M";
        
    КонецЕсли;
    
    РимскоеЧисло = СокрЛП(РимскоеЧисло);
    ЧислоСимволов = СтрДлина(РимскоеЧисло);
    
    Для Сч=1 По ЧислоСимволов Цикл
        Если Сред(РимскоеЧисло,Сч,1) = c1000 Тогда
            АрабскоеЧисло = АрабскоеЧисло+1000;
        ИначеЕсли Сред(РимскоеЧисло,Сч,1) = c500 Тогда
            АрабскоеЧисло = АрабскоеЧисло+500;
        ИначеЕсли Сред(РимскоеЧисло,Сч,1) = c100 Тогда
            Если (Сч < ЧислоСимволов) И ((Сред(РимскоеЧисло,Сч+1,1) = c500) ИЛИ (Сред(РимскоеЧисло,Сч+1,1) = c1000)) Тогда
                АрабскоеЧисло = АрабскоеЧисло-100;
            Иначе
                АрабскоеЧисло = АрабскоеЧисло+100;
            КонецЕсли;
        ИначеЕсли Сред(РимскоеЧисло,Сч,1) = c50 Тогда
            АрабскоеЧисло = АрабскоеЧисло+50;
        ИначеЕсли Сред(РимскоеЧисло,Сч,1) = c10 Тогда
            Если (Сч < ЧислоСимволов) И ((Сред(РимскоеЧисло,Сч+1,1) = c50) ИЛИ (Сред(РимскоеЧисло,Сч+1,1) = c100)) Тогда
                АрабскоеЧисло = АрабскоеЧисло-10;
            Иначе
                АрабскоеЧисло = АрабскоеЧисло+10;
            КонецЕсли;
        ИначеЕсли Сред(РимскоеЧисло,Сч,1) = c5 Тогда
            АрабскоеЧисло = АрабскоеЧисло+5;
        ИначеЕсли Сред(РимскоеЧисло,Сч,1) = c1 Тогда
            Если (Сч < ЧислоСимволов) И ((Сред(РимскоеЧисло,Сч+1,1) = c5) ИЛИ (Сред(РимскоеЧисло,Сч+1,1) = c10)) Тогда
                АрабскоеЧисло = АрабскоеЧисло-1;
            Иначе
                АрабскоеЧисло = АрабскоеЧисло+1;
            КонецЕсли;
        КонецЕсли;
    КонецЦикла;
    
    Возврат АрабскоеЧисло;
    
КонецФункции
29 Фокусник
 
29.07.14
13:53
(27) Вроде того :)
30 program345
 
29.07.14
13:53
(4) XIX - девятнадцать.
31 Garykom
 
гуру
29.07.14
13:54
(28) ща будут жалобы что ошибку на VV не выдает ))
32 Garykom
 
гуру
29.07.14
13:55
(30) Мы как бы в курсе, wiki:Римские_цифры просмотрели.
33 program345
 
29.07.14
13:59
var
    i,n,state:integer;
    symbol:char;
    str:string;
    ok:boolean;

begin

    state := 1;
    ok:=true;
    n := 0;

    readln(str);
    for i:=1 to length(str) do
    begin
    symbol:=str[i];
        if ((symbol = 'X') or (symbol = 'V') or (symbol = 'I')) then
        begin
            case state of
            1: case symbol of
                'X': begin n := 10; state := 2; continue; end;
                'V': begin n := 5; state := 3; continue; end;
                'I': begin n := 1; state := 4; continue; end;
                end;
            2: case symbol of
                'X': begin n :=n+10; if i>3 then begin ok:=false; break; end else continue; end;
                'V': begin n := n + 5; state := 3; continue; end;
                'I': begin n := n + 1; state := 4; continue; end
               end;
            3: case symbol of
                'X', 'V': begin ok := false; break; end;
                'I': begin n := n + 1; state:=4; continue; end
               end;
            4: case symbol of
                'X':begin n:=n+8; break; end;
                'V': begin n:=n+3; break; end;
                'I': begin n := n + 1; state := 5; continue; end
               end;
            5: case symbol of
                'X', 'V': begin ok := false; break; end;
                'I': begin n := n + 1; state := 6; continue; end
               end;
            6: begin ok:=false; break; end;
            end;
            end
            else
            begin
                    writeln('Error, try typing in capital letters. ');
            end;
            end;
            if not ok then begin write('The number was incorrect. Try again. ');  end else write(n);
end.
34 fmrlex
 
29.07.14
14:18
(33) А чего ссылку на автора не приложил?
35 NikVars
 
29.07.14
15:02
(33) Ужасная "реализация"...
Объясни чего там происходит и как выходит.
36 wertyu
 
29.07.14
15:06
(0) зачем тебе эти цифры: ????????? ?
37 wertyu
 
29.07.14
15:07
+(36) не отобразилось )
http://clip2net.com/s/iCBSui
38 DirecTwiX
 
29.07.14
15:45
Слева-направо...
1) Нашли число, запомнили
2.1) Если следующее больше в два раза или меньше (чем в два раза), то ошибка
2.2) Если больше более чем в два раза, то вычитаем из него
2.3) Если равно, то прибавляем все такие числа
2.4) Если меньше, то кладём в буфер и переходим к 1)

Как-то так.
39 Крошка Ру
 
29.07.14
15:49
(33) Боже, как ужасно...
Я бы сделал массив соответствия и по нему анализировал введенную строку
40 NS
 
29.07.14
15:50
http://ru.wikipedia.org/wiki/Римские_цифры
смотрим конец статьи, примеры кода и для перевода, и для проверки корнектности.
41 Крошка Ру
 
29.07.14
15:55
(33) Ахах, 'Error, try typing in capital letters. '

Функция "UpCase"? Не, не слышал.
42 kokamoonga
 
30.07.14
21:42
(0) на checkio.org есть такая задачка. только для python

собственно:

def checkio(number):
    
    if not number:
        return None
    
    roman = ''
    
    s = list(str(number))
    s.reverse()
    
    rules = {'1': '1', '2': '11', '3': '111', '4': '15', '5': '5', '6': '51',
             '7': '511', '8': '5111', '9': '1X', 'X': 'X'}
            
    subs = [{'1': 'I', 'X': 'X', '5': 'V'}, {'1': 'X', 'X': 'C', '5': 'L'},
            {'1': 'C', 'X': 'M', '5': 'D'}, {'1': 'M'}]        
    
    i = 0
    for i in range(0, s.__len__()):
        
        if not s[i] == '0':
            rule = rules[s[i]]
            roman_digit = ''
        
            for digit in rule:
                roman_digit += subs[i][digit]
            
            roman = roman_digit+roman
        
        i += 1  

    return roman
43 Жан Пердежон
 
31.07.14
11:55
у нас в школе были такие задачки...
44 Ёпрст
 
31.07.14
11:58
(43) таже фигня
45 Крошка Ру
 
31.07.14
12:10
(42)Тоже на VV не ругается
46 NS
 
31.07.14
12:25
Сделать список запрещенных сочетаний, да и проверить по нему.
47 kokamoonga
 
31.07.14
12:25
(45) Хм... Я вроде и не писал, что это функция верификации. Ограничения в рамках условий задачи. Если использовать ее штатно, то "VV" просто не возникнет.
48 kokamoonga
 
31.07.14
12:29
(47) + собственно результаты выполнения:

checkio(55) # LV
checkio(555) # DLV
49 NS
 
31.07.14
12:31
Что-то я туплю. Если нужна проверка на совсем строгую запись - преобразуем в арабские, потом обратно в римские, если не соответствует исходному - значит ошибка.
50 Garykom
 
гуру
31.07.14
12:45
(49) проблема в возможности по разному записать одинаковые числа римскими цифрами ))
51 kokamoonga
 
31.07.14
12:54
(50) кроме "IIII" <=> "IV" есть еще примеры разной записи? Приведенный пример в настоящее время интересен с исторической точки зрения, повсеместно ипользуюется вариант "IV".
52 Garykom
 
гуру
31.07.14
12:58
(51) "например, в программе Microsoft Excel при преобразовании арабских цифр в римские при помощи функции «РИМСКОЕ()» можно использовать несколько видов представления чисел, от классического до сильно упрощенного

(так, число 499 может быть записано как CDXCIX, LDVLIV, XDIX, VDIV или ID)."

"из вики"
53 kokamoonga
 
31.07.14
13:08
(52) Полагаю, слово "римские" все же устанавливает некое отношение древнеримской цивилизации к этой системе записи чисел. Вот когда они начнут называться редмондские цифры, тогда наверно мы сможем всерьез обсуждать какие именно стандарты записи установила компания Microsoft
54 Garykom
 
гуру
31.07.14
13:20
(53) Хорошо, какие правила записи чисел римскими цифрами Вы считаете истинно римскими?

Если сами римляне в разные времена писали по разным правилам ))

Если те, что сейчас считаются "классическими" то да, но в задании (0) ничего не говорится о правилах )), только что XI-11 и IX-9 и что VV-ошибка и все.

Ни про какие варианты вычитания и что в классических их только 6 речи нет.
А предполагать например на олимпиаде по программированию или еще где, что все должны знать "классические" правила нелепо и говорит об "уровне знаний" составителя задач.
55 Garykom
 
гуру
31.07.14
13:26
(54)+ пример который верен по (0) и неверен по классическим: XVIV
56 NikVars
 
31.07.14
14:51
(55) В (0) не олимпиадная задача с вылизанным условием, а вольный пересказ пацанчика, путающего цифры с числами.
57 k vad
 
31.07.14
14:53
Перем РимскийСимвол[100], АрабскийСимвол[100];
Перем СтрРимская, СтрАрабская;
Процедура Сформировать()
    времРимскоеЧисло = СокрЛП(РимскоеЧисло);
    КолСимволов = 0;
    Для н  = 1 по СтрДлина(времРимскоеЧисло) Цикл
        РимскийСимвол[н] = Сред(времРимскоеЧисло,н,1);
        КолСимволов = КолСимволов + 1;
    КонецЦикла;
    
    
    Для н = 1 по КолСимволов Цикл
        Позиця = Найти(СтрРимская,РимскийСимвол[н]);
        Если Позиця = 0 Тогда
            Сообщить("Неверный символ");
            Возврат;
        КонецЕсли;
        АрабскийСимвол[н] = Число(Сред(СтрАрабская,Позиця-3,4));
        Итог = АрабскийСимвол[н];
    КонецЦикла;
    
    ПредСимвол = 0;
    Совпадений = 1;
    Для н  = -КолСимволов по -1 Цикл
        текСимвол = АрабскийСимвол[-н];
        Если ПредСимвол  <> 0 Тогда
            Если (ПредСимвол>текСимвол) и (АрабскийСимвол[-н]<>АрабскийСимвол[-н+1]) Тогда
                Итог = ПредСимвол - текСимвол;
            Иначе
                Итог = ПредСимвол + текСимвол;
            КонецЕсли;
        КонецЕсли;
        
        Если АрабскийСимвол[-н]=АрабскийСимвол[-н+1] Тогда
            Совпадений = Совпадений +1;
            Если АрабскийСимвол[-н] = 5 Тогда
                Совпадений = 4;
            КонецЕсли;
        КонецЕсли;

        ПредСимвол = Итог;
    КонецЦикла;
    Если Совпадений >= 4 Тогда
        Сообщить("Неверное Число");
    Иначе
        Сообщить(Итог);    
    КонецЕсли;
КонецПроцедуры

СтрРимская = "   I   V   X   L   C   D   M";
СтрАрабская= "0001000500100050010005001000";
58 kokamoonga
 
31.07.14
18:34
(55) В (0) всего лишь некорректное изложение задачи.

Римские цифры это архаичная система представления чисел, которая не используется для счета уже достаточно давно. Соответственно, я считаю, что актуальным на сегодня является вариант наиболее поздний из принятых во время существования Римской империи. То есть, 4 = IV (а не IIII), 9 = IX (а не VIIII). Вычитание стоящей справа цифры возможно только для соседних разрядов ( XC == 90, IC != 99, 99 == 'XCIX' ).

Когда задача составлена без уточнений, возникает почва для легкого троллинга. На checkio.org задача составлена вполне конкретно и такого вопроса не возникает вовсе:


Римские цифры пришли к нам из древней римской системы счета. Они основаны на особых буквах алфавита, которые в различных сочетаниях, путем суммирования (а иногда и разницы) описывают различные числа. Первые 10 римских чисел это:
I, II, III, IV, V, VI, VII, VIII, IX, and X.
Римская система счета имеет десятичное основание, но она непозиционная и не включает в себя 0 (ноль). Римские числа образуются путем комбинации следующих семи символов:
Символ - Значение
I 1 (unus)
V 5 (quinque)
X 10 (decem)
L 50 (quinquaginta)
C 100 (centum)
D 500 (quingenti)
M 1,000 (mille)
Узнать больше о римских цифрах вы можете в статье на Википедии.
В этой задаче, вам необходимо преобразовать данное целое число (от 1 до 3999) в римскую систему счета.
Вх. данные: Число, как целочисленное (int).
Вых. данные: Римское число, как строка (str).
Предусловия: 0 < number < 4000



Тем не менее, когда идет речь об общеизвестном явлении без уточнения, всегда имеется в виду наиболее распространенный его вариант. А наиболее распространенный вариант римской нотации записи чисел я описал вкратце выше в этом посте.
59 Garykom
 
гуру
31.07.14
18:41
(58) чем неправильно XVIV ? Почему правильно XIX ?
60 kokamoonga
 
31.07.14
18:45
(59) тем, что в наиболее поздней версии римских цифр 9 записывается как IX.
61 Garykom
 
гуру
31.07.14
18:55
(60) а у нас нету цифры 9 )) у нас есть число 19
62 kokamoonga
 
31.07.14
19:00
(61) число 19 записывается как сумма десятков, коих в этом числе ровно 1 ( в римской нотации X), и единиц, коих в этом числе 9 (IX). То есть в итоге имеем XIX.

Не стоит в дурачка играть, это даже за приличный троллинг не прокатит.
63 Garykom
 
гуру
31.07.14
19:11
(62) может это другим не стоит в дурачка играть? у римлян не было цифр как мы воспринимаем 1-9, а были только I V X и т.д.
т.е. были цифры 1, 5, 10 и т.д.
64 Garykom
 
гуру
31.07.14
19:12
чтобы попроще давайте перейдем на монеты с которыми и связана скорее всего их система счисления...

есть монеты 1 5 и 10 уе
нужно отдать 19 уе
65 Garykom
 
гуру
31.07.14
19:14
скорее всего монеты в 1 уе были всегда у всех то проще отдать 2 монеты по 10 и получить в сдачу 1 монету в 1 уе чем находитьу себя 3 монеты в 10, 5, еще раз 5 и снова сдачу в 1 уе трясти

а еще проще дать монеты 10 5 и 4х1 т.е. XVIIII

думаю что тогда те кто умел писать и считать автоматом преобразовывали более длинную запись в более короткую - чернила и бумага дорогие и все вам правила ))
66 kokamoonga
 
31.07.14
19:17
(65) после (63) и (64) я начал было писать вам развернутый ответ, но передумал.

Конечно, все дело в монетах. Мы ведь и сейчас для счета используем воображаемые вами римские монеты. Хотя, я лично предпочитаю считать на пальцах, древние римские монеты, знаете ли, не всегда под рукой.
67 Garykom
 
гуру
31.07.14
19:26
(66) да ладно это просто гипотеза )) чувство юмора то должно быть...

а вы 19 как покажете? на пальцах?
68 kokamoonga
 
31.07.14
19:30
(67) Да гипотеза гипотезой. И я соглашусь, что она имеет право на жизнь.

Только какое она отношение имеет к наиболее рапространенному на данный момент варианту записи чисел при помощи римских цифр?

Правильный ответ на этот вопрос: ровным счетом никакого.

Это что касается дискутируемого вопроса.


А на пальцах я 19 никак не покажу. В силу очевидных ограничений такого способа счисления, я умею считать только до 10.
69 Garykom
 
гуру
31.07.14
19:31
(67)+ можно например скрестить руки X = 10 и растопырить пальцы загнув один IIIII и IIII

но неудобно считать тому кому показываете придется 9 пальце не проще ли на одной руке показать V (причем показывали обычно сложив 4 пальца вместе с указательного до мизинца и отогнув большой, рогатка в  виде указательного и среднего это более позднее изобретение) и на второй руке IIII (т.е. сложу один палец)
70 Garykom
 
гуру
31.07.14
19:33
(69)+ "сложу один палец" = загну один палец из 5
71 Крошка Ру
 
31.07.14
19:33
(67) 19 показать - не проблема. Даже 21 не проблема (если показывает мужчина). А вот дальше даже не знаю...
Хотя нет, знаю - был же ещё рабовладельческий строй, так что проблема с потребным количеством пальцев решалась относительно просто.
72 Garykom
 
гуру
31.07.14
19:34
(68) хорошо вы руками и пальцами по очереди показывате числа чтобы получилось полное число...
73 Garykom
 
гуру
31.07.14
19:35
Банальный пример это язык жестов, кто в курсе как там числа показывают?
74 1Сергей
 
01.08.14
09:33
(73) я в курсе
75 Garykom
 
гуру
01.08.14
10:31
(74) так как числа показывают?
76 NikVars
 
01.08.14
10:52
(58) Нафига ты тут все это запостил?! Да еще и источник не указал?! И в википедию послал, да без ссылки...
Ты если уж начал жевать, так жуй нормально, конспективно-реферативно, излагай что-то новое и занимательно-наглядное, прилагай фото, видео.
77 kokamoonga
 
01.08.14
14:49
(76) Так и думал, что что-то забыл.

Забыл получить твое одобрение, прежде чем что-то постить. Горе мне горе.
Кaк может человек ожидaть, что его мольбaм о снисхождении ответит тот, кто превыше, когдa сaм он откaзывaет в милосердии тем, кто ниже его? Петр Трубецкой