Bonjour à tous !

Suite à une discussion sur l'irc python, quelqu'un a lancé le défi de faire un code en C++0x qui soit plus court en ligne et en nombre de caractère que le code python correspondant :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
numlist = [(1000,'M'), (900,'CM'), (500,'D'), (400,'CD'), (100,'C'), (90,'XC'), (50,'L'),(40,'XL'), (10,'X'), (9,'IX'), (5,'V'), (4,'IV'), (1,'I')]
 
def arabe(n):
    res = ""
    for k, v in numlist:
        while n >= k:
            n -= k
            res += v
    return res
Selon lui il existe une version en C++0x qui soit plus courtes que ce code. Cependant, moi-même je n'arrive pas à faire mieux que ça :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include <iostream>
#include <vector>
#include <utility>
 
using namespace std;
 
const vector< pair<int, string> > numlist = {pair<int, string>(1000,"M"), pair<int, string>(900,"CM"), pair<int, string>(500,"D"), pair<int, string>(400,"CD"), pair<int, string>(100,"C"), pair<int, string>(90,"XC"), pair<int, string>(50,"L"), pair<int, string>(40,"XL"), pair<int, string>(10,"X"), pair<int, string>(9,"IX"), pair<int, string>(5,"V"), pair<int, string>(4,"IV"), pair<int, string>(1,"I")};
 
string arabToRoman(int n)
{
    string result;
    for(size_t i(0); i < numlist.size(); ++i)
    {
        while(n >= numlist[i].first)
        {
            n -= numlist[i].first;
            result += numlist[i].second;
        }
    }
 
    return result;
}
 
int main()
{
    for(int i(1); i < 4000; ++i)
        cout << arabToRoman(i) << '\n';
    return 0;
}
Quelqu'un arriverait à faire un code plus concis en C++0x? J'ai pas trouvé mieux mais il semblerait qu'il existe plus court.

Merci de votre aide !