• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

liczby rzymskie, python, analiza

Object Storage Arubacloud
0 głosów
609 wizyt
pytanie zadane 6 listopada 2022 w Python przez s1m1nv1k Początkujący (270 p.)

Hej, mam tu taki kod który zamienia liczby i cyfry rzymskie na normalne arabskie, kod skopiowałem z jakiejś strony i trochę go zmieniłem żeby działał bez tworzenia funckji i klasy

roman_and_integers = {'I': 1, 'V': 5, 'X': 10, 'L': 50,
                     'C': 100, 'D': 500, 'M': 1000, 'IV': 4,
                     'IX': 9, 'XL': 40, 'XC': 90, 'CD': 400, 'CM': 900}
s = 'DLI'
i = 0
num = 0
while i < len(s):
    if i + 1 < len(s) and s[i:i + 2] in roman_and_integers:
        num += roman_and_integers[s[i:i + 2]]
        i += 2
    else:
        num += roman_and_integers[s[i]]
        i += 1
print(num)

Nie rozumiem jak działa część kodu z ifem czy mógłby mi ktoś to wyprowadzić jak to działa na konkretnym przykładzie np II albo DLI skąd ta część kodu wie że np. II to 2?

komentarz 6 listopada 2022 przez Wiciorny Ekspert (270,230 p.)
A co to za rodzaj zamiany  masz wprowadzić? Bo co w sytuacji kiedy ktoś wporwadzi

XLXLX -> co da 90 ? :)
komentarz 6 listopada 2022 przez s1m1nv1k Początkujący (270 p.)
edycja 6 listopada 2022 przez s1m1nv1k

@Wiciorny,  hmmm w takim wypadku otrzymuję 120, ale bardziej mi chodziło proces sumowania w ifie, i nie chcę nic zmieniać póki niezrozumiem jak to działa

2 odpowiedzi

+2 głosów
odpowiedź 6 listopada 2022 przez VBService Ekspert (253,420 p.)
wybrane 6 listopada 2022 przez s1m1nv1k
 
Najlepsza

Ten if powoduje,

if s[i:i + 2] in roman_and_integers:  #  i + 1 < len(s) ten zapis jest niepotrzebny

że w pierwszej kolejności są sprawdzane sekwencje dwu literowe czyli np. IV, IX, XL itd.

in roman_and_integers

sprawdza czy taka sekwencja jest na liście jeżeli tak to pobierana jest wartość przypisana do danej sekwencji

'IV': 4, 'IX': 9, 'XL': 40,

może taki zapis Tobie pomoże  [ on-line ]

Dla zapisu rzymskiego np. II (2) nie ma na liście 'II': 2 

roman_and_integers = { 'I': 1, 'II': 2, 'V': 5, ... }

więc warunek

if s[i:i + 2] in roman_and_integers:

jest niespełniony i wykonuje się else, które czyta sekwencję znaków pojedynczo.

roman_and_integers[s[i]]

 

komentarz 6 listopada 2022 przez s1m1nv1k Początkujący (270 p.)
Dzięki wielkie za pomoc, źle zrozumiałem 2 część ifa, ale bardzo fajnie to rozpisałeś Pozdrawiam
komentarz 6 listopada 2022 przez VBService Ekspert (253,420 p.)

Zapomniałem dopisać, że jeżeli warunek jest spełniony to indeks i jest przesuwany o 2 (I += 2) a gdy else o 1 (i += 1)

sprawdź jeszcze taki zapis [ on-line ] (z czapy, ale chyba już wyjaśni się wszystko wink)

+2 głosów
odpowiedź 6 listopada 2022 przez Oscar Nałogowiec (29,320 p.)
dwa I sa analizowane oddzielnie jako 2 razy 1 i wychodzi 2. Zapis rzymski jest prosty, nie jest pozycyjny - a staje się jeszcze prostszy, gdy wszystkie kombinacje "przedrostkowe", które zmniejszają wartość bazową symbolu potraktujemy jako jeden symbol "wieloznakowy'. Na początku masz wypisane symbole pojedyncze (które się sumuje), a potem kombinacje dwuznakowe - normalnie trzeba by odejmować jak przed a dodawać jak po, ale jeśli je potraktujemy jako całość o odpowiednio zmniejszonej wartość to już zostajemy przy dodawaniu. Tylko trzeba najpierw wyszukać te symbole dłuższe, a jak brak wyniku to krótsze. I to masz w if - zmienna i leci po napisie i jeśli jeszcze zostało co najmniej dwa znaki to sprawdzane jest czy symbol składający się z dwóch kolejnych znaków jest znany. Else bierze się 1 znakowy symbol i też się dodaje. Potem powtórka na pozostałem części napisu aż analiza dotrze do końca.

 

A swoja droga - ciekawe jak sie w systemie rzymskim zapisuje liczbe 99?
komentarz 6 listopada 2022 przez s1m1nv1k Początkujący (270 p.)
dzięki ale jak przebiega sumowanie, tego nie rozumiem, jak na podstawie wycinka ze stringa [i:i+2] otrzymuje wartosc liczbową. no bo wezmy na przykład DLI len = 3 czyli while 0 < 3 dalej idąc if 1 < niz len(3) i wycinek ze stringa zawarty w dict [0:2](czyli DL) i teraz to sumowanie moglbys to jasniej przedstawic?
komentarz 6 listopada 2022 przez Oscar Nałogowiec (29,320 p.)
Jak wspomniałem system rzymski nie jest pozycyjny - wartość symbolu zasadniczo zależy od niego samego a nie od pozycji w napisie (wyjątki to te prefiksy)

DLI -

zaczynamy od początku, mamy i = 0; wynik = 0;

sprawdzamy if w linii 8: Od pozycji i (0) są co najmniej 2 znaki więc sprawdzamy czy 2-znakowy podciąg (DL) jest w tym słowniczku:

   Ciągu "DL" tam nie ma więc wykonujemy else czyli bierzemy krótszy, 1-znakowy podciąg - 'D'. W słowniku mamy 'D' - odpowiada mu 500. Mamy 500 jako tymczasowy wynik.

Przesuwamy się i 1 znak ( i += 1) - podobnie ciągu LI nie ma w słowniku, konwertujemy samo 'L' - dodajemy 50 do wyniku i mamy 550.

Przesuwamy się o 1 znak do zostało za mało na dwuuznakowy podciąg, od razu wykonujemy else (wariant 1-znakowy) samo "I" daje jedynkę więc dodajemy taką wartość do wyniku - wychodzi 551. Więcej znaków nie ma, konwersja zakończona.
komentarz 6 listopada 2022 przez Oscar Nałogowiec (29,320 p.)
Zwróć uwagę na fakt, że program w ogóle nie sprawdza poprawności, skonwertuje każdy napis składający się z odpowiednich literek.
komentarz 6 listopada 2022 przez s1m1nv1k Początkujący (270 p.)
no tak nie przyjrzałem się dokładnie drugiej części ifa, jestem początkującym i musze przyznać ze taki prosty kod sprawił mi dużo problemów, Dzięki wielkie bardzo mi pomogłeś Pozdrawiam.
komentarz 6 listopada 2022 przez s1m1nv1k Początkujący (270 p.)

@Oscar, tak to że program ma pare luk zauważyłem już wcześniej, pora go ulepszyć

 

komentarz 7 listopada 2022 przez Oscar Nałogowiec (29,320 p.)
Wszystko przed Tobą, powodzenia. Najpierw jednak zbierz dużo szczegółowych informacji jak to jest z zapisem rzymskim, bo podejrzewam że tak ogólnie wszyscy wiedzą, ale jest sporo szczegółów (jak ma przykład to 99), w których tkwi diabeł.

Podobne pytania

+1 głos
1 odpowiedź 712 wizyt
pytanie zadane 6 kwietnia 2020 w Python przez Steady Obywatel (1,140 p.)
0 głosów
1 odpowiedź 2,592 wizyt

92,584 zapytań

141,434 odpowiedzi

319,671 komentarzy

61,968 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...