public static String getMinimalForm(int value) {
		
		StringBuilder result = new StringBuilder();
		// roman numerals are dumb, so let's just go one value at a time
		int pow10 = 1;
		for (int i = 0; i < 4; i++, pow10 *= 10) {
			int digit = value % 10;
			value /= 10;

			// wtf
			boolean normal = false;
			boolean hasFive = false;
			switch (digit) {
			case 0:
			case 1:
			case 2:
			case 3:
				normal = true;
				break;
			case 4:
				break;
			case 5:
			case 6:
			case 7:
			case 8:
				normal = true;
				hasFive = true;
				break;
			case 9:
				hasFive = true;
				break;
			}

			if (normal) {
				int numberOfOnes = digit % 5;
				char one = numerals.get(pow10);
				for (int j = 0; j < numberOfOnes; j++) {
					result.insert(0, one);
				}
				// if it's bigger than 4000, we're fucked
				if (hasFive && pow10 != 1000) {
					char five = numerals.get(5 * pow10);
					result.insert(0, five);
				}
			} else {
				// swaparoo
				// if it's bigger than like 9000, we're fucked (again)
				if (hasFive) {
					if (pow10 != 1000) {
						char ten = numerals.get(10 * pow10);
						char one = numerals.get(pow10);
						result.insert(0, ten);
						result.insert(0, one);
					}
				} else {
					if (pow10 != 1000) {
						char five = numerals.get(5 * pow10);
						char one = numerals.get(pow10);
						result.insert(0, five);
						result.insert(0, one);
					} else {
						// 4 Ms
						char one = numerals.get(pow10);
						result.insert(0, one);
						result.insert(0, one);
						result.insert(0, one);
						result.insert(0, one);
					}
				}
			}
		}
		return result.toString();
	}