Advertisement
Guest User

Untitled

a guest
Dec 22nd, 2020
81
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Swift 2.70 KB | None | 0 0
  1. import Foundation
  2. import utils
  3.  
  4. func parseDeck(_ deck: String) -> [Int] {
  5.     return deck.components(separatedBy: "\n")[1...].filter({$0.count > 0}).map({Int($0)!})
  6. }
  7.  
  8. func calcScore(_ deck: [Int]) -> Int {
  9.         return deck.reversed().enumerated().map({idx, card in (idx+1)*card}).reduce(0,+)
  10. }
  11.  
  12. func part1(_ deck1: [Int], _ deck2: [Int]) -> Int {
  13.     var player1 = deck1
  14.     var player2 = deck2
  15.  
  16.     while player1.count > 0 && player2.count > 0 {
  17.         let (a, b) = (player1.remove(at: 0), player2.remove(at: 0))
  18.         if a > b {
  19.             player1 += [a, b]
  20.         }
  21.         else {
  22.             player2 += [b, a]
  23.         }
  24.     }    
  25.    
  26.     if player1.count > 0 {
  27.         return calcScore(player1)
  28.     }
  29.     else {
  30.         return calcScore(player2)
  31.     }
  32. }
  33.  
  34. func part2(_ deck1: [Int], _ deck2: [Int]) -> Int {
  35.  
  36.     var winnersDeck = [Int]()
  37.     var memo = [[[Int]]: Int]()
  38.    
  39.     func subGame(_ deckA: [Int], _ deckB: [Int]) -> Int {
  40.        
  41.         var player1 = deckA
  42.         var player2 = deckB
  43.  
  44.         var prevRounds = Set<[[Int]]>()
  45.  
  46.         while player1.count > 0 && player2.count > 0 {
  47.             if prevRounds.contains([player1, player2]) {
  48.                 winnersDeck = player1
  49.                 return 1
  50.             }
  51.             else {
  52.                 prevRounds.insert([player1, player2])
  53.                
  54.                 let (a, b) = (player1.remove(at: 0), player2.remove(at: 0))
  55.                 if player1.count >= a && player2.count >= b {
  56.  
  57.                     let round = [player1, player2]
  58.                     let subWinner = memo[round] ?? subGame(Array(player1[..<a]), Array(player2[..<b]))
  59.                     memo[round] = subWinner
  60.                    
  61.                     if subWinner == 1 {
  62.                         player1 += [a, b]
  63.                     }
  64.                     else {
  65.                         player2 += [b, a]
  66.                     }
  67.                 }
  68.                 else {
  69.                     if a > b {
  70.                         player1 += [a, b]
  71.                     }
  72.                     else {
  73.                         player2 += [b, a]
  74.                     }
  75.                 }
  76.             }
  77.         }
  78.  
  79.         if player1.count > 0 {
  80.             winnersDeck = player1
  81.             return 1
  82.         }
  83.         else {
  84.             winnersDeck = player2
  85.             return 2
  86.         }
  87.     }
  88.    
  89.     let _ = subGame(deck1, deck2)
  90.     return calcScore(winnersDeck)
  91. }
  92.  
  93. let components = getFile(getFilename(day: 22)).components(separatedBy: "\n\n")
  94. let deck1 = parseDeck(components[0])
  95. let deck2 = parseDeck(components[1])
  96.  
  97.  
  98. print("Part 1")
  99. print("--", part1(deck1, deck2))
  100. print("Part 2")
  101. print("--", part2(deck1, deck2))
  102.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement