Skip to content

Instantly share code, notes, and snippets.

@watr
Created October 25, 2017 10:35
Show Gist options
  • Save watr/5a6c9a7a2b18aa886425797feb7ba70b to your computer and use it in GitHub Desktop.
Save watr/5a6c9a7a2b18aa886425797feb7ba70b to your computer and use it in GitHub Desktop.
ordf07walk.swift
import Foundation
struct TestCase: CustomStringConvertible {
var input: String
var expectedOutput: String
var description: String {
return String("input: \(self.input), expected output: \(self.expectedOutput)\n")
}
}
var testCases: [TestCase] = []
func addTestCase(_ input: String, _ expectedOutput: String) {
testCases.append(TestCase(input: input, expectedOutput: expectedOutput))
}
/*0*/ addTestCase( "12345/29496/19485/09594/82457", "*****/*9*9*/*9*8*/*9*9*/82**7" );
/*1*/ addTestCase( "12345/11011/65432/71999/65432", "*****/*****/*****/*1999/*****" );
/*2*/ addTestCase( "11111/11111/11111/11111/11111", "*****/*****/*****/*****/*****" );
/*3*/ addTestCase( "88011/79992/69992/69993/55443", "*****/*****/*****/*****/*****" );
/*4*/ addTestCase( "45000/46871/46971/36771/33222", "*****/*****/*****/*****/*****" );
/*5*/ addTestCase( "45020/46871/46971/36771/33222", "45*20/46871/46971/36771/33222" );
/*6*/ addTestCase( "21550/70587/91453/20343/96389", "21**0/70*87/91***/20***/96*89" );
/*7*/ addTestCase( "74438/33621/27261/91783/17242", "7***8/**6**/*726*/91783/17242" );
/*8*/ addTestCase( "33422/69349/24553/04129/52082", "***22/69**9/2***3/0*129/52082" );
/*9*/ addTestCase( "24573/71679/48704/19786/91834", "2***3/71**9/4**04/1***6/91*34" );
/*10*/ addTestCase( "23373/18323/34943/20613/79772", "***7*/*8***/349**/2061*/7977*" );
/*11*/ addTestCase( "78255/11128/48232/09427/78865", "78*55/****8/48***/094*7/78865" );
/*12*/ addTestCase( "82972/68827/34779/89986/45211", "82*72/6**27/34**9/****6/45211" );
/*13*/ addTestCase( "16702/45602/15203/44906/64628", "1**02/***02/1*203/**906/6*628" );
/*14*/ addTestCase( "52832/05787/66710/81714/75749", "52*32/0****/***10/81*14/75*49" );
/*15*/ addTestCase( "84555/63383/52164/43916/20026", "8****/***83/***64/**916/20026" );
/*16*/ addTestCase( "72261/21028/90154/71654/51861", "7**61/***28/9**54/7*654/5*861" );
/*17*/ addTestCase( "98787/56708/35188/42175/68339", "*****/***0*/3*1**/421*5/68339" );
/*18*/ addTestCase( "92767/16790/84897/69765/75734", "92***/1***0/84**7/69***/75***" );
/*19*/ addTestCase( "40454/92023/68721/31223/92629", "40***/920**/687**/3****/9*6*9" );
/*20*/ addTestCase( "55761/98788/56838/92226/57838", "55**1/*****/56*3*/92226/57838" );
/*21*/ addTestCase( "43367/35324/40338/35675/17028", "***67/*5**4/*0**8/*5675/17028" );
/*22*/ addTestCase( "97490/41513/42468/23325/27098", "97*90/4**13/4**68/****5/*7098" );
/*23*/ addTestCase( "65658/53785/10987/14550/03167", "****8/*3**5/10***/14550/03167" );
/*24*/ addTestCase( "96825/07774/18726/17112/37496", "9**25/0***4/1**26/1*112/3*496" );
/*25*/ addTestCase( "66674/65657/14666/32917/83223", "****4/*****/1****/3291*/83223" );
/*26*/ addTestCase( "74344/97459/97302/14439/35689", "7****/97**9/97*02/1***9/3**89" );
/*27*/ addTestCase( "63956/98856/98586/88356/59386", "63*56/***56/**586/**356/5*386" );
/*28*/ addTestCase( "55204/29155/42023/28114/27173", "55*04/29*55/42***/28***/27*7*" );
/*29*/ addTestCase( "96259/76240/06333/98212/70575", "96**9/76**0/06***/98***/70575" );
/*30*/ addTestCase( "96778/95391/95497/11300/85047", "9****/9**91/9**97/11*00/85047" );
/*31*/ addTestCase( "12618/16611/96673/43535/82667", "12*18/1**11/9***3/43*35/82***" );
/*32*/ addTestCase( "84348/77650/49246/62965/07154", "****8/****0/492*6/62965/07154" );
/*33*/ addTestCase( "21172/32169/46995/38254/43735", "***72/***69/*6995/*8254/**735" );
/*34*/ addTestCase( "98528/96666/78713/82600/76116", "98*28/9****/***13/*2*00/**116" );
/*35*/ addTestCase( "56543/64480/21582/03631/46244", "*****/***80/21*82/03*31/46244" );
/*36*/ addTestCase( "42865/87706/56970/17609/39789", "42*65/***06/**970/1**0*/39***" );
/*37*/ addTestCase( "41774/61265/57974/29143/55908", "41***/612**/579**/291**/55908" );
/*38*/ addTestCase( "03797/09776/26074/20987/35589", "03*9*/09***/260*4/20***/355**" );
/*39*/ addTestCase( "72261/22155/23330/53106/43155", "7**61/***55/****0/**106/**155" );
/*40*/ addTestCase( "56420/39322/05102/76122/03879", "56**0/39***/05***/76***/03879" );
/*41*/ addTestCase( "77665/95657/13657/94094/13762", "*****/9***7/13**7/94094/13762" );
/*42*/ addTestCase( "66110/25706/49002/77901/36519", "66***/257*6/49***/779**/365*9" );
/*43*/ addTestCase( "21244/58340/37447/06079/25691", "*****/58**0/37**7/06079/25691" );
/*44*/ addTestCase( "10180/11677/22208/34867/28064", "***80/**677/***08/**867/*8064" );
/*45*/ addTestCase( "34503/83687/42707/02558/12933", "***03/8**87/4**07/**558/**933" );
//MARK: -
typealias Position = (x: Int, y: Int)
struct Stage {
let input: String
var value: [Int]
func value(x: Int, y: Int) -> Int {
let i = ((5 * y) + x)
return self.value[i]
}
init(input: String) {
self.input = input
self.value = []
for split in input.split(separator: "/") {
let ca: [Character] = Array(split.characters)
for c in ca {
let v: Int = Int(String(c))!
self.value.append(v)
}
}
}
//MARK: gone
var gone = [Bool](repeating: false, count: 25)
func canGo(_ i: Int) -> Bool {
return self.gone[i]
}
func canGo(x: Int, y: Int) -> Bool {
let i = (5 * y) + x
return self.canGo(i)
}
//MARK: active
var active = [Bool](repeating: false, count: 25)
mutating func activate(_ active: Bool, x: Int, y: Int) {
let i = ((5 * y) + x)
if self.active[i] {
return
}
self.active[i] = active
if active {
self.gone[i] = true
let up: Position? = (y != 0) ? ((x), (y - 1)) : nil
let right: Position? = (x != 4) ? ((x + 1), (y)) : nil
let down: Position? = (y != 4) ? ((x), (y + 1)) : nil
let left: Position? = (x != 0) ? ((x - 1), (y)) : nil
for e in [up, right, down, left] {
if let e = e {
let diff: Int = abs(self.value(x: x, y: y) - self.value(x: e.x, y: e.y))
if diff <= 1 {
activate(true, x: e.0, y: e.1)
}
}
}
}
}
}
extension Stage {
var result: String {
var s = ""
for e in self.gone.enumerated() {
if (e.offset != 0) && ((e.offset % 5) == 0) {
s += "/"
}
s += e.element ? "*" : String(self.value[e.offset])
}
return s
}
}
func solve(input: String) -> String {
var stage = Stage(input: input)
//print(stage)
let start: Position = (x: 2, y: 0)
stage.activate(true, x: 2, y: 0)
return stage.result
}
func runTests() {
var testedCount = 0
var okCount = 0
var ngCount = 0
let beginn = Date()
for testCase in testCases {
//let begin = Date()
let solved = solve(input: testCase.input)
//let end = Date()
//print("time", end.timeIntervalSince(begin))
if solved == testCase.expectedOutput {
okCount += 1
}
else {
ngCount += 1
print("## NG")
print("solved: ", solved)
print("test: ", testCase)
}
testedCount += 1
}
let endd = Date()
print("########")
print("tests have done")
print("total tests: ", testedCount)
print("total ok: ", okCount)
print("total ng: ", ngCount)
print("total time", endd.timeIntervalSince(beginn))
}
runTests()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment