割り算 プログラム☆(^~^)

Git Hub は、つながらなくなった。壊れた。

ここには プログラムは貼り付けられるのかだぜ☆?

試してみるか……☆

 

 

use std::fs::File;
use std::io::Write;
use std::path::Path;

use std::io;

pub fn write( s:String ){
// 書き込み先
let mut log_file = File::create(Path::new("warizan.txt")).unwrap();
print!( "{}", s );
match log_file.write_all( s.as_bytes() )
{
Err(_why) => {},
Ok(_) => {},
}
}
pub fn writeln( s:String ){
// 書き込み先
let mut log_file = File::create(Path::new("warizan.txt")).unwrap();
println!( "{}", s );
match log_file.write_all( format!("{}\n", s).as_bytes() )
{
Err(_why) => {},
Ok(_) => {},
}
}

// /**
// * 割られる数を表示
// */
// fn hyoji_vec( vec_wararerusu:&Vec<i64> ){

// write( "割られる数: ".to_string() );

// for warareru_su in vec_wararerusu.iter() {
// write( format!("{},", warareru_su ) );
// }

// writeln( "".to_string() );

// }

/**
* 循環小数判断機
*/
fn check_recurring( vec_wararerusu:&Vec<i64> )->bool{

let len = vec_wararerusu.len();
//writeln( format!("vec_wararerusu.len()={}", vec_wararerusu.len() ) );
//hyoji_vec( &vec_wararerusu );

if len < 2 {
// 0桁、1桁なら循環してないぜ☆(^~^)
return false;
}

// どの繰り返しの時点で 循環小数と考えていいのかだぜ☆(^~^)?
// 長さ1個分の循環小数から考えようぜ☆(^~^)
for nagasa in 1..1000 {
// 小数点めんどくさいので考えないぜ☆(^~^)
if len <= nagasa*2 {
break;
}

let a_start = len-2*nagasa;
let b_start = len-nagasa;
 
let mut itti : bool = true; //一致
for i_keta in 0..nagasa {
//writeln( format!("nagasa={} a={} b={} a={} b={}", nagasa, a_start+i_keta, b_start+i_keta, vec_wararerusu[a_start+i_keta], vec_wararerusu[b_start+i_keta] ) );
if vec_wararerusu[a_start+i_keta]!=vec_wararerusu[b_start+i_keta] {
itti = false;
break;
}
}

if itti {
return true;
}
}

return false;
}

fn main() {

writeln( "さあ、割り算をしようか☆(^~^)!\na÷b の a と b に入る 正の整数 を半角スペース1個で区切って入れろだぜ☆(^~^)\n例: 1 19".to_string() );

let mut line : String = String::new();
io::stdin().read_line(&mut line)
.ok()// read_lineの返り値オブジェクトResult の okメソッド
.expect("info Failed to read line");// OKで無かった場合のエラーメッセージ

// 末尾の改行を除こうぜ☆(^~^)
// trim すると空白も消えるぜ☆(^~^)
let line : String = line.trim().parse().ok().expect("info Failed to parse");
let vec: Vec<&str> = line.split(" ").collect();
writeln( format!("{}÷{}☆(^~^)!", vec[0], vec[1] ) );


let mut kekka : String = "".to_string();
let wararerusu0 : i64 = vec[0].parse().unwrap();
let warusu0 : i64 = vec[1].parse().unwrap();
writeln( format!("さあ、割り算をしようか☆(^~^)!\n{}÷{} を考えろだぜ☆(^~^)!\n", wararerusu0, warusu0 ) );

let mut vec_wararerusu : Vec<i64> = Vec::new();
let mut wararerusu : i64 = wararerusu0; // 割られる数
let warusu : i64 = warusu0; // 割る数
let mut i_keta : i64 = 0; // 桁
while i_keta < 100 {

if wararerusu == 0 {
writeln( format!("({}){} 割り切れた☆(^~^)", i_keta, kekka) );

kekka += &" 割り切り".to_string();
break;

}
 
if wararerusu < warusu {
let old_warareru_su = wararerusu;
wararerusu *= 10;
writeln( format!("({}) {}÷{} ☆(^~^)? 割れね☆(^~^) 10倍して {}÷{} を考えろだぜ☆(^~^)!", i_keta, old_warareru_su, warusu, wararerusu, warusu ) );

if i_keta==0 {
kekka += &".".to_string();
} else {
kekka += &"0".to_string();
}
i_keta += 1;

writeln( format!("{}", kekka ) );
}

if warusu <= wararerusu {
let old_warareru_su = wararerusu;
let old_waru_su = warusu;

let mut wattemiru_su = 0;
while warusu <= wararerusu {
wararerusu -= warusu;
wattemiru_su += 1;
}

// 100 の割る数で 1 割ると、 "01" をつなげる。

kekka += &wattemiru_su.to_string();
writeln( format!("({}) {}÷{}は、{}で割れたぜ☆(^~^)", i_keta, old_warareru_su, old_waru_su, wattemiru_su ) );

// 割ったら、次は割れないので10倍しておくぜ☆(^~^)
wararerusu *= 10;
i_keta += 1;

writeln( format!("{}", kekka ) );
}
 
vec_wararerusu.push(wararerusu);
 
if check_recurring( &vec_wararerusu ) {
writeln( format!("({}){} 循環小数かだぜ☆(^~^)", i_keta, kekka) );
break;
}
}

writeln( format!("{:3}/{:3}={}", wararerusu0, warusu0, kekka ) );
}

 

さて どうだぜ☆(^~^)?

 

速読コンピュータ将棋用語【記事投げつけ用】

カパックが がんばって編集している、

 

速読コンピュータ将棋用語【記事募集中】 - qhapaq’s diary

 

に 要点など掻い摘まない バッドな記事 を投げつけようぜ☆(^~^)

 

 

 

f:id:muzudho:20180414232931p:plain

 

 

 

評価値

 

電王戦でよく目にするのは、 歩1枚100点 の評価値で

こっちが+100なら 相手はー100 でその差は 200点☆

 

このとき 駒の価値は100点、 駒の交換値は200点 と言う。

 

これを センチ・ポーン(centipawn、略して cp と書かれることもある) という。

 

 

 

評価値は 大きく分けて 1つの主流と、そのたの各自自由な方法がある☆

(1)センチ・ポーン … 歩100点

(2)その他各自自由な方法

 

 

 

なんで こんな主流(強く言ってしまえば 標準)が1つ どーん とあるかと言うと、

(1)新しい人が開発に参加しやすくする

(2)他のソフトと評価値の付け方を比較できる

という オープン・コミュニティ の考え方がヨーロッパにあって、

世界の末端まで知識を行き届かせるという使命があるといった 宣教師的 な文化観が背景にある。

日本には 使命を持つといった(ある種、侵略的な)文化は 無いんで、

ほっとくと すぐ止めて 独自規格での 囲い込みを始めて 利権を使ったコミュニティを作っている間に、毎回 海賊的な(よく言えば 標準的な) 海外のPCや、Webサイトの オープン・コミュニティ群 に侵略を許してしまう。

要は オープン・コミュニティ群 より魅力的なものを独占的に 作り続け ればいいんだが、そんな使命が無い(でも利権があるからいい)んで、ある程度大きくなった頃に 利権に かすらないようにうまい具合に侵略されるんで(まるで囲碁40級の地の取られ方のようだ) そうなったら宿主を変えて、べつの細胞の一部として融合するのが日本的だぜ☆

 

日本でも 将棋所 というところが センチ・ポーン だけに統一されるように

わざわざ この規格を堅持している。使命的であるといえよう☆

 

タヌキ と 技巧 の どっちが言ってるのが正しいのか、といった

比べっこ ができるのは 将棋所 の戦略によるところが大きい☆

 

チェスから そのまんま取り入れたので

谷川浩司九段式 の歩1枚1点の タニガワ ではなく、

歩1枚の100分の1点 センチ・ポーン という名称で落ち着いている。

 

 

逆に センチ・ポーン を使わないのは、

(1) 単に 勝率 でいいんじゃないか☆

(2) 歩を18枚持ってたら1800点なのか? 線形はおかしいだろ☆

(3) 独自性アピールをするところもないんで、手を付けたことが 目に見えやすいところから変えてしまった

 

などがある☆

 

 

 

 

-------- 休憩 --------

 

ここで 2011年の Bonanza 6.0 のソースコードを手に入れてみよう☆

