NilsKirchhoff icon

AoC 2017 - Day 6

NilsKirchhoff | PRO | 12/06/17 08:44:40 PM UTC | 0 ⭐ | 275 👁️ | Never ⏰ | []
Java |

4.58 KB

|

None

|

0 👍

/

0 👎

public class Day6 {
    
    //*******************************************// 
    // ==========   Day 5 - Part 1    ========== //     
    //*******************************************//
    
    //class to creat list of previous change iterations
    static class Results {
        int[] values = new int[16];
        Results next = null;
    }
 
    // main method to get the number of loops until a previous result is received
    public static void main(String[] args) {
        
        // question 0   5   10  0   11  14  13  4   11  8   8   7   1   4   12  11
         int[] banks = {0,5,10,0,11,14,13,4,11,8,8,7,1,4,12,11};
 
        //example question 
        // int banks[] = {0, 2, 7, 0}; 
        
        //initializing needed variables
        int max = 0,  maxlocation = 0, counter = 0;
        Results anker = null;
        Results lauf = new Results();
        
        //loop until a previous result is received
        while (gesehen(anker, banks) != true) {
            //reset value location each loop
            maxlocation = 0;
            
            //get the highest values and its location
            for (int i=0; i<banks.length; i++) {
                if (banks[i] > max) {
                    max = banks[i];
                    maxlocation = i;
                }
            }
            
            //reset highest value to 0
            banks[maxlocation] = 0;
            
            //increase the location by one
            maxlocation++;
            
            //loop though array and increase values until max value is 0
            while (max != 0) {
                if (maxlocation < banks.length) {
                banks[maxlocation]++;
                max--;
                maxlocation++;
                } else {
                    maxlocation = 0;
                    banks[maxlocation]++;
                    max--;
                    maxlocation++;
                }       
                
            }
                
            //create list of previous results, or attach last result to exsisting list
            Results neu = new Results();
            for (int i=0; i<banks.length; i++)
                neu.values[i] = banks[i];
                if(anker == null) {
                    anker = neu;
                    lauf = neu;
                } else {
                    lauf.next = neu;
                    lauf = lauf.next;
                }
            
            // increase counter after each loop iteration
            counter++;
        }
        
        System.out.println("Loops for Part 1: " + counter);
        
        //*******************************************// 
        // ==========   Day 5 - Part 2    ========== //     
        //*******************************************//
        // copy the previous exsisting result into a new arrwa 
        int[] banken = new int[16];
        for (int i=0; i<banks.length; i++)
                banken[i] = banks[i];
 
        //reset counter
        counter = 0;
        
        // loop until previous result is found again
        do {
                //reset value location each loop
                maxlocation = 0;
                
                //get the highest values and its location
                for (int i=0; i<banks.length; i++) {
                    if (banks[i] > max) {
                        max = banks[i];
                        maxlocation = i;
                    }
                }
                
                //reset highest value to 0
                banks[maxlocation] = 0;
                //increase the location by one
                maxlocation++;
                
                //loop though array and increase values until max value is 0
                while (max != 0) {
                    if (maxlocation < banks.length) {
                    banks[maxlocation]++;
                    max--;
                    maxlocation++;
                    } else {
                        maxlocation = 0;
                        banks[maxlocation]++;
                        max--;
                        maxlocation++;
                    }       
                }
                // increase counter after each loop iteration
                counter ++; 
        //check if previous result equal the newly calculated result
        } while (wiederGesehen(banken, banks) == false);
        
        System.out.println("Loops for Part 2: " + counter);
    }
    
    
    // method for part 1 - checking if list of previous calculations matches new calculated result
    static boolean gesehen(Results liste, int[] banks) {
        // variable to track matches within the list
        int hit = 0;
        
        //only check if the method received a valif list
        if (liste != null) {
            //loop through list, while it still has new items
            while (liste.next != null) {
                //reset hit-counter each loop through
                hit = 0;
                //loop through the values of the list and check for matches with current result
                for (int i=0; i<banks.length; i++) {
                    if (liste.values[i] == banks[i])
                        hit++;              
                    //when all values are hit, return true
                    if(hit == 16)
                        return true;
                } 
                //go to the next item of the list
                liste = liste.next;
            }
            
        }       
        return  false;
    }
    
    //method for part 2 - checking if newly calculated result matches result of day 2
    static boolean wiederGesehen(int[] banken, int[] banks) {
        // variable to track matches within the list
        int hit = 0;
        // loop through result from part 1 and compare with new calcualted result
        for (int i=0; i<banks.length; i++) {
                //increase hit-counter for each value matched
                if (banken[i] == banks[i])
                    hit++;  
                //when all values are hit, return true
                if(hit == 16)
                    return true;
            } 
        return false;
    }
    
}

Comments