24 game/Solve

import Data.List
import Data.Ratio
import Control.Monad data Expr = Constant Rational |
Expr :+ Expr | Expr :- Expr |
Expr :* Expr | Expr :/ Expr
deriving (Eq) data Result = Result {value :: Rational, lastOp :: String, lastValues :: [Rational]} ops = [((:+), "+"), ((:-), "-"), ((:*), "*"), ((:/), "/")] instance Show Expr where
show (Constant x) = show $ numerator x
show (a :+ b) = strexp "+" a b
show (a :- b) = strexp "-" a b
show (a :* b) = strexp "*" a b
show (a :/ b) = strexp "/" a b strexp :: String -> Expr -> Expr -> String
strexp op a b = "(" ++ show a ++ " " ++ op ++ " " ++ show b ++ ")" templates :: [[Expr] -> Expr]
templates = do
(op1, ch1) <- ops
(op2, ch2) <- ops
(op3, ch3) <- ops
let t1 = \[a, b, c, d] -> ((a `op1` b) `op2` c) `op3` d
let t2 = \[a, b, c, d] -> (a `op1` b) `op2` (c `op3` d)
let t3 = \[a, b, c, d] -> (a `op1` (b `op2` c)) `op3` d
let t4 = \[a, b, c, d] -> a `op1` ((b `op2` c) `op3` d)
let t5 = \[a, b, c, d] -> a `op1` (b `op2` (c `op3` d))
case (ch1, ch2, ch3) of
("+", "+", "+") -> [t1]
("*", "*", "*") -> [t1]
("+", "+", _ ) -> [t1,t2,t4]
( _ , "+", "+") -> [t1,t3,t4]
("*", "*", _ ) -> [t1,t2,t4]
( _ , "*", "*") -> [t1,t3,t4]
otherwise -> [t1,t2,t3,t4,t5] isSorted :: (Ord a) => [a] -> Bool
isSorted [] = True
isSorted [x] = True
isSorted (x:y:xs) = x <= y && isSorted (y:xs) eval :: Expr -> Maybe Result
eval (Constant c) = Just Result{value=c, lastOp="", lastValues=[c]}
eval (a :+ b) = do
Result{value=va, lastOp=opa, lastValues=lva} <- eval a
let lva' = if opa == "+" then lva else [va]
Result{value=vb, lastOp=opb, lastValues=lvb} <- eval b
let lvb' = if opb == "+" then lvb else [vb]
let lv = lva' ++ lvb'
guard $ isSorted lv
return Result{value=va + vb, lastOp="+", lastValues=lv}
eval (a :- b) = do
Result{value=va} <- eval a
Result{value=vb} <- eval b
let v = va - vb
return Result{value=v, lastOp="", lastValues=[v]}
eval (a :* b) = do
Result{value=va, lastOp=opa, lastValues=lva} <- eval a
let lva' = if opa == "*" then lva else [va]
Result{value=vb, lastOp=opb, lastValues=lvb} <- eval b
let lvb' = if opb == "*" then lvb else [vb]
let lv = lva' ++ lvb'
guard $ isSorted lv
return Result{value=va * vb, lastOp="*", lastValues=lv}
eval (a :/ b) = do
Result{value=va} <- eval a
Result{value=vb} <- eval b
guard $ vb /= 0
let v = va / vb
return Result{value=v, lastOp="", lastValues=[v]} solve :: Rational -> [Rational] -> [Expr]
solve target r4 = filter (maybe False (\r -> value r == target) . eval) $
liftM2 ($) templates $
nub $ permutations $ map Constant r4 main = mapM_ (\x -> putStrLn $ show x ++ " = 24") . solve 24 $ [1,2,3,4]
((1 + 3) * (2 + 4)) = 24
(4 * ((1 + 2) + 3)) = 24
(((1 * 2) * 3) * 4) = 24
(((2 * 3) * 4) / 1) = 24
((2 * 3) * (4 / 1)) = 24
(3 * ((2 * 4) / 1)) = 24
(4 * ((2 * 3) / 1)) = 24
(2 * ((3 * 4) / 1)) = 24
((2 * (3 / 1)) * 4) = 24
(2 * ((3 / 1) * 4)) = 24
((2 * 3) / (1 / 4)) = 24
((2 * 4) / (1 / 3)) = 24
((3 * 4) / (1 / 2)) = 24
(3 * (2 / (1 / 4))) = 24
(2 * (3 / (1 / 4))) = 24
(4 * (2 / (1 / 3))) = 24
(2 * (4 / (1 / 3))) = 24
(4 * (3 / (1 / 2))) = 24
(3 * (4 / (1 / 2))) = 24
(((2 / 1) * 3) * 4) = 24
(2 / (1 / (3 * 4))) = 24
(3 / (1 / (2 * 4))) = 24
(4 / (1 / (2 * 3))) = 24
(2 / ((1 / 3) / 4)) = 24
(3 / ((1 / 2) / 4)) = 24
(4 / ((1 / 2) / 3)) = 24
(2 / ((1 / 4) / 3)) = 24
(4 / ((1 / 3) / 2)) = 24
(3 / ((1 / 4) / 2)) = 24

