とあるゲーム専門学校にお邪魔してきた話とゲーム業界の新卒採用の話

あくまでぼく個人の見解です。

tnnsst35.me

ダイアリーをブログにインポートしてみた

簡単だった。

PHPでシーザー暗号

<?php

/**
 * Caesar暗号を解読するプログラムを作り,暗号を解読してください。暗号鍵(何文字ずらすか)は不明です。
 * 暗号は英文です。
 */

$code = "yWNh'bVVN.hMJfhkURLNhdJ'h'RaaRWPhXWhaQNh.RcN.KJWThdRaQhQN.hXUMN.h'R'aN.HhkURLNI'h'R'aN.hdJ'h.NJMRWPhJhKXXThJWMhkURLNhWXaRLNMhaQJahaQNhKXXThMRMWIahQJcNhJWfhYRLab.N'ihdQRLQhVJMNhkURLNhUX'NhRWaN.N'ahRWhRaHhAQNWhJ'h'QNhUXXTNMhXbahRWaXhaQNhVNJMXdih'QNh'Jdh'XVNaQRWPhcN.fhYNLbURJ.Hh?QNh'JdhJhUJ.PNhdQRaNh.JKKRah.bWWRWPhYJ'ahQN.hUXXTRWPhJahQR'hdJaLQh'JfRWPhIyQhMNJ.hyQhMNJ.hsh'QJUUhKNhaXXhUJaNHIhAQNWhQNhYXYYNMhMXdWhJh.JKKRahQXUNHhkURLNihKNRWPhaQNhLb.RXb'hPR.Uh'QNhdJ'ihOXUUXdNMhaQNh.JKKRahMXdWhaQJahQXUNhJWMhOXbWMhQN.'NUOhRWhJhUJWMhdRaQhVJWfhdXWMN.'HhsahdJ'hJhdXWMN.UJWMHh?QNhVNah'XVNhRWaN.N'aRWPhL.NJab.N'hRWLUbMRWPhaQNhuRWPhJWMh bNNWhXOhrNJ.a'ihaQNhrJaaN.ihJWMhaQNhwJ.LQhrJ.NHh?QNhOXbWMhaQJahVJWfhL.NJab.N'hRWhaQR'hUJWMhMRMWIahQJcNhaQNhKN'ahXOhaNVYN.'hJWMhMRMWIahdJWahaXha.fhaXhQNUYhkURLNhORPb.NhXbahdQN.NhaXhPXhJWMhdQJahaXhMXHhkURLNhJU'XhOXbWMhQN.'NUOhLQJWPRWPh'RgN'hJOaN.hNJaRWPhX.hM.RWTRWPhaQRWP'h'QNhOXbWMHhyWNhVRWbaNh'QNhdJ'hJhONdhRWLQN'haJUUhJWMhaQNhWNeah'QNhdJ'hWRWNhONNahaJUUHhDQNWhkURLNhdJ'hRWhaQR'hUJWMh'QNhNeYNLaNMhaQNhbWNeYNLaNMhJWMhMRMWIahaQRWThVbLQhXOhaQNhbWb'bJUhXLLb..NWLN'Hh?QNhb'NMhQN.hTWXdUNMPNhaXhQNUYhXaQN.hYNXYUNih'bLQhJ'hdQNWh'QNhVJMNh'NW'NhXOhNcRMNWLNhMb.RWPhJha.RJUHhk'hVbLQhJ'hkURLNhaQXbPQahRahRWaN.N'aRWPhKNRWPhdRaQhaQN'Nh'a.JWPNhL.NJab.N'hJWMha.fRWPhaXhPNahJUXWPhdRaQhaQNVih'QNhdXWMN.NMhdQNWh'QNhdXbUMh.Nab.WhQXVNhaXhQN.hWX.VJUhURONhX.hROh'QNhdXbUMHh?QNh.NVNVKN.NMhQN.hLJahJWMhM.NJVNMhXOh'NNRWPhQRVhJPJRWHhlbahdJ'haQN.NhJhdJfhaXhPNahXbahX.hdJ'hRahJUUhSb'ahJhM.NJVj";
$hint = "aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ .,'?";

$caesar = new Caesar($code, $hint);

//英文なので最も多いのは「 」のはずという仮定をする
echo $caesar->crack($caesar->getShiftNum('h', ' '));

class Caesar {
    private $code;
    private $hint;

    function __construct($code, $hint) {
        $this->code = $code;
        $this->hint = $hint;
    }

    public function getShiftNum($fromChar, $toChar) {
        $fromCharIdx = strpos($this->hint, $fromChar);
        $toCharIdx   = strpos($this->hint, $toChar);

        return $toCharIdx >= $fromCharIdx ? $toCharIdx - $fromCharIdx : ($toCharIdx - $fromCharIdx) * -1;
    }

    public function crack($shift) {
        $key  = $this->createKey($shift);

        $answer = "";
        $code   = $this->code;

        for ($i = 0;$i < mb_strlen($code);$i++) {
            $answer .= $key[$code[$i]];
        }

        return $answer;
    }

    private function createKey($shift) {
        $key = array();
        $hint  = $this->hint;

        $len   = mb_strlen($hint);

        for ($i = 0;$i < $len;$i++) {
            $idx = $i + $shift;
            if ($idx > $len - 1) $idx -= $len;
            $key[$hint[$i]] = $hint[$idx];
        }

        return $key;
    }
}

PHPで転置行列

