Burrows–Wheeler transform: Difference between revisions

→‎{{header|Perl 6}}: Add a Perl 6 example
(Added Kotlin)
(→‎{{header|Perl 6}}: Add a Perl 6 example)
Line 200:
--> ERROR: String can't contain STX or ETX
-->
</pre>
 
=={{header|Perl 6}}==
{{works with|Rakudo|2018.06}}
 
<lang perl6># STX and ETX can be any characters that don't appear
# in the text as long as STX sorts before ETX.
 
constant \STX = '👍';
constant \ETX = '👎';
 
# Burrows-Wheeler transform
sub transform (Str $s is copy) {
die "String can't contain STX or ETX characters." if $s.contains: STX|ETX;
$s = STX ~ $s ~ ETX;
my $l = $s.chars;
(^$l).map({ $s.comb.list.rotate: $_ }).sort[*;*-1].join
}
 
# Burrows-Wheeler inverse transform
sub ɯɹoɟsuɐɹʇ (Str $s) {
my @t = '' xx my $l = $s.chars;
@t = ($s.comb Z~ @t).sort for ^$l;
@t.first( *.starts-with: STX ).substr(1, $l - 2)
}
 
# TESTING
for |<BANANA dogwood SIX.MIXED.PIXIES.SIFT.SIXTY.PIXIE.DUST.BOXES>,
'TO BE OR NOT TO BE OR WANT TO BE OR NOT?', "Oops{STX}"
-> $phrase {
say 'Original: ', $phrase;
say 'Transformed: ', transform $phrase;
say 'Inverse transformed: ', ɯɹoɟsuɐɹʇ transform $phrase;
say '';
}</lang>
{{out}}
<pre>Original: BANANA
Transformed: BNN👍AA👎A
Inverse transformed: BANANA
 
Original: dogwood
Transformed: 👍ooodwg👎d
Inverse transformed: dogwood
 
Original: SIX.MIXED.PIXIES.SIFT.SIXTY.PIXIE.DUST.BOXES
Transformed: TEXYDST.E.IXIXIXXSSMPPS.B..E.👍.UESFXDIIOIIIT👎S
Inverse transformed: SIX.MIXED.PIXIES.SIFT.SIXTY.PIXIE.DUST.BOXES
 
Original: TO BE OR NOT TO BE OR WANT TO BE OR NOT?
Transformed: OOORREEETTRTW BBB ATTT NNOOONOO👍 👎?
Inverse transformed: TO BE OR NOT TO BE OR WANT TO BE OR NOT?
 
Original: Oops👍
String can't contain STX or ETX characters.
in sub transform at bwt.p6 line 9
in block <unit> at bwt.p6 line 27
</pre>
 
10,333

edits