読者です 読者をやめる 読者になる 読者になる

プログラムdeタマゴ

nodamushiの著作物は、文章、画像、プログラムにかかわらず全てUnlicenseです

おまけのおまけ:複数人数で条件分岐せずにじゃんけんできてた

ちょっと前にじゃんけんプログラムをポリモーフィズムも条件分岐も必要なしに書けるよ、という記事を書きました。ジャンケンプログラムにポリモー…?何それおいしいの?

そのおまけとして複数人数の場合どうするか、と言う記事で、引き分けの場合だけは条件分岐してましたおまけ:複数人数のじゃんけんプログラム

それに対して、知人から「JAVAよく知らないですけど、配列使って良いんだったら条件分岐しなくてもいけるんじゃない?」と以下の様なJavaScriptソースコードを送ってくれました。


function Janken(){
  var message1 = ["グー","チョキ","パー"];
  var message2 = [];
  var gcp = [9,2,4];
  var member = 3;
  var players = [];
  var gcps = [];
  var kekka = 0;
  for(var i=0; i<member; i++){
      var te = null;
      var g_c_p = null;
      te = Math.floor(Math.random()*3);//手の決定
      g_c_p = gcp[te];
      players[i] = te;
      gcps[i] = g_c_p;
      document.write("Player" + i + "は" + message1[players[i]] + "を出しました。<br>");
      kekka |= g_c_p;
  }
  kekka = kekka & (kekka>>1);
  var kekka_text; //結果をテキスト表示するための配列
  for(var i=0; i<member; i++){
      var kekka_bit = gcps[i]&kekka;
      message2[kekka_bit] = ["勝ちました。"];
      message2[0] = ["負けました。"];
      kekka_text = [];
      kekka_text[kekka] = "Player" + i + "は" + message2[kekka_bit] + "<br>";
      kekka_text[0] = "";  //引き分けの場合は文章を初期化
      kekka_text[7] = "";
      document.write(kekka_text[kekka]);
  }
  var draw = [];
  draw[kekka] = "";  //以下、引き分けの時のみ文章表示
  draw[0] = "引き分けです。";
  draw[7] = "引き分けです。";
  document.write(draw[kekka]);
}

Janken();

(不要かな、と思われる場所は削っておきました)




実に豪快だな、おい( ゚д゚)



このアルゴリズムの肝となるところは、表示する文字を負けや引き分けの場合上書きする、ということを配列を用いて条件分岐せずに行っています。

当方、この豪快な解法に結構びっくりしました。送られたソースを読んで、「おぉふ( ゚д゚)」とか言ってしまった。

無駄な処理や遅くなる処理は書かないという頭でっかちな前提条件が常に思考にある私には思いつかない芸当です。

もちろん、実行動作速度の面では私の解法が速い処理になるのですが、文字列処理速度が遅いので誤差にしかならなでしょう。



この柔軟な発想恐れ入りました。



結論:複数人数でも条件分岐は必要なかった