【Nodejs】“快算24”扑克牌游戏算法 1.01
考虑到1.00版本需要改源码变更四个数字,这版修改了一下变成控制台输入了。
先把两个数四则运算得到结果想清楚就是C2代码,三个数就是C3,四个数就是C4.简单的代码简单,却是复杂的基础;复杂的脱胎于简单,但还有自己的特性。
新代码如下:
//======================================================
// 算24 C4 1.01
// 增加控制台输入,避免改源码了
// 2018年4月18日
//======================================================
var micro=0.000001 // 定义一个极小量,运算结果绝对值小于它就算相等
//======================================================
// C2类,用于判断两个数通过加减乘除运算能否得到某个结果
// C代表Caculate,2代表两个操作数
// op1:操作数1,op2:操作数2,result,结果
//======================================================
function C2(op1,op2,result){
var obj=new Object();
obj.op1=op1;
obj.op2=op2;
obj.result=result;
obj.findComputationMethods=function(){
var arr=[];
if(Math.abs(result-(op1+op2))<micro){
arr.push(op1+"+"+op2); // op1+op2
}
if(Math.abs(result-op1*op2)<micro){
arr.push(op1+"*"+op2); // op1*op2
}
if(Math.abs(result-(op1-op2))<micro){
arr.push(op1+"-"+op2); // op1-op2
}
if(Math.abs(result-(op2-op1))<micro){
arr.push(op2+"-"+op1); // op2-op1
}
if(Math.abs(result-op1/op2)<micro){
arr.push(op1+"/"+op2); // op1/op2
}
if(Math.abs(result-op2/op1)<micro){
arr.push(op2+"/"+op1); // op2/op1
}
return arr;
}
return obj;
}
//======================================================
// C3类,用于判断三个数通过加减乘除运算能否得到某个结果
// C代表Caculate,3代表两个操作数
// op1:操作数1,op2:操作数2,op3:操作数3,result,结果
//======================================================
function C3(op1,op2,op3,result){
var obj=new Object();
obj.op1=op1;
obj.op2=op2;
obj.op3=op3;
obj.result=result;
obj.findComputationMethods=function(){
var retArr=[];// 返回数组
var permutationArr=[ [this.op1,this.op2,this.op3],
[this.op1,this.op3,this.op2],
[this.op2,this.op1,this.op3],
[this.op2,this.op3,this.op1],
[this.op3,this.op2,this.op1],
[this.op3,this.op1,this.op2], ]; // 排列数组,三个操作数共有6种排列方式
for(var i=0;i<permutationArr.length;i++){
var arr=permutationArr[i];
var op1=arr[0];
var op2=arr[1];
var op3=arr[2];
var c2=new C2(op1,op2,this.result+op3);
var methods=c2.findComputationMethods();
if(methods.length>0){
for(var j=0;j<methods.length;j++){
retArr.push('('+methods[j]+")"+"-"+op3);// [op1,op2]-op3
}
}
c2=new C2(op1,op2,this.result*op3);
methods=c2.findComputationMethods();
if(methods.length>0){
for(var j=0;j<methods.length;j++){
retArr.push('('+methods[j]+")"+"/"+op3);// [op1,op2]/op3
}
}
c2=new C2(op1,op2,this.result-op3);
methods=c2.findComputationMethods();
if(methods.length>0){
for(var j=0;j<methods.length;j++){
retArr.push('('+methods[j]+")"+"+"+op3);// [op1,op2]+op3
}
}
c2=new C2(op1,op2,op3-this.result);
methods=c2.findComputationMethods();
if(methods.length>0){
for(var j=0;j<methods.length;j++){
retArr.push(op3+"-"+'('+methods[j]+")");// op3-[op1,op2]
}
}
c2=new C2(op1,op2,this.result/op3);
methods=c2.findComputationMethods();
if(methods.length>0){
for(var j=0;j<methods.length;j++){
retArr.push('('+methods[j]+")"+"*"+op3);// [op1,op2]*op3
}
}
c2=new C2(op1,op2,op3/this.result);
methods=c2.findComputationMethods();
if(methods.length>0){
for(var j=0;j<methods.length;j++){
retArr.push(op3+"/"+'('+methods[j]+")");// op3/[op1,op2]
}
}
}
return retArr;
};
return obj;
}
//======================================================
// C4类,用于判断三个数通过加减乘除运算能否得到某个结果
// C代表Caculate,4代表两个操作数
// op1:操作数1,op2:操作数2,op3:操作数3,op4:操作数4,result,结果
//======================================================
function C4(op1,op2,op3,op4,result){
var obj=new Object();
obj.op1=op1;
obj.op2=op2;
obj.op3=op3;
obj.op4=op4;
obj.result=result;
obj.findComputationMethods=function(){
var retArr=[];// 返回数组
var permutationArr=[ [this.op1,this.op2,this.op3,this.op4],
[this.op1,this.op2,this.op4,this.op3],
[this.op1,this.op3,this.op2,this.op4],
[this.op1,this.op3,this.op4,this.op2],
[this.op1,this.op4,this.op2,this.op3],
[this.op1,this.op4,this.op3,this.op2],
[this.op2,this.op1,this.op3,this.op4],
[this.op2,this.op1,this.op4,this.op3],
[this.op2,this.op3,this.op1,this.op4],
[this.op2,this.op3,this.op4,this.op1],
[this.op2,this.op4,this.op1,this.op3],
[this.op2,this.op4,this.op3,this.op1],
[this.op3,this.op1,this.op2,this.op4],
[this.op3,this.op1,this.op4,this.op2],
[this.op3,this.op2,this.op1,this.op4],
[this.op3,this.op2,this.op4,this.op1],
[this.op3,this.op4,this.op1,this.op2],
[this.op3,this.op4,this.op2,this.op1],
[this.op4,this.op1,this.op2,this.op3],
[this.op4,this.op1,this.op3,this.op2],
[this.op4,this.op2,this.op1,this.op3],
[this.op4,this.op2,this.op3,this.op1],
[this.op4,this.op3,this.op1,this.op2],
[this.op4,this.op3,this.op2,this.op1],
]; // 排列数组,四个操作数共有24种排列方式
for(var i=0;i<permutationArr.length;i++){
var arr=permutationArr[i];
var op1=arr[0];
var op2=arr[1];
var op3=arr[2];
var op4=arr[3];
var c3=new C3(op1,op2,op3,this.result+op4);
var methods=c3.findComputationMethods();
if(methods.length>0){
for(var j=0;j<methods.length;j++){
retArr.push('('+methods[j]+")"+"-"+op4);// [op1,op2,op3]-op4
}
}
var c3=new C3(op1,op2,op3,this.result*op4);
var methods=c3.findComputationMethods();
if(methods.length>0){
for(var j=0;j<methods.length;j++){
retArr.push('('+methods[j]+")"+"/"+op4);// [op1,op2,op3]/op4
}
}
var c3=new C3(op1,op2,op3,this.result-op4);
var methods=c3.findComputationMethods();
if(methods.length>0){
for(var j=0;j<methods.length;j++){
retArr.push('('+methods[j]+")"+"+"+op4);// [op1,op2,op3]+op4
}
}
var c3=new C3(op1,op2,op3,op4-this.result);
var methods=c3.findComputationMethods();
if(methods.length>0){
for(var j=0;j<methods.length;j++){
retArr.push(op4+"-"+'('+methods[j]+")");// op4-[op1,op2,op3]
}
}
var c3=new C3(op1,op2,op3,this.result/op4);
var methods=c3.findComputationMethods();
if(methods.length>0){
for(var j=0;j<methods.length;j++){
retArr.push('('+methods[j]+")"+"*"+op4);// [op1,op2,op3]*op4
}
}
var c3=new C3(op1,op2,op3,op4/this.result);
var methods=c3.findComputationMethods();
if(methods.length>0){
for(var j=0;j<methods.length;j++){
retArr.push(op4+"/"+'('+methods[j]+")");// op4/[op1,op2,op3]
}
}
if(op1*op2-op3*op4==result){
retArr.push(op1+"*"+op2+"-"+op3+"*"+op4);// op1*op2-op3*op4,这是c3里不曾有的
}
if(op1*op2+op3*op4==result){
retArr.push(op1+"*"+op2+"+"+op3+"*"+op4);// op1*op2+op3*op4,这是c3里不曾有的
}
if(op1/op2-op3/op4==result){
retArr.push(op1+"/"+op2+"-"+op3+"/"+op4);// op1/op2-op3/op4,这是c3里不曾有的
}
if(op1/op2+op3/op4==result){
retArr.push(op1+"/"+op2+"+"+op3+"/"+op4);// op1/op2+op3/op4,这是c3里不曾有的
}
if(op1*op2-op3/op4==result){
retArr.push(op1+"*"+op2+"-"+op3+"/"+op4);// op1*op2-op3/op4,这是c3里不曾有的
}
if(op1*op2+op3/op4==result){
retArr.push(op1+"*"+op2+"+"+op3+"/"+op4);// op1*op2+op3/op4,这是c3里不曾有的
}
}
return retArr;
}
return obj;
}
//======================================================
// 用来得到仅包含不重复元素的数组
//======================================================
function getDistinctArray(arr){
var returnArr=new Array();
var sortedArr=arr.sort();
for(var i=0;i<sortedArr.length;i++){
if(returnArr[returnArr.length-1]!=sortedArr[i]){
returnArr.push(sortedArr[i]);
}
}
return returnArr;
}
//======================================================
// 程序入口
//======================================================
function main(){
/*var c4=new C4(6,7,10,10,24);
var arr=getDistinctArray(c4.findComputationMethods());
for(var i=0;i<arr.length;i++){
console.log(arr[i]+"=24");
} */
process.stdin.resume();
process.stdout.write("\033[33m 请输入四个数字,用逗号分隔: \033[39m");// 草黄色
process.stdin.setEncoding('utf8');
process.stdin.on('data',function(text){
var input=text.trim();
process.stdin.end();// 退出输入状态
var arrTemp=input.split(",");
var op1=parseInt(arrTemp[0],10);
var op2=parseInt(arrTemp[1],10);
var op3=parseInt(arrTemp[2],10);
var op4=parseInt(arrTemp[3],10);
var c4=new C4(op1,op2,op3,op4,24);
var arr=getDistinctArray(c4.findComputationMethods());
if(arr.length>0){
for(var i=0;i<arr.length;i++){
console.log(arr[i]+"=24");
}
}else{
console.log(input+"这四个数无法计算得到24");
}
});
}
// 开始
main();
控制台输出示例如下:
C:\Users\horn1\Desktop\node.js\54-算24c41.01>node c24.js 请输入四个数字,用逗号分隔: 4,8,13,2 ((13*8)/4)-2=24 ((13/4)*8)-2=24 ((8*13)/4)-2=24 ((8/4)*13)-2=24 (13/(4/8))-2=24 (8/(4/13))-2=24 13*2-8/4=24 2*13-8/4=24 C:\Users\horn1\Desktop\node.js\54-算24c41.01>node c24.js 请输入四个数字,用逗号分隔: 2,7,5,11 ((11*2)+7)-5=24 ((11*2)-5)+7=24 ((11*5)-7)/2=24 ((2*11)+7)-5=24 ((2*11)-5)+7=24 ((5*11)-7)/2=24 ((7-5)*11)+2=24 2-((5-7)*11)=24 7-(5-(11*2))=24 7-(5-(2*11))=24 C:\Users\horn1\Desktop\node.js\54-算24c41.01>node c24.js 请输入四个数字,用逗号分隔: 13,11,1,3 13,11,1,3这四个数无法计算得到24 C:\Users\horn1\Desktop\node.js\54-算24c41.01>node c24.js 请输入四个数字,用逗号分隔: 8,11,1,3 ((11*3)-1)-8=24 ((11*3)-8)-1=24 ((3*11)-1)-8=24 ((3*11)-8)-1=24
【Nodejs】“快算24”扑克牌游戏算法 1.01的更多相关文章
- 【Nodejs】“快算24”扑克牌游戏算法
算24是一款扑克牌游戏,它的游戏方式是把四张牌的牌面数值通过四则运算得到结果24,四张牌必须仅用一次.这是一种挺好的锻炼孩子算数能力的扑克牌游戏. 各地玩法还有点差别,有的只算1-10,其它抽出来:有 ...
- 【Nodejs】“快算24”扑克牌游戏算法 1.02
快算24是一种挺好的锻炼孩子算数能力的扑克牌游戏,它的游戏方式是把四张牌的牌面数值通过有限四则运算得到结果24,四张牌必须仅用一次.各地玩法还有点差别,有的只算1-10,其它抽出来:有的地方把整幅牌都 ...
- php实现 24点游戏算法
php实现 24点游戏算法 一.总结 一句话总结:把多元运算转化为两元运算,先从四个数中取出两个数进行运算,然后把运算结果和第三个数进行运算,再把结果与第四个数进行运算.在求表达式的过程中,最难处理的 ...
- POJ 3983:快算24
快算24 Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 4791 Accepted: 2930 Description ...
- 快算24点,POJ(3983)
题目链接:http://poj.org/problem?id=3983 中文题,就不解释题意了. 类似之前的一篇博客,这里也不上解释了,直接上代码吧. #include <iostream> ...
- POJ3983 快算24
很正常的题目,迷一样的答案. 测试数据只有一组,对没错只有一组. #include<cstdio> int main() { printf("5*(5-(1/5))\n" ...
- python实现算24的算法
1.介绍 给定4个整数,数字范围在1-13之间,任意使用 + - * / ( ) ,构造出一个表达式,使得最终结果为24,这就是常见的算24的游戏.本文介绍用Python语言实现的两种方式.2.实现思 ...
- 用python代替人脑运算24点游戏
前言 文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者:老方玩编程 PS:如有需要Python学习资料的小伙伴可以加点击下方链 ...
- python实例:解决经典扑克牌游戏 -- 四张牌凑24点 (二)
Hey! 如果你还没有看这篇的上文的话,可以去稍稍瞅一眼,会帮助加速理解这一篇里面涉及到的递归结构哦!(上一篇点这里:<python实例:解决经典扑克牌游戏 -- 四张牌凑24点 (一)> ...
随机推荐
- UOJ.87.mx的仙人掌(圆方树 虚树)(未AC)
题目链接 本代码10分(感觉速度还行..). 建圆方树,预处理一些东西.对询问建虚树. 对于虚树上的圆点直接做:对于方点特判,枚举其所有儿子,如果子节点不在该方点代表的环中,跳到那个点并更新其val, ...
- [CF183D]T-shirt
[CF183D]T-shirt 题目大意: 有\(n(n\le3000)\)个人和\(m(m\le300)\)种T恤,每个人都有一种喜欢的T恤,你知道每个人喜欢每种T恤的概率\(p_{i,j}\). ...
- CF961E Tufurama【主席树】
CF961E Tufurama 题意翻译 题目描述 有一天Polycarp决定重看他最喜爱的电视剧<Tufurama>.当他搜索“在线全高清免费观看Tufurama第3季第7集”却只得到第 ...
- 【洛谷】2144:[FJOI2007]轮状病毒【高精度】【数学推导??(找规律)】
P2144 [FJOI2007]轮状病毒 题目描述 轮状病毒有很多变种.许多轮状病毒都是由一个轮状基产生.一个n轮状基由圆环上n个不同的基原子和圆心的一个核原子构成.2个原子之间的边表示这2个原子之间 ...
- bzoj 3473 后缀自动机多字符串的子串处理方法
后缀自动机处理多字符串字串相关问题. 首先,和后缀数组一样,用分割符连接各字符串,然后建一个后缀自动机. 我们定义一个节点代表的字符串为它原本代表的所有串去除包含分割符后的串.每个节点代表的字符串的数 ...
- 离线下载Xcode的文档
https://developer.apple.com/library/downloads/docset-index.dvtdownloadableindex 找到里面的文档下载地址 例如iOS 8. ...
- C#高级编程9-第7章 运算符和类型强制转换
运算符和类型强制转换 1.运算符 运算符的简化操作 条件运算符: if-else的简化操作,也称三元运算符.如果条件为真,返回一个值,为假返回另外一个值. condition?true_value:f ...
- Linux下的两个经典宏定义 转
http://www.linuxidc.com/Linux/2016-08/134481.htm http://www.linuxidc.com/Linux/2013-01/78003.htm htt ...
- Openfire 服务器更换ip后的恢复方法
如果你的服务器名称和mysql的地址都是使用的静态ip地址配置的,更改ip后,openfire就会开启失败,这种情况下请看下面的解决方法. 比如你的ip地址由 192.168.0.111 改为192. ...
- jQuery插件——可以动态改动颜色的jQueryColor
1.请选择代码框中所有代码后, 保存为 jquery.color.js /*! * jQuery Color Animations v@VERSION * https://github.com/jqu ...