C言語でパソコン甲子園に挑戦(6回戦)
夏といえば高校野球。甲子園で白球を追う球児は「修練」の大切さを教えてくれますね。
というワケで、高校球児に倣い、自身のプログラミングスキルを磨くべくひたすらbuild & destroy。今日は「2006年本選 問題01」に挑戦してみました。実はこの挑戦シリーズ、日経ソフトウエアの付録冊子に基づいて進めてるのですが、配点が高い難問で敢えなくギブアップ、何問かスッ飛ばしている事は内緒なのであります
(= ‘艸’)ムププ
それで修練といえるのか!!オラァ(p゚ロ゚)==p)`д)グハッ
ま、まぁそこら辺は曖昧にお茶を濁しておいて、問題の内容は「8 * 8」の文字列パターンを90度ずつ回転させて表示しよう、というものです。
まずは、いつものようにC言語で挑戦してみました。
#include <stdio.h>
#include <stdlib.h>
#define LEN 8
void rotate_pattern(char pattern[8][8]);
void print_pattern(char pattern[8][8]);
int main(void)
{
char tmp[9], pattern[8][8];
int i, j, cnt = 0;
printf("8 * 8のパターンを入力してください\n");
do {
scanf("%9c", tmp);
for (i = 0; i < LEN; i++) {
pattern[cnt][i] = tmp[i];
}
cnt++;
} while (cnt < LEN);
cnt = 0;
for (i = 0; i < 3; i++) {
rotate_pattern(pattern);
print_pattern(pattern);
}
return 0;
}
void rotate_pattern(char pattern[8][8])
{
int i, j;
char tmp[8][8];
/* 90度回転させたパターンを転写 */
for (i = 0; i < LEN; i++) {
for (j = LEN -1; j >= 0; j--) {
tmp[i][(LEN - 1) - j] = pattern[j][i];
}
}
/* 転写した配列を元の配列にコピー */
for (i = 0; i < LEN; i++) {
for (j = 0; j < LEN; j++) {
pattern[i][j] = tmp[i][j];
}
}
}
void print_pattern(char pattern[8][8])
{
int i, j;
for (i = 0; i < LEN; i++) {
for (j = 0; j < LEN; j++) {
printf("%c", pattern[i][j]);
}
printf("\n");
}
printf("\n");
}
で、これを書いていて身に沁みましたが、やはりヘッポコはポインタを理解出来ておりませんです( p_q)
そんなに簡単に理解出来るとは思っておりませんでしたが、想像以上に理解出来てなくて凹みます。多次元配列とか文字列の配列とかになると、もうてんでダメ。上のコードでも、パターンが「8 * 8」と決め打ちされてるので関数の引数とかも強引に何とかなってますが、これじゃダメなんでしょうね~。
我が家にあるC言語の書籍総ざらえで、再度ポインタをみっちり学習したいと思います。
そんなポインタに泣かされる中で、コッソリ(?)書籍を購入して勉強し始めた「Python」。拡散もいい加減にしておかないとこれ以上はマズイ気がしますが、折角なのでPythonでも挑戦してみました。
CやPHPのいわゆる「C言語スタイル」に慣れておりますので、まだまだチンプンカンプンですが、一応動いたので超大甘採点で良しとしておきます。「8 * 8」のパターンを記述したファイルからデータを読み込む前提です。
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import os, sys
# 1辺の最大数
LEN = 8
def rotatePattern(list):
"""
配列のパターンを90度回転させる
"""
new_list = []
for i in range(0, LEN):
str = ''
for j in range(0, LEN):
str += list[(LEN - 1) -j][i]
new_list.append(str)
return new_list
# 初期パターンを読み込み
file = open('./rotate.txt')
list = []
for line in file:
line = line.replace("\n", "")
list.append(line)
# パターンを90度ずつ回転させて表示
for i in range(0, 4):
for j in range(0, LEN):
print list[j]
print("\n")
list = rotatePattern(list)
モジュールのosとかsysは、必要かどうかも分からず取りあえずimportしてみた、という適当さ加減。変数名も、こんな衝突しそうな名前で大丈夫なのか??とか(PHPだと「$」が付くので衝突にあまり神経質にならなくて良いですよね)、自分で書いていてツッコミどころ満載です。
さすがに恥ずかしくなってきたので、今日はここまで。
浅い理解で終わらないように、計画的に学習しないとですね~ヾ(*’-'*)マタネー♪
