カロリーメイトのプログラマー向けプロモーション(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);
}

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です