えっ、2015年に 新しいパッチ(修正の追加)があるって? 知らね☆

 

Bonanza - The Computer Shogi Program

 

 

client フォルダーの中の param.h ファイルをテキスト・エディターで開けだぜ☆

 

 

f:id:muzudho:20180414233554p:plain

 

 

#define DPawn     87    /* 174 */

 

と書いてるのが 歩の価値87点 歩の交換値 174点 だぜ☆

 

 

 

えっ、歩の価値は100点じゃないのかだって☆?

 歩が 100 点じゃないのが気になるなら 1.14942529 倍すれば 100 点だろ☆

画面に出すときに 調整しろだぜ☆

 

 

 

この param.h ファイルは、learn2.c ファイルのプログラムが作成したもので、駒の価値は 学習で変動する☆ 

 

f:id:muzudho:20180414234146p:plain

 

 fprintf というのが1行を書いているわけだが、 面白いのは

駒の価値も 学習で出てくるということだぜ☆(^~^)

 

 

 

歩が 87点 とか、 香が 232点 とか、もっともらしい数字が付いているが

こういうのを見ると なにかしらの 神秘 があったのかと 感じるかもしれない☆

これが どうやって 付いているかも ヒマだったら 説明する☆

 

覚えておいてほしいのは、

 

87 + 232 + 257 + 534 + 489 + 369 + 510 + 495 + 444 + 569 + 642 + 827 + 945

 

を全部足すと 6400 ということだぜ☆(^~^)

 

 

 

 

f:id:muzudho:20180414234911p:plain

学習のとき 最初からやり直すか、続きからやるかを選べるんだが、

最初の 駒の価値 はこんな風に

 

”将棋のことは何も知らない” という 保木さんが テキトー、いいかげん に入れてくれている☆(^~^)

金(gold)が500点で ”と”金(pro_pawn)が400点だったり、

成銀(pro_silver)が500点 なところが

まあ そうしたい気持ちも分かる☆(^~^)

 

 

わからないことは 機械に付けてもらえばいいんだぜ。

ところで覚えておいてほしいんだが、

 

100 + 300 + 300 + 400 + 500 + 600 + 700 + 400 + 400 + 400 + 500 + 800 + 1000

 

を全部足すと 6400 だぜ☆(^~^) 

 

 

---------- いったん休憩 ----------

 

 

もう 駒の評価値が どうやって付けられたか プログラムなんか読まなくても

想像できたかもしれないんだが、

 

f:id:muzudho:20180415004012p:plain

 

しゃか しゃか しゃか ぽん だぜ☆(^~^)

玉を除くと 駒の種類は 13 個だろ☆

 

順位の下から6つのうち 2つを -2点、 3つを -1点☆

順位の上から7つのうち 2つを +2点、 3つを +1点☆

他は 変わりなし だぜ☆(^~^)

 

何の順に並んでいるかだが、

学習に使用したのは たぶんプロの棋譜だろう、

 

(1)指した1手後の局面に出てきた駒割り

(2)合法手にはあったが指さなかった0~592手の実現しなかった局面の駒割り

 

の2つを集計して 1手 対 1手 の比率になるように (2)の方の数字を

きゅきゅーっと 割り算で調整して、 (1)引く(2) だぜ☆(^~^)

 

ヒマだったら もっと説明しよう☆(^~^)

 

 

f:id:muzudho:20180415020022p:plain

 

駒割 は まあ 分かるだろう☆(^~^)

 

 

 

f:id:muzudho:20180415015719p:plain

 

その駒割は 駒の価値 を調整するのに使われるぜ☆(^~^)

 

足してばっかり じゃあ 偏るんじゃないか、というと、偏るだろう☆

多分 同じ棋譜 を何回も読むと バカ になるはずだぜ☆(^~^)

おいしい食事は 量の バランスだぜ☆(^~^)

 

そこらへんは 学習に使った棋譜が指した手 を ボナンザが考えて指す手

にするには どれぐらい修正がいるか という差異を 微分を使って計って

たくさん反省するか、ちょっとだけの反省にするかを 倍率にして分けてるわけだぜ☆

 

 

 

 

     保木さんが適当に入れた初期値   ボナンザが修正した後の駒の価値

    ━━━━━━━━━━━━━━   ━━━━━━━━━━━━━━━

