type MyMap
= Array
[ Array
[ Char
] ]
def main
( args
: Array
[ String
] ) { val xdt
= ( 1 to
10 ) .
map ( l
=> readLine.
trim .
toCharArray .
map ( c
=> if ( c
== '-' ) true else false ) ) .
toArray val words
= readLine.
trim .
split ( ";" ) .
toList // println(words)
yield xdt
( y
) ( x
) ) .
toArray ) .
toArray
def findFragment
( l
: List
[ Boolean
] ) : List
[ Tuple2
[ Int, Int
] ] = { def find
( l
: List
[ Tuple2
[ Boolean, Int
] ] ) : List
[ Tuple2
[ Int, Int
] ] = { Nil
( s.head ._ 2, e.head ._ 2 - s.head ._ 2) +: find( e)
}
}
find( l2) .filter ( t => t._ 2 > 1 )
}
val zx
= xdt.
zipWithIndex val zy
= ydt.
zipWithIndex //println(xdt.toList.map(_.toList))
val xe
= zx.
map ( t
=> findFragment
( t.
_ 1.
toList ) .
map ( v
=> ( v.
_ 1, t.
_ 2, v.
_ 2,
( 1 ,
0 ) ) ) ) .
filter ( !_ .
isEmpty ) val ye
= zy.
map ( t
=> findFragment
( t.
_ 1.
toList ) .
map ( v
=> ( t.
_ 2, v.
_ 1, v.
_ 2,
( 0 ,
1 ) ) ) ) .
filter ( !_ .
isEmpty ) val aa
= ( xe ++ ye
) .
flatten
// println(aa.mkString)
val map
= Array.
ofDim [ Char
] ( 10 ,
10 ) for ( y
< -
0 to
9 ; x
< -
0 to
9 ) { map
( x
) ( y
) = DEFAULTCHAR
}
def dupArray
( src
: MyMap
) : MyMap
= { val dst
= Array.
ofDim [ Char
] ( 10 ,
10 ) for ( y
< -
0 to
9 ; x
< -
0 to
9 ) { dst
( x
) ( y
) = src
( x
) ( y
) } dst
}
def fill
( map
: MyMap, word
: String, x
: Int, y
: Int, ox
: Int, oy
: Int
) : Option
[ MyMap
] = { Option( map)
if ( map
( x
) ( y
) != DEFAULTCHAR
&& map
( x
) ( y
) != word.
head ) { None
map( x) ( y) = word.head
fill( map, word.tail , x + ox, y + oy, ox, oy)
}
}
}
words.permutations .foreach { p =>
// println(zipped.filter(e => e._1.length == e._2._3).size)
if ( zipped.
filter ( e
=> e.
_ 1.
length == e.
_ 2.
_ 3
) .
size == words.
size ) { // println(zipped)
val newMap
= dupArray
( map
) val stat
= zipped.
map ( z
=> { //(String, (Int, Int, Int, (Int, Int)))]
fill( newMap, z._ 1, z2._ 1, z2._ 2, z2._ 4._ 1, z2._ 4._ 2)
} )
if ( stat.
collect { case Some
( x
) => x
} .
size == zipped.
size ) { dump( newMap)
}
}
}
print( map( x) ( y) )
}
println
}
}
}
}
ICBvYmplY3QgU29sdXRpb24gewogICAgdHlwZSBNeU1hcCA9IEFycmF5W0FycmF5W0NoYXJdXQoKICAgIGRlZiBtYWluKGFyZ3M6IEFycmF5W1N0cmluZ10pIHsKICAgICAgdmFsIHhkdCA9ICgxIHRvIDEwKS5tYXAobCA9PiByZWFkTGluZS50cmltLnRvQ2hhckFycmF5Lm1hcChjID0+IGlmIChjID09ICctJykgdHJ1ZSBlbHNlIGZhbHNlKSkudG9BcnJheQogICAgICB2YWwgd29yZHMgPSByZWFkTGluZS50cmltLnNwbGl0KCI7IikudG9MaXN0Ci8vICAgICAgcHJpbnRsbih3b3JkcykKICAgICAgdmFsIHlkdCA9CiAgICAgICAgKGZvciAoeCA8LSAwIHRvIDkpCiAgICAgICAgICB5aWVsZCAoZm9yICh5IDwtIDAgdG8gOSkKICAgICAgICAgIHlpZWxkIHhkdCh5KSh4KSkudG9BcnJheSkudG9BcnJheQoKICAgICAgZGVmIGZpbmRGcmFnbWVudChsOiBMaXN0W0Jvb2xlYW5dKTogTGlzdFtUdXBsZTJbSW50LCBJbnRdXSA9IHsKICAgICAgICBkZWYgZmluZChsOiBMaXN0W1R1cGxlMltCb29sZWFuLCBJbnRdXSk6IExpc3RbVHVwbGUyW0ludCwgSW50XV0gPSB7CiAgICAgICAgICB2YWwgcyA9IGwuZHJvcFdoaWxlKF8uXzEgPT0gZmFsc2UpCiAgICAgICAgICBpZiAocy5pc0VtcHR5KQogICAgICAgICAgICBOaWwKICAgICAgICAgIGVsc2UgewogICAgICAgICAgICB2YWwgZSA9IHMuZHJvcFdoaWxlKF8uXzEgPT0gdHJ1ZSkKICAgICAgICAgICAgKHMuaGVhZC5fMiwgZS5oZWFkLl8yIC0gcy5oZWFkLl8yKSArOiBmaW5kKGUpCgogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICB2YWwgbDIgPSAobCA6KyBmYWxzZSkuemlwV2l0aEluZGV4CiAgICAgICAgZmluZChsMikuZmlsdGVyKHQgPT4gdC5fMiA+IDEpCiAgICAgIH0KICAgICAgdmFsIHp4ID0geGR0LnppcFdpdGhJbmRleAogICAgICB2YWwgenkgPSB5ZHQuemlwV2l0aEluZGV4Ci8vcHJpbnRsbih4ZHQudG9MaXN0Lm1hcChfLnRvTGlzdCkpCiAgICAgIAogICAgICB2YWwgeGUgPSB6eC5tYXAodCA9PiBmaW5kRnJhZ21lbnQodC5fMS50b0xpc3QpLm1hcCh2ID0+ICh2Ll8xLCB0Ll8yLCB2Ll8yLCAoMSwgMCkpKSkuZmlsdGVyKCFfLmlzRW1wdHkpCiAgICAgIHZhbCB5ZSA9IHp5Lm1hcCh0ID0+IGZpbmRGcmFnbWVudCh0Ll8xLnRvTGlzdCkubWFwKHYgPT4gKHQuXzIsIHYuXzEsIHYuXzIsICgwLCAxKSkpKS5maWx0ZXIoIV8uaXNFbXB0eSkKICAgICAgdmFsIGFhID0gKHhlICsrIHllKS5mbGF0dGVuCgovLyAgICAgIHByaW50bG4oYWEubWtTdHJpbmcpCiAgICAgIHZhbCBERUZBVUxUQ0hBUiA9ICcrJwogICAgICB2YWwgbWFwID0gQXJyYXkub2ZEaW1bQ2hhcl0oMTAsIDEwKQogICAgICBmb3IgKHkgPC0gMCB0byA5OyB4IDwtIDAgdG8gOSkgeyBtYXAoeCkoeSkgPSBERUZBVUxUQ0hBUiB9CgogICAgICBkZWYgZHVwQXJyYXkoc3JjOiBNeU1hcCk6IE15TWFwID0gewogICAgICAgIHZhbCBkc3QgPSBBcnJheS5vZkRpbVtDaGFyXSgxMCwgMTApCiAgICAgICAgZm9yICh5IDwtIDAgdG8gOTsgeCA8LSAwIHRvIDkpIHsgZHN0KHgpKHkpID0gc3JjKHgpKHkpIH0KICAgICAgICBkc3QKICAgICAgfQoKICAgICAgZGVmIGZpbGwobWFwOiBNeU1hcCwgd29yZDogU3RyaW5nLCB4OiBJbnQsIHk6IEludCwgb3g6IEludCwgb3k6IEludCk6IE9wdGlvbltNeU1hcF0gPSB7CiAgICAgICAgaWYgKHdvcmQuaXNFbXB0eSkgewogICAgICAgICAgT3B0aW9uKG1hcCkKICAgICAgICB9IGVsc2UgewogICAgICAgICAgaWYgKG1hcCh4KSh5KSAhPSBERUZBVUxUQ0hBUiAmJiBtYXAoeCkoeSkgIT0gd29yZC5oZWFkKSB7CiAgICAgICAgICAgIE5vbmUKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIG1hcCh4KSh5KSA9IHdvcmQuaGVhZAogICAgICAgICAgICBmaWxsKG1hcCwgd29yZC50YWlsLCB4ICsgb3gsIHkgKyBveSwgb3gsIG95KQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQoKICAgICAgd29yZHMucGVybXV0YXRpb25zLmZvcmVhY2ggeyBwID0+CiAgICAgICAgdmFsIHppcHBlZCA9IHAuemlwKGFhKQovLyAgICAgICAgcHJpbnRsbih6aXBwZWQuZmlsdGVyKGUgPT4gZS5fMS5sZW5ndGggPT0gZS5fMi5fMykuc2l6ZSkKICAgICAgICBpZiAoemlwcGVkLmZpbHRlcihlID0+IGUuXzEubGVuZ3RoID09IGUuXzIuXzMpLnNpemUgPT0gd29yZHMuc2l6ZSkgewovLyAgICAgICAgICAgICAgICAgIHByaW50bG4oemlwcGVkKQogICAgICAgICAgdmFsIG5ld01hcCA9IGR1cEFycmF5KG1hcCkKICAgICAgICAgIHZhbCBzdGF0ID0gemlwcGVkLm1hcCh6ID0+IHsKICAgICAgICAgICAgdmFsIHoyID0gei5fMgogICAgICAgICAgICAvLyhTdHJpbmcsIChJbnQsIEludCwgSW50LCAoSW50LCBJbnQpKSldCiAgICAgICAgICAgIGZpbGwobmV3TWFwLCB6Ll8xLCB6Mi5fMSwgejIuXzIsIHoyLl80Ll8xLCB6Mi5fNC5fMikKICAgICAgICAgIH0pCiAgICAgICAgICBpZiAoc3RhdC5jb2xsZWN0IHsgY2FzZSBTb21lKHgpID0+IHggfS5zaXplID09IHppcHBlZC5zaXplKSB7CiAgICAgICAgICAgIGR1bXAobmV3TWFwKQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQoKICAgICAgZGVmIGR1bXAobWFwOiBNeU1hcCkgPSB7CiAgICAgICAgZm9yICh5IDwtIDAgdG8gOSkgewogICAgICAgICAgZm9yICh4IDwtIDAgdG8gOSkgewogICAgICAgICAgICBwcmludChtYXAoeCkoeSkpCiAgICAgICAgICB9CiAgICAgICAgICBwcmludGxuCiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQo=