史上最牛的JS,不是高手勿留言



<html>
<head>
<script>
</script>
</head>
<body>
條件A:<INPUT type="text" name="a" size="5">
條件B:<INPUT type="text" name="b" size="5">
<br>
<br>
<button onclick="func()">開始並計算</button>
<br>
<br>
結果:<INPUT type="text" name="c">
</body>
</html>

寫一個函數func(),能完成以下要求:
要求:1、點擊“開始並計算”按鈕在“結果”文本框中生成一個隨機的四位數字,其中數字不能重復,范圍0~9皆可。如:0357、5690、1234。
      2、心里想一個四位數字,與“結果”文本框返回的數字做對比,找出數字和位置都正確的總數填入條件A(人工填入),數字正確但位置不正確的總數填入條件B(人工填入)。如:“結果” 文本框返回的數字為“1234”,我心里的數字為“5213”,則條件A應該填入1,條件B應該填入2。
      3、填入條件后點擊“開始並計算”按鈕,通過算法重新得到結果,並寫入“結果文本框”。
      4、重復填入條件A、B並點擊“開始並計算”按鈕,直到“結果”文本框的內容和心里想的那個四位數字完全一樣。
      5、點擊按鈕超過11次(不包括11次),該程序便宣告失敗,反之,則成功並獲得CSDN得分。

如不能理解請,可參見百度:“文曲星猜數字”。
最后:如果您不能設計出程序或提出思路,請勿留言,謝謝配合。

58 个解决方案

#1


看樣子,這帖子放錯板塊了,丫丫個胚的,這版壓根就沒一編程精的~

#2


飄過~   看熱鬧,我編程很不行,我還是幫你UP一下。

#3


高難問題 。。。

#4


前2期的《程序員》里面好像有出過這道題~~~

#5


標題起的太爛了~~
第一:這題又不是js才能算的;第二:這不牛。

#6


找蓋子用VB給你做一個吧。。。
錯了,VB。NET
Joke

#7


上學時,在一個VB學習資料的書里好像見過。不算很難,當時做出來,現在忘了





#8


就沖你說的話,會也不告訴你(別用激將法啊,我不吃這一套)





#9


該回復於2007-12-18 16:30:26被版主刪除

#10


做出來了,程序沒成老虎機了,憑運氣猜數游戲~~樓主描述肯定有錯~~~

<html>
<head>
<script>
</script>
</head>
<body>
條件A:<INPUT type="text" name="a" size="5">
條件B:<INPUT type="text" name="b" size="5">
<br>
<br>
<button onclick="func()">開始並計算</button>
<br>
<br>
結果:<INPUT type="text" name="c">
</body>
</html>
<script>
window.times=0;
function func(){
    if(document.all.a.value=="4")alert("游戲結束了!你獲得了勝利!");return;
    if(window.times>11)alert("游戲結束了!");return;
    document.all.c.value=createRandomNumber();
    window.times++;
}
function createRandomNumber(){
    var arr=[0,1,2,3,4,5,6,7,8,9];
    var result=[];
    while(arr.length>6){
        var rnd=parseInt(arr.length*Math.random());
        var num=arr[rnd];
        arr.splice(rnd,1);
        result.push(num);
    }
    return result.join("");
}
</script>

#11



俺沒本事,俺也不是高手,但是,這個小問題俺能解決,可是,俺不告訴你。






#12


說清楚點,偶就是耍你hztgcl1986,針對你hztgcl1986,所以請你別回了,OK?

#13








#14


he_8134,只有星星伴明月,你的程序運行不出來。。。

#15


庸俗
膚淺

#16


該回復於2007-12-18 16:30:54被版主刪除

#17



<html>
<head>
<script>
</script>
</head>
<body>
條件A:<INPUT type="text" name="a" size="5" />
條件B:<INPUT type="text" name="b" size="5" />
<br>
<br>
<button onclick="func()">開始並計算</button>
<br>
<br>
結果:<INPUT type="text" name="c" />
</body>
</html>
<script>
window.times=0;
function func(){
    if(document.all.a.value=="4"){
        alert("游戲結束了!你獲得了勝利!");
        return;
    };
    if(window.times>11){
        alert("游戲結束了!");
        return;
    }
    document.all.c.value=createRandomNumber();
    window.times++;
}
function createRandomNumber(){
    var arr=[0,1,2,3,4,5,6,7,8,9];
    var result=[];
    while(arr.length>6){
        var rnd=parseInt(arr.length*Math.random());
        var num=arr[rnd];
        arr.splice(rnd,1);
        result.push(num);
    }
    return result.join("");
}
</script>

