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

liczby rzymskie, python, analiza

VPS Starter Arubacloud
0 głosów
874 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 (277,460 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 (255,840 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 (255,840 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,340 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,340 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,340 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,340 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ź 832 wizyt
pytanie zadane 6 kwietnia 2020 w Python przez Steady Obywatel (1,140 p.)
0 głosów
1 odpowiedź 2,755 wizyt

93,006 zapytań

141,973 odpowiedzi

321,254 komentarzy

62,345 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

Wprowadzenie do ITsec, tom 2

Można już zamawiać tom 2 książki "Wprowadzenie do bezpieczeństwa IT" - będzie to około 650 stron wiedzy o ITsec (17 rozdziałów, 14 autorów, kolorowy druk).

Planowana premiera: 30.09.2024, zaś planowana wysyłka nastąpi w drugim tygodniu października 2024.

Warto preorderować, tym bardziej, iż mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy dodatkowe 15% zniżki! Dziękujemy zaprzyjaźnionej ekipie Sekuraka za kod dla naszej Społeczności!

...