day05
This commit is contained in:
		
							parent
							
								
									861e13713e
								
							
						
					
					
						commit
						dd98983ab3
					
				
					 1 changed files with 45 additions and 0 deletions
				
			
		
							
								
								
									
										45
									
								
								2022/day05.nim
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										45
									
								
								2022/day05.nim
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,45 @@
 | 
				
			||||||
 | 
					import std/[algorithm, os, sequtils, strutils]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let
 | 
				
			||||||
 | 
					  input = stdin.readAll().strip().split("\n\n")
 | 
				
			||||||
 | 
					  stackLevels = input[0].splitLines().reversed()
 | 
				
			||||||
 | 
					  steps = input[1]
 | 
				
			||||||
 | 
					  stackIndices = stackLevels[0].splitWhitespace()
 | 
				
			||||||
 | 
					  stackSize = stackIndices[^1].parseInt()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					var stacks = newSeq[seq[char]](stackSize)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					for stackLevel in stackLevels[1..^1]:
 | 
				
			||||||
 | 
					  for i in 0 ..< stackSize:
 | 
				
			||||||
 | 
					    let charIdx = i * 4 + 1
 | 
				
			||||||
 | 
					    let crateId = stackLevel[charIdx]
 | 
				
			||||||
 | 
					    if crateId != ' ':
 | 
				
			||||||
 | 
					      stacks[i].add(crateId)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					proc crateMover9000(fromStack, toStack: var seq[char]; number: int) =
 | 
				
			||||||
 | 
					  for i in 0 ..< number:
 | 
				
			||||||
 | 
					    let crate = fromStack.pop()
 | 
				
			||||||
 | 
					    toStack.add(crate)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					proc crateMover9001(fromStack, toStack: var seq[char]; number: int) =
 | 
				
			||||||
 | 
					  for crate in fromStack[^number..^1]:
 | 
				
			||||||
 | 
					    toStack.add(crate)
 | 
				
			||||||
 | 
					  fromStack.delete(fromStack.len - number .. fromStack.high)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let move =
 | 
				
			||||||
 | 
					  if paramCount() > 0 and paramStr(1) == "2":
 | 
				
			||||||
 | 
					    crateMover9001
 | 
				
			||||||
 | 
					  else:
 | 
				
			||||||
 | 
					    crateMover9000
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					for step in steps.splitLines():
 | 
				
			||||||
 | 
					  let
 | 
				
			||||||
 | 
					    tokens = step.splitWhitespace()
 | 
				
			||||||
 | 
					    moves = tokens[1].parseInt()
 | 
				
			||||||
 | 
					    fromStackIdx = tokens[3].parseInt() - 1
 | 
				
			||||||
 | 
					    toStackIdx = tokens[5].parseInt() - 1
 | 
				
			||||||
 | 
					  stacks[fromStackIdx].move(stacks[toStackIdx], moves)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					for stack in stacks:
 | 
				
			||||||
 | 
					  stdout.write(stack[^1])
 | 
				
			||||||
 | 
					echo()
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue