Перейти к содержимому

Фотография

Римские цифрыЗадача для настоящих программистов


  • Авторизуйтесь для ответа в теме
Сообщений в теме: 23

#1
Mr. Bool

Mr. Bool
  • Завсегдатай
  • 115 сообщений

Привет всем. Предлагаю интересную задачу - преобразование обычных цифр в римские. Напишите программу, в которой пользователь вводит обычные (арабские) цифры, а программа преобразует их в римские. Все вводимые числа целые и положительные, от 1 и больше.

 

Если кто не знает или забыл, для записи таких чисел древние римляне использовали всего 7 цифр.

 

Скрытый текст

 

Если число было невозможно записать одной из этих основных цифр, то использовались их сочетания.

 

Скрытый текст

 

Язык программирования можете использовать любой. Главное, чтобы ваша программа выдавала правильные результаты.

 

Скрытый текст

 

У вас должна получиться программа примерно такого вида:

 

b6MPvdyC71.png


  • 0

#2
T-800 Danya

T-800 Danya
  • Свой человек
  • 653 сообщений

И тогда вы получите от меня плюсик в вашу репутацию  ;)

 

ИМХО для Участника который по его словам получил БОЛЬШОЕ наследство ;)  и который вроде как  по его же словам тратит Большие ДЕНЬГИ на Благотворительность ;)   - Плюсик в Репутацию  ИМХО  как-то совсем  НЕ Солидно :faceoff:

 

ЗЫ Я не хочу показывать пальцем, но к примеру другие Участники, когда Давали подобные Задачки то кидали в Призовой Фонд хотя бы Пятерку ;)

ЗЗЫ Причем насколько я слышал данные Участники  НЕ Миллионеры от слова ВООБЩЕ :dandy:


Сообщение отредактировал T-800 Danya: 07.10.2019, 20:16:26

  • 0

#3
Mr. Bool

Mr. Bool
  • Завсегдатай
  • 115 сообщений
ИМХО для человека, который по его словам получил БОЛЬШОЕ наследство и который вроде как по его же словам тратит Большие ДЕНЬГИ на Благотворительность - Плюсик в Репутацию вообще ИМХО как-то совсем НЕ Солидно

 

ЗЗЫ Причем насколько я слышал данные Участники  НЕ Миллионеры от слова ВООБЩЕ

 

Миллионером я себя никогда не называл, не выдумывайте. Насчет моего "большого наследства" успокойтесь, это была шутка (читайте внимательно, там смайлик был). И вообще, что мы здесь обсуждаем? Предложенную в данной теме задачу? Или персонально меня, мою личность?

 

Не устраивайте здесь базарную торговлю. 

 

Решайте предложенную задачу, если она вам интересна. Иначе лучше не засоряйте мою тему посторонней болтовней.


Сообщение отредактировал Mr. Bool: 07.10.2019, 20:14:58

  • -1

#4
T-800 Danya

T-800 Danya
  • Свой человек
  • 653 сообщений

Решайте предложенную задачу, если она вам интересна. Иначе лучше не засоряйте мою тему посторонней болтовней.

 
ИМХО было бы чего решать...  :dandy:
 
См. https://rextester.com/SHS7587

Сообщение отредактировал T-800 Danya: 07.10.2019, 21:28:00

  • 0

#5
Mr. Bool

Mr. Bool
  • Завсегдатай
  • 115 сообщений

Ну что ж, я попробовал Ваше решение. Задал навскидку несколько конкретных чисел на входе. Ваш код работает может быть и правильно, но только до значения 3999 => MMMCMXCIX. Начиная с 4000, Ваша программа валится с ошибкой 

IndexError: string index out of range

 


Если распишите спецификацию на алгоритм и объясните в чем его "магия" SIA/OOO/ТOO Green Dragons внесет в Ваш призовой Фонд данной ТЕМЫ 20$ которым Вы можете распоряжаться по Вашему усмотрению - т.е. хотите на Призы участникам, хотите на Благотворительность, Хотите на собственные Нужды

 

По причине, указанной выше, с предложенным в Вашем решении алгоритмом я не стал разбираться.

 

Скрытый текст

 

Спасибо за Ваше предложение $20. Но нет, я пожалуй откажусь. Сами направляйте их на призы или на благотворительность, по Вашему усмотрению.  :hi:


  • 0

#6
T-800 Danya

T-800 Danya
  • Свой человек
  • 653 сообщений

Спасибо за Ваше предложение $20. Но нет, я пожалуй откажусь. Сами направляйте их на призы или на благотворительность, по Вашему усмотрению.  :hi:

 

 
Ага.. ага... Конечно направим... Но при ТОМ условии Что Вы  разберетесь в Алгоритме в котором  как Вы уже Заметили  Ограничение до 4000 задано  ;)   
 
