
Real1ty
Senior Member

Nov 18, 2006, 5:27 AM
Post #1 of 4
(296 views)
Shortcut
|
|
Recursive Permuter
|
Can't Post
|
|
I originally wrote this program to figure out the values of cryptograms, when added together, but with a little reworking, the permuter I made can be very useful in other situations...
/** * Created by IntelliJ IDEA. * User: real1ty * Date: Sep 20, 2006 * Time: 2:22:59 PM * To change this template use File | Settings | File Templates. */ class RecursionDriver { public static void main(String args[]) { Recursion test = new Recursion("PORK", "CHOP", "PIZZA", '+'); //FIRST CRYPTOGRAM, SECOND CRYPTOGRAM, operator if (test.assignArray(0)) test.print(); else System.out.println("No Solution"); } } /** * Created by IntelliJ IDEA. * User: emlander * Date: Sep 20, 2006 * Time: 1:49:13 PM * To change this template use File | Settings | File Templates. */ class Recursion { static final int UNASSIGNED = -1; static final int UNUSED = -2; static final int CHARCOUNT = 26; int[ ] letters; String firstString; String secondString; String thirdString; char operator; int firstValues; int secondValues; int thirdValues; boolean[ ] used= new boolean[10]; public Recursion(String thisFirstString, String thisSecondString, String thisThirdString, char thisOperator) { letters = new int[CHARCOUNT]; for(int i=0; i<CHARCOUNT; i++) letters = UNUSED; for(int p= 0; p<10; p ++) { used[p] = false; } firstString = thisFirstString; secondString = thisSecondString; thirdString = thisThirdString; firstValues = UNUSED; secondValues = UNUSED; thirdValues = UNUSED; operator = thisOperator; initialize(firstString); initialize(secondString); initialize(thirdString); } public void initialize(String thisString) { for(int i=0; i <thisString.length(); i++) letters[valueChar(thisString.charAt(i))] = UNASSIGNED; } public boolean testValues() { firstValues = getValues(firstString); secondValues = getValues(secondString); thirdValues = getValues(thirdString); if(operator == '+') return firstValues + secondValues == thirdValues; if(operator == '-') return firstValues - secondValues == thirdValues; System.out.println("THIS PROGRAM CAN ONLY ADD AND SUBTRACT :("); return false; } //permuter starts here public boolean assignArray(int position) { /*Debugging Tool *System.out.println(this.toString()); *count += 1; */ //System.out.println(position); if (position>=CHARCOUNT) return testValues(); else if (letters[position] == UNUSED) return assignArray(position+1); else { for(int j=0; j <10; j++) { if (!used[j]) { letters[position] = j; //System.out.println(j); used[j] = true; if (assignArray(position +1)) return true; used[j] = false; } } /*The code: *if (assignArray(position+1)) *return true; used to be here.*/ } return false; }//end permuter public void resetUsed() { for(int i = 0; i>10; i++) used=false; } //BIG Precondition: This method can NOT be passed a null string (null length). public int getValues(String thisString) { String resultString = ""; for(int i= thisString.length()-1; i>=0; i--) resultString = "" +letters[valueChar(thisString.charAt(i))] + resultString; // System.out.println(resultString); return Integer.parseInt(resultString); } public int valueChar(char thisChar) { int result= UNASSIGNED; switch(thisChar) { case 'A': result= 0; break; case 'B': result= 1; break; case 'C': result= 2; break; case 'D': result= 3; break; case 'E': result= 4; break; case 'F': result= 5; break; case 'G': result= 6; break; case 'H': result= 7; break; case 'I': result= 8; break; case 'J': result= 9; break; case 'K': result= 10; break; case 'L': result= 11; break; case 'M': result= 12; break; case 'N': result= 13; break; case 'O': result= 14; break; case 'P': result= 15; break; case 'Q': result= 16; break; case 'R': result= 17; break; case 'S': result= 18; break; case 'T': result= 19; break; case 'U': result= 20; break; case 'V': result= 21; break; case 'W': result= 22; break; case 'X': result= 23; break; case 'Y': result= 24; break; case 'Z': result= 25; break; } return result; } public String toLetter(int thisInt) { String result= ""; switch(thisInt) { case 0: result= "A"; break; case 1: result= "B"; break; case 2: result= "C"; break; case 3: result= "D"; break; case 4: result= "E"; break; case 5: result= "F"; break; case 6: result= "G"; break; case 7: result= "H"; break; case 8: result= "I"; break; case 9: result= "J"; break; case 10: result= "K"; break; case 11: result= "L"; break; case 12: result= "M"; break; case 13: result= "N"; break; case 14: result= "O"; break; case 15: result= "P"; break; case 16: result= "Q"; break; case 17: result= "R"; break; case 18: result= "S"; break; case 19: result= "T"; break; case 20: result= "U"; break; case 21: result= "V"; break; case 22: result= "W"; break; case 23: result= "X"; break; case 24: result= "Y"; break; case 25: result= "Z"; break; } return result; } public String toString() { String resultString = "Character Values:"; for(int i=0; i<CHARCOUNT; i++) { if(letters != UNUSED) resultString= resultString + "\n" + toLetter(i) + "=" + letters; } resultString= resultString + "\n" + "\n" + "Solution:" + "\n" + "\n " +firstValues + "\n" + operator + secondValues + "\n____________________________________" + "\n" + thirdValues; return resultString; } public void print() { System.out.println(this.toString()); } }
"It worked, idk how. It probably wasn't healthy considering one time it bleed." ~coolgreencat
|