Data commit
This commit is contained in:
parent
7387c8f97b
commit
cb5bb5e222
199093 changed files with 3378972 additions and 0 deletions
37
Task/Roman-numerals-Decode/Java/roman-numerals-decode-1.java
Normal file
37
Task/Roman-numerals-Decode/Java/roman-numerals-decode-1.java
Normal file
|
|
@ -0,0 +1,37 @@
|
|||
public class Roman {
|
||||
private static int decodeSingle(char letter) {
|
||||
switch(letter) {
|
||||
case 'M': return 1000;
|
||||
case 'D': return 500;
|
||||
case 'C': return 100;
|
||||
case 'L': return 50;
|
||||
case 'X': return 10;
|
||||
case 'V': return 5;
|
||||
case 'I': return 1;
|
||||
default: return 0;
|
||||
}
|
||||
}
|
||||
public static int decode(String roman) {
|
||||
int result = 0;
|
||||
String uRoman = roman.toUpperCase(); //case-insensitive
|
||||
for(int i = 0;i < uRoman.length() - 1;i++) {//loop over all but the last character
|
||||
//if this character has a lower value than the next character
|
||||
if (decodeSingle(uRoman.charAt(i)) < decodeSingle(uRoman.charAt(i+1))) {
|
||||
//subtract it
|
||||
result -= decodeSingle(uRoman.charAt(i));
|
||||
} else {
|
||||
//add it
|
||||
result += decodeSingle(uRoman.charAt(i));
|
||||
}
|
||||
}
|
||||
//decode the last character, which is always added
|
||||
result += decodeSingle(uRoman.charAt(uRoman.length()-1));
|
||||
return result;
|
||||
}
|
||||
|
||||
public static void main(String[] args) {
|
||||
System.out.println(decode("MCMXC")); //1990
|
||||
System.out.println(decode("MMVIII")); //2008
|
||||
System.out.println(decode("MDCLXVI")); //1666
|
||||
}
|
||||
}
|
||||
59
Task/Roman-numerals-Decode/Java/roman-numerals-decode-2.java
Normal file
59
Task/Roman-numerals-Decode/Java/roman-numerals-decode-2.java
Normal file
|
|
@ -0,0 +1,59 @@
|
|||
import java.util.Set;
|
||||
import java.util.EnumSet;
|
||||
import java.util.Collections;
|
||||
import java.util.stream.Collectors;
|
||||
import java.util.stream.LongStream;
|
||||
|
||||
public interface RomanNumerals {
|
||||
public enum Numeral {
|
||||
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);
|
||||
|
||||
public final long weight;
|
||||
|
||||
private static final Set<Numeral> SET = Collections.unmodifiableSet(EnumSet.allOf(Numeral.class));
|
||||
|
||||
private Numeral(long weight) {
|
||||
this.weight = weight;
|
||||
}
|
||||
|
||||
public static Numeral getLargest(long weight) {
|
||||
return SET.stream()
|
||||
.filter(numeral -> weight >= numeral.weight)
|
||||
.findFirst()
|
||||
.orElse(I)
|
||||
;
|
||||
}
|
||||
};
|
||||
|
||||
public static String encode(long n) {
|
||||
return LongStream.iterate(n, l -> l - Numeral.getLargest(l).weight)
|
||||
.limit(Numeral.values().length)
|
||||
.filter(l -> l > 0)
|
||||
.mapToObj(Numeral::getLargest)
|
||||
.map(String::valueOf)
|
||||
.collect(Collectors.joining())
|
||||
;
|
||||
}
|
||||
|
||||
public static long decode(String roman) {
|
||||
long result = new StringBuilder(roman.toUpperCase()).reverse().chars()
|
||||
.mapToObj(c -> Character.toString((char) c))
|
||||
.map(numeral -> Enum.valueOf(Numeral.class, numeral))
|
||||
.mapToLong(numeral -> numeral.weight)
|
||||
.reduce(0, (a, b) -> a + (a <= b ? b : -b))
|
||||
;
|
||||
if (roman.charAt(0) == roman.charAt(1)) {
|
||||
result += 2 * Enum.valueOf(Numeral.class, roman.substring(0, 1)).weight;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
public static void test(long n) {
|
||||
System.out.println(n + " = " + encode(n));
|
||||
System.out.println(encode(n) + " = " + decode(encode(n)));
|
||||
}
|
||||
|
||||
public static void main(String[] args) {
|
||||
LongStream.of(1999, 25, 944).forEach(RomanNumerals::test);
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue