我正在编写一个程序来评估 4 张扑克牌(数字 1-13)的整数值,并显示一个等于 24 的解决方案。我为此编写了一个很大的 if 语句并意识到解决方案太多了,无法全部添加。我正在寻找有关如何将其压缩为更优化版本的建议。代码运行良好,没有错误,这是我的全部代码:
import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;
import javafx.scene.image.Image;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.HBox;
import javafx.scene.layout.VBox;
import javafx.scene.layout.Pane;
import javafx.stage.Stage;
import javafx.scene.image.ImageView;
import java.util.ArrayList;
import java.util.Collections;
import java.util.LinkedList;
import java.util.concurrent.atomic.AtomicReference;
import java.util.*;
public class Main extends Application {
private Card card1;
private Card card2;
private Card card3;
private Card card4;
private int a;
private int b;
private int c;
private int d;
private int e=0;
private int f=0;
boolean par=false;
@Override
public void start(Stage primaryStage) {
ArrayList<Integer> deck;
deck = new ArrayList<>();
int i = 1;
while(i < 52){
deck.add(i);
i++;
}
final AtomicReference<String> result = new AtomicReference<>("");
Collections.shuffle(deck);
BorderPane pane = new BorderPane();
HBox top = new HBox(10);
Label display = new Label(result.toString());
Button btShuffle = new Button("Shuffle");
Button fiSolution = new Button("Find Solution");
TextField solfield = new TextField();
VBox bottomBox = new VBox();
top.getChildren().add(fiSolution);
top.getChildren().add(solfield);
top.getChildren().add(btShuffle);
HBox center = new HBox(10);
card1 = new Card(deck.get(0));
center.getChildren().add(card1);
card2 = new Card(deck.get(1));
center.getChildren().add(card2);
card3 = new Card(deck.get(3));
center.getChildren().add(card3);
card4 = new Card(deck.get(4));
center.getChildren().add(card4);
//String str1 = solfield.setText();
fiSolution.setOnAction(
(ActionEvent e) -> {
a = card1.CardValue();
b = card2.CardValue();
c = card3.CardValue();
d = card4.CardValue();
if (a+b+c+d == 24)
solfield.setText(a+"+"+b+"+"+c+"+"+d);
else if (a+b+c-d == 24)
solfield.setText(a+"+"+b+"+"+c+"-"+d);
else if (a-b+c+d == 24)
solfield.setText(a+"+-"+b+"+"+c+"+"+d);
else if (a+b-c+d == 24)
solfield.setText(a+"+"+b+"-"+c+"+"+d);
else if ((((a+b)-c)*d)==24)
solfield.setText(a+"+"+b+"-"+c+"*"+d);
else if ((((a+b)-c)/d)==24)
solfield.setText(a+"+"+b+"-"+c+"/"+d);
else if ((((a+b)/c)-d)==24)
solfield.setText(a+"+"+b+"/"+c+"-"+d);
else if ((((a+b)/c)*d)==24)
solfield.setText(a+"+"+b+"/"+c+"*"+d);
else if ((((a+b)*c)/d)==24)
solfield.setText(a+"+"+b+"*"+c+"/"+d);
else if ((((a+b)*c)-d)==24)
solfield.setText(a+"+"+b+"*"+c+"-"+d);
else if ((((a-b)+c)*d)==24)
solfield.setText(a+"-"+b+"+"+c+"*"+d);
else if ((((a-b)+c)/d)==24)
solfield.setText(a+"-"+b+"+"+c+"/"+d);
else if ((((a-b)/c)+d)==24)
solfield.setText(a+"-"+b+"/"+c+"+"+d);
else if ((((a-b)/c)*d)==24)
solfield.setText(a+"-"+b+"/"+c+"*"+d);
else if ((((a-b)*c)/d)==24)
solfield.setText(a+"-"+b+"*"+c+"/"+d);
else if ((((a-b)*c)+d)==24)
solfield.setText(a+"-"+b+"*"+c+"+"+d);
else if ((((a*b)+c)/d)==24)
solfield.setText(a+"*"+b+"+"+c+"/"+d);
else if ((((a*b)+c)-d)==24)
solfield.setText(a+"*"+b+"+"+c+"-"+d);
else if ((((a*b)-c)/d)==24)
solfield.setText(a+"*"+b+"-"+c+"/"+d);
else if ((((a*b)-c)+d)==24)
solfield.setText(a+"*"+b+"-"+c+"+"+d);
else if ((((a*b)/c)+d)==24)
solfield.setText(a+"*"+b+"/"+c+"+"+d);
else if ((((a*b)/c)-d)==24)
solfield.setText(a+"*"+b+"/"+c+"-"+d);
else if ((((a/b)+c)*d)==24)
solfield.setText(a+"/"+b+"+"+c+"*"+d);
else if ((((a/b)+c)-d)==24)
solfield.setText(a+"/"+b+"+"+c+"-"+d);
else if ((((a/b)-c)+d)==24)
solfield.setText(a+"/"+b+"-"+c+"+"+d);
else if ((((a/b)-c)*d)==24)
solfield.setText(a+"/"+b+"-"+c+"*"+d);
else if ((((a/b)*c)-d)==24)
solfield.setText(a+"/"+b+"*"+c+"-"+d);
else if ((((a/b)*c)+d)==24)
solfield.setText(a+"/"+b+"*"+c+"+"+d);
f=c+d;
if (((a/b)*f)==24)
solfield.setText(a+"/"+b+"*("+c+"+"+d+")");
else if (((a/b)-f)==24)
solfield.setText(a+"/"+b+"-("+c+"+"+d+")");
else if (((a*b)-f)==24)
solfield.setText(a+"*"+b+"-("+c+"+"+d+")");
else if (((a*b)/f)==24)
solfield.setText(a+"*"+b+"/("+c+"+"+d+")");
else if (((a-b)*f)==24)
solfield.setText(a+"-"+b+"*("+c+"+"+d+")");
else if (((a-b)/f)==24)
solfield.setText(a+"-"+b+"/("+c+"+"+d+")");
f=c-d;
if (((a/b)*f)==24)
solfield.setText(a+"/"+b+"*("+c+"-"+d+")");
else if (((a/b)+f)==24)
solfield.setText(a+"/"+b+"+("+c+"-"+d+")");
else if (((a*b)+f)==24)
solfield.setText(a+"*"+b+"+("+c+"-"+d+")");
else if (((a*b)/f)==24)
solfield.setText(a+"*"+b+"/("+c+"-"+d+")");
else if (((a+b)*f)==24)
solfield.setText(a+"+"+b+"*("+c+"-"+d+")");
else if (((a+b)/f)==24)
solfield.setText(a+"+"+b+"/("+c+"-"+d+")");
f=c*d;
if (((a/b)-f)==24)
solfield.setText(a+"/"+b+"*("+c+"*"+d+")");
else if (((a/b)+f)==24)
solfield.setText(a+"/"+b+"+("+c+"*"+d+")");
else if (((a-b)+f)==24)
solfield.setText(a+"-"+b+"+("+c+"*"+d+")");
else if (((a-b)/f)==24)
solfield.setText(a+"-"+b+"/("+c+"*"+d+")");
else if (((a+b)-f)==24)
solfield.setText(a+"+"+b+"-("+c+"*"+d+")");
else if (((a+b)/f)==24)
solfield.setText(a+"+"+b+"/("+c+"*"+d+")");
f=c/d;
if (((a-b)*f)==24)
solfield.setText(a+"-"+b+"*("+c+"/"+d+")");
else if (((a-b)+f)==24)
solfield.setText(a+"-"+b+"+("+c+"/"+d+")");
else if (((a*b)+f)==24)
solfield.setText(a+"*"+b+"+("+c+"/"+d+")");
else if (((a*b)-f)==24)
solfield.setText(a+"*"+b+"-("+c+"/"+d+")");
else if (((a+b)*f)==24)
solfield.setText(a+"+"+b+"*("+c+"/"+d+")");
else if (((a+b)-f)==24)
solfield.setText(a+"+"+b+"-("+c+"/"+d+")");
f=b*c;
if (((a-f)/d)==24)
solfield.setText(a+"-("+b+"*"+c+")/"+d);
else if (((a-f)+d)==24)
solfield.setText(a+"-("+b+"*"+c+")+"+d);
else if (((a/f)+d)==24)
solfield.setText(a+"/("+b+"*"+c+")+"+d);
else if (((a/f)-d)==24)
solfield.setText(a+"/("+b+"*"+c+")-"+d);
else if (((a+f)/d)==24)
solfield.setText(a+"+("+b+"*"+c+")/"+d);
else if (((a+f)-d)==24)
solfield.setText(a+"+("+b+"*"+c+")-"+d);
f=b-c;
if (((a*f)/d)==24)
solfield.setText(a+"*("+b+"-"+c+")/"+d);
else if (((a*f)+d)==24)
solfield.setText(a+"*("+b+"-"+c+")+"+d);
else if (((a/f)+d)==24)
solfield.setText(a+"/("+b+"-"+c+")+"+d);
else if (((a/f)*d)==24)
solfield.setText(a+"/("+b+"-"+c+")*"+d);
f=b/c;
if (((a-f)*d)==24)
solfield.setText(a+"-("+b+"/"+c+")*"+d);
else if (((a-f)+d)==24)
solfield.setText(a+"-("+b+"/"+c+")+"+d);
else if (((a*f)+d)==24)
solfield.setText(a+"*("+b+"/"+c+")+"+d);
else if (((a*f)-d)==24)
solfield.setText(a+"*("+b+"/"+c+")-"+d);
else if (((a+f)*d)==24)
solfield.setText(a+"+("+b+"/"+c+")*"+d);
else if (((a+f)-d)==24)
solfield.setText(a+"+("+b+"/"+c+")-"+d);
f=b+c;
if (((a*f)/d)==24)
solfield.setText(a+"*("+b+"+"+c+")/"+d);
else if (((a*f)-d)==24)
solfield.setText(a+"*("+b+"+"+c+")-"+d);
else if (((a/f)-d)==24)
solfield.setText(a+"/("+b+"+"+c+")-"+d);
else if (((a/f)*d)==24)
solfield.setText(a+"/("+b+"+"+c+")*"+d);
});
btShuffle.setOnAction(
e -> {
center.getChildren().clear();
Collections.shuffle(deck);
card1 = new Card(deck.get(0));
card2 = new Card(deck.get(1));
card3 = new Card(deck.get(2));
card4 = new Card(deck.get(3));
center.getChildren().add(card1);
center.getChildren().add(card2);
center.getChildren().add(card3);
center.getChildren().add(card4);
});
HBox bottom = new HBox(10);
Label expression = new Label("Please Enter the expression: ");
TextField tfExpress = new TextField();
String str = tfExpress.getText();
Button btVerify = new Button("Verify");
bottom.getChildren().add(expression);
bottom.getChildren().add(tfExpress);
bottom.getChildren().add(btVerify);
bottomBox.getChildren().add(bottom);
bottomBox.getChildren().add(display);
btVerify.setOnAction(
(ActionEvent e) ->
{
String regex = ("[^0-9]+");
String[] inputIntegers = tfExpress.getText().split(regex);
// expInput.removeIf(p-> p.equals(signs));
ArrayList<Integer> temp = new ArrayList<>();
temp.add(new Integer(card1.CardValue()));
temp.add(new Integer(card2.CardValue()));
temp.add(new Integer(card3.CardValue()));
temp.add(new Integer(card4.CardValue()));
if(inputIntegers.length != 0)
{
if (inputIntegers.length != 0) {
for (String s : inputIntegers) {
if (!s.equals(""))
temp.remove(new Integer(Integer.valueOf(s)));
}
}
}
if(temp.isEmpty())
{
if(evaluateExpression(tfExpress.getText()) == 24){
display.setText("Correct");
}
else
display.setText("Incorrect");
}
else
display.setText("The numbers in the expression don't "
+ "match the numbers in the set.");
});
pane.setTop(top);
pane.setCenter(center);
pane.setBottom(bottomBox);
Scene scene = new Scene(pane);
primaryStage.setTitle("24 card game");
primaryStage.setScene(scene);
primaryStage.show();
}
public boolean Twentyfour(boolean par){
//some people play the game with or without parentheses.
this.par=par;
return par;
}
/** Evaluate an expression */
public static int evaluateExpression(String expression) {
// Create operandStack to store operands
Stack<Integer> operandStack = new Stack<Integer>();
// Create operatorStack to store operators
Stack<Character> operatorStack = new Stack<Character>();
// Insert blanks around (, ), +, -, /, and *
expression = insertBlanks(expression);
// Extract operands and operators
String[] tokens = expression.split(" ");
// Phase 1: Scan tokens
for (String token: tokens) {
if (token.length() == 0) // Blank space
continue; // Back to the while loop to extract the next token
else if (token.charAt(0) == '+' || token.charAt(0) == '-') {
// Process all +, -, *, / in the top of the operator stack
while (!operatorStack.isEmpty() &&
(operatorStack.peek() == '+' ||
operatorStack.peek() == '-' ||
operatorStack.peek() == '*' ||
operatorStack.peek() == '/')) {
processAnOperator(operandStack, operatorStack);
}
// Push the + or - operator into the operator stack
operatorStack.push(token.charAt(0));
}
else if (token.charAt(0) == '*' || token.charAt(0) == '/') {
// Process all *, / in the top of the operator stack
while (!operatorStack.isEmpty() &&
(operatorStack.peek() == '*' ||
operatorStack.peek() == '/')) {
processAnOperator(operandStack, operatorStack);
}
// Push the * or / operator into the operator stack
operatorStack.push(token.charAt(0));
}
else if (token.trim().charAt(0) == '(') {
operatorStack.push('('); // Push '(' to stack
}
else if (token.trim().charAt(0) == ')') {
// Process all the operators in the stack until seeing '('
while (operatorStack.peek() != '(') {
processAnOperator(operandStack, operatorStack);
}
operatorStack.pop(); // Pop the '(' symbol from the stack
}
else { // An operand scanned
// Push an operand to the stack
operandStack.push(new Integer(token));
}
}
// Phase 2: process all the remaining operators in the stack
while (!operatorStack.isEmpty()) {
processAnOperator(operandStack, operatorStack);
}
// Return the result
return operandStack.pop();
}
/** Process one operator: Take an operator from operatorStack and
* apply it on the operands in the operandStack */
public static void processAnOperator(
Stack<Integer> operandStack, Stack<Character> operatorStack) {
char op = operatorStack.pop();
int op1 = operandStack.pop();
int op2 = operandStack.pop();
if (op == '+')
operandStack.push(op2 + op1);
else if (op == '-')
operandStack.push(op2 - op1);
else if (op == '*')
operandStack.push(op2 * op1);
else if (op == '/')
operandStack.push(op2 / op1);
}
public static String insertBlanks(String s) {
String result = "";
for (int i = 0; i < s.length(); i++)
{
if (s.charAt(i) == '(' || s.charAt(i) == ')' ||
s.charAt(i) == '+' || s.charAt(i) == '-' ||
s.charAt(i) == '*' || s.charAt(i) == '/')
result += " " + s.charAt(i) + " ";
else
result += s.charAt(i);
}
return result;
}
public class Card extends Pane {
public int cardVal;
Card(int card){
Image cardImage;
cardImage = new Image("card/"+ card +".png");
getChildren().add(new ImageView(cardImage));
cardVal = card;
}
public int CardValue(){
int card = 0;
if(cardVal <= 13){
card = cardVal;
}
else if(cardVal > 13 && cardVal <= 26){
card = cardVal - 13;
}
else if(cardVal > 26 && cardVal <= 39){
card = cardVal - 26;
}
else if(cardVal > 39 && cardVal <= 52){
card = cardVal - 39;
}
return card;
}
}
public static void main(String[] args) {
launch(args);
}
}
最佳答案
enum 在这里可以提供帮助。
我不确定我是否完成了它,因为我不确定我是否已经实现了所有可能的包围,但现在对我来说它看起来很完整。
enum Op {
Add("+") {
@Override
int op(int a, int b) {
return a + b;
}
},
Sub("-") {
@Override
int op(int a, int b) {
return a - b;
}
},
Mul("*") {
@Override
int op(int a, int b) {
return a * b;
}
},
Div("/") {
@Override
int op(int a, int b) {
// Insane value for / 0 to ensure unlikely to match.
return b != 0 ? a / b : Integer.MAX_VALUE;
}
};
final String asString;
Op(String asString) {
this.asString = asString;
}
public String toString() {
return asString;
}
abstract int op(int a, int b);
}
private void tryAllOrders(int a, int b, int c, int d, Op op1, Op op2, Op op3, int target) {
if (op3.op(op2.op(op1.op(a, b), c), d) == target) {
System.out.println(" ((" + a + op1 + b + ")" + op2 + c + ")" + op3 + d + "=" + target);
}
if (op3.op(op1.op(a, op2.op(b, c)), d) == target) {
System.out.println(" (" + a + op1 + "(" + b + op2 + c + "))" + op3 + d + "=" + target);
}
if (op2.op(op1.op(a, b), op3.op(c, d)) == target) {
System.out.println(" (" + a + op1 + b + ")" + op2 + "(" + c + op3 + d + ")=" + target);
}
if (op1.op(a, op3.op(op2.op(b, c), d)) == target) {
System.out.println(" " + a + op1 + "((" + b + op2 + c + ")" + op3 + d + ")=" + target);
}
if (op1.op(a, op2.op(b, op3.op(c, d))) == target) {
System.out.println(" " + a + op1 + "(" + b + op2 + "(" + c + op3 + d + "))=" + target);
}
}
private void tryAllOps(int a, int b, int c, int d, int target) {
for (Op op1 : Op.values()) {
for (Op op2 : Op.values()) {
for (Op op3 : Op.values()) {
tryAllOrders(a, b, c, d, op1, op2, op3, target);
}
}
}
}
public void test() {
int target = 24;
for (int a = 1; a <= 13; a++) {
for (int b = 1; b <= 13; b++) {
for (int c = 1; c <= 13; c++) {
for (int d = 1; d <= 13; d++) {
tryAllOps(a, b, c, d, target);
}
}
}
}
}
它打印:
((1+1)+1)*8=24
(1+(1+1))*8=24
(1+1)*(1+11)=24
((1+1)*1)*12=24
(1+(1*1))*12=24
(1+1)*(1*12)=24
...
7+((11*8)/5)=24
((7+11)*8)/6=24
((7-11)+8)*6=24
(7-(11-8))*6=24
((7+11)/8)*12=24
(7/(11-8))*12=24
...
((13/13)*13)+11=24
(13/13)*(13+11)=24
(13/(13/13))+11=24
((13+13)/13)*12=24
(13-(13/13))+12=24
13-((13/13)-12)=24
共有 67,752 个结果。
关于java - 寻找结果为 24 的算术运算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30082403/
我真的很习惯使用Ruby编写以下代码:my_hash={}my_hash['test']=1Java中对应的数据结构是什么? 最佳答案 HashMapmap=newHashMap();map.put("test",1);我假设? 关于java-等价于Java中的RubyHash,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/22737685/
请帮助我理解范围运算符...和..之间的区别,作为Ruby中使用的“触发器”。这是PragmaticProgrammersguidetoRuby中的一个示例:a=(11..20).collect{|i|(i%4==0)..(i%3==0)?i:nil}返回:[nil,12,nil,nil,nil,16,17,18,nil,20]还有:a=(11..20).collect{|i|(i%4==0)...(i%3==0)?i:nil}返回:[nil,12,13,14,15,16,17,18,nil,20] 最佳答案 触发器(又名f/f)是
几个月前,我读了一篇关于rubygem的博客文章,它可以通过阅读代码本身来确定编程语言。对于我的生活,我不记得博客或gem的名称。谷歌搜索“ruby编程语言猜测”及其变体也无济于事。有人碰巧知道相关gem的名称吗? 最佳答案 是这个吗:http://github.com/chrislo/sourceclassifier/tree/master 关于ruby-寻找通过阅读代码确定编程语言的rubygem?,我们在StackOverflow上找到一个类似的问题:
我正在尝试使用boilerpipe来自JRuby。我看过guide从JRuby调用Java,并成功地将它与另一个Java包一起使用,但无法弄清楚为什么同样的东西不能用于boilerpipe。我正在尝试基本上从JRuby中执行与此Java等效的操作:URLurl=newURL("http://www.example.com/some-location/index.html");Stringtext=ArticleExtractor.INSTANCE.getText(url);在JRuby中试过这个:require'java'url=java.net.URL.new("http://www
我只想对我一直在思考的这个问题有其他意见,例如我有classuser_controller和classuserclassUserattr_accessor:name,:usernameendclassUserController//dosomethingaboutanythingaboutusersend问题是我的User类中是否应该有逻辑user=User.newuser.do_something(user1)oritshouldbeuser_controller=UserController.newuser_controller.do_something(user1,user2)我
什么是ruby的rack或python的Java的wsgi?还有一个路由库。 最佳答案 来自Python标准PEP333:Bycontrast,althoughJavahasjustasmanywebapplicationframeworksavailable,Java's"servlet"APImakesitpossibleforapplicationswrittenwithanyJavawebapplicationframeworktoruninanywebserverthatsupportstheservletAPI.ht
导读语言模型给我们的生产生活带来了极大便利,但同时不少人也利用他们从事作弊工作。如何规避这些难辨真伪的文字所产生的负面影响也成为一大难题。在3月9日智源Live第33期活动「DetectGPT:判断文本是否为机器生成的工具」中,主讲人Eric为我们讲解了DetectGPT工作背后的思路——一种基于概率曲率检测的用于检测模型生成文本的工具,它可以帮助我们更好地分辨文章的来源和可信度,对保护信息真实、防止欺诈等方面具有重要意义。本次报告主要围绕其功能,实现和效果等展开。(文末点击“阅读原文”,查看活动回放。)Ericmitchell斯坦福大学计算机系四年级博士生,由ChelseaFinn和Chri
这篇文章是继上一篇文章“Observability:从零开始创建Java微服务并监控它(一)”的续篇。在上一篇文章中,我们讲述了如何创建一个Javaweb应用,并使用Filebeat来收集应用所生成的日志。在今天的文章中,我来详述如何收集应用的指标,使用APM来监控应用并监督web服务的在线情况。源码可以在地址 https://github.com/liu-xiao-guo/java_observability 进行下载。摄入指标指标被视为可以随时更改的时间点值。当前请求的数量可以改变任何毫秒。你可能有1000个请求的峰值,然后一切都回到一个请求。这也意味着这些指标可能不准确,你还想提取最小/
HashMap中为什么引入红黑树,而不是AVL树呢1.概述开始学习这个知识点之前我们需要知道,在JDK1.8以及之前,针对HashMap有什么不同。JDK1.7的时候,HashMap的底层实现是数组+链表JDK1.8的时候,HashMap的底层实现是数组+链表+红黑树我们要思考一个问题,为什么要从链表转为红黑树呢。首先先让我们了解下链表有什么不好???2.链表上述的截图其实就是链表的结构,我们来看下链表的增删改查的时间复杂度增:因为链表不是线性结构,所以每次添加的时候,只需要移动一个节点,所以可以理解为复杂度是N(1)删:算法时间复杂度跟增保持一致查:既然是非线性结构,所以查询某一个节点的时候
遍历文件夹我们通常是使用递归进行操作,这种方式比较简单,也比较容易理解。本文为大家介绍另一种不使用递归的方式,由于没有使用递归,只用到了循环和集合,所以效率更高一些!一、使用递归遍历文件夹整体思路1、使用File封装初始目录,2、打印这个目录3、获取这个目录下所有的子文件和子目录的数组。4、遍历这个数组,取出每个File对象4-1、如果File是否是一个文件,打印4-2、否则就是一个目录,递归调用代码实现publicclassSearchFile{publicstaticvoidmain(String[]args){//初始目录Filedir=newFile("d:/Dev");Datebeg