Burrows–Wheeler transform: Difference between revisions
Content added Content deleted
Line 918: | Line 918: | ||
***error*** BWT: The input string contains an invalid character at position 15. |
***error*** BWT: The input string contains an invalid character at position 15. |
||
</pre> |
</pre> |
||
=={{header|Scala}}== |
|||
{{trans|Kotlin}} |
|||
<lang scala>import scala.collection.mutable.ArrayBuffer |
|||
object BWT { |
|||
val STX = '\u0002' |
|||
val ETX = '\u0003' |
|||
def bwt(s: String): String = { |
|||
if (s.contains(STX) || s.contains(ETX)) { |
|||
throw new RuntimeException("String can't contain STX or ETX") |
|||
} |
|||
var ss = STX + s + ETX |
|||
// val table = Array<String>(ss.length) { ss.substring(it) + ss.substring(0, it) } |
|||
var table = new ArrayBuffer[String]() |
|||
(0 until ss.length).foreach(_ => { |
|||
table += ss |
|||
ss = ss.substring(1) + ss.charAt(0) |
|||
}) |
|||
// return String(table.map { it[it.lastIndex] }.toCharArray()) |
|||
table.sorted.map(a => a.last).mkString |
|||
} |
|||
def ibwt(r: String): String = { |
|||
var table = Array.fill(r.length)("") |
|||
(0 until r.length).foreach(_ => { |
|||
(0 until r.length).foreach(i => { |
|||
table(i) = r.charAt(i) + table(i) |
|||
}) |
|||
table = table.sorted |
|||
}) |
|||
table.indices.foreach(i => { |
|||
val row = table(i) |
|||
if (row.last == ETX) { |
|||
return row.substring(1, row.length - 1) |
|||
} |
|||
}) |
|||
"" |
|||
} |
|||
def makePrintable(s: String): String = { |
|||
s.replace(STX, '^').replace(ETX, '|') |
|||
} |
|||
def main(args: Array[String]): Unit = { |
|||
val tests = Array("banana", |
|||
"appellee", |
|||
"dogwood", |
|||
"TO BE OR NOT TO BE OR WANT TO BE OR NOT?", |
|||
"SIX.MIXED.PIXIES.SIFT.SIXTY.PIXIE.DUST.BOXES", |
|||
"\u0002ABC\u0003" |
|||
) |
|||
tests.foreach(test => { |
|||
println(makePrintable(test)) |
|||
print(" --> ") |
|||
try { |
|||
val t = bwt(test) |
|||
println(makePrintable(t)) |
|||
val r = ibwt(t) |
|||
printf(" --> %s\n", r) |
|||
} catch { |
|||
case e: Exception => printf("ERROR: %s\n", e.getMessage) |
|||
} |
|||
println() |
|||
}) |
|||
} |
|||
}</lang> |
|||
{{out}} |
|||
<pre>banana |
|||
--> |annb^aa |
|||
--> banana |
|||
appellee |
|||
--> |e^elplepa |
|||
--> appellee |
|||
dogwood |
|||
--> |do^oodwg |
|||
--> dogwood |
|||
TO BE OR NOT TO BE OR WANT TO BE OR NOT? |
|||
--> |?OOORREEETTRTW BBB ATTT NNOOONOO^ |
|||
--> TO BE OR NOT TO BE OR WANT TO BE OR NOT? |
|||
SIX.MIXED.PIXIES.SIFT.SIXTY.PIXIE.DUST.BOXES |
|||
--> |STEXYDST.E.IXXIIXXSSMPPS.B..EE.^.USFXDIIOIIIT |
|||
--> SIX.MIXED.PIXIES.SIFT.SIXTY.PIXIE.DUST.BOXES |
|||
^ABC| |
|||
--> ERROR: String can't contain STX or ETX</pre> |
|||
=={{header|Sidef}}== |
=={{header|Sidef}}== |