Какая цифра римская l: Римская цифра L — какое число

0b1001 путей решения задачи перевода чисел в римскую запись / Хабр

Привет друзья. Вот вам простенькая задачка. Как бы вы перевели арабские числа в римские используя Python? Правда с одним условием — числа не могут быть больше чем 4000.

Я думаю это должно быть просто, но позвольте я вам покажу вам серию интересных решений и не тривиальных подходов:

«13 шагов» от StefanPochmann

Очень простая идея и при этом самая популярная. Мы делаем таблицу соответствий арабских и римских чисел. Идя по таблице этих соответствий мы уменьшая арабское число и увеличиваем римское.

def checkio(n):
    result = ''
    for arabic, roman in zip((1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1),
                             'M     CM   D    CD   C    XC  L   XL  X   IX V  IV I'.split()):
        result += n // arabic * roman
        n %= arabic
        print('({}) {} => {}'.format(roman, n, result))
    return result

Я добавил функцию print для вас, чтобы решение было понятнее. И вот какой будет вывод:

>>> checkio(177)
(M) 177 => 
(CM) 177 => 
(D) 177 => 
(CD) 177 => 
(C) 77 => C
(XC) 77 => C
(L) 27 => CL
(XL) 27 => CL
(X) 7 => CLXX
(IX) 7 => CLXX
(V) 2 => CLXXV
(IV) 2 => CLXXV
(I) 0 => CLXXVII
'CLXXVII'

Теперь вы видите, как на каждой итерации меняется римское и арабское числа.

«thous, hunds, tens и ones» от mdeakyne

def checkio(data):
    ones = ["","I","II","III","IV","V","VI","VII","VIII","IX"]
    tens = ["","X","XX","XXX","XL","L","LX","LXX","LXXX","XC"]
    hunds = ["","C","CC","CCC","CD","D","DC","DCC","DCCC","CM"]
    thous = ["","M","MM","MMM","MMMM"]
    
    t = thous[data // 1000]
    h = hunds[data // 100 % 10]
    te = tens[data // 10 % 10]
    o =  ones[data % 10]
    
    return t+h+te+o

В этом случае у нас уже есть обратное соответствие арабских к римским. При этом нам уже не нужен цикл.

«base.replace» от MaikSchoepe

def checkio(data):
    base = "I"*data
    
    base = base.replace("I"*5, "V")
    base = base.replace("V"*2, "X")
    base = base.replace("X"*5, "L")
    base = base.replace("L"*2, "C")
    base = base.replace("C"*5, "D")
    base = base.replace("D"*2, "M")
    
    base = base.replace("DCCCC", "CM")
    base = base.replace("CCCC", "CD")
    base = base.replace("LXXXX", "XC")
    base = base.replace("XXXX", "XL")
    base = base.replace("VIIII", "IX")
    base = base.replace("IIII", "IV")
    
    return base

Я верю, что это не самый эффективный способ решения, но один из самых веселых. Он начинается с того, что делает длинную строку из “I”, размером с переданное число. Следующей строй заменяет каждые пять символов “I” на символ “V”. Далее два “V” на “X” и так далее. В конце пути мы получим строку, которую мы искали.

«Enum» от veky

Для того, чтобы понять, как работает следующее решение вам надо знать модуль Enum. Если не знаете — есть отличный шанс погуглить его.

from enum import Enum
​
class Roman(Enum):
    M  = 1000
    CM = 900
    D  = 500
    CD = 400
    C  = 100
    XC = 90
    L  = 50
    XL = 40
    X  = 10
    IX = 9
    V  = 5
    IV = 4
    I  = 1
​
    @classmethod
    def encode(cls, n):
        for numeral in cls:
            rep, n = divmod(n, numeral.value)
            yield numeral.name * rep
​
checkio = lambda n: ''.join(Roman.encode(n))

В целом пример работает так-же как мы видели в первом примере от StefanPochmann, но кое-каким синтаксическим сахором. Таким как Enum и yield

«A derelict battery» от veky

Все эти решения я собрал с CheckiO.

И когда пользователь публикует свое решение на этом ресурсе — он должен выбрать, в какую категорию он хочет его добавить. Есть такая категория как “Creative”, где тебе не надо сильно заморачиваться на тему скорости или как легко твое решение читается.

Единственная вещь, о который ты должен думать — это на сколько креативное и необычное твое решение.

Это решение как раз из такое категории.

import formatter, functools
checkio = functools.partial(formatter.AbstractFormatter.format_roman, None, 'I')

Да, вот и все. Стоит упомянуть, правда, что модуль formater задеприкейтили начиная с версии 3.4 из-за того, что мало кто его использовал. Так что мы скорее всего напишем петицию Гвидо, чтобы оставить этот модуль в Python. Своим ап-вотом за это решение — вы как-бы ставите свою подпись под этой петицией.

«Достаточно элегантно, но не очень по питоновски» от nathan.l.cook

Мы идем дальше и решения становятся тяжелее

def checkio(data):
    rom = ['I', 'V', 'X', 'L', 'C', 'D', 'M']
    str_data = str(data)
    str_data = str_data[::-1]
    num_digits = len(str_data)
    ans = ""
    rom_pointer = 0
​
    for place in range(num_digits):
        if str_data[place] in ["0", "1", "2", "3"]:
            ans = rom[rom_pointer] * int(str_data[place]) + ans
        elif str_data[place] in ["4"]:
             ans = rom[rom_pointer] + rom[rom_pointer + 1] + ans
        elif str_data[place] in ["5", "6", "7", "8"]:
             ans = rom[rom_pointer + 1] + rom[rom_pointer] * (int(str_data[place]) - 5) + ans
        elif str_data[place] in ["9"]:
             ans = rom[rom_pointer] + rom[rom_pointer + 2] + ans
        rom_pointer += 2
​
    return ans

Знаете, когда читаешь чье то решение и первые строки, которые ты видишь это:

    str_data = str(data)
    str_data = str_data[::-1]

Ты думаешь: “Ок, тут ща точно будет какая-то магия”

«Немного истории от» от veky (или от …)

def checkio(n:int) -> str:
  pool = "m2d5c2l5x2v5i"
  rep = lambda t: int(pool[t - 1])
  def roman(n, j=0, v=1000):
    while True:
      while n >= v: yield pool[j]; n -= v
      if n <= 0: return
      k = j + 2; u = v // rep(k)
      if rep(k) == 2: k += 2; u //= rep(k)
      if n + u >= v: yield pool[k]; n += u
      else: j += 2; v //= rep(j)
  return "".
join(roman(n)).upper()

Вы можете знать автора этого решения по таким книгам как The Art of Computer Programming, Concrete Mathematics, Surreal Numbers и так далее.

«Эта странная римская математика» от LukeSolo

Довольно часто ты встречаешь решения на CheckiO, и при этом ты даже не представляешь, как они работают:

from math import sqrt
​
alpha = "IVXLCDM"
one = lambda n, s: (n % 5 >> n % 5 // 4 * 2) * alpha[s]
two = lambda n, s: (3 < n) * alpha[s + (3 < n) + (8 < n)]
three = lambda n, s: sqrt(n) == int(sqrt(n)) and ''.join(reversed(s)) or s
go = lambda n, s: three(n, two(n, s) + one(n, s))
​
def checkio(data, s = 0, conc = ""):
    d, m = divmod(data, 10)
    text = go(m, s) + conc
    return d and checkio(d, s + 2, text) or text

Но я думаю, что вы разберетесь 🙂

Спасибо

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

Это первый раз, когда я пытаюсь поделится такой вот коллекцией наиболее интересных решений на CheckiO. Дайте мне знать, насколько интересно вам о таком читать и на сколько вам нравится сам формат.

Для создания этой статьи использовались решения пользователей CheckiO:

  • “13 шагов” от StefanPochmann
  • “thous, hunds, tens и ones” от mdeakyne
  • “base.replace” от MaikSchoepe
  • “Enum” от veky
  • “A derelict battery” от veky
  • “Достаточно элегантно, но не очень по питоновски” от nathan.l.cook
  • “Немного истории от” от veky (или от …)
  • “Эта странная римская математика” от LukeSolo

ПС: Кстати, еще есть категория “Speedy” для решений. И когда ты говоришь, что решение задачи не может быть длиннее чем 4000 символов, то самым быстрым решением для этой задачи будет вот это. По понятным причинам я могу вам показать только ссылку.

римских цифр | Цифры вики

в: Наборы цифр, наборы натуральных цифр

Посмотреть источник

Римские цифры — это набор цифр, использовавшихся римлянами для обозначения чисел.

Содержание

  • 1 Определение
  • 2 больших числа
    • 2.1 Апостроф
    • 2.2 Винкулум
  • 3 В разные базы

Определение

Римские цифры определяются следующими шагами:

  1. Разделите число на разрядные значения. Пример: 1023 = 1000 + 20 + 3.
  2. Расположите части от тысяч до единиц. 1000 + 20 + 3.
  3. Преобразуйте детали в римские цифры в соответствии с этой таблицей:
Тысячи Сотни Десятки единиц
1 М С Х я
2 мм СС ХХ II
3 МММ ССС ХХХ III
4 компакт-диск XL IV
5 Д л В
6 округ Колумбия люкс VI
7 ДКК ЛХХ VII
8 ДККК ЛХХХ VIII
9 см ХС IX

Пример: 1000 + 20 + 3 = М + ХХ + III

Следовательно, 1023 = MXXIII.

Большие числа

Согласно 4, 40 и 400, 4000 должно быть 5000-1000. Но римской цифры для 5000 нет. Вот несколько вариантов римских цифр для больших чисел:

Апостроф

Апостроф определяется следующим образом:

|Ↄ равно 500. |ƆƆ равно 5000, а |ƆƆƆ равно 50000. Число Ɔ – это количество нулей после 50, увеличивающее предыдущее число в десять раз.

C|Ɔ равно 1000. CC|ƆƆ равно 10000, а CCC|ƆƆƆ равно 100000. Думайте о C и Ɔ как о скобках. Количество CƆ — это количество нулей после 100, что также увеличивает предыдущее в десять раз.

В этой системе нет ни D, ни M, ни вычитательных определений для больших чисел. поэтому 400 — это CCCC вместо CD. Вы просто повторяете цифры эффективным способом.

4000 — это C|ƆC|ƆC|ƆC|Ɔ (1000+1000+1000+1000).

С помощью апострофа вы можете написать любое число римскими цифрами. Пример: 123456 = 100000 + 20000 + 3000 + 400 + 50 + 6.

100000 = CCC|ƆƆƆ

20000 = CC|ƆƆCC|ƆƆ

3000 = С|ƆС|ƆС|Ɔ

400 = CCCC

50 = Л

6 = VI

Следовательно, 123456 = CCC|ƆƆƆCC|ƆƆCC|ƆƆC|ƆC|ƆC|ƆCCCCLVI

Vinculum

Вместо использования апострофов, которые могут затруднить представление числа, мы можем масштабировать число в 1000 раз, рисуя линию над числом, если результат больше или равен 4000. Следовательно, 3000 будет МММ, а 4000 будет I̅V̅. 5000 — это V̅. 10 000 — это X̅, а 100 000 — это C̅. 1 000 000 – это M̅. Этот вариант намного проще, чем вышеописанный, и поэтому многие предпочитают его.

100000 = C̅

20000 = X̅X̅

3000 = MMM

400 = CD

50 = L

6 = VI

Следовательно, 123456 = C̅X̅X̅MMMCDLVI.

В разные системы счисления

В сообществе аналитиков римские цифры были преобразованы в различные четные системы счисления, поскольку некоторые не предпочитают десятичную систему. Значения букв были скорректированы в соответствии с полномочиями новой базы. Базовые индикаторы, такие как точка Хамфри, до сих пор используются для отличия числа от десятичного.

Ниже приведена таблица значений римских цифр для десятичных и дюжинных, а также других четных оснований b{\displaystyle b}:

9{3}}
Значения римских цифр в разных системах счисления
Символ Значение Десятичный Дюжина
Я 1 1
В b2{\ displaystyle {\ frac {b} {2}}} 5 1000 1000; = 1 728 10

Вычитающие числительные, такие как 4 = IV (в десятичной системе), также применимы к другим основаниям. Они также применяются к цифрам со значением от b4+1{\displaystyle {\frac {b}{4}}+1}до b2−1{\displaystyle {\frac {b}{2}}-1}. как 3b4+1{\displaystyle {\frac {3b}{4}}+1}до 3b2−1{\displaystyle {\frac {3b}{2}}-1}.

То есть для дюжинных римских цифр 4 пишется как IIV; так как b4 + 1 = 4 {\ displaystyle {\ frac {b} {4}} + 1 = 4}, когда b = 12 {\ displaystyle b = 12}. То же правило применимо к 5 и , записанным как IV;, IIX; и IX; соответственно.

Это будет сложно для больших баз, так как для небольших чисел требуется много символов. Однако это можно решить, определив новые буквы как другие круглые значения. (Например, десятичное число 15 в шестидесятеричных римских цифрах будет представлено как IIIIIIIIIIIIIII, что может быть упрощено как AIIIIII, определяя A как новый символ для десяти.) Пока не было известно никаких предложений по этому поводу.

Наборы цифр


Исторические китайские цифры • египетские цифры • греческие цифры • индийско-арабские цифры • цифры майя • римские цифры
Предложения по трансдесятичным системам счисления Algam • De Vlieger Argam • Система дюжины • Grecset • Heptian Vigesimal • Hillarian «Cadexal» • MBeargam • Recset

Контент сообщества доступен по лицензии CC-BY-SA, если не указано иное.

Римские цифры

Римские цифры, система счисления в Древнем Риме, используют комбинации букв латинского алфавита для обозначения значений.

Римские цифры не имеют ни понятия числа ноль, ни жесткого понятия разрядного значения . Из-за этого длина символа цифр увеличивается и уменьшается неравномерно по мере увеличения числа.

Ниже приведены числа от 1 до 500, отображаемые римскими цифрами. Подробнее о формате чисел можно прочитать здесь

1 I
2 II
3 III
4 IV
5 V
6 VI
7 VII
8 VIII
9 IX
10 X
11 XI
12 XII
13 XIII
14 XIV
15 XV
16 XVI
17 XVII
18 XVIII
19 XIX
20 XX
21 XXI
22 XXII
23 XXIII
24 XXIV
25 XXV
26 XXVI
27 XXVII
28 XXVIII
29 XXIX
30 XXX
31 XXXI
32 XXXII
33 XXXIII
34 XXXIV
35 XXXV
36 XXXVI
37 XXXVII
38 XXXVIII
39 XXXIX
40 XL
41 XLI
42 XLII
43 XLIII
44 XLIV
45 XLV
46 XLVI
47 XLVII
48 XLVIII
49 XLIX
50 L
51 ЛИ
52 ЛИИ
53 LIII
54 LIV
55 LV
56 LVI
57 LVII
58 LVIII
59 LIX
60 LX
61 LXI
62 LXII
63 LXIII
64 LXIV
65 LXV
66 LXVI
67 LXVII
68 LXVIII
69 LXIX
70 LXX
71 LXXI
72 LXXII
73 LXXIII
74 LXXIV
75 LXXV
76 LXXVI
77 LXXVII
78 LXXVIII
79 LXXIX
80 LXXX
81 LXXXI
82 LXXXII
83 LXXXIII
84 LXXXIV
85 LXXXV
86 LXXXVI
87 LXXXVII
88 LXXXVIII
89 LXXXIX
90 XC
91 XCI
92 XCII
93 XCIII
94 XCIV
95 XCV
96 XCVI
97 XCVII
98 XCVIII
99 XCIX
100 С
494444444444444444444444444444444444444444444444444444444444444444444444444444444400444444444444444444444444444444444444444440044444444494494494494494449009н. 0053 CXIV4139393939393939393939393939393939393939393939393939393939393939393939393939393
101 CI
102 CII
103 CIII
104 CIV
105 CV
106 CVI
107 CVII
108 CVIII
109 CIX
110 CX
111 CXI
112 CXII
113
115 CXV
116 CXVI
117 CXVII
118 CXVIII
119 CXIX
120 CXX
121 CXXI ​​
122 CXXII
123 CXXIII
.0054
125 CXXV
126 CXXVI
127 CXXVII
128 CXXVIII
129 CXXIX
130 CXXX
131 CXXXI
132 CXXXII
133 CXXXIII
134 CXXXIV
135 CXXXV
136 CXXXVI
137 CXXXVII
138 CXXXVIII
139 CXXXIX
140 CXL
141 CXLI
142 CXLII
143 CXLIII
144 CXLIV
145 CXLV
146 CXLVI
147 CXLVII
148 CXLVIII
149 CXLIX
150 CL
999393 1839999393
151 CLI
152 CLII
153 CLIII
1549
154 9009
1549
1540054 CLIV
155 CLV
156 CLVI
157 CLVII
158 CLVIII
159 CLIX
160 CLX
161 CLXI
162 CLXII
163 CLXIII
164 CLXIV
165 CLXV
166 CLXVI
167 CLXVII
168 CLXVIII
169 CLXIX
170 CLXX
171 CLXXI
172 CLXXII
173 CLXXIII
174 CLXXIV
175 CLXXV
176 CLXXVI
177 CLXXVII
178 CLXXVIII
179 CLXXIX
180 CLXXX
181 CLXXXI
182 CLXXXII
183 CLXXXIIIIIII CLXXIIIIIIII 183 CLXXIIIIIII CLXXIIIIIII CLXXII. 0054 CLXXXIV
185 CLXXXV
186 CLXXXVI
187 CLXXXVII
188 CLXXXVIII
189 CLXXXIX
190 CXC
191 CXCI
92 CXCII
193 CXCII CXCII41414141414149393.0393 194 CXCIV
195 CXCV
196 CXCVI
197 CXCVII
198 CXCVIII
199 CXCIX
200 СС
201 ТПП
202 CCII
203 CCIII
204 CCIV
205 CCV
206 CCVI
207 CCVII
208 CCVIII
209 CCIX
210 CCX
211 CCXI
212 CCXII
213 CCXIII
214 CCXIV
215 CCXV
216 CCXVI
217 CCXVII
218 CCXVIII
219 CCXIX
220 CCXX
221 CCXXI
222 CCXXII
223 CCXXIII
224 CCXXIV
225 CCXXV
226 CCXXVI
227 CCXXVII
228 CCXXVIII
229 CCXXIX
230 CCXXX
231 CCXXXI
232 CCXXXII
233 CCXXXIII
234 CCXXXIV
235 CCXXXV
236 CCXXXVI
237 CCXXXVII
238 CCXXXVIII
239 CCXXXIX
240 CCXL
241 CCXLI
242 CCXLII
243 CCXLIII
244 CCXLIV
245 CCXLV
246 CCXLVI
247 CCXLVII
248 CCXLVIII
249 CCXLIX
250 БКЛ

Ниже приведен график, показывающий, как изменяется длина этих римских цифр. Как вы можете видеть, это очень циклично: длина увеличивается по мере того, как цифра I добавляется поэтапно, а затем уменьшается, когда она проходит кратность пяти, заменяясь символом с более высоким значением.

Самая длинная римская цифра до 250 — CLXXXVIII, состоящая из девяти символов и представляющая число 188.

Первое число из обязательных десяти цифр — 288, и это CCLXXXVIII

Таблица умножения

Несмотря на отсутствие практического применения, здесь тепловая карта, показывающая длины произведения двух римских цифр. Вверху слева — I x I. Чем светлее цвета, тем короче строки, чем темнее цвета, тем длиннее строки продукта.

Каждый квадрат вправо и вниз увеличивает число на единицу. По понятным причинам диаграмма симметрична относительно ведущей диагонали, но интересно различить гармоники, из-за которых она выглядит так, как будто на графике есть кольца. На графике представлены продукты для 1-50 по каждой оси.

Использование

В наши дни римские цифры используются в основном для украшения и придают изысканность при каждом использовании.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *