ガチホ〇撲滅教

人の行く裏に道あり花の山

そろそろリハビリ終了かなAOJ【0509】

今日は、リハビリも進んできたので正答率の低い問題を解く事にした

AOJ【0509】シート(シート | Aizu Online Judge)

 

javaを用いての実装をすることにしたがここで使用しようと考えたのがPolygonクラス。

ポリゴンといえばポケモンだが、こいつはまさにそれ。カクカクの多角形を表現するのにはこいつが最適。こんなクラスまで用意しとうとかjava最強かよww

しかし、実際に今回のプログラミングで使用したのは、配列だ。

また、頭悪い発見をした。仕組みについてであるが以下の考え方で記述する。

 

まぁ、俺の中でのjavaは便利で理解しやすいが故、誰でもできそうという烙印が押されてしまいそうな言語という認識なのでいつかは、javaからの脱却をしなければならない??のだろうか笑

 

さて、問題 

 

〜考え方〜

1×1の正方形を以下のような配列でデータを格納し、各配列を正方形として処理、そしてセルの値が1ならばその領域はactiveであり、正方形がその領域に存在していると見なす。0であるならばその領域には正方形がないと考える。

この処理により、面積は瞬殺で出す事ができる。

 

面積?アクティブセルの数を数えるだけ。

まさに、瞬殺。

周の長さにおいても、一つの正方形につき4である。

しかし、4辺のうち他の正方形と接しているのでそのぶんを引かなくてはならないのだが

実は、これもある正方形の周の長さは、その対象としている正方形に

接している正方形の数だけ4から引いていけばよい。

 

[0][9] [1][9] [2][9] [3][9] [4][9] [5][9] [6][9] [7][9] [8][9] [9][9]
[0][8] [1][8] [2][8] [3][8] [4][8] [5][8] [6][8] [7][8] [8][8] [9][8]
[0][7] [1][7] [2][7] [3][7] [4][7] [5][7] [6][7] [7][7] [8][7] [9][7]
[0][6] [1][6] [2][6] [3][6] [4][6] [5][6] [6][6] [7][6] [8][6] [9][6]
[0][5] [1][5] [2][5] [3][5] [4][5] [5][5] [6][5] [7][5] [8][5] [9][5]
[0][4] [1][4] [2][4] [3][4] [4][4] [5][4] [6][4] [7][4] [8][4] [9][4]
[0][3] [1][3] [2][3] [3][3] [4][3] [5][3] [6][3] [7][3] [8][3] [9][3]
[0][2] [1][2] [2][2] [3][2] [4][2] [5][2] [6][2] [7][2] [8][2] [9][2]
[0][1] [1][1] [2][1] [3][1] [4][1] [5][1] [6][1] [7][1] [8][1] [9][1]
[0][0] [1][0] [2][0] [3][0] [4][0] [5][0] [6][0] [7][0] [8][0] [9][0]

 正方形の実装のイメージ図 

 

[0][9] [1][9] [2][9] [3][9] [4][9] [5][9] [6][9] [7][9] [8][9] [9][9]
[0][8] [1][8] [2][8] [3][8] [4][8] [5][8] [6][8] [7][8] [8][8] [9][8]
[0][7] [1][7] [2][7] [3][7] [4][7] [5][7] [6][7] [7][7] [8][7] [9][7]
[0][6] [1][6] [2][6] [3][6] [4][6] [5][6] [6][6] [7][6] [8][6] [9][6]
[0][5] [1][5] [2][5] [3][5] [4][5] [5][5] [6][5] [7][5] [8][5] [9][5]
[0][4] [1][4] [2][4] [3][4] [4][4] [5][4] [6][4] [7][4] [8][4] [9][4]
[0][3] [1][3] [2][3] [3][3] [4][3] [5][3] [6][3] [7][3] [8][3] [9][3]
[0][2] [1][2] [2][2] [3][2] [4][2] [5][2] [6][2] [7][2] [8][2] [9][2]
[0][1] [1][1] [2][1] [3][1] [4][1] [5][1] [6][1] [7][1] [8][1] [9][1]
[0][0] [1][0] [2][0] [3][0] [4][0] [5][0] [6][0] [7][0] [8][0] [9][0]

入力例1の図形の図

 緑色はアクティブセル(正方形が存在する)って感じで正方形を表現する。

 

以下コード

 

~FileRead_0509.java~

 

package sheets_0509;

 

import java.io.BufferedReader;

import java.io.FileNotFoundException;

import java.io.FileReader;

import java.io.IOException;

import java.util.ArrayList;

 

