やわらか博物館

壁がトランポリンでできてる

どうぶつ150101

どうぶつしょうぎで負けた回を反省する。

 

・先手自分vs後手4級 棋譜

△A3きりんと来て先手勝利の可能性が生まれたんだけど、受けに失敗して崩れた。

f:id:sianos:20160101225902p:plain

(お互い持ち駒はひよこ1枚のみ)

 

ここは▲B2きりんではなく▲A3きりんが最善手。というかA3きりん以外は後手勝利に流れる。きりん捨ててライオンが進んでくる、しかもそこにあるきりんを取る手段がない…となるとと攻める手段なくてつらいからそりゃそうだわなという感じ。

でとりあえず▲B2きりんとやったとして、

f:id:sianos:20160101230654p:plain

先手:ひよこ1きりん1 後手:ひよこ1ぞう1

ここでの最善手は▲B3ひよこ打。ちょっと意外だけど、B3ひよこ打は@25後勝。対してA1ぞう打は@15、C1ぞう打&C3ぞう打は@11だからひよこのほうが圧倒的に手番を稼げる=相手のミスを誘うことが出来る。ちなみにB3ひよこからは△A2ライオン▲B1ぞう打△B1ライオン▲A3ライオンとぞうを犠牲に捧げて相手のライオンを下げ、A3のきりんを手に入れることができる。ついでにライオンも前に出て、以下の図の通りになる。

f:id:sianos:20160102000725j:plain

ここからは後手がA2に打たない限り先手勝ちに繋がるのでまあ勝ちも見える…かもしれない。とりあえずB3ひよこを追うのはここまでにしておく。

 

この局面の続き。

f:id:sianos:20160101230654p:plain

私が打った手はというとC3ぞう打。ぞうを失いたくなくて日和った手。対して後手は避けてA2に移動、

f:id:sianos:20160102001632p:plain

持ち駒:先手ひよこ1きりん1 後手ひよこ1

こうなった。これでもやはり最善手はB3ひよこ打@12後勝のようだ。ぞうの効く範囲に攻めていけるからだろう。もっとひよこをうまく活用して連携させていきたい。まあこの場合B3ひよこ打しても後手の勝つ確率はわりと高いんだけど。ちなみに次点ではB2ぞう@9後、C4ライオン@9後と続く。

実際に打ったのはB3ぞう@6後。他の手に比べると微妙だったみたいだ。まあどちらにせよ、この時点でかなり劣勢なんだけど。△B3きりん以外だと先手勝ちに繋がるが、迷わず△B3きりんにすると思うので結局もう後がなくて負ける。

 

総括

f:id:sianos:20160101225902p:plain

ここでA3きりんを取る。この後の流れは要確認。

 

・ひよこをうまく使う

ひよこの使い方が中々難しい。ぞうなんかは迷ったらぞう多伝にしちゃうんだけどひよこはなかなかそうもいかない。

ぞうの効いているところに置くとか、相手ぞうの頭に置くとかとりあえずぞうと絡めていくのが良さそう。

スッキリわかるjava入門 第Ⅰ部復習

久々に手をつけるので復習にまとめる

第1章 プログラムの書き方

開発と実行の流れ

ソースコード作成→コンパイルコンパイラバイトコードに変換)→インタプリタバイトコードの実行を指示。インタプリタバイトコードJVMマシン語に変換しながらCPUを動かす

開発の流れと基本構造

ソースコードは二重構造
・読みやすいソースコードを書く
 →コメント、インテンドの活用

変数宣言の文

・「型 変数名;」で宣言
・整数(int等)、小数(double等)、真偽値(boolean)、文字(char)、文字列(String)
・変数の初期化…「変数を制限すると同時に値を代入」
・「final 型 定数名 = 初期値;」で値の書き換え防止

第2章 式と演算子

・式はオペランド(変数やリテラル)、演算子から構成
リテラル…整数、小数、真偽値、文字、文字列などの型を持つ値
演算子が評価される→周囲のオペランドを巻き込んで結果に置き換わる
演算子は優先順位と結合規則に従って評価
 ・=演算子は右から評価
 ・/演算子は整数演算では商を計算。普通に除算したい場合どちらかを小数にする

型変換

①代入時の自動型変換
 小さな型の値を大きな型に代入→代入先の変換の型に自動変換
②明示的な型変換
 キャストによる強制変換 「(変換先の型名) 式」
③演算時の自動型変換
 意味的に大きな型に統一して演算

命令の実行

・2つの値を比較して大きい方の数字を代入

int m = Math.max(①,②);

・乱数生成

int r = new java.util.Random().nextInt(①);
①は発生させる乱数の上限値(値を含まない)

・キーボードから1行の文字列の入力を受け付ける

String input = new java.util.Scanner(System.in).nextLine();

・キーボードから1つの整数の入力を受け付ける

int input = new java.util.Scanner(System.in).nextInt();

3章 条件分岐と繰り返し

制御構文

・順次、分岐、繰り返しを組み合わせればどんなプログラムも作成可能
  順次…単純に次の文を実行
  分岐…条件によって違う文を実行
  繰り返し…条件が満たされるまで同じ文を繰り返す
・分岐と繰り返しは「条件式」と「ブロック」から構成
  条件式…分岐条件や繰り返しを続ける条件を示した式。
  ブロック…分岐や繰り返しで実行する一連の文の集まり。ブロック内で宣言した変数はそのブロックが終わると同時に消滅
・条件式の評価結果はtrueまたはfalse
・文字列を比較するときは==でなくequals

文字列型の変数.equals(比較相手の文字列)

・制御構文は入れ子(ネスト)できる

分岐

・if文またはswitch文を使用して分岐
  switch文…①一致を比較する式②比較する値が整数、文字列、文字の場合if文から書き換え可能(p.117)。break文で抜けられる
・if文は「ifのみの構文」「if-else構文」「if-else if-else構文」の3種類

繰り返し

・while文、do-while文またはfor文を使用して繰り返し
  while文…ブロックを実行する前に条件式評価。最低0回実行
  do-while文…ブロックを実行した後に条件式評価。最低1回実行
  for文…ループ文を繰り返して「~回繰り返す」という場面に使用

for (int i = 0; i < 10; i++){ }
初期化処理,繰り返し条件,繰り返し時処理

・break文…繰り返し自体を中断
・continue文…繰り返しの次の周回へ進む


4,5章はまとめてあるのでパス。次は6章「複数クラスを用いた開発」だー

Java入門5 メソッド

メソッドとは

用語

メソッド(method)…複数の文をまとめ、それを1つの処理として名前をつけたもの。部品の最小単位。
メソッドの定義…メソッドを作成すること
・引数(argument)…メソッドの呼び出し元から呼び出し先に渡される、もしくは受け取る値。
         数値・文字列等を指定でき、値や型、渡す引数の数は自由に決められる。
・実引数…渡す値
・仮引数…受け取る変数
・ローカル変数…メソッド内で宣言した変数。その変数が属するメソッド内だけで有効。
・戻り値[返り値]…呼びだされたメソッドから呼び出し元のメソッドへ値を返す(値を戻す)際の値。
オーバーロード[多重定義](overload)…同じ名前のメソッドを定義。シグネチャが重複しない場合のみ可能
シグネチャ(signature)…メソッド名 + 引数の個数・型・並び順
・値渡し(call by value)…値そのものが呼び出される呼び出し
・参照渡し(call by reference)…引数としてアドレスを渡すこと
コマンドライン引数(command line argument)…プログラム起動時の追加情報

メソッドの定義
public static 戻り値の型 メソッド名(引数リスト) {
 メソッドが呼び出されたときに実行される具体的な処理
}
メソッドの呼び出し
メソッド名(引数リスト)
public static void main(String[] args) {
 hello(ミズゴロウ);
 hello(ヌマクロー);
 hello(ラグラージ);
}
public static void hello(String name) {
 System.out.println(name + "、こんにちは");
}
mainメソッド以外からのメソッドの呼び出し

→mainメソッドから動き始める

引数の渡し方

何も渡さない:メソッド名()
値を1つ渡す:メソッド名(値)
値を2つ渡す:メソッド名(値, 値, …)

ローカル変数の独立性

異なるメソッドに属するローカル変数はお互いに独立

値の戻し方
public static 戻り値の型 メソッド名(引数リスト…) {
 メソッドが実行されたときに動く処理
 return 戻り値;
}

・return文でメソッド終了

メソッドを呼び出し、戻り値を受け取る
型 変数名 = メソッド名(引数リスト);
public static int add(int x, int y) {
 int ans = x + y;
 return ans;
}

