Smalltalk
Ada perpustakaan yang belum diport ke beberapa dialek Smalltalk (Visualworks, Gemstone Squeak / Pharo, ...) bernama Xtreams yang membuat tugas ini lebih mudah.
FileStream akan sesederhana 'foo' asFilename reading
dan 'bar' asFilename writing
misalnya dalam Visualworks, tetapi khusus dialek.
Untuk alasan ini saya mendemonstrasikan algoritma dengan dialek internal stream netral sebagai gantinya.
Ide yang bagus adalah memproses setiap byte kode dalam urutan yang meningkat:
| input |
input := 'Hello world' asByteArray reading.
^((ByteArray new writing)
write: ((0 to: 255) inject: ByteArray new reading into: [:outputSoFar :code |
| nextOutput |
nextOutput := ByteArray new writing.
((input += 0; selecting: [:c | c <= code]) ending: code inclusive: true) slicing do: [:subStream |
| positionable |
positionable := subStream positioning.
nextOutput write: (outputSoFar limiting: (positionable ending: code) rest size).
nextOutput write: (positionable += 0; selecting: [:c | c = code])].
nextOutput conclusion reading]);
conclusion) asString
Tentu saja, ini juga memungkinkan untuk diproses dalam urutan acak, tetapi saya khawatir itu membuat kode ini agak terlalu kompak:
| input output |
input := 'Hello world' asByteArray reading.
output := ByteArray new writing.
(0 to: 255) asArray shuffled do: [:code |
output += 0.
(input += 0; ending: code inclusive: true) slicing do: [:subStream |
| positionable |
positionable := subStream positioning.
output ++ (positionable += 0; rejecting: [:c | c = code]) rest size.
output write: (positionable += 0; selecting: [:c | c = code])]].
^output conclusion asString
EDIT
Ah bodohnya aku, aku tidak melihat solusi log2:
| input output |
input := 'Hello world' asByteArray reading.
(output := ByteArray new writing) write: (input collecting: [:e | 0]).
output := (0 to: 7) asArray shuffled inject: output into: [:outputSoFar :bit |
(ByteArray new writing)
write:
(((input += 0; collecting: [:e | e >> bit bitAnd: 1]) interleaving: outputSoFar conclusion reading)
transforming: [ :in :out | out put: in get << bit + in get]);
yourself].
^output conclusion asString