趣味编程:24点(Haskell版)的更多相关文章

  1. 《Linux命令行与shell脚本编程大全 第3版》Linux命令行---24

    以下为阅读<Linux命令行与shell脚本编程大全 第3版>的读书笔记,为了方便记录,特地与书的内容保持同步,特意做成一节一次随笔,特记录如下:

  2. 《Java编程思想第四版》附录 B 对比 C++和 Java

    <Java编程思想第四版完整中文高清版.pdf>-笔记 附录 B 对比 C++和 Java “作为一名 C++程序员,我们早已掌握了面向对象程序设计的基本概念,而且 Java 的语法无疑是 ...

  3. Go并发编程实战 第2版 PDF (中文版带书签)

    Go并发编程实战 第2版 目录 第1章 初识Go语言 1 1.1 语言特性 1 1.2 安装和设置 2 1.3 工程结构 3 1.3.1 工作区 3 1.3.2 GOPATH 4 1.3.3 源码文件 ...

  4. Python编程导论第2版|百度网盘免费下载|新手学习

    点击下方即可免费下载 百度网盘免费下载:Python编程导论第2版 提取码:18g5 豆瓣评论: 介绍: 本书基于MIT 编程思维培训讲义写成,主要目标在于帮助读者掌握并熟练使用各种计算技术,具备用计 ...

  5. Python核心编程(第3版)PDF高清晰完整中文版|网盘链接附提取码下载|

    一.书籍简介<Python核心编程(第3版)>是经典畅销图书<Python核心编程(第二版)>的全新升级版本.<Python核心编程(第3版)>总共分为3部分.第1 ...

  6. Python编程入门(第3版) PDF|百度网盘下载内附提取码

    Python编程入门(第3版)是图文并茂的Python学习参考书,书中并不包含深奥的理论或者高级应用,而是以大量来自实战的例子.屏幕图和详细的解释,用通俗易懂的语言结合常见任务,对Python的各项基 ...

  7. 读书笔记:JavaScript DOM 编程艺术(第二版)

    读完还是能学到很多的基础知识,这里记录下,方便回顾与及时查阅. 内容也有自己的一些补充. JavaScript DOM 编程艺术(第二版) 1.JavaScript简史 JavaScript由Nets ...

  8. 编译opengl编程指南第八版示例代码通过

    最近在编译opengl编程指南第八版的示例代码,如下 #include <iostream> #include "vgl.h" #include "LoadS ...

  9. 结对编程项目——四则运算vs版

    结对编程项目--四则运算vs版 1)小伙伴信息:        学号:130201238 赵莹        博客地址:点我进入 小伙伴的博客 2)实现的功能: 实现带有用户界面的四则运算:将原只能在 ...

  10. java编程思想第四版中net.mindview.util包下载,及源码简单导入使用

    在java编程思想第四版中需要使用net.mindview.util包,大家可以直接到http://www.mindviewinc.com/TIJ4/CodeInstructions.html 去下载 ...

随机推荐

  1. vue-cli 下的 webpack 优化

    app bundle 可以通过组件懒加载优化 vender 优化方法: 使用 cdn,然后在 webpack 配置中指定 externals. 利用 webpack 的插件 DllPlugin 和 D ...

  2. R(8): tidyr

    tidy(整洁),Tidyr包是由Hadely Wickham创建,这个包提高了整理原始数据的效率,tidyr包的4个常用的函数及其用途如下: gather()——它把多列放在一起,然后转化为key: ...

  3. 【Spring-AOP-学习笔记-3】@Before前向增强处理简单示例

    项目结构 程序代码 HelloImpl.java WorldImpl.java 定义切面类 package org.crazyit.app.aspect; import org.aspectj.lan ...

  4. spring boot学习(3) SpringBoot 之MVC 支持

    第一节:@RequestMapping 配置url 映射   第二节:@Controller 处理http 请求 转发到一个页面,以前是转发到jsp页面,现在使用freemarker: 在pom.xm ...

  5. TMOD

    1. • tag/itemlist {{Syntax Error}} Debug info: Unexpected token else Waiting... Debug info: node D:/ ...

  6. RAID磁盘阵列的原理与搭建

    学习导图 RAID-0结构关系图 RAID-1结构关系图 RAID-5:条带+分布校验(三块磁盘以上) RAID-10:镜像+条带(四块磁盘以上) RAID-0 添加两块硬盘,分别为磁盘1.磁盘2.最 ...

  7. [UE4]C++ STL总结

    STL概述 STL (Standard Template Library, 标准模板库) 是惠普实验室开发的一系列软件的统称.主要核心分为三大部分:容器(container).算法(algorithm ...

  8. 深度学习中的Normalization模型

    Batch Normalization(简称 BN)自从提出之后,因为效果特别好,很快被作为深度学习的标准工具应用在了各种场合.BN 大法虽然好,但是也存在一些局限和问题,诸如当 BatchSize ...

  9. SQL Server 2016将内置R语言

    题记:随着大数据成为一个BuzzWord,和大数据相关的技术也变得越来越火热,其中就包括R语言.而据说SQL Server 2016将会内置R语言支持? R语言作为一个存在很久的语言,在大数据热炒之后 ...

  10. 在visual code的debugger for chrome中调试webpack构建的项目

    一直使用chrome中内置的调试器, 感觉世界那么美好, 自从学了react之后,使用visual code作为编辑器, 它提供了很多插件, 其中就包括debugger for chrome, 一款使 ...