歩        100       →       87  (- 13)

香        300       →      232  (- 68)

桂        300       →      257  (- 43)

銀        400       →      369  (- 31)

金        500       →      444  (- 56)

角        600       →      569  (- 31)

飛        700       →      642  (- 58)

と金       400       →      534  (+134)

成香       400       →      489  (+ 89)

成桂       400       →      510  (+110)

成銀       500       →      495  (-  5)

馬        800       →      827  (+ 27)

竜       1000       →      945  (- 55)

 

 

成り駒の価値を がんばって 上げてて笑える☆(*^~^*)

 

 もちろん 評価値 の中には この 駒の価値 が加味されている☆

そう見えないのは 駒と駒がどこにあるか、の 三駒関係 が もっと

駒の価値 を修正してるからだぜ☆

 

 

駒の評価値の話しは 終わるぜ☆(^~^) 

 

 

 

---------- いったん休憩 ----------

 

 

f:id:muzudho:20180415021945p:plain

 

 

評価値を付けるのに だいたい ー32768 ~ 32767 の整数を使える。

 

2を16回 掛けたら 65536 だが、

このうちの半分を マイナス に、

もう半分を 0 と プラス に分けると、

-32768 ~ 32767 という非対称になるぜ☆(^~^)

 

そういえば 駒の価値の合計の 6400 って どこから来たのかだが、

32 とか 64 は コンピューターでよく出てくるから

32767に収める前提で、 適当に選んだんじゃないか☆(^~^)

 

 

 

 

9999 になると詰み、というのは 経験上そう言えるだけで

コンピューターは 10000以上の評価値も数えているし、

この数字の大きさは 詰み とは まったく関係ない☆

 

表示の上で 9999 にしているのは 昔のゲーム機の感覚があるのだろう☆

コンピューターは 詰み があるときは 評価値は使わないので、

べつに 0 にしても、 9999 にしても なんでもいい☆

 

コンピューター・チェス・ソフトの ストックフィッシュ は

詰みを見つけたら 評価値の30000ぐらいのところより大きい数字を使って

詰み手数 を表示するために使ったりする。

 

おおざっぱに言って

 

駒の価値(盤上、持ち駒) + 駒がどの升にあるかの価値

 

が 王道な 局面評価値 で、

駒割りと 駒配置が 大幅に有利なときに 数十手先まで読みを入れ、

たまたま 詰んでる ことに気づくのが 詰め だぜ☆ 

 

 

---------- いったん休憩 ----------

 

Bonanza6.0 では 玉 の価値は 15000点 に固定している。

 

お互い 玉は1枚持っているので 差し引き 0 だが、

これが1枚取られるということは 一挙に 30000点の差が付くということで、

おだぶつ だぜ☆

 

もちろん 将棋には 1手指して 38枚の駒が入ってくるようなケースはないので

 こんなに評価値が動くケースもない☆

38手連続で駒が取れる77手先の局面でもあれば別だが

38枚の駒を取るより先に メートが見つかるだろう 問題ない☆

 

 

 

3万点あれば、どれぐらいの 盤面の差を ひっくりかえせるだろうか☆

筆算してみよう。

 

と金 534点×18枚 = 9612点

成香 489点× 4枚 = 1956点

成桂 510点× 4枚 = 2040点

成銀 495点× 4枚 = 1980点

金  444点× 4枚 = 1776点

馬  827点× 2枚 = 1654点

竜  945点× 2枚 = 1890点

             ━━━━━━

金や成り駒38枚の価値  20908点

(その交換値       41816点)

 

実際は ここに 駒配置 の点も加わるが、30000点で ひっくり返るだろう☆

 

 

逆に 自分が 20000点も有利だったら 問題があるかもしれない☆

 

何が問題になるかというと、数値の範囲を超えることだぜ☆

例えば +40000点 になったら 数値の範囲 32767 を超えているので

40000-32767=7233、

マイナスの最小は ー32768 なので、ここから 7233 増えて

一周回って 40000点のことを -25535点 と勘違いしてしまう。

コンピューターは 勝てる手は選ばないような感じで、おかしくなってしまう。

 

 

---------- いったん休憩 ----------

 

コンピューター・ソフトは 最善手 しか指さない、と思われているが