#18


樓主,對不起,我錯了。向你道歉。





#19


樓主TMD是想找罵吧, 比我的ID還ID...

#20


樓主是外星人 鑒定完畢

#21


我想起來了~~~
那道題是電腦根據人的提示猜出人心里想的數~~~樓主沒講清楚啊~哎~~~

#22


又一個無聊的人

#23


沒事找抽貼.就是會也不鳥你.

#24


樓主的題目很難,能不能用C或C++寫?

#25


樓主可不可以用C/C++寫啊?

#26


JK 刪除挑釁/罵人回復 兩條。
請版友說話注意分寸。

#27


菜鳥 飄過~~   確實很牛(流氓)

#28


呵呵. 自認為不是高手,所以就不寫了.

#29



對的數量(包含位置正確的):<input id="a" />
<br />
並且位置正確的:<input id="b" />
<br />
輸入:<input id="c" onchange="check(this, 'a', 'b')" />
<hr />
<input type="button" onClick="WQX.init()" value="生成" />
<script type="text/ecmascript">
var WQX = {

num : ""

, chnum : 0

, chmax : 8

, init : function () {
//生成數
var a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], n = [], i = 4;

while (i -- > 0)
n.push(
a.splice(
Math.floor(Math.random() * a.length), 1
)
);

this.num = n.join("");
this.chnum = 0;
}

, getP : function (a) {
//獲取位置正確個數
return (a[0] == this.num.charAt(0) ? 1 : 0)
+ (a[1] == this.num.charAt(1) ? 1 : 0)
+ (a[2] == this.num.charAt(2) ? 1 : 0)
+ (a[3] == this.num.charAt(3) ? 1 : 0);
}

, getN : function (a) {
//獲取數值正確個數
return (this.num.match(new RegExp(a.join("|"), "ig")) || []).length; //加i為了以后修改方便,不過這里就不做特殊字符處理了。。。
}

, test : function (str) {
//驗證正確性
return /^(?!.*(\d).*\1)\d{4}$/.test(str);
}

};

var $ = function () {
return document.getElementById(arguments[0]);
};

var check = function (o, a, b) {
var ary, num = 0;

if (WQX.chnum < WQX.chmax) {
if (WQX.test(o.value)) {
ary = o.value.split(""), num = WQX.getP(ary)

if (num < 4) {
$(a).value = WQX.getN(ary), $(b).value = num;
} else {
$(a).value = "", $(b).value = "";
alert("貌似OK了。。");
}
} else {
alert("貌似你輸入的東西不合法");
window.setTimeout(function () {
o.focus();
o.select();
}, 1);
}
} else {
alert("次數以滿,再接再厲。");
}
};

/*
百度艘文曲星猜數字...

和LZ描述貌似有一定的差別... - -

http://zhidao.baidu.com/question/28587075.html

從0~9中隨楊所取4個數組成一序列(不重復),用戶有8次機會來猜 
返回?A?B 
A:數字對,位置也對;B:數字對,位置不對 
隱藏條件:要求用戶輸入4個不同的數據
*/
</script>

#30


- -
我暈...我領個工資,財務算錯帳了....理論了半天...回完一看...多了這么多回復...

一會還要繼續算帳去....哭了...

#31


ary = o.value.split(""), num = WQX.getP(ary);
WQX.chnum ++;
忘記加了...

徹底閃了...

#32


樓主描述的過程和文曲星猜數字剛好相反,而且要比后者難很多。


11次機會我覺得不太可能找出用戶心中所想的數字,因為這里面的排列組合太多。

#33


現在變懶了。

#34


JS 是什么東東

#35


呵呵,樓主要反省,再深奧的技術肯下功夫的人都將它變得容易!

嘩眾取寵是不對的心態,多看點書吧。

#36


/*
* 程序描述:
* 常見的小游戲【猜數字】的智能解法:
* 猜數字游戲:即有四位十進制數字,一般可猜8次
* 每次返回aAbB(A表示數字正確並且位置正確,B表示數字正確但位置不正確)
* 如:假設要猜的數字是1234,如果游戲者猜0134即返回2A1B(3、4為A,1為B)
*
* 算法:每次選取熵最大的數字進行猜測,即:貪心算法
*       編譯環境:VC6
*/

#include <vector>
#include <list>
#include <string>
#include <iostream>
#include <algorithm>
#include <ctime>
#include <strstream>
#include <cmath>

using namespace std;

class GuessNum
{
public:
GuessNum();
void Guess(void);
void PrintStack(void);
private:
bool ConfirmAB(string first, string second, string ab);
bool GuessNext(void);
int GetABValue(string first, string second);

const static int m_base[5];

string m_lastGuess;
list<string> m_setAll;
list<string> m_setCurr;
vector<string> m_stack;
int m_times;
};

const int GuessNum::m_base[5] = {0, 5, 9, 12, 14};

int main(int argc, char *argv[])
{
GuessNum gn;
cout << "GuessNum object created..." << endl;
gn.Guess();
return 0;
}

GuessNum::GuessNum()
{
m_times = 0;

//產生m_setAll
unsigned int num=123;
char a[10];
while (num < 10000)
{
bool valid = true; //表示數字沒有重復
sprintf(a, "%04u", num);
for (int i=0; i<4; i++)
{
for (int j=i+1; j<4; j++)
if (a[i]==a[j]) valid = false;
}
if (valid) m_setAll.push_back(a);
num++;
}//#while(num)
}//#GuessNum()

void GuessNum::Guess(void)
{
//重置數據集
m_setCurr.clear();
list<string>::iterator itCopy = m_setAll.begin();
while(itCopy != m_setAll.end())
m_setCurr.push_back(*itCopy++);
m_stack.clear();
m_times = 0;

//隨機產生第一次猜測
srand((unsigned)time(NULL)); //隨機數種子
bool valid = false;
unsigned int iCode;
while (!valid)
{
iCode = rand();
while (iCode > 9999) iCode /= 10;
char a[10];
sprintf(a, "%04u", iCode);
valid = true;
for (int i=0; i<4; i++)
for (int j=i+1; j<4; j++)
if (a[i] == a[j]) valid = false;
if (valid) m_lastGuess = a;
}
while (!GuessNext());

}//#Guess()

bool GuessNum::GuessNext(void)
{
m_times++;
//進行猜測,獲取猜測結果
string result;
cout << "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n";
PrintStack();
cout << "第 " << m_times << " 次猜測: " << m_lastGuess << endl;
cout << "請輸入結果[?A?B]:";
bool valid = false;
while (!valid)
{
cin >> result;
//判斷輸入是否合法
if (result.length() == 4 &&
result[0] >= '0' && result[0] <= '4' &&
result[2] >= '0' && result[2] <= '4' &&
(result[0] + result[2]) <= ('0' + '4') &&
toupper(result[1]) == 'A' && toupper(result[3]) == 'B')
{
valid = true;
}
if (!valid) cout << "輸入不合法,請重新輸入:";
}//#while
//將結果入棧
strstream strm;
strm << "第 " << m_times << "次: " << m_lastGuess << " -> " << result << endl;
string strTemp;
getline(strm, strTemp);
m_stack.push_back(strTemp);
if (result[0] != '4')
{
//尚未猜對, 進行數據集的約簡
list<string>::iterator itRemove;
itRemove = m_setCurr.begin();
while (itRemove != m_setCurr.end())
{
if (!ConfirmAB(m_lastGuess, *itRemove, result))
itRemove = m_setCurr.erase(itRemove);
else
itRemove++;
}

//@@
if (m_setCurr.size() == 0)
{
cerr << "你檢查一下,肯定是哪一步輸入錯誤!" << endl;
cerr << "程序結束" << endl;
exit(1);
}else if (m_setCurr.size() == 1)
{
m_lastGuess = m_setCurr.front();
return false;
}

//@@
cout << "m_setAll.size() = " << m_setAll.size() << endl;
cout << "m_setCurr.size() = " << m_setCurr.size() << endl;

//產生下一個猜測數據
double eMax = 0; //max entropy, 最大信息量
string strMax; //提供最大信息量的那個數串
list<string>::iterator itEn = m_setCurr.begin();
//計算用每一個數來做區分時的信息量,取提供最大信息量的那個
double eCurr = 0;
int abList[15]; //從0a0b到4a0b共15種情況
memset(abList, 0, 15 * sizeof(int)/sizeof(char));
while (itEn != m_setCurr.end())
{
list<string>::iterator itTemp = m_setCurr.begin();
while (itTemp != m_setCurr.end())
{
abList[GetABValue(*itEn, *itTemp)]++;
itTemp++;
}
//統計熵

//@@
// cout << "sigh.." << *itEn << endl;

double eTemp = 0;
double eDiv = 0;
for (int i=0; i<15; i++)
{
if (abList[i] != 0) //避免0*log0
{
eDiv = double(abList[i]) / double(m_setCurr.size());
eTemp += -eDiv * log(eDiv);
}
}
if (eTemp > eMax)
{
cout << "here eMax = " << eMax << endl;
eMax = eTemp;
strMax = *itEn;
}
itEn++;
}//#while(itEn)
m_lastGuess = strMax;
return false;
}//#if(result[0] != 4)
else// result[0] == 4
{
cout << "\n答案是: " << m_lastGuess << endl;
cout << "一共用了 " << m_times << "次" << endl;
PrintStack();
return true;
}
}//#GuessNext()

