Advertisement
Arham-4

Squeezebox Solitaire

Oct 19th, 2018
230
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 4.83 KB | None | 0 0
  1. package org.friscoisd.k12.linkedlist.solitaire;
  2.  
  3. import org.friscoisd.k12.linkedlist.solitaire.card.Card;
  4.  
  5. import java.io.File;
  6. import java.io.FileNotFoundException;
  7. import java.util.*;
  8.  
  9. public class Squeezebox {
  10.  
  11.     public static void main(String[] args) {
  12.         Squeezebox squeezebox = new Squeezebox();
  13.         squeezebox.setupAndSolve();
  14.     }
  15.  
  16.     private void setupAndSolve() {
  17.         try (Scanner scanner = new Scanner(new File("squeezebox.dat"))) {
  18.             while (!scanner.hasNext("#")) {
  19.                 ArrayDeque<Card> cards = new ArrayDeque<>();
  20.                 loadCards(scanner, cards);
  21.                 solve(cards);
  22.             }
  23.         } catch (FileNotFoundException e) {
  24.             e.printStackTrace();
  25.         }
  26.     }
  27.  
  28.     private void loadCards(Scanner scanner, ArrayDeque<Card> cards) {
  29.         String[][] rawCards = { scanner.nextLine().split(" "), scanner.nextLine().split(" ") };
  30.  
  31.         Arrays.stream(rawCards).forEach(cardRow ->
  32.                 Arrays.stream(cardRow).forEach(card -> cards.addLast(new Card(card))));
  33.     }
  34.  
  35.     private void solve(ArrayDeque<Card> cards) {
  36.         LinkedList<LinkedList<Card>> piles = new LinkedList<>();
  37.  
  38.         do {
  39.             Card cardDrawn = drawCard(cards);
  40.             makeNewPileOfCards(piles, cardDrawn);
  41.  
  42.             int newPileIndex = piles.size() - 1;
  43.             doMoveIfPossible(piles, newPileIndex);
  44.         } while (cards.size() != 0);
  45.  
  46.         printResult(piles);
  47.     }
  48.  
  49.     private void makeNewPileOfCards(LinkedList<LinkedList<Card>> piles, Card cardDrawn) {
  50.         LinkedList<Card> stackOfCards = new LinkedList<>();
  51.         stackOfCards.addFirst(cardDrawn);
  52.  
  53.         piles.addLast(stackOfCards);
  54.     }
  55.  
  56.     private Card drawCard(ArrayDeque<Card> cards) {
  57.         return cards.removeFirst();
  58.     }
  59.  
  60.     private void printResult(LinkedList<LinkedList<Card>> piles) {
  61.         int pilesRemaining = piles.size();
  62.         StringBuilder pilesWithCount = new StringBuilder();
  63.         for (LinkedList<Card> queueOfStacksOfCard : piles) {
  64.             pilesWithCount.append(queueOfStacksOfCard.size()).append(" ");
  65.         }
  66.         System.out.println(pilesRemaining + " piles remaining: " + pilesWithCount.toString());
  67.     }
  68.  
  69.     private void doMoveIfPossible(LinkedList<LinkedList<Card>> piles, int originIndex) {
  70.         if (matchesNeighborThreeSpacesDown(piles, originIndex)) {
  71.             moveCardThreeSpacesDown(piles, originIndex);
  72.         } else if (matchesDirectNeighbor(piles, originIndex)) {
  73.             moveCardOneSpaceDown(piles, originIndex);
  74.         }
  75.     }
  76.  
  77.     private void doMoveAcrossAllPiles(LinkedList<LinkedList<Card>> piles) {
  78.         for (int i = 0; i < piles.size(); i++) {
  79.             doMoveIfPossible(piles, i);
  80.         }
  81.     }
  82.  
  83.     private boolean matchesNeighborThreeSpacesDown(LinkedList<LinkedList<Card>> piles, int pileIndex) {
  84.         return matchesNeighborXSpacesDown(piles, pileIndex, 3);
  85.     }
  86.  
  87.     private boolean matchesDirectNeighbor(LinkedList<LinkedList<Card>> piles, int pileIndex) {
  88.         return matchesNeighborXSpacesDown(piles, pileIndex, 1);
  89.     }
  90.  
  91.     private boolean matchesNeighborXSpacesDown(LinkedList<LinkedList<Card>> piles, int pileIndex, int x) {
  92.         if (piles.size() < x || pileIndex >= piles.size() || pileIndex - x < 0) {
  93.             return false;
  94.         }
  95.         int directNeighborIndex = pileIndex - x;
  96.         Card cardInQuestion = piles.get(pileIndex).getFirst();
  97.         Card neighborThreeSpacesDown = piles.get(directNeighborIndex).getFirst();
  98.         return cardInQuestion.equals(neighborThreeSpacesDown);
  99.     }
  100.  
  101.     private void moveCardThreeSpacesDown(LinkedList<LinkedList<Card>> piles, int pileIndex) {
  102.         moveCardXSpacesDown(piles, pileIndex, 3);
  103.     }
  104.  
  105.     private void moveCardOneSpaceDown(LinkedList<LinkedList<Card>> piles, int pileIndex) {
  106.         moveCardXSpacesDown(piles, pileIndex, 1);
  107.     }
  108.  
  109.     private void moveCardXSpacesDown(LinkedList<LinkedList<Card>> piles, int pileIndex, int x) {
  110.         Card cardBeingMoved = piles.get(pileIndex).getFirst();
  111.         int neighborXSpacesDownIndex = pileIndex - x;
  112.  
  113.         piles.get(neighborXSpacesDownIndex).addFirst(cardBeingMoved); // adds card to top of new pile
  114.         piles.get(pileIndex).removeFirst(); // removes card from old pile
  115.  
  116.         postMove(piles);
  117.     }
  118.  
  119.     private void postMove(LinkedList<LinkedList<Card>> piles) {
  120.         cleanEmptyPiles(piles);
  121.         doMoveAcrossAllPiles(piles);
  122.     }
  123.  
  124.     private void cleanEmptyPiles(LinkedList<LinkedList<Card>> piles) {
  125.         ArrayList<Integer> emptyIndices = new ArrayList<>();
  126.         for (int i = 0; i < piles.size(); i++) {
  127.             if (piles.get(i).size() == 0) {
  128.                 emptyIndices.add(i);
  129.             }
  130.         }
  131.         for (int emptyIndex : emptyIndices) {
  132.             piles.remove(emptyIndex);
  133.         }
  134.     }
  135. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement