Data commit
This commit is contained in:
parent
7387c8f97b
commit
cb5bb5e222
199093 changed files with 3378972 additions and 0 deletions
41
Task/Roman-numerals-Encode/Java/roman-numerals-encode-1.java
Normal file
41
Task/Roman-numerals-Encode/Java/roman-numerals-encode-1.java
Normal file
|
|
@ -0,0 +1,41 @@
|
|||
public class RN {
|
||||
|
||||
enum Numeral {
|
||||
I(1), IV(4), V(5), IX(9), X(10), XL(40), L(50), XC(90), C(100), CD(400), D(500), CM(900), M(1000);
|
||||
int weight;
|
||||
|
||||
Numeral(int weight) {
|
||||
this.weight = weight;
|
||||
}
|
||||
};
|
||||
|
||||
public static String roman(long n) {
|
||||
|
||||
if( n <= 0) {
|
||||
throw new IllegalArgumentException();
|
||||
}
|
||||
|
||||
StringBuilder buf = new StringBuilder();
|
||||
|
||||
final Numeral[] values = Numeral.values();
|
||||
for (int i = values.length - 1; i >= 0; i--) {
|
||||
while (n >= values[i].weight) {
|
||||
buf.append(values[i]);
|
||||
n -= values[i].weight;
|
||||
}
|
||||
}
|
||||
return buf.toString();
|
||||
}
|
||||
|
||||
public static void test(long n) {
|
||||
System.out.println(n + " = " + roman(n));
|
||||
}
|
||||
|
||||
public static void main(String[] args) {
|
||||
test(1999);
|
||||
test(25);
|
||||
test(944);
|
||||
test(0);
|
||||
}
|
||||
|
||||
}
|
||||
59
Task/Roman-numerals-Encode/Java/roman-numerals-encode-2.java
Normal file
59
Task/Roman-numerals-Encode/Java/roman-numerals-encode-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