Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • World
  • Users
  • Groups
Skins
  • Light
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Default (No Skin)
  • No Skin
Collapse
Code Project
  1. Home
  2. The Lounge
  3. Coding Challenge Of The Day

Coding Challenge Of The Day

Scheduled Pinned Locked Moved The Lounge
c++architecture
51 Posts 30 Posters 0 Views 1 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • S S Houghtelin

    Sub Roman_Numeral()
    Range("A1").Value = "2012"
    Range("B1").FormulaR1C1 = "=ROMAN(RC[-1],0)"
    End Sub

    [Edit] I know, I know... Wrong way... I was chuggin beers:sigh:

    It was broke, so I fixed it.

    C Offline
    C Offline
    Chris Maunder
    wrote on last edited by
    #6

    You get points for at least writing code. As opposed to some members... (dark looks all 'round).

    cheers, Chris Maunder The Code Project | Co-founder Microsoft C++ MVP

    W S 2 Replies Last reply
    0
    • C Chris Maunder

      Write a function to convert Roman numerals to Arabic numbers. The smaller the better. Bonus points, as always, for obscure languages and obfuscated assembler.

      cheers, Chris Maunder The Code Project | Co-founder Microsoft C++ MVP

      C Offline
      C Offline
      Chris Losinger
      wrote on last edited by
      #7

      for well-formed roman numerals, modern rules:

      int r2d2(const char *r)
      {
      int val[128];
      memset(val,0,sizeof(int)*128);
      val['I']=1; val['V']=5;
      val['X']=10; val['L']=50;
      val['C']=100; val['D']=500; val['M']=1000;

      int a = 0;
      for (int cv, pv = 0, i=strlen(r)-1;i>=0;i--)
      {
      cv = val[r[i]];
      a += cv * (pv > cv ? -1 : 1);
      pv = cv;
      }

      return a;
      

      }

      image processing toolkits | batch image processing

      C P F 3 Replies Last reply
      0
      • C Chris Maunder

        Write a function to convert Roman numerals to Arabic numbers. The smaller the better. Bonus points, as always, for obscure languages and obfuscated assembler.

        cheers, Chris Maunder The Code Project | Co-founder Microsoft C++ MVP

        A Offline
        A Offline
        AspDotNetDev
        wrote on last edited by
        #8

        Chris Maunder wrote:

        obfuscated assembler

        Tautology.

        Thou mewling ill-breeding pignut!

        1 Reply Last reply
        0
        • C Chris Losinger

          for well-formed roman numerals, modern rules:

          int r2d2(const char *r)
          {
          int val[128];
          memset(val,0,sizeof(int)*128);
          val['I']=1; val['V']=5;
          val['X']=10; val['L']=50;
          val['C']=100; val['D']=500; val['M']=1000;

          int a = 0;
          for (int cv, pv = 0, i=strlen(r)-1;i>=0;i--)
          {
          cv = val[r[i]];
          a += cv * (pv > cv ? -1 : 1);
          pv = cv;
          }

          return a;
          

          }

          image processing toolkits | batch image processing

          C Offline
          C Offline
          Chris Meech
          wrote on last edited by
          #9

          I once met a well formed roman, when I was touring through Italy. :cool:

          Chris Meech I am Canadian. [heard in a local bar] In theory there is no difference between theory and practice. In practice there is. [Yogi Berra] posting about Crystal Reports here is like discussing gay marriage on a catholic church’s website.[Nishant Sivakumar]

          L A 2 Replies Last reply
          0
          • C Chris Maunder

            Write a function to convert Roman numerals to Arabic numbers. The smaller the better. Bonus points, as always, for obscure languages and obfuscated assembler.

            cheers, Chris Maunder The Code Project | Co-founder Microsoft C++ MVP

            B Offline
            B Offline
            Bassam Abdul Baki
            wrote on last edited by
            #10

            In URL form: http://en.wikipedia.org/wiki/Roman_numerals#External_links[^] :-D Another interesting fact: http://answers.yahoo.com/question/index?qid=20100525032737AATfpBJ[^]

            Web - BM - RSS - Math - LinkedIn

            1 Reply Last reply
            0
            • C Chris Maunder

              Write a function to convert Roman numerals to Arabic numbers. The smaller the better. Bonus points, as always, for obscure languages and obfuscated assembler.

              cheers, Chris Maunder The Code Project | Co-founder Microsoft C++ MVP

              J Offline
              J Offline
              Joan M
              wrote on last edited by
              #11

              Chris... you should know that we don't make homework here... :rolleyes:

              [www.tamautomation.com] Robots, CNC and PLC machines for grinding and polishing.

              C 1 Reply Last reply
              0
              • C Chris Maunder

                Write a function to convert Roman numerals to Arabic numbers. The smaller the better. Bonus points, as always, for obscure languages and obfuscated assembler.

                cheers, Chris Maunder The Code Project | Co-founder Microsoft C++ MVP

                W Offline
                W Offline
                wizardzz
                wrote on last edited by
                #12

                I never enter a contest without knowing the prize, for tax purposes, but also in this case, it could be a job at CP... :doh:

                C 1 Reply Last reply
                0
                • C Chris Maunder

                  You get points for at least writing code. As opposed to some members... (dark looks all 'round).

                  cheers, Chris Maunder The Code Project | Co-founder Microsoft C++ MVP

                  W Offline
                  W Offline
                  wizardzz
                  wrote on last edited by
                  #13

                  I didn't see you award him any points. Go on, 5 him!

                  S S 2 Replies Last reply
                  0
                  • W wizardzz

                    I never enter a contest without knowing the prize, for tax purposes, but also in this case, it could be a job at CP... :doh:

                    C Offline
                    C Offline
                    Chris Maunder
                    wrote on last edited by
                    #14

                    Actually it's a personality test to see who among you are worthy of being labelled a Brogrammer.

                    cheers, Chris Maunder The Code Project | Co-founder Microsoft C++ MVP

                    B 1 Reply Last reply
                    0
                    • W wizardzz

                      I didn't see you award him any points. Go on, 5 him!

                      S Offline
                      S Offline
                      S Houghtelin
                      wrote on last edited by
                      #15

                      Thanks wizardzz, I suppose he meant like virtual points, or maybe pints, I'll definitely takes pints! :-D

                      It was broke, so I fixed it.

                      1 Reply Last reply
                      0
                      • W wizardzz

                        I didn't see you award him any points. Go on, 5 him!

                        S Offline
                        S Offline
                        Steve Mayfield
                        wrote on last edited by
                        #16

                        Don't you mean 'V' him?

                        Steve _________________ I C(++) therefore I am

                        A 1 Reply Last reply
                        0
                        • C Chris Maunder

                          Actually it's a personality test to see who among you are worthy of being labelled a Brogrammer.

                          cheers, Chris Maunder The Code Project | Co-founder Microsoft C++ MVP

                          B Offline
                          B Offline
                          Bassam Abdul Baki
                          wrote on last edited by
                          #17

                          You may want to snag CodeBroject.com just in case (CodePreject.com too).

                          Web - BM - RSS - Math - LinkedIn

                          1 Reply Last reply
                          0
                          • C Chris Maunder

                            You get points for at least writing code. As opposed to some members... (dark looks all 'round).

                            cheers, Chris Maunder The Code Project | Co-founder Microsoft C++ MVP

                            S Offline
                            S Offline
                            S Houghtelin
                            wrote on last edited by
                            #18

                            Just like positive reenforcment in the schools today, everybody gets a trophy, even when they're wrong. Thanks! :thumbsup: :-D

                            It was broke, so I fixed it.

                            1 Reply Last reply
                            0
                            • C Chris Maunder

                              Write a function to convert Roman numerals to Arabic numbers. The smaller the better. Bonus points, as always, for obscure languages and obfuscated assembler.

                              cheers, Chris Maunder The Code Project | Co-founder Microsoft C++ MVP

                              S Offline
                              S Offline
                              Sentenryu
                              wrote on last edited by
                              #19

                              as a nerd, i can't resist... between, it's only a quick n' dirty solution:

                              public static int RomanToArabic(string romans) {
                              if (string.IsNullOrWhiteSpace(romans))
                              {
                              return 0;
                              }
                              //remove whitespace...
                              romans = romans.Replace(" ", string.Empty);
                              //make sure no one pass out an "A" for example...
                              if (!Regex.IsMatch(romans, "(I|V|X|C|M|D|L)+"))
                              {
                              throw new ArgumentException("Invalid numeral!!");
                              }

                                      //actual validation that matters (based on http://en.wikipedia.org/wiki/Roman\_numerals): 
                                      //The symbols "I", "X", "C", and "M" can be repeated three times in succession, but no more. "D", "L", and "V" can never be repeated.
                                      string invalidSequences = "(XXXX+)|(IIII+)|(CCCC+)|(MMMM+)|(DD+)|(LL+)|(VV+)";
                              
                                      if (Regex.IsMatch(romans, invalidSequences))
                                      {
                                          throw new ArgumentException("Invalid sequence!!");
                                      }
                              
                                      int result = 0;
                              
                                      result += Regex.Matches(romans, "IV").Count \* 4;
                                      romans = Regex.Replace(romans, "IV", string.Empty);
                              
                                      result += Regex.Matches(romans, "IX").Count \* 9;
                                      romans = Regex.Replace(romans, "IX", string.Empty);
                              
                                      result += Regex.Matches(romans, "XL").Count \* 40;
                                      romans = Regex.Replace(romans, "XL", string.Empty);
                              
                                      result += Regex.Matches(romans, "XC").Count \* 90;
                                      romans = Regex.Replace(romans, "XC", string.Empty);
                              
                                      result += Regex.Matches(romans, "CD").Count \* 400;
                                      romans = Regex.Replace(romans, "CD", string.Empty);
                              
                                      result += Regex.Matches(romans, "CM").Count \* 900;
                                      romans = Regex.Replace(romans, "CM", string.Empty);
                              
                                      result += romans.Count(x => x == 'I');
                                      romans = romans.Replace("I", string.Empty);
                              
                                      result += romans.Count(x => x == 'V') \* 5;
                                      romans = romans.Replace("V", string.Empty);
                              
                                      result += romans.Count(x => x == 'X') \* 10;
                                      romans = romans.Replace("X", string.Empty);
                              
                                      result += romans.Count(x => x == 'L') \* 50;
                                      romans = romans.Replace("L", string.Empty);
                              
                                      result += romans.Count(x => x == 'C') \* 100;
                                      romans = romans.Replace("C", string.Empty);
                              
                                      result += romans.Count(x => x == 'D') \* 500;
                                      romans = romans.Replace("D", strin
                              
                              1 Reply Last reply
                              0
                              • S Steve Mayfield

                                Don't you mean 'V' him?

                                Steve _________________ I C(++) therefore I am

                                A Offline
                                A Offline
                                AspDotNetDev
                                wrote on last edited by
                                #20

                                Good catch. Live long and prosper.

                                Thou mewling ill-breeding pignut!

                                1 Reply Last reply
                                0
                                • C Chris Maunder

                                  Write a function to convert Roman numerals to Arabic numbers. The smaller the better. Bonus points, as always, for obscure languages and obfuscated assembler.

                                  cheers, Chris Maunder The Code Project | Co-founder Microsoft C++ MVP

                                  K Offline
                                  K Offline
                                  Karl Sanford
                                  wrote on last edited by
                                  #21

                                  Chris Maunder wrote:

                                  Roman numerals to Arabic numbers

                                  totally read this backward... at least now I have a solution for Arabic to Roman Numerals :doh:

                                  Be The Noise

                                  1 Reply Last reply
                                  0
                                  • C Chris Maunder

                                    Write a function to convert Roman numerals to Arabic numbers. The smaller the better. Bonus points, as always, for obscure languages and obfuscated assembler.

                                    cheers, Chris Maunder The Code Project | Co-founder Microsoft C++ MVP

                                    L Offline
                                    L Offline
                                    Lost User
                                    wrote on last edited by
                                    #22

                                    #!/usr/bin/python

                                    import sys

                                    I=1
                                    V=5
                                    X=10
                                    L=50
                                    C=100
                                    D=500
                                    M=1000

                                    a=0
                                    b=0
                                    c=0

                                    for d in map(eval,sys.argv[1]):
                                    if d > a:
                                    b += d - c
                                    c = 0
                                    else:
                                    b += c
                                    c = d
                                    a = d
                                    print b + c

                                    L 1 Reply Last reply
                                    0
                                    • J Joan M

                                      Chris... you should know that we don't make homework here... :rolleyes:

                                      [www.tamautomation.com] Robots, CNC and PLC machines for grinding and polishing.

                                      C Offline
                                      C Offline
                                      Corporal Agarn
                                      wrote on last edited by
                                      #23

                                      Tried to leave a similar message earlier but CP locked. I was going to add this is not QA. :)

                                      1 Reply Last reply
                                      0
                                      • C Chris Maunder

                                        Write a function to convert Roman numerals to Arabic numbers. The smaller the better. Bonus points, as always, for obscure languages and obfuscated assembler.

                                        cheers, Chris Maunder The Code Project | Co-founder Microsoft C++ MVP

                                        J Offline
                                        J Offline
                                        jesarg
                                        wrote on last edited by
                                        #24

                                        private int ToInt(string rom)
                                        {
                                        int length = rom.Length;
                                        int result = 0;
                                        for(int loop1=0; loop1 < length; loop1++)
                                        {
                                        char current = rom[loop1];
                                        char next = loop1 < length - 1 ? rom[loop1 + 1] : ' ';
                                        switch(current)
                                        {
                                        case 'I':
                                        result += next == 'V' || next == 'X' ? -1 : 1;
                                        break;
                                        case 'V':
                                        result += 5;
                                        break;
                                        case 'X':
                                        result += next == 'L' || next == 'C' ? -10 : 10;
                                        break;
                                        case 'L':
                                        result += 50;
                                        break;
                                        case 'C':
                                        result += next == 'D' || next == 'M' ? -100 : 100;
                                        break;
                                        case 'D':
                                        result += 500;
                                        break;
                                        case 'M':
                                        result += 1000;
                                        break;
                                        }
                                        }
                                        return result;
                                        }

                                        1 Reply Last reply
                                        0
                                        • L Lost User

                                          #!/usr/bin/python

                                          import sys

                                          I=1
                                          V=5
                                          X=10
                                          L=50
                                          C=100
                                          D=500
                                          M=1000

                                          a=0
                                          b=0
                                          c=0

                                          for d in map(eval,sys.argv[1]):
                                          if d > a:
                                          b += d - c
                                          c = 0
                                          else:
                                          b += c
                                          c = d
                                          a = d
                                          print b + c

                                          L Offline
                                          L Offline
                                          Lost User
                                          wrote on last edited by
                                          #25

                                          Or, somewhat more tersely,

                                          def r2d3(r,(s,M,C,X,I,z,V,L,D)=["%%s%d"%v for v in[1001,1000,100,10,1,0,5,50,500]]):
                                          return eval("".join([
                                          p%"+-"[eval( p%"%s>"%d%"")]
                                          for d,p in zip(map(eval,'%sz'%r),map(eval,'s%s'%r))
                                          ][1:]))

                                          Y 1 Reply Last reply
                                          0
                                          Reply
                                          • Reply as topic
                                          Log in to reply
                                          • Oldest to Newest
                                          • Newest to Oldest
                                          • Most Votes


                                          • Login

                                          • Don't have an account? Register

                                          • Login or register to search.
                                          • First post
                                            Last post
                                          0
                                          • Categories
                                          • Recent
                                          • Tags
                                          • Popular
                                          • World
                                          • Users
                                          • Groups