public class FileRead_0509 {

private ArrayList<Integer> sl = new ArrayList<Integer>();

private int sq = new int[100][100][10];

 

/**

* @return the sq

*/

public int getSq() {

returnsq;

}

 

/**

* @return the sl

*/

public ArrayList<Integer> getSl() {

returnsl;

}

 

/**

* 配列の初期化のメソッド

*/

public void initSq(){

for(int l = 0; l < 10; l++){

for(int i = 0; i < 100; i++){

for(int k = 0; k < 100; k++){

sq[i][k][l] = 0;

}

}

}

}

 

public int FileRead(String filename){

FileReader fr = null;

    BufferedReader br = null;

    try {

        fr = new FileReader(filename);

        br = new BufferedReader(fr);

       

        String line;

        int i;

        int count = 0;

 

        while((line = br.readLine()) != null){ //1行読む

        String word = line.split(" ", 0);

        i = Integer.parseInt(word[0]); //数字に変換

        sl.add(Integer.parseInt(word[1]));

                

        if(i == 0) break; //EoFとしての0がきたらメソッド終了

        for(int k = 0; k < i; k++){

        line = br.readLine();

        String w = line.split(" ", 0);

        int m, n;

        for(m = Integer.parseInt(w[0]); m < Integer.parseInt(w[2]); m++){

        for(n = Integer.parseInt(w[1]); n < Integer.parseInt(w[3]); n++){

        sq[m][n][count] = 1;

        }

        }

        }

        count++;

        }

    } catch (FileNotFoundException e) {

        e.printStackTrace();

    } catch (IOException e) {

        e.printStackTrace();

    } finally {

        try {

            br.close();

            fr.close();

        } catch (IOException e) {

            e.printStackTrace();

        }

    }

returnsq;

}

}

 

~sheets.java~

 

package sheets_0509;

 

public class Sheets {

private static FileRead_0509 file = new FileRead_0509();

private static int sq = new int[100][100][10];

 

public int square(int i){

int s = 0;

for(int m = 0; m < 100; m++){

for(int n = 0; n < 100; n++){

if(sq[m][n][i] == 1){

s++;

}

}

}

returns;

}

 

public int length(int i){

int l = 0;

for(int m = 0; m < 100; m++){

for(int n = 0; n < 100; n++){

if(sq[m][n][i] == 1){

l += 4;

//周りにアクティブセルが存在するかの確認

 

/**

* 左端を見るとき

*/

 

if(m == 0){

if(n == 0){ //左下端のとき

if(sq[m+1][n][i] == 1)

l--;

if(sq[m][n+1][i] == 1)

l--;

continue;

}

if(n == 100-1){ //左上端のとき

if(sq[m+1][n][i] == 1)

l--;

if(sq[m][n+1][i] == 1)

l--;

continue;

}

if(sq[m+1][n][i] == 1)

l--;

if(sq[m][n+1][i] == 1)

l--;

if(sq[m][n-1][i] == 1)

l--;

continue;

}

 

/**

* 右端を見るとき

*/

 

if(m == 100-1){

if(n == 0){ //右下端のとき

if(sq[m-1][n][i] == 1)

l--;

if(sq[m][n+1][i] == 1)

l--;

continue;

}

if(n == 100-1){ //右上端のとき

if(sq[m-1][n][i] == 1)

l--;

if(sq[m][n-1][i] == 1)

l--;

continue;

}

if(sq[m-1][n][i] == 1)

l--;

if(sq[m][n+1][i] == 1)

l--;

if(sq[m][n-1][i] == 1)

l--;

continue;

}

 

/**

* 下端を見るとき

*/

 

if(n == 0){

if(sq[m-1][n][i] == 1)

l--;

if(sq[m+1][n][i] == 1)

l--;

if(sq[m][n+1][i] == 1)

l--;

continue;

}

/**

* 上端を見るとき

*/

 

if(n == 100-1){

if(sq[m-1][n][i] == 1)

l--;

if(sq[m][n+1][i] == 1)

l--;

if(sq[m][n-1][i] == 1)

l--;

continue;

}

/**

* 端以外を見るとき

*/

if(sq[m-1][n][i] == 1)

l--;

if(sq[m+1][n][i] == 1)

l--;

if(sq[m][n-1][i] == 1)

l--;

if(sq[m][n+1][i] == 1)

l--;

}

}

}

returnl;

}

 

public void showAnswer(){

for(int i = 0; i < file.getSl().size(); i++){

if(file.getSl().get(i) == 1){

System.out.println(square(i));

}

if(file.getSl().get(i) == 2){

System.out.println(square(i));

System.out.println(length(i));

}

}

}

 

public static void main(String args[]){

Sheets sheets = new Sheets();

file.FileRead(args[0]);

sq = file.getSq();

sheets.showAnswer();

}

}

 

