アプリ版:「スタンプのみでお礼する」機能のリリースについて

テニスのダブルス組み合わせ用のスクリプトを考えております。

ネットでいろいろ
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件)

たとえば、


組み合わせ ( http://iruka.la.coocan.jp/cgi-bin/members.cgi )
な感じかな??
    • good
    • 0
この回答へのお礼

これはすごいです(*゜▽゜)ノ

名前まで登録できたり
CSV出力までできるなんて・・・

まさに希望どおりになっております♪

お礼日時:2009/04/07 10:25

 サーバーサイドでjavascriptも可能ですが、そうなるとHTMLを書き出すことになる--文字を複雑に扱うことになるので、圧倒的にPerlが便利です。


 このプログラムの処理過程で、他のプログラムに使えそうなアルゴリズムがあるので、それらをサブルーチン化して置くと良いですね。
 トーナメントの組み合わせとか・・、机の座り方とか、部屋割りとか
 ちょっと考えて見ます。
    • good
    • 0
この回答へのお礼

やはり、サーバーサイドならPerlのほうが柔軟性ありますしね(^-^)

>トーナメントの組み合わせとか・・、机の座り方とか、部屋割りとか
>ちょっと考えて見ます。
すみません、お力お借りしたいです(;^_^A

お礼日時:2009/03/25 10:01

面白そう。


メンバーを配列に入れて、その数から乱数を発生して一人除く、残った配列から同じ事を繰り返せばできますね。
$picup = splice(@noOrderdMembers,int (rand( $num )),1);
本体は数行ですむけど、それを使えるようにするには、ちょっと手を加えないと。
なお、これだけじゃ面白くないので、色々応用が利く物にしないとダメだな・・・
    • good
    • 0
この回答へのお礼

ありがとうございます♪

ここ数日、JSとPerlのリファレンスを見比べながら
同じように書いてみようと思ったのですが
全然うまくいかなくて、参りました(;^_^A

たとえば、このJSをなんとかサーバーサイドで動くように
できないものでしょうか?

お礼日時:2009/03/24 19:52

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!