Вот разберитесь в Алгоритме, Снимите ограничение... И тогда мы с удовольствием направим 20$ на призы Вашего Конкурса в Качестве Генерального Спонсора ;)


Сообщение отредактировал T-800 Danya: 07.10.2019, 23:34:22

  • 0

#7
T-800 Danya

T-800 Danya
  • Свой человек
  • 653 сообщений

Хотя использование в алгоритме функции sqrt(), то есть извлечение квадратного корня, это интересный способ натягивания совы на глобус... ;)


Ну тык для Вас же старались  :dandy:   Ведь  Вы же вроде говорили что любите Python...

 

Вот мы и выбрали самый прикольный Алгорим... Чтобы Вам интересней в нем  БЫЛО разбираться :idea:


Сообщение отредактировал T-800 Danya: 07.10.2019, 23:35:21

  • 0

#8
Mr. Bool

Mr. Bool
  • Завсегдатай
  • 115 сообщений
Ага.. ага... Направим направим... Но при ТОМ условии Что Вы разберетесь в Алгоритме в котором как Вы верно Заметили Ограничение до 4000 задано Вот разберитесь в Алгоритме, Снимите ограничение... И тогда мы с удовольствием направим 20$ на призы Вашего Конкурса в Качетсве Генерального Спонсора

 

Когда мне будет это необходимо, или если мне это будет интересно, я разберусь в Вашем (или на самом деле не Вашем) алгоритме. 

 

Кто еще хочет предложить свои варианты решения предложенной в данной теме задачи? Есть желающие?

 

________

UPDATE: Извиняюсь, моя ошибка! Перед тем как создавать эту тему, мне сначала надо было просто посмотреть в Яндексе, есть ли для данной задачи готовые решения. Оказывается, есть! Их много и найти их легко! :faceoff:  

 

Все, данную тему можно закрывать. Спасибо за внимание.


Сообщение отредактировал Mr. Bool: 08.10.2019, 00:12:05

  • -1

#9
T-800 Danya

T-800 Danya
  • Свой человек
  • 653 сообщений

 

Ага.. ага... Направим направим... Но при ТОМ условии Что Вы разберетесь в Алгоритме в котором как Вы верно Заметили Ограничение до 4000 задано Вот разберитесь в Алгоритме, Снимите ограничение... И тогда мы с удовольствием направим 20$ на призы Вашего Конкурса в Качетсве Генерального Спонсора

 

Когда мне будет это необходимо, или если мне это будет интересно, я разберусь в Вашем (или на самом деле не Вашем) алгоритме. 

 

Скрытый текст

 

Ну  Ясень же Пень  :dandy:   - че Алгорим так же как  как и ваша Задачка  взяты  из Учебника...  :D

 

Только для Вашей задачки решение МОЖНО тупо списать...  А вот для той что Мы  подкинули - В ней  придется чуток Поразбираться  ;)


Сообщение отредактировал T-800 Danya: 08.10.2019, 00:05:05

  • 0

#10
Nurlan74

Nurlan74
  • Постоялец
  • 319 сообщений

Снимите ограничение...

Если я правильно понял, для снятия ограничения нужно просто дополнять символы в переменной alpha, например добавив в конце символ F (не смог указать настоящий римский символ обозначающий 4000 стоящий после M, что-то наподобие V с чертой сверху)

В итоге алгоритм выдал результат для числа 4001

4001 => MFI


  • 0

#11
T-800 Danya

T-800 Danya
  • Свой человек
  • 653 сообщений

Все, данную тему можно закрывать. Спасибо за внимание.



Сообщение отредактировал T-800 Danya: 08.10.2019, 00:33:19

  • 0

#12
T-800 Danya

T-800 Danya
  • Свой человек
  • 653 сообщений

 

Снимите ограничение...

Если я правильно понял, для снятия ограничения нужно просто дополнять символы в переменной alpha, например добавив в конце символ F (не смог указать настоящий римский символ обозначающий 4000 стоящий после M, что-то наподобие V с чертой сверху)
В итоге алгоритм выдал результат для числа 4001
4001 => MFI

 


Если ПРОСТО в alpha символы добавлять скрипт то конечно уже не будет выдавать IndexError но и правильно конвертировать он как бы тоже не будет.

Так что если хотите Решить Задачку Вам придется  еще немножко Поразбираться ;)

ДА! И еще, Поскольку Mr Bool ВНЕЗАПНО отважно Сбежал  :D  

 

Давайте сделаем наверно так. Если Вы или кто другой из Участников в полном объеме РЕШИТ поставленную НАМИ Задачку

Мы вам Перечислим Ваш честно Выигранный Приз в 20$ :dandy:

 