<?php
$matrix = array(
        array(1, 2, 3),
        array(4, 5, 6),
        array(7, 8, 9),
        );

print_matrix($matrix);
print_matrix(transpose($matrix));

function transpose($matrix) {
    $transpose = null;

    foreach ($matrix as $row_k => $row) {
        foreach ($row as $col_k => $col) {
            $transpose[$col_k][$row_k] = $col;
        }
    }

    return $transpose;
}

function print_matrix($matrix) {
    echo "----- Print matrix -----\n";

    foreach ($matrix as $row) {
        foreach ($row as $col) {
            echo $col . ' ';
        }
        echo "\n";
    }
}

うーむ

// Hoge
class Hoge {
private:
    bool isHoge;
public:
    void SetIsHoge(bool h);
}

void Hoge::SetIsHoge(bool h) {
    isHoge = h;
}

// HogeMan
class HogeMan {
private:
    std::list<Hoge> hoges;
public:
    std::list<Hoge> GetHoges();
}

std::list<Hoge> HogeMan::GetHoges() {
    return hoges;
}

// HogeUpdater
class HogeUpdater {
public:
    void Update(HogeMan hogeMan);
}

void HogeUpdater::Update(HogeMan hogeMan) {
    std::list<Hoge> hoges = hogeMan.GetHoges();
    for (std::list<Hoge>::iterator it = hoges.begin();it != hoges.end();it++) {
        Hoge* hoge = &*it;
        hoge->SetIsHoge(TRUE);
    }
}

C++のコードです。

Hoge、HogeMan、HogeUpdater という3つのクラスがある。
Hoge は hoge の中身。
HogeMan は Hoge をリストで保持している。
HogeUpdater は HogeMan が保持しているリストを元に、Hogeを更新する。
HogeUpdater::Update 関数で HogeMan が保持しているリストをもらい、イテレータでループさせて、Hoge の変数 isHoge をTRUE に更新したいのだが、どうやらこれだと動かないようだ。

おそらく、コピーされた Hoge に対して SetIsHoge(TRUE) を呼んでしまっているのだろうが、どう直したら HogeUpdater から HogeMan が保持しているリスト中の Hoge を更新できるのかわからない。

Help me!

追記

解決した!
コピーを受け渡ししていたので、ポインタか参照を渡すようにする

ポインタ版

// Hoge
class Hoge {
private:
    bool isHoge;
public:
    void SetIsHoge(bool h);
}

void Hoge::SetIsHoge(bool h) {
    isHoge = h;
}

// HogeMan
class HogeMan {
private:
    std::list<Hoge> hoges;
public:
    /* リストのポインタを返す */
    std::list<Hoge>* GetHoges();
}

/* リストのポインタを返す */
std::list<Hoge>* HogeMan::GetHoges() {
    return &hoges;
}

// HogeUpdater
class HogeUpdater {
public:
    /* HogeManのポインタを渡す */
    void Update(HogeMan* hogeMan);
}

/* HogeManのポインタを渡す */
void HogeUpdater::Update(HogeMan* hogeMan) {
    /* HogeMan::hogesのポインタを受け取る */
    std::list<Hoge>* hoges = hogeMan.GetHoges();
    for (std::list<Hoge>::iterator it = hoges->begin();it != hoges->end();it++) {
        Hoge* hoge = &*it;
        hoge->SetIsHoge(TRUE);
    }
}

//参照版

// Hoge
class Hoge {
private:
    bool isHoge;
public:
    void SetIsHoge(bool h);
}

void Hoge::SetIsHoge(bool h) {
    isHoge = h;
}

// HogeMan
class HogeMan {
private:
    std::list<Hoge> hoges;
public:
    /* リストの参照を返す */
    std::list<Hoge> &GetHoges();
}

/* リストの参照を返す */
std::list<Hoge> &HogeMan::GetHoges() {
    return hoges;
}

// HogeUpdater
class HogeUpdater {
public:
    /* HogeManの参照を渡す */
    void Update(HogeMan &hogeMan);
}

/* HogeManの参照を渡す */
void HogeUpdater::Update(HogeMan &hogeMan) {
    /* HogeMan::hogesの参照を受け取る */
    std::list<Hoge> &hoges = hogeMan.GetHoges();
    for (std::list<Hoge>::iterator it = hoges.begin();it != hoges.end();it++) {
        Hoge* hoge = &*it;
        hoge->SetIsHoge(TRUE);
    }
}

PHPでソート

今日の新卒コードレビューのお題。
文字列の数字を昇順にソートする。

$str = '20110801';

echo bubble_sort($str) . "\n";
echo quick_sort($str) . "\n";

function bubble_sort($str) {
    $n = strlen($str) - 1;

    for ($i = 0;$i < $n;$i++) {
        for ($j = $n;$j > $i;$j--) {
            if ($str[$j - 1] > $str[$j]) {
                list($str[$j - 1], $str[$j]) = array($str[$j], $str[$j - 1]);
            }
        }
    }

    return $str;
}

function quick_sort($str) {
    if (strlen($str) < 1) return;

    $pivot = $str[0];
    $left  = '';
    $right = '';

    for ($i = 1;$i < strlen($str);$i++) {
        if ($pivot >= $str[$i]) {
            $left  .= $str[$i];
        }
        if ($pivot < $str[$i]) {
            $right .= $str[$i];
        }
    }

    $left  = quick_sort($left);
    $right = quick_sort($right);

    return $left . $pivot . $right;
}