Burrows–Wheeler transform: Difference between revisions

Content added Content deleted
(Add Swift)
Line 1,353: Line 1,353:
BWT("SIX.MIXED.PIXIES.SIFT.SIXTY.PIXIE.DUST.BOXES") = "STEXYDST.E.IXXIIXXSSMPPS.B..EE.$.USFXDIIOIIIT"
BWT("SIX.MIXED.PIXIES.SIFT.SIXTY.PIXIE.DUST.BOXES") = "STEXYDST.E.IXXIIXXSSMPPS.B..EE.$.USFXDIIOIIIT"
</pre>
</pre>

=={{header|Swift}}==

{{trans|Kotlin}}

<lang swift>import Foundation

private let stx = "\u{2}"
private let etx = "\u{3}"

func bwt(_ str: String) -> String? {
guard !str.contains(stx), !str.contains(etx) else {
return nil
}

let ss = stx + str + etx
let table = ss.indices.map({i in ss[i...] + ss[ss.startIndex..<i] }).sorted()

return String(table.map({str in str.last!}))
}

func ibwt(_ str: String) -> String? {
let len = str.count
var table = Array(repeating: "", count: len)

for _ in 0..<len {
for i in 0..<len {
table[i] = String(str[str.index(str.startIndex, offsetBy: i)]) + table[i]
}

table.sort()
}

for row in table where row.hasSuffix(etx) {
return String(row.dropFirst().dropLast())
}

return nil
}


func readableBwt(_ str: String) -> String {
return str.replacingOccurrences(of: "\u{2}", with: "^").replacingOccurrences(of: "\u{3}", with: "|")
}

let testCases = [
"banana",
"appellee",
"dogwood",
"TO BE OR NOT TO BE OR WANT TO BE OR NOT?",
"SIX.MIXED.PIXIES.SIFT.SIXTY.PIXIE.DUST.BOXES",
"\u{2}ABC\u{3}"
]

for test in testCases {
let b = bwt(test) ?? "error"
let c = ibwt(b) ?? "error"

print("\(readableBwt(test)) -> \(readableBwt(b)) -> \(readableBwt(c))")
}</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 -> error</pre>


=={{header|Visual Basic .NET}}==
=={{header|Visual Basic .NET}}==