struct Train { let start: Int let path: Array var final: Int { var s = start for t in path { s = t.numberOpposite(s) } return s } func print() { let hasVertical = path.filter { $0.isDouble }.count > 0 var printedLines = Array>(repeating: [], count: hasVertical ? 5 : 3) var start = self.start for t in path { var lines = t.tile(leading: start).split(separator: "\n").map { Array($0) } if hasVertical == true && t.isDouble == false { lines.insert(Array(repeating: " ", count: Domino.horizontalTileWidth), at: 0) lines.append(Array(repeating: " ", count: Domino.horizontalTileWidth)) } start = t.numberOpposite(start) // append a space after this tile printedLines = printedLines.enumerated().map { $1 + lines[$0] + [" "] } } for l in printedLines { Swift.print(String(l)) } } }