6

Smocza książka zawiera ćwiczenie polegające na przekształcaniu liczb całkowitych w cyfry rzymskie za pomocą schematu tłumaczenia kierowanego na składnię.Konwertuj liczby całkowite na cyfry rzymskie, używając schematu translacji opartego na składni?

Jak można to zrobić?

+1

wygląda jak zadanie domowe, pachnie jak zadanie domowe ...;-) –

+0

Tak, wiem ... Chciałbym móc udowodnić, że nie oszukuję. To jest właściwie zadanie domowe, dla studentów CS ... Po prostu, nie dla mnie, po prostu czytam książkę na własną rękę, i nie mam nauczyciela (lub dobrze poinformowanego przyjaciela), aby zapytać. –

Odpowiedz

2

Rozważałoby parsowanie od prawej do lewej.

Po pierwsze, chciałbym odwzorować kolumny zespołów:

0 -> '' 
1 -> 'I' 
2 -> 'II' 
3 -> 'III' 
4 -> 'IV' 
... 
9 -> 'IX' 

Następnie, jeśli nie było drugą kolumnę (np sekund z kolumny w prawo = TEN), chciałbym używać, aby mapować do

0 -> '' 
1 -> 'X' 
2 -> 'XX' 
... 
9 -> 'XC' 

Musiałoby to zostać dodane do początkowego wyjścia.

Powtarzaj dla następnych kolumn (setek, tysięcy), aż zabraknie liter.

Podwójne sprawdzenie, czy liczba nie jest "0" lub ujemna.

+0

To oznacza, że ​​tworząc gramatykę bezkontekstową, która umożliwiłaby mi konwersję przy użyciu schematu tłumaczenia kierowanego przez sytanx, muszę utworzyć 10 reguł dla każdej "kolumny". (czyli około 34 reguł, aby móc uzyskać 3999). Czy mam rację? –

+0

Tak naprawdę myślałem o czymś takim, spodziewałem się, że będzie bardziej elegancka metoda ... Czy istnieje? –

+0

Tak, oznacza to 10 reguł na kolumnę. Myślę, że można napisać jedną funkcję, która działa dla każdej z kolumn, i przyjmuje litery jako parametry ... Tak więc, dla 219, wypiszesz f (2, "C", "D", "M") + f (1. "X", "L", "C") + f (9, "I", "V", "X") Nie "odczuwa" braku kontekstu . – Oddthinking

2

Innym sposobem jest przechowywanie w dwuwymiarowej tablicy cyfr rzymskich dla 1, 5, 10, 50, 100, 500, 1000 i tak dalej. Przykład (w tablicy PHP):

$roman = array(
    [0] = array(1=>"I", 5=>"V", 10=>"X"), 
    [1] = array(1=>"X", 5=>"L", 10=>"C"), 
    [2] = array(1=>"C", 5=>"D", 10=>"M"), 
    [3] = array(1=>"M", 5=>"^V", 10=>"^X"), 
); 

Następnie prześlij każdą cyfrę od prawej do lewej i zastosuj następujące tłumaczenie. Ustawić zmienną $ level = 0 i zwiększać swoją wartość o 1 po każdej cyfrze przetworzonej ('' w PHP a concats dwa ciągi)

1 => $roman[$level][1] 
2 => $roman[$level][1].$roman[$level][1] 
3 => $roman[$level][1].$roman[$level][1].$roman[$level][1] 
4 => $roman[$level][1].$roman[$level][5] 
5 => $roman[$level][5] 
6 => $roman[$level][5].$roman[$level][1] 
7 => $roman[$level][5].$roman[$level][1].$roman[$level][1] 
8 => $roman[$level][5].$roman[$level][1].$roman[$level][1].$roman[$level][1] 
9 => $roman[$level][1].$roman[$level][10] 

Przykład: 1945

5 => $roman[0][5] = "V" 
4 => $roman[1][1].$roman[1][5] = "XL" 
9 => $roman[2][1].$roman[2][10] = "CM" 
1 => $roman[3][1] = "M" 

Więc przetłumaczona liczba to "MCMXLV"

Niestety, ta odpowiedź może nie w pełni odpowiedzieć na Twoje pytanie, ale mam nadzieję, że pomoże to w jakikolwiek sposób.

2

Następna to gramatyka reprezentująca tłumaczenie skierowane na składnię z liczby w formacie 1xxx na liczby rzymskie.

numer = Jedna trzecia cyfra3 cyfra2 cyfra1 | nzdigit3 digit2 digit1 | nzdigit2 digit1 | nzdigit1

OneThousand -> 1 {druku ('M')}

digit3 -> 0 digit3 -> nzdigit3

nzdigit3 -> 1 druku ('C') nzdigit3 -> 2 print ('CC') nzdigit3 -> 3 print ('CCC') nzdigit3 -> 4 print ('CCCC') nzdigit3 -> 5 print ('D') nzdigit3 -> 6 print ('DC') nzdigit3 - > 7 print ('DCC') nzdigit3 -> 8 print ('DCCC') nzdigit3 -> 9 print ('DCCCc')

W podobny sposób zapisz definicję cyfr w pozycji 2 i 1, a będziesz potrzebować tłumaczenia.

Powiązane problemy