【JavaScript】计算24点
华为算法题1:
/**
* 计算24点是一种扑克牌益智游戏,随机抽出4张扑克牌,通过加(+),减(-),乘(*), 除(/)四种运算法则计算得到整数24,本问题中,扑克牌通过如下字符或者字符串表示,其中,小写joker表示小王,大写JOKER表示大王:
* 3 4 5 6 7 8 9 10 J Q K A 2 joker JOKER
* 本程序要求实现:输入4张牌,输出一个算式,算式的结果为24点。
* 详细说明:
* 1.运算只考虑加减乘除运算,没有阶乘等特殊运算符号,友情提醒,整数除法要当心;
* 2.牌面2~10对应的权值为2~10, J、Q、K、A权值分别为为11、12、13、1;
* 3.输入4张牌为字符串形式,以一个空格隔开,首尾无空格;如果输入的4张牌中包含大小王,则输出字符串“ERROR”,表示无法运算;
* 4.输出的算式格式为4张牌通过+-*\/四个运算符相连,中间无空格,4张牌出现顺序任意,只要结果正确;
* 5.输出算式的运算顺序从左至右,不包含括号,如1+2+3*4的结果为24
* 6.如果存在多种算式都能计算得出24,只需输出一种即可,如果无法得出24,则输出“NONE”表示无解。
*/
let arr = [];
+function(){Array.prototype.remove = function(val) {let index = this.indexOf(val);if(index > -1) {this.splice(index, 1);}}// 输入四张牌let n1 = '4 2 K A';let list = n1.split(' ');// 四张牌转换数字list = trans(list);// 做4次拆解,每次将最后一位数字放到第一位d('', list);for(let i=0; i< list.length-1; i++) {d('', turn(list));}if(arr.length == 0) {print('NONE');}else {print(arr[0]);}
}();function trans(list) {// 转化牌面 转为数字return list.map(val => {if(val == 'J') {return 11;}else if(val == 'Q') {return 12;}else if(val == 'K') {return 13;}else if(val == 'A') {return 1;}else {return Number(val);}});
}// 将数组最后一位数字放到第一位
function turn(list) {list.unshift(list[list.length-1]);list.splice(-1);return list;
}// 计算
function d(str, list_) {let can = false;// 浅拷贝数组let list = [...list_];// 锁住数组第一个参数let a = list[0];// 其余数字做新数组遍历list.remove(a);if(list.length > 2) {// 当数组超过2个,做递归d(`${str} ${a}`, list);for(let i=0; i< list.length-1; i++) {d(`${str} ${a}`, turn(list));}}else {// 当数组减少到只剩2个数字,开始排列// 将之前截取的数字拼起来let l1 = `${str} ${a}`.trim().split(' ');let l2 = [...l1];// 排列1l1.push(list[0]);l1.push(list[1]);can = y1(l1);if(!can) {// 排列2l2.push(list[1]);l2.push(list[0]);can = y1(l2);}}return can;
}function y1(list) {// 四张牌运算// 运算法则let soul = ['+', '-', '*', '/'];let a = list[0];let b = list[1];let c = list[2];let d = list[3];let can = false;// 锁住第一个数字位置for(let i=0; i< 4 && !can; i++) {// 锁住第二个数字位置for(let j=0; j< 4 && !can; j++) {// 锁住第三个数字位置for(let k=0; k< 4 && !can; k++) {// 穷举处理括号let s = `${a}${soul[i]}${b}${soul[j]}${c}${soul[k]}${d}`;let s1 = '', s2 = '', s3 = '';if(i == 0 || i == 1) {if(j ==0 || j == 1) {if(k == 0 || k == 1) {}else {s1 = `(${a}${soul[i]}${b}${soul[j]}${c})${soul[k]}${d}`;}}else {if(k == 0 || k == 1) {s1 = `(${a}${soul[i]}${b})${soul[j]}${c}${soul[k]}${d}`;s2 = `(${a}${soul[i]}${b})${soul[j]}(${c}${soul[k]}${d})`;s3 = `${a}${soul[i]}${b}${soul[j]}(${c}${soul[k]}${d})`;}else {s1 = `(${a}${soul[i]}${b})${soul[j]}${c}${soul[k]}${d}`;}}}else {if(j ==0 || j == 1) {if(k == 0 || k == 1) {s1 = `${a}${soul[i]}(${b}${soul[j]}${c})${soul[k]}${d}`;s2 = `${a}${soul[i]}(${b}${soul[j]}${c}${soul[k]}${d})`;}else {s1 = `(${a}${soul[i]}${b}${soul[j]}${c})${soul[k]}${d}`;s2 = `${a}${soul[i]}(${b}${soul[j]}${c}${soul[k]}${d})`;s3 = `${a}${soul[i]}(${b}${soul[j]}${c})${soul[k]}${d}`;}}else {if(k == 0 || k == 1) {s1 = `${a}${soul[i]}${b}${soul[j]}(${c}${soul[k]}${d})`;}}}// 计算总和let sum = eval(s);let sum1 = s1 != ''? eval(s1) : 0;let sum2 = s2 != ''? eval(s2) : 0;let sum3 = s3 != ''? eval(s3) : 0;if(sum == 24) {// print(s);arr.push(s);can = true;}if(sum1 == 24) {// print(s1);arr.push(s1);can = true;}if(sum2 == 24) {// print(s2);arr.push(s2);can = true;}if(sum3 == 24) {// print(s3);arr.push(s3);can = true;}}}}return can;
}function print(msg) {console.log(msg)
}
使用穷举法,因为边工作边写的,还有细节待完善,Joker这些还没写,准备做一个24点小游戏的Electron
【JavaScript】计算24点相关推荐
- c#和javascript分别轻松实现计算24点
24点游戏介绍:给出4个1-9之间的整数(ms我当年玩的时候是用扑克牌),其中每个数字必须且只用一次:任意使用+-*/ ( ),构造出一个表达式,使得最终结果为24,这就是常见的算24点的游戏(我的老 ...
- JS、javascript计算两个时间差
其实,javascript计算时间差的方式非常简单,如果是默认的Date()类型,直接相减就是相差的毫秒数. Date型 var d1 = new Date('2016/03/28 10:17:22' ...
- javaScript 计算两个日期的天数相差~~~
一:计算两个日期相差的天数 比如: str1 = "2002-01-20" str2 = "2002-10-11" 怎样用javaScr ...
- html 表格自动计算,HTML表格中的JavaScript计算
我是 JavaScript的新手,所以我甚至不知道这是否是尝试这个的正确语言,但我想我会尝试.我已经阅读了其他几篇文章,我找不到真正让我知道如何做到这一点的东西,所以我在这里问.我读过的所有例子都涉及 ...
- 24点游戏java_使用java编写计算24点游戏程序
初学java,编写了一个计算24点的程序,时间有限,有些粗糙,不过可以使用. //-------------Cal24.java--------------- //计算24点程序 //作者:徒步天下( ...
- 计算机公式求时间差公式,24时间差计算公式 excel中计算24小时
excel中计算24小时制时间差 怎样在excel中计算24小时制时间差,在一天之内的小编会,不过不在一天之内外套一个MOD函数,就行了,这样试试 =MOD("0:36"-&quo ...
- 1224 红魔馆的纸牌游戏 (计算24点,dfs)
Description 红魔馆的蕾米莉亚大小姐一天发现人类有一种叫做24点的游戏,于是就带着一副不知哪里弄来的扑克牌到图书馆找帕秋莉玩 24点游戏的规则:从一副牌中随机抽取4张牌,牌的点数为1到13之 ...
- 阿里云云计算 24 SLB的概念
阿里云云计算 24 SLB的概念 参考 https://edu.aliyun.com/lesson_547_21891#_21891
- ArcGIS API for JavaScript 3.24 文字标注的添加和带背景的文字添加
说明:本人是一个gis小白,由于网上的资料过于专业,当时学习的时候经常看不懂,于是写了一些简单的关于ArcGIS Api for javaScript分享,若该分享中出现错误,希望大家指出,若能帮助到 ...
最新文章
- R语言一键批量完成差异统计和可视化
- 【文本分类】基于BERT预训练模型的灾害推文分类方法、基于BERT和RNN的新闻文本分类对比
- django中自定义标签和过滤器
- mysql延迟判断模板
- algid parse error, not a sequence错误
- 【阿里云域名】我都有服务器了,为什么还要购买域名?
- 【软件工程】数据流图初探
- linux 自动安装mysql数据库_Linux安装MySql数据库
- 小公司出身的我,是如何拿下知名独角兽公司 Offer?
- Vue-watch侦听器和计算属性
- 机房重构(4)——触发器的使用
- WP中Document的层次设计
- 微课有关计算机应用基础,【计算机仿真论文】微课在计算机应用基础课的应用(共3802字)...
- 如何使用IntelliJ IDEA中自带的mvn命令
- 计算机软件设计费计算标准,水利工程咨询、勘测设计费收费标准及计算程序
- vue扫码跳转页面_VUE 网页 扫码登录(微信)
- 零信任嵌入式安全沙箱技术,企业应用软件的技术底座
- Gromacs 的第一步_能量最小化
- 我哋嘅水墨动剐曾让宫祈骏、糕填勋睇木殳咗2019年6月25日 星期二
- 微信H5页面源码如何看