Но давайте наверное установим Сроки: Дедлайн 10 Октября 22:00 по времени Астаны.

 

Т.е. если до 22:00 10 Октября никто полного Решения Задачи НЕ представит - Значит призовая двадцатка остается у нас ждать Следующих Конкурсов :)






 


Сообщение отредактировал T-800 Danya: 08.10.2019, 00:52:32

  • 0

#13
Mr. Bool

Mr. Bool
  • Завсегдатай
  • 115 сообщений

ДА! И еще, Поскольку Mr Bool ВНЕЗАПНО отважно Сбежал

 

Не беспокойтесь, я не сбежал.

Скрытый текст

 

Давайте сделаем наверно так. Если Вы или кто другой из Участников в полном объеме РЕШИТ поставленную НАМИ Задачку

 

Может и найдется кто желающий разбираться в Вашем (или не Вашем?) кривом алгоритме, с его ограничением не выше 3999. А мне это неинтересно, потому что у меня уже есть решение, где НЕТ таких ограничений.

 

248tTUZsu7.png


  • -1

#14
T-800 Danya

T-800 Danya
  • Свой человек
  • 653 сообщений

248tTUZsu7.png

 

Что в  фотошопе нарисовали? :D

 

Код где? ;)


Сообщение отредактировал T-800 Danya: 08.10.2019, 01:31:13

  • 0

#15
Mr. Bool

Mr. Bool
  • Завсегдатай
  • 115 сообщений

Что в фотошопе нарисовали?  :D 

 

Ваш юмор на уровне детсада. Не интересно и не удивительно.

 

Код где? ;) 

 

Еще чего. Над кодом попробуйте подумать сами, если сможете. Или ищите в Яндексе, возможно он там есть. ;)


  • -1

#16
T-800 Danya

T-800 Danya
  • Свой человек
  • 653 сообщений

 

Что в фотошопе нарисовали?  :D

 
Ваш юмор на уровне детсада. Не интересно и не удивительно.

 


А я то че? Я дишь только Повторяю Ваши же шуточки которые Вы пишите из под акка lexx821 :D

Или Вы что хотите сказать. Что lexx821 это Внезапно  НЕ Вы? :eek:


Сообщение отредактировал T-800 Danya: 08.10.2019, 01:55:06

  • 0

#17
Nurlan74

Nurlan74
  • Постоялец
  • 319 сообщений
но и правильно конвертировать он как бы тоже не будет.

попробовал до 100000 вроде работает корректно (проверял по числам с картинки https://cs4.pikabu.r...115442438.jpg),

можете предложить число на котором он споткнется при условии что все римские цифры будут объявлены в alpha?

 

 

 

Так что если хотите Решить Задачку Вам придется еще немножко Поразбираться

я с кодом поразбирался поверхностно, т.к. не питонист :)

путем вставки трассирующих сообщений:

 

from math import sqrt
alpha = "IVXLCDMFGLRDM"
raz = lambda n, s: (n % 5 >> n % 5 // 4 * 2) * alpha[s]
dva = lambda n, s: (3 < n) * alpha[s + (3 < n) + (8 < n)]
tri = lambda n, s: ((4 == n) or (9 == n)) and ''.join(reversed(s)) or s
poehali = lambda n, s: tri(n, dva(n, s) + raz(n, s))

def Mr_Bool(data, s = 0, conc = ""):
    print('------------------------------------------------')
    print('Params:')   
    print(data, s, conc)   
    d, m = divmod(data, 10)
    print('after div:', d, m)
    print(d, m)
    print(m, s)
    print('raz('+str(m) +', '+ str(s)+'): ' + raz(m, s))
    print('dva('+str(m) +', '+ str(s)+'): ' + dva(m, s))
    text = poehali(m, s) + conc
    print('text: ' + text)
    r = d and Mr_Bool(d, s + 2, text) or text
    print('result: ' + r)
    return r
a = input()
b = Mr_Bool(a)
print a,"=>",b

 

по поводу попытки понять код, я его понимаю так (повторяю я не питонист):

 

 

основа:
число делится на 10
d - частное
m - остаток
т.к. римские числа строятся на базовых числах 1 и 5 и кратных им по 10, т.е.: 1,5,10,50,100,500 и т.д.
имеются два метода один для вычисления единичных символов, например символ I (используется в I,II,III,IV,VI,VII,VIII,IX)
второй метод для вычисления 5 и 10
третий метод используется для переворвачивания строк в случае если число его квадратный корень целочисленный (хотя наверное тут можно было бы сравнивать с 4 и 9 в моем примере сделал так), думаю код работал бы быстрее
ну и четвертый метод собственно все собирает в месте - перевод одной десятичной цифры в римские
рекурсивный метод Mr_Bool выполняет все эти действия для каждой цифры путем деления исходного числа в каждой итерации на 10 пока не останется 0
при этом есть код: s + 2
он необходим для позиционирования в массиве alpha на цифрах отвечающих за 10,100,1000 и т.д. и собственно этот индекс и выходил за пределы массива когда пытались получить результат для 4000
 
ЗЫ: то что у меня в alpha - это просто набор символов, которые будут использоваться в результате - сами эти символы не корректные для римских чисел, я вписывал их только для того чтоб проверить работу алгоритма на больших числах и сопоставлял результат с картинкой адрес которой приведен выше

Сообщение отредактировал Nurlan74: 08.10.2019, 02:10:58

  • 0

#18
T-800 Danya

T-800 Danya
  • Свой человек
  • 653 сообщений

ЗЫ: то что у меня в alpha - это просто набор символов, которые будут использоваться в результате - сами эти символы не корректные для римских чисел, я вписывал их только для того чтоб проверить работу алгоритма на больших числах и сопоставлял результат с картинкой адрес которой приведен выше


Ну так сделайте чтобы корректные символы Выводил. И опубликуйте конечный Вариант на https://rextester.com/

Мы утра глянем если все нормально в обед Переведем Вам ваш Приз

ЗЫ Номер вашего Qiwi можете сейчас мне личку скинуть, ИМХО в принципе вы уже достаточно близко к Решению Подобрались :)

