カロリーメイトのプログラマー向けプロモーション(https://www.otsuka.co.jp/cmt/to_programmer/)にはニヤッとさせられます(*‘∀‘)
このプロモーションサイトにはCUIモードがあり、その中にこんなテキストmessages/msg19.mdがあります:
01000010 01000001 01001100 01000001 01001110 01000011 01000101 01000100 00100000 01000110 01001111 01010010 00100000 01001000 01010101 01001101 01000001 01001110 00101110
これ、いかにもな01の配列ですが、8桁、つまり8ビットでascii文字を表現しています。
これの解読プログラムをRustで作ってみました。
まずこのビット列をテキストファイルにし、ファイル名を “msg19.md” として保存してください。
Rustで作った解読プログラムはこちらです。ファイル名 “main.rs”:
use std::fs::File; use std::io::prelude::Read; fn main() { let mut msg19 = String::new(); File::open("msg19.md").unwrap().read_to_string(&mut msg19).unwrap(); let message: String = msg19.split_ascii_whitespace().map(|bits_str| { bits_str.char_indices().fold(0u8, |acc, (i, ch)| if ch == '1' {acc | (0x80 >> i)} else {acc}) as char }).collect(); println!("{}", message); }
解析部は高階関数をふんだんに使っています。
やってみてわかったのですが、Rustってガッツリ関数型的に組むことができるんですねー(*‘∀‘)
今回の発見でした\(^o^)/
そして、解読結果ですが
BALANCED FOR HUMAN.
でした!
おまけ
ちなみに、実際に動くコードではありませんが、Rustでのカロリーメイト表現、こんな感じのものをtwitterに上げました:
fn main() { let nutri = ["PROTEIN", "FAT", "CARBOHYDRATE", "VITAMIN", "MINERAL"]; let calorie_mate = nutri.iter().fold(Liquid::new(), |mut acc, elem| {acc.add(elem); acc}); let u = Human::new(); calorie_mate.supply(&mut u); }