最後の方が脳筋のゴリラプログラムになってしまったが

処理方法が他になさそうなのであまり気にしない事にする笑

 

円高時、高額ブランド商品を買うなら外国サイトで??

今日、zozotownを見ていてポールスミスの服を見ており

ふと、思いついたこと。

誰もがご存知の通りだが今、ポンド通貨に対して、円高であるので

ポールスミスの英国版通販サイトで

同じ商品を見たらいくらになるのだろうかと思って見てみた。

 

f:id:seiyafield:20160816133351p:plain

 

日本サイトで見た値段 9720円

f:id:seiyafield:20160816133446p:plain

 

英国サイトで見た値段 55ポンド 1ポンド=129.5円で計算して 7128円であった。

日本サイトで購入するよりも

2500円くらい安い笑

まぁ、実際はここに送料が追加されるので実際の値段はよくわからない笑笑

ちなみに、ユーロ圏でのサイトとアメリカでのサイトでも同じ商品を見たところ

ポールスミスの服

円     9720円
ドル→円  9548円  約2%OFF     (1ドル=100.5円換算)
ユーロ→円 8438円  約13%OFF   (1ユーロ=112.5円換算)
ポンド→円 7128円  約26%OFF   (1ポンド=129.5円換算)

 

つまり、日本でうっている英国ブランドを英国で購入すると26%OFFになる。

(ポールスミスの服で計算した場合笑)

よって、送料が商品の値段の26%以下であった場合、日本で買うよりお得という事になる。

なんなら、英国ブランドの100万円の商品の購入(時計とか??)を考えている場合

浮いた26%の26万円分で買いに行くついでに旅行に行くこともできる。

まぁ、ここで問題になるのは商品の保証の話であるが

その辺は、自分がどうしたいかによるので本人依存で笑。

〜続々〜リハビリプログラムAOJ【0502】

またまた、リハビリプログラム

今回は、(サイコロ | Aizu Online Judge)

  

本日(記事をあげた時点では昨日)2つめのコードであるがやはり、リハビリを重ねるごとにコーディングのスピードがあがっているのを感じた。1日に解ける問題数がしっかりと増えてきているのはリハビリの効果が出始めているとみてとらえていいと感じる。

また、今年の夏休みは、5日に1度、直前の5日間を振り返って

今後どのようにしていくかを反省していきたいと考えている(受験生か!!)

 

ちなみに、この問題は 

サイコロの上面をtop

サイコロの前面をfront

サイコロの右面をrs (right-sideとする)

 

この3面さえわかれば

下は7-top

後ろは7-front

左は7-rsとなるため

 

結果、6面が把握できる事になる。

(3面の情報を把握する事によりサイコロ全ての面の情報を把握する事が可能)

このデータ管理によりプログラミングの労力を減らす事ができる。

このとき、注意するのが次の3面の情報が前の情報に依存するため

データの代入中には、データを2つ用意する事が必要である。

 

次の各面の数字と、現在の各面の数字

 

ページを見ると各動作によるサイコロの挙動は明らかである。

以下に擬似コードを記す。

(次の各面の値) = (前の各面の値を用いて処理)

 

操作Northによって

top = front

front = 7-top

rs = rs (変わらない)

 

操作Eastによって

top = 7-rs

front = front(変わらない)

rs = top

 

操作Westによって

top = rs

front = front(変わらない)

rs = 7-top

 

操作Southによって

top = 7 - front

front = top

rs = rs (変わらない)

 

操作Rightによって

top = top

front = rs

rs = 7 - front

 

操作Leftによって

top = top

front = 7 - rs

rs = front

 

となる。が、実行結果はミスっていたため(擬似コードの挙動予測はあってると思う)

デバッグを行った。

 

~修正後のコード~

 

~FileRead_0502.java~

 

package dice_0502;

 

import java.io.BufferedReader;

import java.io.FileNotFoundException;

import java.io.FileReader;

import java.io.IOException;

import java.util.ArrayList;

 