神の1手しか指さないソフトがあったら 逆に 研究されてしまう。

 

思考時間 に ランダム性 を入れるとか、

 

PV(principal variation、つまり変化のなかで1番 有力なやつ)を

なんか 指が麻痺して指せなくなったということにして、

 PV 無しのなかで 次のPV を探すPV、これが つまり マルチPV で、

マルチPV を 5 にして その中から ランダムに1手選ぶ とかして

 

指し手に変化が付くようにして、いつも同じ手を返すような 真似を止めさせている☆

 

 

早く決断してしまって 最善手とは限らないかもしれなかったり、

マルチPVの 次善手~5次善手 を選んでいることもありえる。

 

 

 

100点なら微差、500点で少しの差、1000点で優勢、2000点で勝勢

とよく言われるが、

もちろん コンピューターが言う ランダム性込みの最善手 を続けた場合の

点数であって、

20手だか 30手だかを 指し続けた先に それぐらい差が広がっている局面が

あるというだけだぜ☆

 

コンピューターが勝勢という局面から負けることも

マチュアなら可能だろう☆(^~^)

自分の強さから見た勝勢とは限らない☆(^~^)

 

 

 

 

---------- いったん休憩 ----------

 

 

 

評価値は必ずしも Bonanza 風とは限らない☆(^~^)

 

指し手の評価値、

局面評価値、

勝率

 

だぜ☆(^~^)

 

例えば Bonanza風は 指し手の評価値 で、

この局面では どの手を指すか、に付けた評価値だぜ☆(^~^)

プロ棋士とか、誰かが指しそうな手を真似するのは このタイプ☆(^~^)

どの手を選ぶか 決めることができれば いいだけなんで、

比較対象として選ばれた局面の中で 指したい局面には一番高い点数が、

そうでない局面は低い点が入っているだけなんで、

大小だけに意味があり、点自体に意味はない☆(^~^)

 

 

局面評価値 というのは 駒の配置や 持ち駒 で付けた点だぜ☆(^~^)

例えば 20手読んだ先の局面についている点数を 評価値とする☆

ストックフィッシュのような 局面探索の量自慢のソフトには相性がいい☆(^~^)

Apery も やねうら王 も これだろう☆(^~^)

 

 

 勝率 というのは、この局面から勝った率だぜ☆(^~^)

局面評価値より 趣旨が はっきりしているし、

50%なら 0点、 100%なら 9999点 と対応付ければ 評価値にもなる☆(^~^)

それこそ 勝率80%なら 2000にする、とか 数字の調整は可能だろう☆

だが そうすると、数字は調整をすれば どうとでもなるものなので、

評価値は 視聴者向けの飾り ぐらいの意味になる☆(^~^)

 

 

 

 

//いったん保存

 

 

ぜんぜん まとまらね☆ (^~^)

【ダウンロード】SFEN文字列の初期局面を、画像ログにする .bat

↓こういった文字列

 

position sfen Snkg3nl/2s1r4/1pp1+N3p/2+r6/LP2PPBp1/P1PlG1P1P/4S1NP1/K+p7/3+b4L b G4Pgsp 1 moves 

 

から、↓こういった .png 画像 を出力するバッチの配布なんだぜ☆

 

f:id:muzudho:20150405234818p:plain

 

ダウンロードページへ、ゴーなんだぜ☆!

http://grayscale.iza-yoi.net/download_portal.html#2015_04

 

ダウンロード案内

ニコニコ動画主催 第2回将棋電王トーナメント 24位の将棋エンジン

『きふわらべ』は、プログラム無料で公開している☆

 

  サークル ぐれーすけーる 『きふわらべ』ダウンロード

 

 

 

v(^▽^)vうぇーい☆ww 練習させてくれー☆ww

大見出しって何なんだぜ~☆ww

中見出しって何なんだぜ~☆wwww

小見出しって何なんだぜ~☆wwww

標準って何なんだぜ~☆wwwwww

 

  • 箇条
  • 書き

箇条書きからどうやって戻るんだぜ☆ww おっ☆ もう1回

箇条書きボタンを押すのか☆ww

 

  1. ばんっ
  2. ごうっ

だって打てるんだぜ~☆wwwwww

 

まあ あともだいたい 使えるだろう☆ww