Advertisement
nigredo

FP 08 2014 - code

Aug 8th, 2014
245
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Scala 3.14 KB | None | 0 0
  1. import java.io.FileOutputStream
  2.  
  3. import scala.collection.immutable.BitSet
  4. import scala.io.Source
  5. import scalax.io._
  6.  
  7. val symbolsData: Map[Int, Seq[Seq[Int]]] =
  8.   Map(
  9.     0 ->
  10.       Seq(
  11.         Seq(1, 1, 1),
  12.         Seq(1, 0, 1),
  13.         Seq(1, 0, 1),
  14.         Seq(1, 0, 1),
  15.         Seq(1, 1, 1)),
  16.     1 ->
  17.       Seq(
  18.         Seq(1, 1, 0),
  19.         Seq(0, 1, 0),
  20.         Seq(0, 1, 0),
  21.         Seq(0, 1, 0),
  22.         Seq(1, 1, 1)),
  23.     2 ->
  24.       Seq(
  25.         Seq(1, 1, 1),
  26.         Seq(0, 0, 1),
  27.         Seq(1, 1, 1),
  28.         Seq(1, 0, 0),
  29.         Seq(1, 1, 1)),
  30.     3 ->
  31.       Seq(
  32.         Seq(1, 1, 1),
  33.         Seq(0, 0, 1),
  34.         Seq(1, 1, 1),
  35.         Seq(0, 0, 1),
  36.         Seq(1, 1, 1)),
  37.     4 ->
  38.       Seq(
  39.         Seq(1, 0, 1),
  40.         Seq(1, 0, 1),
  41.         Seq(1, 1, 1),
  42.         Seq(0, 0, 1),
  43.         Seq(0, 0, 1)),
  44.     5 ->
  45.       Seq(
  46.         Seq(1, 1, 1),
  47.         Seq(1, 0, 0),
  48.         Seq(1, 1, 1),
  49.         Seq(0, 0, 1),
  50.         Seq(1, 1, 1)),
  51.     6 ->
  52.       Seq(
  53.         Seq(1, 1, 1),
  54.         Seq(1, 0, 0),
  55.         Seq(1, 1, 1),
  56.         Seq(1, 0, 1),
  57.         Seq(1, 1, 1)),
  58.     7 ->
  59.       Seq(
  60.         Seq(1, 1, 1),
  61.         Seq(0, 0, 1),
  62.         Seq(0, 1, 1),
  63.         Seq(0, 1, 0),
  64.         Seq(0, 1, 0)),
  65.     8 ->
  66.       Seq(
  67.         Seq(1, 1, 1),
  68.         Seq(1, 0, 1),
  69.         Seq(1, 1, 1),
  70.         Seq(1, 0, 1),
  71.         Seq(1, 1, 1)),
  72.     9 ->
  73.       Seq(
  74.         Seq(1, 1, 1),
  75.         Seq(1, 0, 1),
  76.         Seq(1, 1, 1),
  77.         Seq(0, 0, 1),
  78.         Seq(1, 1, 1)))
  79.  
  80. val symbolWidth = 3
  81. val symbolHeight = 5
  82.  
  83. val data : IndexedSeq[IndexedSeq[Boolean]] = Source.fromFile("data.txt")
  84.   .getLines
  85.   .map(_.map(_ - '0').map(1 ==).toIndexedSeq).toIndexedSeq
  86.  
  87. val dataWidth = data.head.length
  88. val dataHeight = data.length
  89.  
  90. // Функция для перевода матрицы булевских значений в битсет
  91. def bitSet(bss : Seq[Seq[Boolean]]): BitSet =
  92.   BitSet(bss.flatten.zipWithIndex.filter(_._1).map(_._2): _*)
  93.  
  94. // Словарь для поиска цифры по матрице  
  95. val symbolsMap: Map[BitSet, Int] =
  96.   for {
  97.     (k, v) <- symbolsData
  98.     bits = bitSet(v.map(_.map(1 ==)))
  99.   } yield bits -> k
  100.  
  101. object Digit {
  102.   def unapply(data: Seq[Seq[Boolean]]): Option[Int] = symbolsMap.get(bitSet(data))
  103. }
  104.  
  105. // Основной цикл: проходим перебором по всей таблице.
  106. // Если цифры расположены с известными закономерностями (как в примере), это можно использовать для ускорения алгоритма.
  107. val resultLines =
  108.   for {
  109.     //Выбираем все возможные ряды-полосы
  110.     (row, y) <- data.sliding(symbolHeight).zipWithIndex
  111.     //В каждой полосе выбираем все возможные матрицы цифр. Тут же происходит и поиск цифры.
  112.     (Digit(n), x) <- row.map(_.sliding(symbolWidth).toList).transpose.zipWithIndex
  113.   } yield s"$n @ ($y, $x)"
  114.  
  115. Resource
  116.   .fromOutputStream(
  117.     new FileOutputStream("result.txt"))
  118.   .writeStrings(resultLines.toSeq, "\n")
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement