Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // https://puzzling.stackexchange.com/questions/89598/generating-roman-numerals-with-dice
- // Score checker
- // Dmitry Kamenetsky, 28th September 2019
- import java.util.*;
- public class RomanNumerals
- {
- static int NumDigs=2000; //number of digits we will consider
- static int N=3; //number of dice
- static String[] Romans; //Romans[i] is i-th number in Roman numerals
- static Map<String,Integer> Romans2Dec;
- static boolean[] Seen;
- public static void main(String[] args)
- {
- generateRomans();
- score("I II III IV IX C","V X XV XCV CX C","XX L LV LXX C CXX"); //160 from Bass
- //score("I,II,III,IV,VI,VII","X,XX,XXX,XL,LX,LXX","V,L,IX,LV,XV,XIX"); //89 from trolley813
- //score("I,II,III,IV,IX,CLXC","V,X,XX,XXX,XL,XXV","V,L,XC,C,CL,CLX"); //64 from PuzzleGuest
- }
- public static void generateRomans()
- {
- char[] digits={'I','V','X','L','C','D','M'};
- int[][] id={{},{0},{0,0},{0,0,0},{0,1},{1},{1,0},{1,0,0},{1,0,0,0},{0,2}};
- Romans=new String[NumDigs+1];
- Romans2Dec=new HashMap<String,Integer>();
- for (int i=1; i<=NumDigs; i++)
- {
- String a=""+i;
- String roman="";
- for (int k=0; k<a.length(); k++)
- {
- int digit=(int)(a.charAt(k)-'0');
- for (int q=0; q<id[digit].length; q++)
- roman+=digits[id[digit][q]+2*(a.length()-1-k)];
- }
- //System.out.println(i+" "+roman);
- Romans[i]=roman;
- Romans2Dec.put(roman,i);
- }
- }
- public static void score(String dice1, String dice2, String dice3)
- {
- Seen=new boolean[NumDigs+1];
- String[][] allDice=new String[N][];
- allDice[0]=dice1.split("[, ]+");
- allDice[1]=dice2.split("[, ]+");
- allDice[2]=dice3.split("[, ]+");
- boolean[] done=new boolean[N];
- go(done,allDice,"");
- for (int i=1; i<=NumDigs; i++)
- if (!Seen[i])
- {
- System.out.println(i+"="+Romans[i]+" cannot be made");
- System.out.println("range covered "+(i-1));
- break;
- }
- }
- public static void go(boolean[] done, String[][] allDice, String cur)
- {
- Integer num=Romans2Dec.get(cur);
- if (num!=null) Seen[num]=true;
- for (int i=0; i<N; i++)
- if (!done[i])
- {
- for (int k=0; k<allDice[i].length; k++)
- {
- done[i]=true;
- go(done,allDice,cur+allDice[i][k]);
- done[i]=false;
- }
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement