diff options
author | Andreas Rumpf <rumpf_a@web.de> | 2018-01-27 07:59:40 +0100 |
---|---|---|
committer | Andreas Rumpf <rumpf_a@web.de> | 2018-01-27 07:59:40 +0100 |
commit | 68dfd1729e22835d9596b20d419a720ba6452781 (patch) | |
tree | 8d4729202e066b0f535aff618afd6f7002c0c77f /tests/array | |
parent | 394757dbf521b8b4a16dd694a687039faeb21682 (diff) | |
download | Nim-68dfd1729e22835d9596b20d419a720ba6452781.tar.gz |
fixes #6989
Diffstat (limited to 'tests/array')
-rw-r--r-- | tests/array/troofregression2.nim | 104 |
1 files changed, 104 insertions, 0 deletions
diff --git a/tests/array/troofregression2.nim b/tests/array/troofregression2.nim new file mode 100644 index 000000000..78d9b9718 --- /dev/null +++ b/tests/array/troofregression2.nim @@ -0,0 +1,104 @@ +discard """ + output: '''OK +OK +OK +OK +OK +dflfdjkl__abcdefgasfsgdfgsgdfggsdfasdfsafewfkljdsfajs +dflfdjkl__abcdefgasfsgdfgsgdfggsdfasdfsafewfkljdsfajsdf +kgdchlfniambejop +fjpmholcibdgeakn +''' +""" + +import strutils, sequtils +# bug #6989 + +import typetraits + +type Dist = distinct int + +proc mypred[T: Ordinal](x: T): T = T(int(x)-1) +proc cons(x: int): Dist = Dist(x) + +var d: Dist + +template `^+`(s, i: untyped): untyped = + (when i is BackwardsIndex: s.len - int(i) else: int(i)) + +proc `...`*[T, U](a: T, b: U): HSlice[T, U] = + result.a = a + result.b = b + +proc `...`*[T](b: T): HSlice[int, T] = + result.b = b + +template `...<`*(a, b: untyped): untyped = + ## a shortcut for 'a..pred(b)'. + a ... pred(b) + +template check(a, b) = + if $a == b: echo "OK" + else: echo "Failure ", a, " != ", b + +check type(4 ...< 1), "HSlice[system.int, system.int]" + +check type(4 ...< ^1), "HSlice[system.int, system.BackwardsIndex]" +check type(4 ... pred(^1)), "HSlice[system.int, system.BackwardsIndex]" + +check type(4 ... mypred(8)), "HSlice[system.int, system.int]" + +check type(4 ... mypred(^1)), "HSlice[system.int, system.BackwardsIndex]" + +var rot = 8 + +proc bug(s: string): string = + result = s + result = result[result.len - rot .. ^1] & "__" & result[0 ..< ^rot] + +const testStr = "abcdefgasfsgdfgsgdfggsdfasdfsafewfkljdsfajsdflfdjkl" + +echo bug(testStr) +echo testStr[testStr.len - 8 .. testStr.len - 1] & "__" & testStr[0 .. testStr.len - pred(rot)] + + + +const + instructions = readFile("./inputs/16.txt").split(',') + programs = "abcdefghijklmnop" + +proc dance(dancers: string): string = + result = dancers + for instr in instructions: + let rem = instr[1 .. instr.high] + case instr[0] + of 's': + let rot = rem.parseInt + result = result[result.len - rot .. ^1] & result[0 ..< ^rot] + of 'x': + let + x = rem.split('/') + a = x[0].parseInt + b = x[1].parseInt + swap(result[a], result[b]) + of 'p': + let + a = result.find(rem[0]) + b = result.find(rem[^1]) + result[a] = rem[^1] + result[b] = rem[0] + else: discard + +proc longDance(dancers: string, iterations = 1_000_000_000): string = + var + dancers = dancers + seen = @[dancers] + for i in 1 .. iterations: + dancers = dancers.dance() + if dancers in seen: + return seen[iterations mod i] + seen.add(dancers) + + +echo dance(programs) +echo longDance(programs) |