public static void main(String[] args) {
 int ans = add(100, 10);
 System.out.println("100 + 10 = " + ans);
オーバーロード

仮引数の個数か型が異なる場合、同じ名前のメソッド複数定義できる。
(引数が同じで、戻り値の型だけが異なる場合は不可)

基本データ型の変数をメソッド呼び出しで渡すと

・呼び出し元の変数の内容が、呼び出し先の引数にコピー
呼び出し先で引数の内容を書き換えても、呼び出し元の変数はそのまま

配列をメソッド呼び出しで渡すと

・呼び出し元の配列のアドレスが、呼び出し先の引数にコピー
呼び出し先で配列の実体を書き換えると、呼び出し元にも影響する

コマンドライン引数
java プログラム名 引数リスト(半角スペース区切り)

・プログラム起動時に指定したコマンドライン引数が、JVMによって配列に変換され、mainメソッド起動時に渡される。


感想

・配列と拡張for文がいまいちよくわかっていない、特に後者は変数名:配列変数名の関係が分からない
メソッドは関数のような印象を受けた

Java入門4 配列

Javaの勉強はじめました

用語

・配列(array)…同一種類の複数データを並び順で格納するデータ構造
・要素(element)…配列内の変数(?)。
・添字(index)…要素ナンバー。0から始まる

配列の書き方

(1)配列変数の宣言

要素の型[] 配列変数名 
int[] weight;

(2)要素の作成と代入

weight = new int[5];

あれこれ

配列の要素数の取得
配列変数名.length 
int ave = weight.length;
配列作成と初期化の省略記法
①要素の型[] 配列変数名 = new 要素の型[]{初期値1, 初期値2, 初期値3, …};
②要素の型[] 配列変数名 = {初期値1, 初期値2, 初期値3, …};
int[] weight1 = new int[]{40, 50, 60};
int[] weight2 = {40, 50, 60};
ArrayIndexOutOfBoundsException

→存在しない要素を使おうとしたエラー

配列をforループで回す

配列を回す…最初の要素から最後の要素まで代入されている値を順番に使用すること

for(int i = 0; i < 配列変数名.length; i++)
int weight = {45, 50, 55, 60, 65};
for(int i = 0; i <weight.length; i++)
拡張for文で配列を回す

拡張for文…要素を1つずつ取り出すループを簡単に書くための文

for(要素の型 任意の変数名:配列変数名)
int weight = {45, 50, 55, 60, 65};
for (int value : weight) {
 System.out.println(value);
}
配列の仕組みをマンションにたとえてみた
int[] mansion = new int[10]

1)配列を作成
→ぬまうおマンション建設
2)int型の要素を10個持つ配列がメモリ上に作成される
→1LDKの部屋を10個作成
3)mansionに配列の先頭要素のアドレスが代入される
→mansion=101号室 となる

・プログラムからmansion[n]と指定されたら
→ぬまうおマンションのn号室に配達
1)mansionの中に入っている番地(101号室)を取り出し、配列(先頭要素)を見つける
2)見つけた配列の先頭要素(101号室)からn個後ろの要素の区画を読み書き
→郵便配達ロボは直接n号室にいく知能がないのでn号室が101号室の何個後にあるのかという判断でもって郵便を配達する

GarbageCollection

Javaは賢いのでメモリ上のゴミを自動的に片付けてくれる

null

(1)int[]型などの参照型変数に代入すると変数は何も参照しなくなる
→配列はGC行き
(2)int型などの基本型変数には代入不可能

length,length()

length…配列の要素数取得
length()…文字列の長さ取得

多次元配列

2次元配列の宣言
要素の型[] 配列変数名 = new 要素の型[行数][列数]
2次元配列の要素の利用
配列変数名[行の添字][列の添字]
int[][] degree = new int[2][2];
scores[0][0] = 0;
scores[0][1] = 5;
scores[1][0] = 10;
scores[1][1] = 15;

フィリップ・K・ディック『パーマー・エルドリッチの三つの聖痕』書評

 

 

 救済というものは存在する。しかし―― だれもが救済されるとはかぎらない。

 

 フィリップ・K・ディックの作品にしては珍しく主人公に惹かれた作品。

 

 主人公の一人、バーニイ・メイヤスンは巨大企業P・P・レイアウト社の流行先取り課で昇進を狙う予知能力者(プレコグ)。この世界の予知能力者は完全な未来予知が出来るわけではなく、未来に起こりうる可能性をいくつか予測することができ、その確率がなんとなく分かる…という程度である。バーニイ・メイヤスンはその中でも超一流の予知能力者であり、この分野では第一人者と言われている。彼はこの地位を大切に思っており、「なによりも大切な自分の地位」などと考えたりしている。

 このように能力も高く、社会的地位も高い彼をなぜ好ましく感じているかというと、間違った選択をしてしまう主人公だからだ。バーニイは物語が始まる前に離婚しているのだが、そのことを物語の間中延々と後悔している。さらに物語の途中でうっかり雇い主を見殺しにしそうになり、あれだけ執着していた地位がふいになってしまう。抜けているというわけではなく、彼なりに考えたり予知をした結果、行動が裏目に出てしまうのだ。

 私はバーニイのその不完全さが好きだ。彼は失ったものへの執着や、罪の意識を強烈に抱えている。しかしそれを背負ったままなんとか生きようとしたり、過去に戻ろうとしたり、死のうとしたりと迷いながら道を歩む姿はとても美しいものだと思う。彼が罪を償おうと思うシーンも印象深い。私は彼がやったことに対して、それは償うべき罪だなんて考えていなかったので、彼のその考えは尊いなあと思ったことをよく覚えている。

 また、この作品はドラッグが人に与える霊的体験についても描かれている。バーニイはキリスト教を「歴史のある信仰対象」、ドラッグを「新しい信仰対象」と扱っており、この言葉に惹かれる人なら、きっと面白く読めることだろう。不完全な主人公バーニイと、ドラッグが人に与えるもの・その悪性について、興味がある人におすすめしたい一冊だ。