Сообщение отредактировал T-800 Danya: 08.10.2019, 02:33:07

  • 0

#19
Nurlan74

Nurlan74
  • Постоялец
  • 319 сообщений

Ну так сделайте чтобы корректные символы Выводил.

Почитал на вики по римским числам и там говорится что один из вариантов обозначения больших чисел - использование черточки над символом, для обозначения увеличения в 1000 раз, например X - 10, а X с чертой - 10000. Я решил объявить два массива: один с нижними подчеркиваниями, а второй с цифрами и совмещать их при выводе, т.е. выводить две строки чтоб визуально было понятно над какой цифрой имеется эта черточка, при этом шрифт должен иметь постоянную ширину чтоб не поехало

 

В итоге получилось сделать такой вариант:

 

 

from math import sqrt
alpha1 = "       ______"
alpha2 = "IVXLCDMVXLCDM"
raz = lambda n, s, arr: (n % 5 >> n % 5 // 4 * 2) * arr[s]
dva = lambda n, s, arr: (3 < n) * arr[s + (3 < n) + (8 < n)]
tri = lambda n, s: ((4 == n) or (9 == n)) and ''.join(reversed(s)) or s
poehali = lambda n, s, arr: tri(n, dva(n, s, arr) + raz(n, s, arr))
def Mr_Bool(arr, data, s = 0, conc = ""):
    #print('------------------------------------------------')
    #print('Params:')  
    #print(data, s, conc)  
    d, m = divmod(data, 10)
    #print('after div:', d, m)
    #print(d, m)
    #print(m, s)
    #print('raz('+str(m) +', '+ str(s)+'): ' + raz(m, s, arr))
    #print('dva('+str(m) +', '+ str(s)+'): ' + dva(m, s, arr))
    text = poehali(m, s, arr) + conc
    #print('text: ' + text)
    r = d and Mr_Bool(arr, d, s + 2, text) or text
    #print('result: ' + r)
    return r
a = input()
b1 = Mr_Bool(alpha1, a)
b2 = Mr_Bool(alpha2, a)
print a,"=>"
print b1
print b2

 

алгоритм работает до максимального числа 3999999. это конечно не снятие ограничения но увеличение допустимого диапазона с 1-3999 на 3 порядка

 

И опубликуйте конечный Вариант на https://rextester.com/

не нашел как это сделать без регистрации, посему код только тут :)


  • 0

#20
T-800 Danya

T-800 Danya
  • Свой человек
  • 653 сообщений

В итоге получилось сделать такой вариант...


Проверили Ваш код см https://rextester.com/LPZ87569

В принципе Работает :)

OK. Отлично! Приз - ВАШ!  :bow:

Как Вы хотите им распорядиться?

1) Получить  переводом на Ваш Qiwi Кошелек?
2) Пожертвовать на Благотворительность переводом на Qiwi Кошелек указанного Вами  Благотворительного Фонда/Организации?


Сообщение отредактировал T-800 Danya: 08.10.2019, 13:33:49

  • 0


Количество пользователей, читающих эту тему: 0

пользователей: 0, неизвестных прохожих: 0, скрытых пользователей: 0

Размещение рекламы на сайте     Предложения о сотрудничестве     Служба поддержки пользователей

© 2011-2022 vse.kz. При любом использовании материалов Форума ссылка на vse.kz обязательна.