[随笔] 出几个小题,活跃下版面

Eastsun 2009-10-09
没人做最后一题。。。我贴下我的代码吧:
def solve(vs: List[Int],n: Int = 24){
    def isZero(d: Double) = Math.abs(d) < 0.00001
    
    //解析为恰当的中缀表达式
    def toStr(any: Any): String = any match {
        case (v: Double,null,null,null) => v.toInt.toString
        case (_,v1: (Double,Any,Any,Any),v2: (Double,Any,Any,Any),op) => 
               if(op=='-'&&(v2._4=='+'||v2._4=='-'))
                   "%s%c(%s)".format(toStr(v1),op,toStr(v2))
               else if(op=='/'){
                   val s1 = if(v1._4=='+'||v1._4=='-') "("+toStr(v1)+")" else toStr(v1)
                   val s2 = if(v2._4==null) toStr(v2) else "("+toStr(v2)+")"
                   s1 + op + s2
               }
               else if(op=='*'){
                   val s1 = if(v1._4=='+'||v1._4=='-') "("+toStr(v1)+")" else toStr(v1)
                   val s2 = if(v2._4=='+'||v2._4=='-') "("+toStr(v2)+")" else toStr(v2)
                   s1 + op + s2
               }
               else toStr(v1) + op + toStr(v2)
    }
    
    //递归求解
    val buf = collection.mutable.ListBuffer[String]()
    def solve0(xs: List[(Double,Any,Any,Any)]): Unit = xs match {
        case x::Nil => if(isZero(x._1-n) && !buf.contains(toStr(x))){ buf += toStr(x); println(buf.last)}
        case _      => for{ x @ (v1,_,_,_) <- xs;val ys = xs diff List(x)
                              y @ (v2,_,_,_) <- ys;val rs = ys diff List(y)
                         }{   solve0((v1+v2,x,y,'+')::rs)
                              solve0((v1-v2,x,y,'-')::rs)
                              solve0((v1*v2,x,y,'*')::rs)
                              if(!isZero(v2)) solve0((v1/v2,x,y,'/')::rs)
                         }
    }
    solve0(vs map {v => (v.toDouble,null,null,null)})
}


比较啰嗦一点的地方就是将结果转换为适当的字符串。。。不能有多余的括号。
解24点:
引用

scala> solve(1::3::4::6::Nil)
6/(1-3/4)

scala> solve(1::8::12::12::Nil)
12/(12/8-1)

scala> solve(10::12::12::12::Nil)
12*12-10*12
12*12-12*10

scala> solve(9::12::12::12::Nil)
(12-9)*12-12
12*(12-9)-12

scala> solve(8::8::9::13::Nil)
(13-9)*8-8
8*(13-9)-8



caizhen229 2009-10-09
呜呜,一点也看不懂啊。
night_stalker 2009-10-09
Eastsun 写道
def sizeOfGroup[T](ls: List[T]) =
  ls.zip(new Object::ls).filter{case(x,y) => y != x}.size


赞……齿轮法!
ps1:话说 1、2、3 在 ruby 里都是有 api 的 ……
(each_cons, each_slice, group_by)
而 4 在 ruby 里可以 eval ……
ps2:我是 一行超过80字符会死星人 ……
RednaxelaFX 2009-10-09
night_stalker 写道
姑且将右滑梯结构称为 "R 模式",那么

def R[V](init: V)(f: ((Any, V) =>V)) =
  new Object {
    def apply[T] (ls: List[T]) =
      (ls :\ init)(f.asInstanceOf[(T, V) => V])
  }

val group = R(List[List[Any]]()) {
  case (e, x :: xs) if x.first == e => (e :: x) :: xs
  case (e, acc) => List(e) :: acc
}

// ...

话说x.first、x.head这些在遇到Nil时都会抛NoSuchElementException,挺讨厌的。我就是懒得写if !x.isEmpty && x.head == e才改长了用模式匹配 =_=
night_stalker 2009-10-09
但是 acc 的每个元素都是大小至少为 1 的 list ……
Eastsun 2009-10-09
night_stalker 写道
Eastsun 写道
Java代码

   1. def sizeOfGroup[T](ls: List[T]) = 
   2.   ls.zip(new Object::ls).filter{case(x,y) => y != x}.size 

def sizeOfGroup[T](ls: List[T]) =
  ls.zip(new Object::ls).filter{case(x,y) => y != x}.size



赞……齿轮法!
ps1:话说 1、2、3 在 ruby 里都是有 api 的 ……
(each_cons, each_slice, group_by)
而 4 在 ruby 里可以 eval ……
ps2:我是 一行超过80字符会死星人 ……


Scala2.8里也有groupBy方法,不过作用不太一样
RednaxelaFX 2009-10-09
night_stalker 写道
但是 acc 的每个元素都是大小至少为 1 的 list ……

也对,有道理……
night_stalker 2009-10-09
你看,一行这么长,引用都点不着了吧 ……
Global site tag (gtag.js) - Google Analytics