Created
October 25, 2017 10:35
-
-
Save watr/5a6c9a7a2b18aa886425797feb7ba70b to your computer and use it in GitHub Desktop.
ordf07walk.swift
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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