/**
* author: Serkan Eryilmaz
*/
type OrigamiSheet
= List
[List
[List
[Int
]]]
def foldLeft
(sheet
: OrigamiSheet
): OrigamiSheet
= { sheet.map{line =>
val (left, right
) = line.
splitAt(line.
length/
2) left.reverse.zip(right).map{
a.reverse ::: b
}
}
}
def foldRight
(sheet
: OrigamiSheet
): OrigamiSheet
= { sheet.map{line =>
val (left, right
) = line.
splitAt(line.
length/
2) right.reverse.zip(left).map{
a.reverse ::: b
}
}
}
def foldTop
(sheet
: OrigamiSheet
): OrigamiSheet
= { val (top, bottom
) = sheet.
splitAt(sheet.
length/
2) top.reverse.zip(bottom).map{
case (topLine,bottomLine
) => topLine.zip(bottomLine).map{
top.reverse ::: bot
}
}
}
def foldBottom
(sheet
: OrigamiSheet
): OrigamiSheet
= { val (top, bottom
) = sheet.
splitAt(sheet.
length/
2) bottom.reverse.zip(top).map{
case (topLine,bottomLine
) => bottomLine.zip(topLine).map{
b.reverse ::: a
}
}
}
private def doFold
(sheet
: OrigamiSheet, fold
: String
): OrigamiSheet
= { doFold(foldLeft(sheet), fold.tail)
doFold(foldRight(sheet), fold.tail)
doFold(foldTop(sheet), fold.tail)
doFold(foldBottom(sheet), fold.tail)
println("unrecognized character")
sheet
}
sheet
}
}
/**
*
* @param foldType
* @return
*/
def fold
(foldType
: String
): OrigamiSheet
= { val n
= 1 << (foldType.
length /
2) (for (j
<-
1 to n
) yield List
((i
*n
)+j
)).
toList }).toList
doFold(initial, foldType)
}
def show
(list
: OrigamiSheet
) { println(list.flatten.flatten.mkString(", "))
}
}
def main
(args
: Array
[String
]) { show(fold("TLRB"))
}
}
LyoqCiAqIGF1dGhvcjogU2Vya2FuIEVyeWlsbWF6CiAqLwoKb2JqZWN0IE9yaWdhbWkgewoKICB0eXBlIE9yaWdhbWlTaGVldCA9IExpc3RbTGlzdFtMaXN0W0ludF1dXQoKICBkZWYgZm9sZExlZnQoc2hlZXQ6IE9yaWdhbWlTaGVldCk6IE9yaWdhbWlTaGVldCA9IHsKICAgIHNoZWV0Lm1hcHtsaW5lID0+CiAgICAgIHZhbCAobGVmdCwgcmlnaHQpID0gbGluZS5zcGxpdEF0KGxpbmUubGVuZ3RoLzIpCiAgICAgIGxlZnQucmV2ZXJzZS56aXAocmlnaHQpLm1hcHsKICAgICAgICBjYXNlIChhLGIpID0+CiAgICAgICAgICBhLnJldmVyc2UgOjo6IGIKICAgICAgfQogICAgfQogIH0KCiAgZGVmIGZvbGRSaWdodChzaGVldDogT3JpZ2FtaVNoZWV0KTogT3JpZ2FtaVNoZWV0ID0gewogICAgc2hlZXQubWFwe2xpbmUgPT4KICAgICAgdmFsIChsZWZ0LCByaWdodCkgPSBsaW5lLnNwbGl0QXQobGluZS5sZW5ndGgvMikKICAgICAgcmlnaHQucmV2ZXJzZS56aXAobGVmdCkubWFwewogICAgICAgIGNhc2UgKGEsYikgPT4KICAgICAgICAgIGEucmV2ZXJzZSA6OjogYgogICAgICB9CiAgICB9CiAgfQoKICBkZWYgZm9sZFRvcChzaGVldDogT3JpZ2FtaVNoZWV0KTogT3JpZ2FtaVNoZWV0ID0gewogICAgdmFsICh0b3AsIGJvdHRvbSkgPSBzaGVldC5zcGxpdEF0KHNoZWV0Lmxlbmd0aC8yKQogICAgdG9wLnJldmVyc2UuemlwKGJvdHRvbSkubWFwewogICAgICBjYXNlICh0b3BMaW5lLGJvdHRvbUxpbmUpID0+CiAgICAgICAgdG9wTGluZS56aXAoYm90dG9tTGluZSkubWFwewogICAgICAgICAgY2FzZSAodG9wLCBib3QpID0+CiAgICAgICAgICAgIHRvcC5yZXZlcnNlIDo6OiBib3QKICAgICAgICB9CiAgICB9CiAgfQoKICBkZWYgZm9sZEJvdHRvbShzaGVldDogT3JpZ2FtaVNoZWV0KTogT3JpZ2FtaVNoZWV0ID0gewogICAgdmFsICh0b3AsIGJvdHRvbSkgPSBzaGVldC5zcGxpdEF0KHNoZWV0Lmxlbmd0aC8yKQogICAgYm90dG9tLnJldmVyc2UuemlwKHRvcCkubWFwewogICAgICBjYXNlICh0b3BMaW5lLGJvdHRvbUxpbmUpID0+CiAgICAgICAgYm90dG9tTGluZS56aXAodG9wTGluZSkubWFwewogICAgICAgICAgY2FzZSAoYSwgYikgPT4KICAgICAgICAgICAgYi5yZXZlcnNlIDo6OiBhCiAgICAgICAgfQogICAgfQogIH0KCiAgcHJpdmF0ZSBkZWYgZG9Gb2xkKHNoZWV0OiBPcmlnYW1pU2hlZXQsIGZvbGQ6IFN0cmluZyk6IE9yaWdhbWlTaGVldCA9IHsKICAgIGlmIChmb2xkLmxlbmd0aCA+IDApIHsKICAgICAgZm9sZC5oZWFkIG1hdGNoIHsKICAgICAgICBjYXNlICdMJyA9PgogICAgICAgICAgZG9Gb2xkKGZvbGRMZWZ0KHNoZWV0KSwgZm9sZC50YWlsKQogICAgICAgIGNhc2UgJ1InID0+CiAgICAgICAgICBkb0ZvbGQoZm9sZFJpZ2h0KHNoZWV0KSwgZm9sZC50YWlsKQogICAgICAgIGNhc2UgJ1QnID0+CiAgICAgICAgICBkb0ZvbGQoZm9sZFRvcChzaGVldCksIGZvbGQudGFpbCkKICAgICAgICBjYXNlICdCJyA9PgogICAgICAgICAgZG9Gb2xkKGZvbGRCb3R0b20oc2hlZXQpLCBmb2xkLnRhaWwpCiAgICAgICAgY2FzZSBfID0+CiAgICAgICAgICBwcmludGxuKCJ1bnJlY29nbml6ZWQgY2hhcmFjdGVyIikKICAgICAgICAgIHNoZWV0CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIHNoZWV0CiAgICB9CiAgfQoKICAvKioKICAgKgogICAqIEBwYXJhbSBmb2xkVHlwZQogICAqIEByZXR1cm4KICAgKi8KICBkZWYgZm9sZChmb2xkVHlwZTogU3RyaW5nKTogT3JpZ2FtaVNoZWV0ID0gewogICAgdmFsIG4gPSAxIDw8IChmb2xkVHlwZS5sZW5ndGggLyAyKQogICAgdmFsIGluaXRpYWwgPSAoZm9yIChpIDwtIDAgdW50aWwgbikgeWllbGQgewogICAgICAoZm9yIChqIDwtIDEgdG8gbikgeWllbGQgTGlzdCgoaSpuKStqKSkudG9MaXN0CiAgICB9KS50b0xpc3QKICAgIGRvRm9sZChpbml0aWFsLCBmb2xkVHlwZSkKICB9CgogIGRlZiBzaG93KGxpc3Q6IE9yaWdhbWlTaGVldCkgewogICAgcHJpbnRsbihsaXN0LmZsYXR0ZW4uZmxhdHRlbi5ta1N0cmluZygiLCAiKSkKICB9Cn0KCm9iamVjdCBNYWluIHsKICBkZWYgbWFpbihhcmdzOiBBcnJheVtTdHJpbmddKSB7CiAgICBpbXBvcnQgT3JpZ2FtaS5fCiAgICBzaG93KGZvbGQoIlRMUkIiKSkKICB9Cn0=
15, 3, 2, 14, 13, 1, 4, 16, 12, 8, 5, 9, 10, 6, 7, 11