1時間チャレンジ始めました。
1時間チャレンジというのを勝手に始めました。
ルールは簡単!
- お題を1つ決める
- 言語は自由
- 調べるのOK
- それを1時間以内にどこまでできるか挑戦
といった感じです。
時間計測開始時点では、PCで開いて良いのは開発環境のみでファイルは作成済みでOKです。
基本的にプログラミングを早く構築することと、アルゴリズムを早く編み出すことを目的としているので、それまでの準備は先に行いましょう。
今回のお題
今回のお題は魔法陣です。
実は、プログラミング初心者の頃に作ったことがあるのですが、もう忘れてしまっていたので初心に戻って作ってみました。
魔法陣がどのようなものかは実際にググってみてください!
結果
まずは完成したコードがこちら
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 |
#include <stdio.h> void magician(int); int main(int argc, char *argv[]) { printf("%s\n",argv[0]); printf("%s\n",argv[1]); printf("%s\n",argv[2]); if(argc==1){ printf("引数を入力してください\n"); return 0; }else if(argc > 2){ printf("引数が多いです\n"); return 0; }else if((int)argv[1] < '0' && (int)argv[1] > '9'){ printf("半角の数値を入力してください\n"); return 0; } //char型からint型に変換 int length = (int)*argv[1] - (int)'0'; //魔法陣関数 magician(length); return 0; } void magician(int length){ //奇数の場合はエラー if(length % 2 == 0){ printf("奇数を入力してください %d",length); return; } //最大値 int MaximumNum = length * length; //盤面作成 int board[length+2][length+2]; //盤面初期化 for(int cnt1 = 0; cnt1<length + 2 ;cnt1++){ for(int cnt2 = 0; cnt2<length + 2 ;cnt2++){ if(cnt1>length + 1 || cnt2 > length + 1){ board[cnt1][cnt2]=-1; }else if(cnt1 ==0 || cnt2 ==0){ board[cnt1][cnt2]=-1; }else{ board[cnt1][cnt2]=0; } } } int x=1,y=1; for(int cnt = 1; cnt <= MaximumNum ; cnt++){ board[x][y]=cnt; if(x==length){ x=1; } else x++; if(y==length) { y = 1; } else y++; if(board[x][y]!=0){ if(x == 1){ x = length; }else{ x--; } } } //表示ループ for(int cnt1=1;cnt1<length + 1;cnt1++){ printf("["); for(int cnt2=1;cnt2<length + 1;cnt2++){ printf("%4d",board[cnt1][cnt2]); } printf("]\n"); } return; } |
何気に最初のエラー処理に時間を取られてしまったので、時間がかかってしまいました。
実際にかかった時間は1時間12分。
また、スケールテストを行うと、今回はコマンドライン引数を使用しており、対応する数値が0~9の中の奇数のみになるため、条件が限られてしまいます。
採点方式
採点方式は以下の通り
最大点100点から減点方式になります。
- 動作しない:-50点
- 目標機能が最低限備わっていない:-20点
- スケールテストで動作しない:-20点
- 制限時間オーバー:-分数点
そのため、今回の結果は
100点 - 20(スケールテスト) - 12(時間オーバー)
で68点です!
うーん、次回は頑張りたいと思います。
追記
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 |
#include <stdio.h> #include <stdlib.h> void magician(int); int main(int argc, char *argv[]) { printf("%s\n",argv[0]); printf("%s\n",argv[1]); printf("%s\n",argv[2]); if(argc==1){ printf("引数を入力してください\n"); return 0; }else if(argc > 2){ printf("引数が多いです\n"); return 0; } //char型からint型に変換 int length = atoi(argv[1]); //魔法陣関数 magician(length); return 0; } void magician(int length){ //奇数の場合はエラー if(length % 2 == 0){ printf("奇数を入力してください %d",length); return; } //最大値 int MaximumNum = length * length; //盤面作成 int board[length+2][length+2]; //盤面初期化 for(int cnt1 = 0; cnt1<length + 2 ;cnt1++){ for(int cnt2 = 0; cnt2<length + 2 ;cnt2++){ if(cnt1>length + 1 || cnt2 > length + 1){ board[cnt1][cnt2]=-1; }else if(cnt1 ==0 || cnt2 ==0){ board[cnt1][cnt2]=-1; }else{ board[cnt1][cnt2]=0; } } } int x=1,y=1; for(int cnt = 1; cnt <= MaximumNum ; cnt++){ board[x][y]=cnt; if(x==length){ x=1; } else x++; if(y==length) { y = 1; } else y++; if(board[x][y]!=0){ if(x == 1){ x = length; }else{ x--; } } } //表示ループ for(int cnt1=1;cnt1<length + 1;cnt1++){ printf("["); for(int cnt2=1;cnt2<length + 1;cnt2++){ printf("%4d",board[cnt1][cnt2]); } printf("]\n"); } return; } |
因みに、これがちゃんとした魔法陣のプログラムです。(スケールテストにも耐えれます)
最後に
これに関しては内容自体、私の完全オリジナルではないのですが、プログラミングを短時間で練習しておくのは、重要かと思うので是非やってみてください!
今回のブログ曲
今回投稿中に聴いていた曲はこちら