public class FileRead_0502 {

ArrayList<String> direction = new ArrayList<String>();

 

/**

* @return the direction

*/

public ArrayList<String> getDirection() {

return direction;

}

 

public void fileRead(String filename){

FileReader fr = null;

    BufferedReader br = null;

    try {

        fr = new FileReader(filename);

        br = new BufferedReader(fr);

       

        String line;

        int i;

        while*1 != null){ //1行読む

        i = Integer.parseInt(line);  

        if(i == 0) break; //EoFの0がきたら終了

        for(int k = 0; k < i; k++){

        line = br.readLine();

        direction.add(line);

        if(k == i-1){

        direction.add(null);

        }

        }

        }

    } catch (FileNotFoundException e) {

        e.printStackTrace();

    } catch (IOException e) {

        e.printStackTrace();

    } finally {

        try {

            br.close();

            fr.close();

        } catch (IOException e) {

            e.printStackTrace();

        }

    }

}

}

 

 

 

~Dice.java~

 

package dice_0502;

 

public class Dice {

private static FileRead_0502 file = new FileRead_0502();

 

private int top = 1, front = 2, rs = 3;

private int p_t = 1, p_f = 2, p_r = 3;

privateintpoint = 1;

 

public void lotation(){

for(int i = 0; i < file.getDirection().size(); i++){

if(file.getDirection().get(i) == null){

System.out.println(point);

point = 1;

top = 1; front = 2; rs = 3;

p_t = 1; p_f = 2; p_r = 3;

continue;

}

if(file.getDirection().get(i).equals("North")){

this.north();

}

if(file.getDirection().get(i).equals("East")){

this.east();

}

if(file.getDirection().get(i).equals("West")){

this.west();

}

if(file.getDirection().get(i).equals("South")){

this.south();

}

if(file.getDirection().get(i).equals("Right")){

this.right();

}

if(file.getDirection().get(i).equals("Left")){

this.left();

}

p_t = top;

p_f = front;

p_r = rs;

point += top;

}

}

 

public void north(){

top = p_f;

front = 7-p_t;

//rsは変更なし

}

public void east(){

top = 7-p_r;

//frontは変更なし

rs = p_t;

}

public void west(){

top = p_r;

//frontは変更なし

rs = 7-p_t;

}

public void south(){

top = 7-p_f;

front = p_t;

//rsは変更なし

}

public void right(){

//topは変更なし

front = p_r;

rs = 7-p_f;

}

public void left(){

//topは変更なし

front = 7-p_r;

rs = p_f;

}

 

public static void main(String args[]){

file.fileRead(args[0]);

Dice dice = new Dice();

dice.lotation();

}

}

 

ミスってたとこ…

・そもそもの一番最初の1が上の時を足し忘れていた。

・2回目のサイコロの回転の開始時に、サイコロの状態を初期化し忘れていた事。修正前は、前回のサイコロの回転の最後の状態から開始していた。

 

この2点を修正することによって、ちゃんとした実行結果を得られる事ができた。

*1:line = br.readLine(

〜続〜リハビリプログラムAOJ【0501】

またまた、AOJでリハビリプログラミング

今日は、前の問題の次の問題を解いている

(データ変換 | Aizu Online Judge)

そのため、前の問題と似ているところがあり

少しだけ、昨日のコードを流用させていただいた。

昨日とコードが少しかぶっているのと2日連続のコーディングにより

すこしずつ、コーディングにかかる時間が短縮されたように感じる。

 

これもまた、昨日のと同様に入力ファイルの指定はコマンドライン引数で指定している。

他の仕様に関しては、上にのせているページと同じ通りである。

入力例と出力例はページに載っている通りなのでここでは割愛。

 

~FileRead.java~

 

package dataConversion_0501;

 

import java.io.BufferedReader;

import java.io.FileNotFoundException;

import java.io.FileReader;

import java.io.IOException;

import java.util.ArrayList;

 

public class FileRead {

private ArrayList<String> before = new ArrayList<String>();

private ArrayList<String> after = new ArrayList<String>();

private ArrayList<String> input = new ArrayList<String>();

 

/**

* @return the before

*/

public ArrayList<String> getBefore() {

returnbefore;

}

 

/**

* @return the after

*/

public ArrayList<String> getAfter() {

returnafter;

}

 

/**

* @return the input

*/

public ArrayList<String> getInput() {

returninput;

}

 

public void fileRead(String filename){

FileReader fr = null;

    BufferedReader br = null;

    try {

        fr = new FileReader(filename);

        br = new BufferedReader(fr);

       

        String line;

        int i;

        while*1 != null){ //1行読む

        i = Integer.parseInt(line); //数字に変換

        if(i == 0) break; //EoFとしての0がきたらメソッド終了

        for(int k = 0; k < i; k++){

        line = br.readLine();

        String word = line.split(" ", 0);

        before.add(word[0]);

        after.add(word[1]);

        if(k == i-1){

        before.add(null);

        after.add(null);

        }

        }

        line = br.readLine();

        i = Integer.parseInt(line);

        for(int k = 0; k < i; k++){

        line = br.readLine();

        input.add(line);

        //複数入力間において間のデータにnullを代入する。

        if(k == i-1){

        input.add(null);

        }

        }

        }

    } catch (FileNotFoundException e) {

        e.printStackTrace();

    } catch (IOException e) {

        e.printStackTrace();

    } finally {

        try {

            br.close();

            fr.close();

        } catch (IOException e) {

            e.printStackTrace();

        }

    }

}

}

 

 

~Conversion.java~

 

package dataConversion_0501;

 

public class Conversion {

private static FileRead file = new FileRead();

 

public void conversion(){

System.out.println(file.getBefore());

System.out.println(file.getAfter());

 

for(int i = 0; i < file.getInput().size(); i++){

 

//入力が次の入力に切り替わるとき

if(file.getInput().get(i) == null){

System.out.println(); //改行処理

while(file.getBefore().get(0) != null){

file.getBefore().remove(0);

file.getAfter().remove(0);

}

//nullも除去

file.getBefore().remove(0);

file.getAfter().remove(0);

continue;

}

 

//入力がまだあるとき

for(int k = 0; file.getBefore().get(k) != null; k++){

if(file.getBefore().get(k).equals(file.getInput().get(i))){

file.getInput().remove(i);

file.getInput().add(i, file.getAfter().get(k));

break;

}

}

System.out.print(file.getInput().get(i));

}

}

 

public static void main(String args){

file.fileRead(args[0]);

Conversion con = new Conversion();

con.conversion();

}

}

 

*1:line = br.readLine(

リハビリプログラムAOJ【0500】

50年ぶりぐらいにプログラミングするからまずは、リハビリからしよ!!ってことで

AOJの問題(カードゲーム | Aizu Online Judge)を解いていて

まぁ、解き始めはこんなん2時間あればかけるやろって感じだったが

最近、プログラミングに触れてなさ過ぎてほぼ完全に書き方忘れとったww

結局、間にハリーポッターを鑑賞する事をはさんで8時間ぐらいかかったwwwwwww

まぁ、なにはともあれかけたのでとりあえずのせる

これからは、たいしたコードではなくとものせていこうと思う。

(特に、ブログにのせれるネタがないということも一因であるww)

たいしたコードではないが自分のコードを客観的に見るために

いつものエクリプス上のコードとは違う雰囲気の中見ていこうと考えたからである。

ちなみに言語はjavaで書いた。

 

リハビリとしてはちょうどいい優しさだった

今日、残ってる時間と明日からもいろんなコードを書いていこう

 

プチ解説としては、ファイル名はコマンドライン引数で指定

その他の事に関しては、AOJの問題が要求している仕様である。

実行例は、上の問題のページの通りの挙動をしているが

わざわざのせるのがめんどくさいのでここでは割愛。

 

このコードを書いていて新しく学んだ事はBufferedReaderを用いて

入力ファイルを1行ずつ読み込んで処理できるという事を学んだ(それぐらい…笑)

という実際に得られた知識どうこう以前に自分が夏休み中にプログラミングをしているという事が

もうそれは、大きな成長なのでまぁまぁ、よいスタートだと思う。

この調子でいきたい

 

~FileRead.java~

 

package cardGame_0500;

 

import java.io.BufferedReader;

import java.io.FileNotFoundException;

import java.io.FileReader;

import java.io.IOException;

import java.util.ArrayList;

 

/**

 * データの読み込みを行うクラス

 * 読み込みファイル名 cardGameInput.docx

 * @author seiya

 */

 

public class FileRead {

//配列要素数の限界は10000である(n≦10000)

private ArrayList<Integer> A = new ArrayList<Integer>();

private ArrayList<Integer> B = new ArrayList<Integer>();

 

/**

* @return the a

*/

public ArrayList<Integer> getA() {

returnA;

}

 

/**

* @return the b

*/

public ArrayList<Integer> getB() {

returnB;

}

 

/**

* 入力ファイルのデータを1行ずつ読み込みデータをセットするメソッド

*/

public void fileReadSet(String filename){

FileReader fr = null;

    BufferedReader br = null;

    try {

        fr = new FileReader(filename);

        br = new BufferedReader(fr);

       

        String line;

        int i;

 

        while*1 != null){ //1行読む

        i = Integer.parseInt(line); //数字に変換

        if(i == 0) break; //EoFとしての0がきたらメソッド終了

        for(int k = 0; k < i; k++){

        line = br.readLine();

        String word = line.split(" ", 0);

        A.add(Integer.parseInt(word[0]));

        B.add(Integer.parseInt(word[1]));

        //複数ゲーム間において間のデータにnullを代入する。

        if(k == i-1){

        A.add(null);

        B.add(null);

        }

        }

        }

    } catch (FileNotFoundException e) {

        e.printStackTrace();

    } catch (IOException e) {

        e.printStackTrace();

    } finally {

        try {

            br.close();

            fr.close();

        } catch (IOException e) {

            e.printStackTrace();

        }

    }

return;

}

}

 

 

~Battle.java~

 

package cardGame_0500;

 

import java.util.ArrayList;

 

/**

 * 実際にカードゲームを行い点数を競うプログラム

 * @author seiya

 *

 */

 

public class Battle {

//カードゲームの勝負の結果を格納する変数

private ArrayList<Integer> Ra = new ArrayList<Integer>();

private ArrayList<Integer> Rb = new ArrayList<Integer>();

private static FileRead file = new FileRead();

 

public void numComp(){

int Ap = 0, Bp = 0;

 

for(int i = 0; i < file.getA().size(); i++){

if(file.getA().get(i) == null){

Ra.add(Ap);

Rb.add(Bp);

Ap = 0;

Bp = 0;

continue;

if(file.getA().get(i) < file.getB().get(i)){

Bp += (file.getA().get(i)+file.getB().get(i));

}

if(file.getA().get(i) > file.getB().get(i)){

Ap += (file.getA().get(i)+file.getB().get(i));

}

if(file.getA().get(i) == file.getB().get(i)){

Ap += file.getA().get(i);

Bp += file.getB().get(i);

}

}

}

 

public void showResult(){

for(int i = 0; i < Ra.size(); i++){

System.out.println(Ra.get(i)+" "+Rb.get(i));

}

}

 

//コマンドライン引数にファイル名を代入

public static void main(String args){

Battle battle = new Battle();

file.fileReadSet(args[0]); //入力データの読み込み

battle.numComp();

battle.showResult();

}

}

*1:line = br.readLine(

なぜか、読者になっていなかったw

わたけんのブログを久々に見たら 思ったより更新されとって 置いていかれた気分になったww そもそも、なんでブログが更新されても 通知が来んねやろって考えたら ブログにいったときに読者になるボタンがあって なぜに、読者のはずやのに 読者になってへんねやって考えたら 読者になってなかった事件 これからは、ブログの動向を把握させていただくww

今年の夏休みの目標==為替レート自動売買システムの開発【もう一人の俺をつくる】

今年も夏休みが始まったが未だに大学院に進学するか就職するか迷っている。

自分の希望としては、大学院に残って研究をするよりもさっさと社会に出て実際に開発をしたい。まぁ、研究室配属されてから研究が楽しいとか言い出す可能性が大アリなんだが…w(99%そうなるww)

まぁ、就職に傾いた場合、理系就職したければ企業に開発物を見せる必要性があるので

最後の夏休みを迎えて、これからは、いろいろ開発を楽しんでいきたいと思う。

 

1.取引シグナル感知システム

最初から完全な自動売買システムを完成できるとは思っていないので

まず、取引のシグナルが感知されたらケータイに通知がいくように設計していきたいと考えている。

 

2.取引アルゴリズムの決定

 基本的には、非常にプログラミングがしやすい5分足チャートのボリバン+MACDを使用してのトレードを行わせようと考えている。

 

必要であると予測される知識

 

・画像解析or数値処理

主に(ほぼ100%??)テクニカル分析を用いるためチャートの情報を解析する必要性が存在する。

 

・Webサイト上の数値や画像をプログラムで使用できるように取り込む

解析元データは、ネット上からとってこようと考えている。そのため、ネット上のデータをプログラムで使用できるように取り込まなければならない。その知識に関しても必要である。

 

・新しい言語の習得

今まで書いた事のあるプログラミング言語は、c言語javaPHP、一瞬prologであったがシステムの都合上別の言語を習得する必要性が出てくる可能性がある。

その場合は、頑張るしかないな笑

 

最近は、テストとかあってプログラミング自体が久々なのでAOJとかで勘を取り戻す事にした。あと、これからは自分が書いたプログラムは、些細なものでも適当にここにのせていこうかなと考えている。

本来なら、もう少し丁寧にこの記事を書いていたのだが書いている途中でページを間違えて閉じてしまい半分ぐらい書いてる内容を忘れてしまったので適当なのは仕方ない。

2016/08/11時点での目標

進捗、変更があれば追記しよ。

テスト前日熱発症。オワタww??

テスト前日にあろうことか熱を出してしまったwww

だが、意外とこうゆう時ほど焦るもので

20時まではスヤスヤしてたがそっからは

丸薬も飲んだのでまぁまぁはかどっておる

 

しゃあなし頑張るでなww

英国国民投票EU離脱FX取引レポート【2016/06/23】投票発表【2016/06/24】

土日も終わりかなりおくれてしまったが、金曜日のトレードのレポートを書いていきたいと思う
経済史の中でも歴史に残りそうなこのビッグイベント取引しない手はなかったので初心者ながら参戦させていただいた。(取引自体は半年間しているが、普段の元手は株で30万FXは1000円であるのに対し、今回は株の資金30万円をFXの口座に移して挑ませていただいた。実際は1万単位での取引がメインであったので30万を使った局面はなかったが。)

まず、総合結果からいわせていただくと、57戦28勝29敗で61,171円の利益となった。
学生という身分ながらかなり稼がせていただいたが
これを特にパーっと使うでもなくこのままこの勢いで年収103万を超えてやるか〜とか考えだしたり
株の軍資金の足しにでもするか〜と考えるあたりが俺。未だにこの利益を株以外に使う予定はありませんww

f:id:seiyafield:20160710170733j:plain
f:id:seiyafield:20160710170749j:plain
f:id:seiyafield:20160710170804j:plain
f:id:seiyafield:20160710170819j:plain
f:id:seiyafield:20160710170853j:plain
f:id:seiyafield:20160710170904j:plain


最終的に6時間トレードを行った訳だが、ここまで長時間トレードをするのは初めてであったので
取引時間が4時間を超えた当たりから集中力が切れたのか、最後の2時間は全敗で6万円の損失を被った。(最後の2時間のトレード9戦9敗ww)
一番重要な敗因としては、そこまでは、1万単位での取引であったが何を考えたか急に2万単位での取引をはじめた。かつ、普段は絶対に行わないナンピン取引を行ったためいつものシステムトレードの形に落とし込むことができず、最終的に売買の大幅スプレッド、急騰、急落のスリッページの嵐の取引の中に巻き込まれ、損失が大きくなってしまったところで損切りをしたのが原因であると考えられる。(間違いなく12万を稼いだ瞬間に調子に乗ってしまったことで、普段のルールを破った事が原因だ。)今度からのトレードは完全にルールを守ってトレードをする事を今まで以上に徹底していきたい。

ここで、今回のトレードの手法であるが投票結果と世論調査により1~5円の急騰、急落が発生しうるため、いつもしているテクニカルトレードに新たなルールを加えたトレード法を用いてトレードする事となった。その手法であるが、6/23日に考案した「地震トレード(自称)」をシステマティックな形式に落とし込めて、トレードを行った。

英EU離脱リスク回避による日経平均反落

f:id:seiyafield:20160622152225j:plain


ローソク足を見ると買いと売りの拮抗であるが
終値よりは低い状態

日本時間、金曜日15時に「離脱」「残留」の最終発表であるがその前から為替相場は動くはずである

投票結果は地域ごとに分割して発表されていくので
GBP/JPYチャートの形を見ればどちらが優勢かわかる

今回のイベントに際しての自分の作戦は


f:id:seiyafield:20160622152720j:plain


1分足はトレード用のチャートで使用
30分足はトレンド読み取り用として使用
今のチャート(水曜日15時ほど)を見ればわかるが
30分足で見た際横ばいである。
これがどのように動いていくかを確認して
トレードのタイミングと売りか買いを判断する。
大まかな流れとしては


為替が下落⇒離脱が優勢
為替が上昇(横ばい)⇒残留が優勢

離脱が優勢⇒
大幅な円高、ポンド安予想としFXで空売り
残留が優勢⇒
株式相場の負の懸念が解消⇒株で買い
という作戦でいこうと考えている。

具体的な作戦としては木曜日の15時までに考えることとする。

英国EU離脱を翌日に控えて…

明日23日、ようやく英国の国民投票の日となる。
これを受けて本日の株価を予測すると相場開始時~数時間は上がると見込まれるが、大引け前にリスク回避の売りが入ると考えられるため後場の相場の動きは減少に入ると思われる。
チャートの形では、75日移動平均線が横ばいの状態で線からの乖離が大きいため、反動で昨日の終値と比較すると少し上昇から始まると考えられる。
f:id:seiyafield:20160622085253j:plain
信用売りの数を見ていなかったため終値よりも低いところからのスタートとなった。ケアレスミスに気をつけたい

イムラ封筒【3955】、プラップJ【2449】続伸予想的中。75日平均線を上抜け

まず、昨日より保有していたイムラ封筒【3955】日経平均の大幅下落の中で株価が上昇していた数少ない銘柄のうちのひとつ、昨日の値上がり率ランキング(全市場)ではギリギリ50位に入る。上昇トレンドにあった、75日移動平均線を上抜け。一目均衡の2点買いによる買いシグナルが出ていたためASK

昨日のチャート
f:id:seiyafield:20160614112140j:plain
f:id:seiyafield:20160614112158j:plain

本日のチャート
f:id:seiyafield:20160614112240j:plain
f:id:seiyafield:20160614112250j:plain

取引残
f:id:seiyafield:20160614112259j:plain

プラップJ【2449】についてもイムラ封筒と同様の買いシグナルであった。この銘柄に関してはかっていない。

f:id:seiyafield:20160614112338j:plain

取引残
f:id:seiyafield:20160614112415j:plain

これらの銘柄はどちらも、7月に控えた参院選に大きく関与する選挙関連銘柄であるため、日経平均が下がっているにも関わらず、上昇を続けていると考えられる。イムラ封筒の取引残に関しては買いが先週比で減少しているため、長期の保有ではなく今週中にBIDする可能性がある。そして、この記事を投稿するタイミングでは、懸念通り下落に転じてしまった。

日経平均は元々、かろうじて持ちこたえるのが望まれていたが英のEU脱退により下落、75日平行線の傾きも下向きに進行し始めた。大幅下落である。一目もこれが銘柄ならうるべきであるとの3点売りになっている。

f:id:seiyafield:20160614112802j:plain
f:id:seiyafield:20160614112755j:plain

この状況を見るからに、今は相場がかなり下落しているため待ちのタイミングではないかと考えた。
どこまで下がるかはよくわからないので、毎日、分析を怠らないようにしたい。
日経平均が下がっているこの状況下では、株を買って利益を出していくのはかなり難しい環境である。懸念材料が多いため、282円で1000株ASK290円でBIDですぐに手放した。この時はかなり不安な気持ちで取引をしていた。

なぜか、幻想的な7 segment LED

情知実験で 7segment LEDを使ったのでネットで内部回路図とかを調べていたら

このような画像がでてきた。

 

f:id:seiyafield:20151123230751g:plain

 

謎に幻想的でなんか悔しくなってしまった。

もし、彼女が工学部で論理回路を扱えるなら

これで、「HAPPY birthday」とサプライズしてくれたら泣いて喜ぶだろう(結構、作るのめんどくさいので)と妄想にふけっていた。

しかし、よくよく考えると7セグで「Y」とか「t」とか出せへんことに気づいてしまって、設計の時点で破綻していてつらい。

B問題【続編】※AC

ようやく通ったB問題、なんか自分の開発能力の低さに涙がでそうになる今日この頃だが、なんとか通った笑

 

この前の記事のプログラムのデバッグ用とコメントアウトしていたものを外して、実行すると、N = 3のときこんな感じ

a[3] = 1

a[4] = 3

a[5] = 6

a[6] = 10

a[7] = 15

a[8] = 21

a[9] = 25

a[10] = 27

a[11] = 27

a[12] = 25

a[13] = 21

a[14] = 15

a[15] = 10

a[16] = 6

a[17] = 3

a[18] = 1

 

これ、よくよく見たら、N~N×6までの数字が出てくるんやけど

ちょうど、その間をとった(int) (N + N × 6) / 2 (※(int)はキャストのつもり)

がでてくる。ので、結局、プログラムをかなり短縮してこう書き換えた。

 

  1. #include <stdio.h>
  2.  
  3. int main(void){
  4. int N = 0;
  5. while(!(1 <= N && N <=256)){
  6. scanf("%d", &N);
  7. }
  8.  
  9. if(N == 1){  //N=1のときのみ処理がかわる。
  10. puts("1");
  11. }
  12. else {
  13. printf("%d\n", (N + N*6)/2);
  14. }
  15.  
  16. return 0;
  17. }

 

結局これで、AC(Accept)されました。

この前、書いたプログラムが間違えてて、今回のプログラムがあっているとゆうのも

悲しくなってしまうがまぁ、なにわともあれあきらめずちゃんと最後までできたので良かったとも感じている。