Codingame『Chuck Norris』

日本版劇場オリジナルポスター★『地獄のコマンド』/チャック・ノリス


 チャック・ノリスがコンセプトとデザインした…ようなことが書いてあるが…。


 とりあえず変換後は0ばっかりで読みにくさが有頂天。
さらに7bitなのに気づかなくて、かなり悩んだ。
下手したら詰んでた。

using System;
using System.Linq;
using System.IO;
using System.Text;
using System.Collections;
using System.Collections.Generic;

/**
 * Auto-generated code below aims at helping you parse
 * the standard input according to the problem statement.
 **/
class Solution
{
    static void Main(string[] args)
    {
        string MESSAGE = Console.ReadLine();

        // Write an action using Console.WriteLine()
        // To debug: Console.Error.WriteLine("Debug messages...");
        Console.Error.WriteLine(MESSAGE); //メッセージの確認用

        Console.WriteLine(CNEncode(MESSAGE));
    }
    
    //チャック・ノリスエンコード
    //引数 string m : メッセージ
    //戻り値 string : エンコード済みメッセージ
    public static string CNEncode(string m)
    {
        string bits = StringToBits(m); //ビット列をstringで取得

        return BitsToPreCN(bits);
    }
    
    //メッセージをビット列に変換する
    //引数 string m : メッセージ
    //戻り値 string : string型のビット列
    public static string StringToBits(string m)
    {
        string bits = null;
        
        byte[] bytes = Encoding.ASCII.GetBytes(m);        //ASCIIコードでbyte型の配列に変換

        foreach(byte b in bytes) {
            bits += Convert.ToString(b,2).PadLeft(7,'0'); //2進数化&上位ビットが0の場合表示されないので、0で埋める
        }

        return bits;
    }
    
    //ビット列をチャックノリス型に変換する(なんでこんなメソッド名にしたんだろう)
    //引数 string bits : ビット列
    //戻り値 string : チャックノリスエンコードしたビット列
    public static string BitsToPreCN(string bits)
    {
        string tes = null;
        
        int oc = 0;
        for(int i = 0; i < bits.Length-1; i++) {
            if(bits[i] != bits[i+1]) {           //01や10のような場所を探す
                tes += BitNum(bits[i]);          //ビットが0か1か
                tes += "".PadRight(i+1-oc, '0'); //連続してる分だけ0をつなげる
                tes += " ";                      //区切り用スペース
                oc = i+1; 
            }
        }
        if(bits.Length-oc != bits.Length) { //終わり部分の処理
            tes += BitNum(bits[bits.Length-1]);
            tes += "".PadRight(bits.Length-oc, '0');
        }
        
        return tes;
    }

    //ビットが1か0かの判定
    //引数 char c : 調べるビット
    //戻り値 string : ビットが0の場合00 ,1の場合0
    public static string BitNum(char c)
    {
        return (c == '0' ? "00 " : "0 "); //ビットの判定
    }
}


Chuck Norris(チャック・ノリス) トーキングボブルヘッド

Chuck Norris(チャック・ノリス) トーキングボブルヘッド