void GuessNum::PrintStack(void)
{
for (int i=0; i<m_stack.size(); i++)
cout << m_stack[i] << endl;
}//#PrintStack()

inline bool GuessNum::ConfirmAB(string first, string second, string ab)
{
int a = 0, b = 0;
for (int i=0; i<4; i++)
{
for (int j=0; j<4; j++)
if (first[i] == second[j])
if (i==j) a++;
else b++;
}
if (ab[0] == char(a+'0') && ab[2] == char(b+'0'))
return true;
else
return false;
}//#ConfirmAB()

inline int GuessNum::GetABValue(string first, string second)
{
int a = 0;
int b = 0;
for (int i=0; i<4; i++)
{
for (int j=0; j<4; j++)
if (first[i] == second[j])
if (i==j) a++;
else b++;
}
return m_base[a] + b;
}//#GetABValue()

#37


做人要低調

#38


留名。。。

#39


up

#40


如果一次出了多個正確的數字,該如何填寫如A、B框?按什么規則?

#41


文曲星上面的猜數游戲嘛,以前寫過

#42




<html>
<head>
<script language='javascript'>
<!--
var n;
var t = 0;
function resetGame()
{
n = '';

var _s = ['0','1','2','3','4','5','6','7','8','9'];

for(var i=0; i<4; i++)
{
_r = Math.floor(Math.random()*_s.length);
_n = _s[_r];
n += _n;

_h = _s.toString();
_h = _h.replace(/,/gi, '');
_h = _h.replace(_n, '');
_s = _h.split('');
}

document.getElementById('d').value = n;
document.getElementById('t').value = t;

document.getElementById('g').disabled = '';
}

function gamble()
{
t ++;
document.getElementById('t').value = t;

var a = 0;
var b = 0;

var _u = document.getElementById('u').value.split('');
var _d = n.split('');
for (var i=0; i<4; i++)
{
if (n.indexOf(_u[i]) != -1)
{
b++;
if (_u[i] == _d[i]){ a++; b--; }
}

}

if (a == 4) alert('win!');

document.getElementById('a').value = a;
document.getElementById('b').value = b;

if (t == 10)
{
document.getElementById('g').disabled = 'disabled';
}
}
-->
</script>
</head>
<body>
<input id='t' type='text' size='2' value='' readonly>
<br>
<input id='a' type='text' size='2' value='' readonly>
<br>
<input id='b' type='text' size='2' value='' readonly>
<br>
<input id='d' type='text' size='18' value='' readonly>
<br>
<input id='u' type='text' size='18' value=''>
<br>
<input id='r' type='button' value='reset' onclick='javascript:resetGame();'>
<input id='g' type='button' value='gamble' onclick='javascript:gamble();' disabled>
</body>
</html>




#43


忘記說明了
t是嘗試的次數
a是完全匹配
b是位置錯誤但是字匹配
d是生成的隨機數
u是你自己去輸入的

簡陋了點,將就看吧

#44


回程序帖的我都看了,測試了,可以說完全不符合要求,可能是你們沒看清我提的要求,我不是要做一個猜數字游戲,相反,我的要求是做一個 破解猜數字的程序,回帖里只有32樓的yegaofei理解了我的意思,雖然你沒有給出程序。最后,感謝大家的發言,並對我開始的激將行為由衷的 道歉,希望大家能 繼續給我解答~

