task

Write a program that takes four digits, either from user input or by random generation, and computes arithmetic expressions following the rules of the 24 game.

Show examples of solutions generated by the program.



Related task

   Arithmetic Evaluator


operators$ = "*+-/"
space$ = "                                                                                "
 
sub present()
	clear screen
	print "24 Game"
	print "============\n"
	print "Computer provide 4 numbers (1 to 9). With operators +, -, * and / you try to\nobtain 24."
	print "Use Reverse Polish Notation (first operand and then the operators)"
	print "For example: instead of 2 + 4, type 2 4 +\n\n"
end sub
 
repeat
	present()
	serie$ = sortString$(genSerie$())
	valid$ = serie$+operators$
	print "If you give up, press ENTER and the program attempts to find a solution."
	line input "Write your solution: " input$
	if input$ = "" then
		print "Thinking ... "
		res$ = explorer$()
		if res$ = "" print "Can not get 24 with these numbers.."
	else
		input$ = delSpace$(input$)
		inputSort$ = sortString$(input$)
		if (right$(inputSort$,4) <> serie$) or (len(inputSort$)<>7) then
			print "Syntax error"
		else
			result = evalInput(input$)
			print "Your solution = ",result," is ";
			if result = 24 then
				print "Correct!"
			else
				print "Wrong!"
			end if
		end if
	end if
	print "\nDo you want to try again? (press N for exit, other key to continue)"
until(upper$(left$(inkey$(),1)) = "N")
 
exit
 
sub genSerie$()
	local i, c$, s$
 
	print "The numbers you should use are: ";
	i = ran()
	for i = 1 to 4
		c$ = str$(int(ran(9))+1)
		print c$," ";
		s$ = s$ + c$
	next i
	print
	return s$
end sub
 
 
sub evalInput(entr$)
	local d1, d2, c$, n(4), i
 
	while(entr$<>"")
		c$ = left$(entr$,1)
		entr$ = mid$(entr$,2)		
		if instr(serie$,c$) then
			i = i + 1
			n(i) = val(c$)
		elseif instr(operators$,c$) then
			d2 = n(i)
			n(i) = 0
			i = i - 1
			if i = 0 return
			d1 = n(i)
			n(i) = evaluator(d1, d2, c$)
		else
			print "Invalid symbol"
			return
		end if
	wend
 
	return n(i)
 
end sub
 
 
sub evaluator(d1, d2, op$)
	local t
 
	switch op$
		case "+": t = d1 + d2 : break
		case "-": t = d1 - d2 : break
		case "*": t = d1 * d2 : break
		case "/": t = d1 / d2 : break
	end switch
 
	return t
end sub
 
 
sub delSpace$(entr$)
	local n, i, s$, t$(1)
 
	n = token(entr$,t$()," ")
 
	for i=1 to n
		s$ = s$ + t$(i)
	next i
	return s$
end sub
 
 
sub sortString$(string$)
	local signal, n, fin, c$
 
	fin = len(string$)-1
	repeat
		signal = false
		for n = 1 to fin
			if mid$(string$,n,1) > mid$(string$,n+1,1) then
				signal = true
				c$ = mid$(string$,n,1)
				mid$(string$,n,1) = mid$(string$,n+1,1)
				mid$(string$,n+1,1) = c$
			end if
		next n
	until(signal = false)
	return string$
end sub
 
 
sub explorer$()
	local d1,d2,o3,x4,x5,x6,o7,p$,result,solution,solutions$,n
 
	for d1 = 1 to 4
		for d2 = 1 to 4
			for o3 = 1 to 4
				for x4 = 1 to 8
					for x5 = 1 to 8
						for x6 = 1 to 8
							for o7 = 1 to 4
								p$ = mid$(serie$,d1,1)+mid$(serie$,d2,1)+mid$(operators$,o3,1)
								p$ = p$+mid$(valid$,x4,1)+mid$(valid$,x5,1)+mid$(valid$,x6,1)
								p$ = p$+mid$(operators$,o7,1)
								if not instr(solutions$,p$) then
									if validateInput(p$) then
										result = evalInput(p$)
										if result = 24 then
											solution = solution + 1
											print "Solution: ",solution," = ";
											solutions$ = solutions$ + p$
											for n = 1 to 7
												print mid$(p$,n,1)," ";
											next n
											print
										end if
									end if
								end if
							next o7
						next x6
					next x5
				next x4
			next o3
		next d2
	next d1
	return p$	
end sub
 
 
sub validateInput(e$)
	local n, inputSort$
 
	inputSort$ = sortString$(e$)
	if serie$ <> right$(inputSort$,4) return false
	for n=1 to 3
		if not instr(operators$,mid$(inputSort$,n,1)) then
			return false
		end if
	next n
	return true
end sub