2014-03-01 3 views
0

나는 13 개의 카드가 [0-12]로 저장된이 포커 카드 게임을 가지고 있습니다. 13 개의 카드 랭크를 가진 5 개의 카드를 가지고있는 각 핸드.표기 팩터 값을 원래 값으로 다시 곱한 표 팩터

마지막 값은 지수 135 (5의 거듭 제곱)부터 시작하는 식별자입니다.

그것은 어떤 종류의 승리 손을 저장합니다. 나머지 5 개의 13의 힘은 5 장의 카드 각각을 저장하는 데 사용됩니다.

또한 5 장의 카드가 항상 저장되는 것은 아니지만 4 장의 키커가 필요한 하이 카드 우승에만 해당됩니다.

제 질문은 모든 카드를 어떻게 풀 수 있었고 어떤 종류의 승리의 손 이었는가하는 최종적인 가치를 사용하고 있습니다.

/** The ranking factors (powers of 13, the number of ranks). */ 
private static final int[] RANKING_FACTORS = {371293, 28561, 2197, 169, 13, 1}; 

rankings[0] = HIGHCARD WIN [0] 
rankings[1] = 12; //Ace 
rankings[2] = 6; //Eight 
rankings[3] = 9; //Jack 
rankings[4] = 1; //Three 
rankings[5] = 3; //Five 

// Calculate value. 
for (int i = 0; i < NO_OF_RANKINGS; i++) { 
    value += rankings[i] * RANKING_FACTORS[i]; 
} 

(0*371293) + (12*28561) + (6*2197) + (9*169) + (1*13) + (3*1) = 357451 

357451 값의 압축을 풀려고합니다. 수학을 계산하기 시작합니다.

if 357451 < 371293      rankings[0] = 0 

(357451/28561) = 12      rankings[1] = 12 
(357451/2197)/((13*2)+1) = 6   rankings[2] = 6 
(357451/169)/((13*18)+1) = 9   rankings[3] = 9 
//Alright it seems that 18 is from answers (12+6) probably because I haven't subtracted them or something. 
//So next one should be (12+6+9)= 27, but it's 2115 
(357451/13)/((13*2115)+1) = 1  rankings[4] = 1 
(357451/1)/((13*9165)+1) = 3   rankings[5] = 3 

나는 그것을 알아 냈다고 생각하지만 값을 이해할 수 없을 것입니다.이 경우에는 아마 또한 다른 경우에는 작동하지 않을 것입니다.

2, 18, 2115, 9165 값이 어디에서 생성되었는지 알 수 없습니다.

어떻게하면됩니까? 나는 이것이 비트가 아니기 때문에 나는 이동을 사용할 수 있다고 생각하지 않는다.

그래서 다음과 같이 끝났습니까?

(357451/371293)   = 0 
(357451/28561)   = 12 
(357451 % 28561)/2197 = 6 
(357451 % 2197)/169  = 9 

(357451 % 169)/13  = 1 
(357451 % 13)    = 3 

답변

1

당신은이 부분을 통해 맞아요 ..

(357451/28561) = 12      rankings[1] = 12 

는하지만이는 더 좋은 ...

당신은 당신의 결과 (12)를 가지고 그것을 다시 곱해야
(357451/2197)/((13*2)+1) = 6   rankings[2] = 6 

그런 다음 28561에서 357451의 값을 빼서 남은 것이 무엇인지 확인합니다. 당신이 당신의 5 개 개의 번호를 때까지 -이 경우에는 지금 14719.

당신이 그래서 2,197분의 14,719 = 6

그 패턴 ((2197 * 6) 14719)을 계속 그 번호를 사용하는 대신 357451. 계속할 수 있어요 .

(357451 % 28561) 또한 그렇게하려는 경우 남은 부분을 가져옵니다.

내 "디코드"코드가 ...

private static final int[] RANKING_FACTORS = {4826809, 371293, 28561, 2197, 169, 13, 1}; 

@Test 
public void testDecode() { 
    long value = 357451; 
    int[] rankings = new int[6]; 
    //System.out.println(Math.max(0,value-RANKING_FACTORS[0])); 
    for (int i=0; i < rankings.length; i++) { 
     rankings[i] = (int)(value/RANKING_FACTORS[i]); 
     value %= RANKING_FACTORS[i]; 
     System.out.println(rankings[i]); 
    } 
} 
+0

는 그래서이처럼'(28,561분의 357,451) = 12' '(357,451% 28561)/2197 = 6' '(35만7천4백51퍼센트 2197)/169 = 9' '(357451 % 169)/13 = 1' '(357451 % 13) = 3' if 문없이 첫 번째 값을 어떻게 확인합니까? – SSpoke

+0

그래서 첫 번째 값 0을 얻으려면'357451/371293'을할까요? – SSpoke

+1

숫자의 하이 엔드에 추가 값을 추가한다고 가정하면 순위 [0] = Math를 사용할 수 있습니다.max (0, value-RANKING_FACTORS [0]) –