Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package nexusoffate;
- import java.util.Arrays.*;
- public class NexusOfFate {
- public static void main(String[] args) {
- //Declare variables
- int ExtraCardDrawPerTurn=2;
- double[][][][] TransitionMatrix = new double[21][41][21][41];
- int ExtraTurns; int CardsInDeck; int FROMExtraTurns; int FROMCardsInDeck; int TOExtraTurns; int TOCardsInDeck; int BETWEENExtraTurns; int BETWEENCardsInDeck;
- boolean WeGoInfinite;
- //Note that since we draw cards after casting Nexuses, we'll always have at least 4 cards in library at that point
- //State with 0 extra turns, 0 cards in library => Absorbing, opponent took a turn
- //State with 20 extra turns, 0 cards in library => Absorbing, we go infinite
- TransitionMatrix[0][0][0][0]=1;
- TransitionMatrix[20][0][20][0]=1;
- for ( FROMExtraTurns=0; FROMExtraTurns<=10; FROMExtraTurns++){
- for ( FROMCardsInDeck=4; FROMCardsInDeck<=40; FROMCardsInDeck++){
- WeGoInfinite=false;
- if (FROMExtraTurns==20 || FROMExtraTurns*(1+ExtraCardDrawPerTurn)>FROMCardsInDeck) {WeGoInfinite=true;}
- if (ExtraCardDrawPerTurn==1 && !WeGoInfinite){
- double ProbDrawFate1=4.0/FROMCardsInDeck;
- double ProbDrawFate2=4.0/(FROMCardsInDeck-1);
- TransitionMatrix[FROMExtraTurns][FROMCardsInDeck][Math.min(FROMExtraTurns+1,20)][FROMCardsInDeck]=ProbDrawFate1*ProbDrawFate1;
- TransitionMatrix[FROMExtraTurns][FROMCardsInDeck][FROMExtraTurns][FROMCardsInDeck-1]=TransitionMatrix[FROMExtraTurns][FROMCardsInDeck][FROMExtraTurns][FROMCardsInDeck-1]+ProbDrawFate1*(1-ProbDrawFate1);
- TransitionMatrix[FROMExtraTurns][FROMCardsInDeck][FROMExtraTurns][FROMCardsInDeck-1]=TransitionMatrix[FROMExtraTurns][FROMCardsInDeck][FROMExtraTurns][FROMCardsInDeck-1]+(1-ProbDrawFate1)*ProbDrawFate2;
- if (FROMExtraTurns>0) {TransitionMatrix[FROMExtraTurns][FROMCardsInDeck][FROMExtraTurns-1][FROMCardsInDeck-2]=(1-ProbDrawFate1)*(1-ProbDrawFate2);}
- if (FROMExtraTurns==0) {TransitionMatrix[FROMExtraTurns][FROMCardsInDeck][0][0]=(1-ProbDrawFate1)*(1-ProbDrawFate2);}
- }
- if (ExtraCardDrawPerTurn==2 && !WeGoInfinite){
- double ProbDrawFate1=4.0/FROMCardsInDeck;
- double ProbDrawFate2=4.0/(FROMCardsInDeck-1);
- double ProbDrawFate3=4.0/(FROMCardsInDeck-2);
- //Hit-Hit-Hit
- TransitionMatrix[FROMExtraTurns][FROMCardsInDeck][Math.min(FROMExtraTurns+2,20)][FROMCardsInDeck]=ProbDrawFate1*ProbDrawFate1*ProbDrawFate1;
- //Hit-Hit-Miss
- TransitionMatrix[FROMExtraTurns][FROMCardsInDeck][Math.min(FROMExtraTurns+1,20)][FROMCardsInDeck-1]=TransitionMatrix[FROMExtraTurns][FROMCardsInDeck][Math.min(FROMExtraTurns+1,20)][FROMCardsInDeck-1]+ProbDrawFate1*ProbDrawFate1*(1-ProbDrawFate1);
- //Hit-Miss-Hit
- TransitionMatrix[FROMExtraTurns][FROMCardsInDeck][Math.min(FROMExtraTurns+1,20)][FROMCardsInDeck-1]=TransitionMatrix[FROMExtraTurns][FROMCardsInDeck][Math.min(FROMExtraTurns+1,20)][FROMCardsInDeck-1]+ProbDrawFate1*(1-ProbDrawFate1)*ProbDrawFate2;
- //Miss-Hit-Hit
- TransitionMatrix[FROMExtraTurns][FROMCardsInDeck][Math.min(FROMExtraTurns+1,20)][FROMCardsInDeck-1]=TransitionMatrix[FROMExtraTurns][FROMCardsInDeck][Math.min(FROMExtraTurns+1,20)][FROMCardsInDeck-1]+(1-ProbDrawFate1)*ProbDrawFate2*ProbDrawFate2;
- //Hit-Miss-Miss
- TransitionMatrix[FROMExtraTurns][FROMCardsInDeck][FROMExtraTurns][FROMCardsInDeck-2]=TransitionMatrix[FROMExtraTurns][FROMCardsInDeck][FROMExtraTurns][FROMCardsInDeck-2]+ProbDrawFate1*(1-ProbDrawFate1)*(1-ProbDrawFate2);
- //Miss-Hit-Miss
- TransitionMatrix[FROMExtraTurns][FROMCardsInDeck][FROMExtraTurns][FROMCardsInDeck-2]=TransitionMatrix[FROMExtraTurns][FROMCardsInDeck][FROMExtraTurns][FROMCardsInDeck-2]+(1-ProbDrawFate1)*ProbDrawFate2*(1-ProbDrawFate2);
- //Miss-Miss-Hit
- TransitionMatrix[FROMExtraTurns][FROMCardsInDeck][FROMExtraTurns][FROMCardsInDeck-2]=TransitionMatrix[FROMExtraTurns][FROMCardsInDeck][FROMExtraTurns][FROMCardsInDeck-2]+(1-ProbDrawFate1)*(1-ProbDrawFate2)*ProbDrawFate3;
- //Miss-Miss-Miss
- if (FROMExtraTurns>0) {TransitionMatrix[FROMExtraTurns][FROMCardsInDeck][FROMExtraTurns-1][FROMCardsInDeck-3]=(1-ProbDrawFate1)*(1-ProbDrawFate2)*(1-ProbDrawFate3);}
- if (FROMExtraTurns==0) {TransitionMatrix[FROMExtraTurns][FROMCardsInDeck][0][0]=(1-ProbDrawFate1)*(1-ProbDrawFate2)*(1-ProbDrawFate3);}
- }
- if (WeGoInfinite){
- TransitionMatrix[FROMExtraTurns][FROMCardsInDeck][20][0]=1;
- }
- }
- }
- double[][] StartingDistribution = new double[21][41];
- double[][] NewDistribution = new double[21][41];
- for (int StartingDeckSize=4; StartingDeckSize<=40; StartingDeckSize++){
- for ( ExtraTurns=0; ExtraTurns<=20; ExtraTurns++){
- for ( CardsInDeck=0; CardsInDeck<=40; CardsInDeck++){
- StartingDistribution[ExtraTurns][CardsInDeck]=0;
- NewDistribution[ExtraTurns][CardsInDeck]=0;
- }}
- StartingDistribution[2][StartingDeckSize]=1;
- for (int Turn=1; Turn<=60; Turn++){
- for ( FROMExtraTurns=0; FROMExtraTurns<=20; FROMExtraTurns++){
- for ( FROMCardsInDeck=0; FROMCardsInDeck<=40; FROMCardsInDeck++){
- for ( TOExtraTurns=0; TOExtraTurns<=20; TOExtraTurns++){
- for ( TOCardsInDeck=0; TOCardsInDeck<=40; TOCardsInDeck++){
- NewDistribution[TOExtraTurns][TOCardsInDeck]=NewDistribution[TOExtraTurns][TOCardsInDeck]+StartingDistribution[FROMExtraTurns][FROMCardsInDeck]*TransitionMatrix[FROMExtraTurns][FROMCardsInDeck][TOExtraTurns][TOCardsInDeck];
- }}}}
- for ( ExtraTurns=0; ExtraTurns<=20; ExtraTurns++){
- for ( CardsInDeck=0; CardsInDeck<=40; CardsInDeck++){
- StartingDistribution[ExtraTurns][CardsInDeck]=NewDistribution[ExtraTurns][CardsInDeck];
- NewDistribution[ExtraTurns][CardsInDeck]=0;
- }}
- }
- System.out.println(StartingDistribution[20][0]);
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement