[随笔] 出几个小题,活跃下版面
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
你看,一行这么长,引用都点不着了吧 ……
|