DevFest

DevFest審査通ったー!ので,書いたコードとか晒してみるw

暗号通信

メールアドレスをシーザー暗号で暗号化して送りつける問題
小文字しかなかったので大文字は無視!
phpって1文字ごとに処理するのめんどくさいなぁーと思った.
っていうかphpで書く必要はなかったのではないかと書いてから思う.

<?php
$addr = 'アドレス';
$arr = array();
for($i = 0; $i < strlen($addr); $i++) {
  if($addr[$i] != '.' && $addr[$i] != '@') {
    $ch = (ord($addr[$i]) - ord('a') + 3) % 26;
    $addr[$i] = chr(ord('a') + $ch);
  }
}
echo $addr . "\n";
$url = 'http://devquiz.appspot.com/personalpost';
$data = array(
    'key' => "キー",
    'pass' => $addr,
);
$json = json_encode($data);
echo $json . "\n";
$options = array('http' => array(
    'method' => 'POST',
    'content' => $json,
));
$contents = file_get_contents($url, false, stream_context_create($options));
echo $contents . "\n";
?>

パッチワーク

A,Bからなるマップを読み込んで,上下左右に同じ文字のつながっている部分のうち一番大きいもの(複数あればすべて)を'-'で書き換えたときに,行ごとの'-'の数を答える問題.
2回DFSして塗り塗りした.

#include<iostream>
#include<vector>
#include<algorithm>
#include<string>
using namespace std;
#define rep(i,s,e) for(int i=(s),___e=(e);i<___e;++i)
#define REP(i,n) rep(i,0,n)
vector<string> s;
int R, C;
int components[1000][1000];
bool visited[1000][1000];
const int dr[] = {0,0,1,-1};
const int dc[] = {1,-1,0,0};
inline bool ok(int r, int c) {
  return 0 <= r && r < R && 0 <= c && c < C;
}

int dfs(int r, int c, char ch, bool rewrite) {
  if(!ok(r, c) || s[r][c] != ch || visited[r][c]) return 0;
  if(rewrite) s[r][c] = '_';
  visited[r][c] = true;
  int ret = 1;
  REP(k, 4) ret += dfs(r + dr[k], c + dc[k], ch, rewrite);
  return ret;
}

int main()
{
  for(string t; cin >> t; )
    s.push_back(t);
  R = s.size(), C = s[0].size();
  int maximum = 0;
  REP(i, R) REP(j, C) if(!visited[i][j]) {
    components[i][j] = dfs(i, j, s[i][j], false);
    maximum = max(maximum, components[i][j]);
  }
  REP(i, R) fill(visited[i], visited[i] + C, false);
  REP(i, R) REP(j, C)
    if(components[i][j] == maximum) 
      dfs(i, j, s[i][j], true);
  REP(i, R) {
    int cnt = 0;
    REP(j, C) if(s[i][j] == '_') ++cnt;
    cout << cnt << endl;
  }
  return 0;
}

漢字変換サーバ

数字をゲットパラメータで渡して,漢字表記に変換するウェブアプリを作る問題.
数字を桁が4の倍数になるように左に'0'を増やして4桁ごとに変換して万とか憶とかをつける方針でやった.
こういう問題苦手ー...phpが苦手以前の問題かも...
htmlspecialcharsとかしてないけどいいや(^p^)

<?php
$a = array('B', 'Y', 'Z', 'L', 'S', 'Q', 'R', 'T', 'P', 'D');
$b = array('N', 'C', 'A', '');
$c = array('', 'G', 'M', 'K');
function to_str($num) {
  global $a, $b;
  if($num == '0000') 
    return '';
  $ret = '';
  for($i = 0; $i < 4; $i++) 
    if($num[$i] != '0') 
      if($num[$i] != '1' || $i == 3)
        $ret .= $a[$num[$i]] . $b[$i];
      else
        $ret .= $b[$i];
  return $ret;
}

$str = $_GET['n'];
$len = strlen($str);
$r = $len % 4;
if($r != 0) 
  for($i = $r; $i < 4; $i++)
    $str = '0' . $str;

$unit = $q = strlen($str) / 4;
$arr = array();
for($i = 0; $i < $q; $i++) 
  $arr[] = substr($str, $i * 4, 4);

$ret = '';
for($i = 0; $i < count($arr); $i++) {
  if($arr[$i] != '0000') {
    $s = to_str($arr[$i]);
    if($s != '')
      $ret .=  $s . $c[count($arr) - 1 - $i];
  }
}
if($ret == '') $ret = $a[0];
echo $ret;
echo "\n";
?>

ぼくこのイベント行ってもいいんでしょうか((((;゜Д゜)))