#45


鑒於你知錯就改的態度,我支持一下.....厄..半下吧,完畢!

#46


看見個飛碟飛過.消失了.

#47


36樓的c++代碼 我編譯通過 而且管用

#48


不知道符不符合樓主題意!


<html>
<head>
<script>
var _a = [];//位置正確的數字
var _b = [];//正確的數字
var _c = [];//錯誤的數字
var _d = [];//上次出現的數字
var totle = 0;//猜測次數

Array.prototype.index = function(o){
var tl = this.length;
if(tl<1) return -1;
for(var i=0;i<tl;i++){
if(this[i]==o) return i;
}
return -1;
}

Array.prototype.insertto = function(p,s){
if(this[p]==null || this[p]==undefined){
this[p] = s;
}else{
var tmpstr = this[p];
this[p] = s;
this.insert(tmpstr);
}
}

Array.prototype.insert = function(s){
var inserted = false;
for(var i=0;i<this.length;i++){
if(this[i]==null || this[i]==undefined){
this[i] = s;
inserted = true;
return;
}
}
if(!inserted) this.push(s);
}

function func(){
++totle;
if(totle>12){
alert("mission unsuccessful!");
return;
}
var oa = document.getElementsByName("a")[0];
var ob = document.getElementsByName("b")[0];
var oc = document.getElementsByName("c")[0];
var oav = oa.value;
var obv = ob.value;

function changepos(arr){
for(var i2=0;i2<arr.length;i2++){
for(var i3=1;i3<arr.length;i3++){
var tmpa = _b[arr[i2]];
var tmpb = _b[arr[i3]];
_b.splice(arr[i2],1);
_b.splice(arr[i2],0,tmpb);
_b.splice(arr[i3],1);
_b.splice(arr[i3],0,tmpa);
}
}
}

function setvalue(arr,vstr,foo){
for(var i=0;i<vstr.length;i++){
var tmpstr = vstr.substr(i,1);
if(arr.index(tmpstr)==-1) foo(arr,tmpstr);
}
}
setvalue(_a,oav,function(a,b){a[_d.index(b)]=b;if(a.join("").length==4) alert("you want:"+a+"\n run times:"+totle);return;});
setvalue(_b,oav,function(a,b){a.insertto(_d.index(b),b)});
setvalue(_b,obv,function(a,b){a.insert(b)});

function getvalue(){
var _t = [];
if(_b.length!=4){
for(var i=0;i<4;i++){
var tmpstr = parseInt(Math.random()*10);
(_t.index(tmpstr)==-1 && _b.index(tmpstr)==-1)?_t.push(tmpstr):--i;
}
}else{
var _e = [];
for(var i=0;i<4;i++){
if(_a[i]==null){
_e.push(i);
}
}
if(_e.length>2){
changepos(_e);
}else{
if(_e.length==2){
changepos(_e);
}
alert("you want:"+_b+"\n run times:"+totle);
}
_t = _b.slice(0);
}
return _t.slice(0);
}

_d = getvalue();
//_c = _b.slice(0).concat(_d.slice(0));//超時
//_c = _c.concat(_d.slice(0));//超時
oc.value = _d;
oa.value = "";
ob.value = "";
}
</script>
</head>
<body>
條件A:<INPUT type="text" name="a" size="5">
條件B:<INPUT type="text" name="b" size="5">
<br>
<br>
<button onclick="func()">開始並計算</button>
<br>
<br>
結果:<INPUT type="text" name="c">
</body>
</html>

#49


"找出數字和位置都正確的總數填入條件A(人工填入),數字正確但位置不正確的總數填入條件B(人工填入)。如:“結果”   文本框返回的數字為“1234”,我心里的數字為“5213”,則條件A應該填入1,條件B應該填入2。"

樓主這句描述的矛盾了吧?
我的例子是:
條件A填入數字和位置都正確的總數;
條件B填入數字正確但位置不正確的總數。

#50


可能我理解錯了,郁悶~~`````

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



史上最牛砍價 史上最牛的演講 史上最牛的IDC公司! 史上最牛的獲獎致辭 史上最牛的員工激勵 史上最牛SQL注入 史上最牛X的程序 史上最牛婚禮集合 開篇:史上最牛的表白! QQ上最牛的離線留言消息
 
粤ICP备14056181号  © 2014-2021 ITdaan.com