rebol et les chiffres romains
yos17-Oct-2012/13:46:36+2:00
Salut !

pour les curieux :

- règles de grammaire BNF
- décodage : somme de la droite vers la gauche avec soustraction des lettres inférieures
- encodage par divisions successives
- bugs free
- commentaires free

rappel: dans leur forme antique les nombres romains vont de 1 à 4999 (le 0 n'existe pas)


roman.r
REBOL []

roman?: func
[   {
    }
    roman-string
    /local
        low-units low-tens low-hundreds units tens hundreds thousands roman
]
[   low-units: [0 3 "I"]
    units: ["IX" | "V" low-units | "IV" | low-units]
    low-tens: [0 3 "X"]
    tens: ["XC" | "L" low-tens | "XL" | low-tens]
    low-hundreds: [0 3 "C"]
    hundreds: ["CM" | "D" low-hundreds | "CD" | low-hundreds]
    thousands: [0 4 "M"]
    roman: [thousands hundreds tens units]

    parse/case/all roman-string roman
]

probe roman? "I"
probe roman? "II"
probe roman? "III"
probe roman? "IIII"
probe roman? "IV"

probe roman? "CCIIV"




to-arabic.r
REBOL []

to-arabic: func
[   {
    }
    roman-string
    /local
        roman arabics arabic curent-arabic next-roman next-arabic
]
[   if roman? roman-string
    [   roman: charset "IVXLCDM"
        arabics: ["I" 1 "V" 5 "X" 10 "L" 50 "C" 100 "D" 500 "M" 1000]

        arabic: curent-arabic: 0
        parse/case/all reverse copy roman-string
        [   any
            [   copy next-roman roman
                (   next-arabic: select arabics next-roman
                    either next-arabic < curent-arabic
                    [   arabic: arabic - next-arabic
                    ]
                    [   arabic: arabic + next-arabic
                    ]
                    curent-arabic: next-arabic
                )
            ] 
        ]
        arabic
    ]
]

probe to-arabic "XIV"
probe to-arabic "III"
probe (1 + 1 + 10 + 50 + 1000 - 100 + 1000)
probe to-arabic "MCMLXII"
probe to-arabic "MMMMCMLXII"
probe to-arabic "MMMMMCMLXII"




to-roman.r
REBOL []

to-roman: func
[   {
    }
    arabic-number
    /local
        romans-arabics romans roman arabic dup
]
[   romans-arabics:
    [   "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
    ]

    romans: copy ""
    foreach [roman arabic] romans-arabics
    [   romans: insert/dup romans roman dup: to integer! (arabic-number / arabic)
        if all [dup > 3  not all [dup = 4  roman = "M"]] [romans: copy ""  break] 
        arabic-number: arabic-number - (dup * arabic)
    ]
    if not empty? romans: head romans [romans]
]

probe to-roman 14
probe to-roman 5000
probe to-roman 4999
probe to-roman 0
probe to-roman -14



yos
shadwolf17-Oct-2012/13:58:04+2:00
j'en pleure de joie tellement c'est joli comme code et en plus yos utilise parse !!!

moi je mets un 10/10. (monte le sur rebol.org!)
olivier17-Oct-2012/19:19:19+2:00
Oui, très beau
coccinelle18-Oct-2012/12:18:51+2:00
J'aime aussi sauf le nom des fonctions qui devraient indiquer la source et la destination.

Ce serait sympa, par exemple d'avoir une conversion roman-2-shadok et shadok-2-roman.

Le shadok est en base 4 (ga, bu, zo, meu), bubu = 5 et zozo = 10, meumeu, je vous laisse découvrir.
yos18-Oct-2012/12:48:17+2:00
D'après http://fr.wikipedia.org/wiki/Les_Shadoks#Langue

ga=0 et meumeu donne 15 non ?

Pour les noms de fonctions/variable j'aime ce qui est court idéalement un seul mot avec le plus de sens possible comme pour les mots d'un dictionnaire en respectant une racine ou une terminaison (exemple: dir dirized undirized ...)

Merci.
shadwolf18-Oct-2012/14:31:26+2:00
Cox shadok c'est pas les oiseaux qui pompent?
coccinelle18-Oct-2012/15:17:53+2:00
C'est bien ça, ils essayaient s'approprier le COSMOGOL des gibi avec la pompe mise au point par le professeur SHADOKO. Mais les gibi savaient que ça ne marcherait pas, alors ils sont partis en vacances.

C'était quand même plus intelligent ça que "Après le 20h, c'est Conreloup"

Login required to Post.


Powered by RebelBB and REBOL 2.7.8.4.2