テニスのダブルス組み合わせ用のスクリプトを考えております。
ネットでいろいろ
Javascriptでは教えていただいたのですが、
携帯からはJS使えないことを後で知り、
Perl-CGIならいけるのでは?と。
Perlについてまったくわからないので
下記の件について、大変僭越ではありますが
移植をお願いしたいのです(;^_^A
【何をしたいのか】
・テキストボックスで任意の数字(整数)で範囲と行数を指定。
・結果は数値4個固定とし、4個で1グループ。この4個内は重複がないように。
・4個1グループを指定の行数分求める。
・このとき、なるべくならすでに出た数字は後回しにしたい。例えば1~10の範囲としたら、1~10すべて出るまでは一度出た数字は後回しになるように。
・小さい範囲で大きな行数を指定すれば、必ず同じ組み合わせが出ることは了承。
・結果は下記のようにしたい。
1,6,8,3
2,4,5,10
9,7,2,3
・
・
3,6,8,1(1行目と同じ組み合わせだが順不同なので可、またはまったく同じのが出ても可)
以下は、Javascriptで稼動するソースになります。
※後半のFORM部分からPOSTして
CGIにて受取、乱数生成したHTMLを表示させるようにしたいのです。
----------------------------------------------
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=shift_jis">
<meta http-equiv="Content-Language" content="ja">
<meta http-equiv="Content-Script-Type" content="text/javascript">
<meta http-equiv="Content-Style-Type" content="text/css">
<script type="text/javascript">
<!--
function OnceRand(min, max) {
if(isNaN(min) || isNaN(max) || parseInt(min) >= parseInt(max))
throw new Error("指定の値に誤りがあります。");
this.min = parseInt(min);
this.max = parseInt(max);
this.createArray();
}
/* 配列を作成します。 */
OnceRand.prototype.createArray = function() {
this.original = [];
for(var ix = this.min; ix <= this.max; ix++) {
this.original.push(ix);
}
this.arr = this.original.concat();
};
/* 次の値を取り出します。 */
OnceRand.prototype.next = function(length) {
var per = [];
if(0 >= length)
return per;
for(var ix = 0; ix < length; ix++) {
if(this.arr.length <= 0)
this.arr = this.original.concat();
do {
var dup = false;
var ax = Math.floor(Math.random() * this.arr.length);
for(var px = 0; px < per.length; px++) {
if(per[px] == this.arr[ax])
dup = true;
}
} while(dup)
per.push(this.arr.splice(ax, 1)[0]);
}
return per;
};
/* 乱数を生成します。 */
function genRandom() {
var minBox = document.getElementById("min");
var maxBox = document.getElementById("max");
var lineBox = document.getElementById("line");
var console = document.getElementById("console");
var consoleClone = console.cloneNode(false);
var lineMax = parseInt(lineBox.value);
var rand1 = new OnceRand(minBox.value, maxBox.value);
for(var lx = 0; lx < lineMax; lx++) {
var texts = rand1.next(4);
var textLine = document.createTextNode(texts.join(" ,"));
var breakLine = document.createElement("br");
consoleClone.appendChild(textLine);
consoleClone.appendChild(breakLine);
}
console.parentNode.replaceChild(consoleClone, console);
}
// -->
</script>
<title>範囲乱数</title>
</head>
<!--ここからはページ表示部分-->
<body>
<div>
範囲:<input type="text" id="min" value="" size=2 maxlength=2>
~<input type="text" id="max" value="" size=2 maxlength=2>
<br>
行数:<input type="text" id="line" value="" size=2 maxlength=2>
<br>
<input type="button" value="乱数発生" onclick="genRandom();">
</div>
<div id="console"></div>
</body>
</html>
-------------------------------------------------------
A 回答 (3件)
- 最新から表示
- 回答順に表示
No.3
- 回答日時:
No.2
- 回答日時:
サーバーサイドでjavascriptも可能ですが、そうなるとHTMLを書き出すことになる--文字を複雑に扱うことになるので、圧倒的にPerlが便利です。
このプログラムの処理過程で、他のプログラムに使えそうなアルゴリズムがあるので、それらをサブルーチン化して置くと良いですね。
トーナメントの組み合わせとか・・、机の座り方とか、部屋割りとか
ちょっと考えて見ます。
やはり、サーバーサイドならPerlのほうが柔軟性ありますしね(^-^)
>トーナメントの組み合わせとか・・、机の座り方とか、部屋割りとか
>ちょっと考えて見ます。
すみません、お力お借りしたいです(;^_^A
No.1
- 回答日時:
面白そう。
メンバーを配列に入れて、その数から乱数を発生して一人除く、残った配列から同じ事を繰り返せばできますね。
$picup = splice(@noOrderdMembers,int (rand( $num )),1);
本体は数行ですむけど、それを使えるようにするには、ちょっと手を加えないと。
なお、これだけじゃ面白くないので、色々応用が利く物にしないとダメだな・・・
ありがとうございます♪
ここ数日、JSとPerlのリファレンスを見比べながら
同じように書いてみようと思ったのですが
全然うまくいかなくて、参りました(;^_^A
たとえば、このJSをなんとかサーバーサイドで動くように
できないものでしょうか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- JavaScript jQueryでのドラッグアンドドロップについて 1 2022/07/07 21:04
- JavaScript ソースコードのいじる場所が分かりません。 1 2022/12/23 02:06
- JavaScript javascript作成してます。ラジオボタンで判定するコードを書いてます。 1 2023/07/18 11:03
- JavaScript 1日1回引けるJavaScriptおみくじについて 1 2022/12/12 22:28
- JavaScript javascriptのちょっとした動作不良(原因は突き止めたのですが) 1 2023/06/15 19:58
- JavaScript 以前の質問だと、どの条件でも配列が表示されてしまいます。 1 2022/07/09 11:40
- JavaScript GoogleChart 階層ごとのブロックの長さを個別に設定したい 1 2022/07/06 14:27
- JavaScript 画像の表示位置 3 2022/12/23 08:25
- JavaScript switch文のswitch(n)の部分を複数の値にするか、if文に変えてほしいです。 1 2022/07/27 17:18
- JavaScript ①入力フォーム→②確認表示画面→③送信完了画面のコードを書いているのです、 入力フォームから受け取っ 2 2022/05/10 16:45
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
JavaScriptで文字列の特定文字...
-
翌月を取得するGASが分かりません
-
C#OpenCv V4にのエラーに関する...
-
var exports = exports || {}; ...
-
GAS アンケート回答後の自動返...
-
アルファベットABCD…をスマート...
-
setTimeoutによる繰り返しが途...
-
google apps scriptの終了のさせ方
-
google map apiで下記のhtmlが...
-
googleスプレッドシートのApps ...
-
今日からnヶ月後(前)
-
ボタンを押すことでテキストエ...
-
引数なしの関数で疑問です
-
javascriptで複数キーワード検...
-
GASでGoogleフォームの自動返信...
-
なぜmatchメソッドがエラーにな...
-
ASP.NETのコントロールの値をJa...
-
javascript修正依頼
-
第3日曜日のみの日付を取得、...
-
Javascriptで指定した位置の文...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
google apps scriptの終了のさせ方
-
C#OpenCv V4にのエラーに関する...
-
メールフォームの日付入力フォ...
-
GASでundefinedエラーが出ます
-
ジェネレーターの作り方
-
GASでGoogleフォームの自動返信...
-
なぜmatchメソッドがエラーにな...
-
翌月を取得するGASが分かりません
-
ローカルにあるファイルを検索...
-
HTMLで作った時報アプリが動き...
-
ASP.NETのコントロールの値をJa...
-
C# 演算 奇数と偶数 表現の仕方
-
html javascript リンク先アド...
-
gas スプレッドシートがアクテ...
-
javascriptでテーブルに追加し...
-
VSCODE[Python]の設定について
-
JavaScriptで決まった「時刻」...
-
ASP.NET MVCでObjectをjsに渡す
-
イベントが初めの一回しか起き...
-
jqGridについて
おすすめ情報