存档

‘转载文章’ 分类的存档

【Vim学习】字符串搜索

2012年10月28日  2,609 views 6 条评论

原文出自http://sucre.blog.51cto.com/1084905/270556

1、基本搜索

要自当前光标位置向下搜索(即在下文中搜索),请使用以下命令:

/pattern   Enter

其中,pattern   表示要搜索的特定字符序列。

要自当前光标位置向上搜索(即在上文中搜索),请使用以下命令:

?pattern   Enter

按下   Enter   键后,vi   将搜索指定的   pattern,并将光标定位在   pattern   的第一个字符处。例如,要向上搜索   place   一词,请键入:

?place   Enter

如果   vi   找到了   place,它将把光标定位在   p   处。要搜索   place   的其他匹配,请按   n   或   N:

n,继续朝同一方向搜索   place。

N,反方向进行搜索。

如果   vi   未找到指定的   pattern,光标位置将不变,屏幕底部显示以下消息:

Pattern:   未找到

2、搜索特殊匹配

在上面的示例中,vi   查找到包含   place   的任何序列,其中包括   displace、placement   和   replaced。

要查找单个的   place,请键入该单词,并在其前后各加一个空格:

/   place     Enter

要查找仅出现在行首的   place,请在该单词前加一个插字符号   (^):

/^place   Enter

要查找仅出现在行尾的   place,请在该单词后加一个货币符号   ($):

/place$   Enter

使用   ^

要逐字搜索这种带有插字符号   (^)   或货币符号   ($)   的字符,请在字符前加一个反斜线   (\)。反斜线命令   vi   搜索特殊字符。

使用   $

特殊字符是指在   vi   中具有特殊功能的字符(例如   ^、$、*、/   和   .)。例如,$   通常表示“转至行尾”,但是,如果   $   前紧跟一个   \,则   $   只是一个普通的字符。

使用   \

例如,/(No   \$   money)   向上搜索字符序列   (No   $   money)。紧跟在   $   之前的转义字符   (\)   命令   vi   逐字搜索货币符号。

分类: 转载文章 标签: ,

楼层扔鸡蛋问题

2012年8月31日  5,194 views 没有评论

本文最早是从csdn上一篇文章看到,后找到LTang转载的一篇文章。原文已失效,无法找到。

楼层扔鸡蛋的经典问题,找的可行解是很简单的,至于最优解以及m层楼n个鸡蛋的扩展则稍费脑力,此文仅转载原文,个人心得及代码实现以及动态规划问题后续会有新文章总结。

转载文章如下:

==有限层数和蛋数,求即使最坏情况下需要的最少判断次数==
两个软硬程度一样但未知的鸡蛋,它们有可能都在一楼就摔碎,也可能从一百层楼摔下来没事。有座100层的建筑,要你用这两个鸡蛋确定哪一层是鸡蛋可以安全落下的最高位置。可以摔碎两个鸡蛋。(参见[两个鸡蛋--一道Google面试题])
这是典型的动态规划问题。假设f[n]表示从n层楼找到摔鸡蛋不碎安全位置的最少判断次数。假设第一个鸡蛋第一次从第i层扔下,如果碎了,就剩一个鸡蛋,为确定下面楼层中的安全位置,必须从第一层挨着试,还需要i-1次;如果不碎的话,上面还有n-i层,剩下两个鸡蛋,还需要f[n-i]次(子问题,实体n层楼的上n-i层需要的最少判断次数和实体n-i层楼需要的最少判断次数其实是一样的)。因此,最坏情况下还需要判断max(i-1,f[n-i])次。

状态转移方程:f[n] = min{ 1+max(i-1,f[n-i]) | i=1..n }
初始条件: f[0]=0(或f[1]=1)

实际上,两个鸡蛋的情况用数学方程就可以解决,前提是你知道该怎么扔:

一种想法是第一个鸡蛋折半搜索,如100层的楼,先从50层扔下去,如果碎了则第二个鸡蛋在1~49层楼中自底向上线性搜索;如果没碎则第一个鸡蛋再从75层扔。如果这次碎了则第二个鸡蛋在51~74层楼中自底向上线性搜索;如果还没碎则第一个鸡蛋再从88层扔,依此类推。这种方法不是最优,因为最坏情况下安全位置恰好是49层,需要尝试50次。
正确的方法是先假设最少判断次数为x,则第一个鸡蛋第一次从第x层扔(不管碎没碎,还有x-1次尝试机会)。如果碎了,则第二个鸡蛋在1~x-1层中线性搜索,最多x-1次;如果没碎,则第一个鸡蛋第二次从x+(x-1)层扔(现在还剩x-2次尝试机会)。如果这次碎了,则第二个鸡蛋在x+1~x+(x-1)-1层中线性搜索,最多x-2次;如果还没碎第一个鸡蛋再从x+(x-1)+(x-2)层扔,依此类推。x次尝试所能确定的最高楼层数为x+(x-1)+(x-2)+…+1=x(x+1)/2。
比如100层的楼,只要让x(x+1)/2>=100,得x>=14,最少判断14次。具体地说,100层的楼,第一次从14层开始扔。碎了好说,从第1层开始试。不碎的话还有13次机会,再从14+13=27层开始扔。依此类推,各次尝试的楼层依次为

14
27 = 14 + 13
39 = 27 + 12

99 = 95 + 4
100

现在推广成n层楼,m个鸡蛋:

还是动态规划。假设f[n,m]表示n层楼、m个鸡蛋时找到摔鸡蛋不碎的最少判断次数。则一个鸡蛋从第i层扔下,如果碎了,还剩m-1个鸡蛋,为确定下面楼层中的安全位置,还需要f[i-1,m-1]次(子问题);不碎的话,上面还有n-i层,还需要f[n-i,m]次(子问题,实体n层楼的上n-i层需要的最少判断次数和实体n-i层楼需要的最少判断次数其实是一样的)。

状态转移方程:f[n,m] = min{ 1+max(f[i-1,m-1], f[n-i,m]) | i=1..n }
初始条件:f[i,0]=0(或f[i,1]=i),对所有i

【zz】120行俄罗斯方块(Javascript版)

2012年3月10日  1,934 views 没有评论

最近比较流行特简洁的俄罗斯方块,前几天从csdn上看到有人写了这个120行的JS版,感觉挺有意思的,就转录于此。
原作者是CSDN论坛上的 lihanbing这段代码最有意思的是只要新建一个文本文件,将如下代码拷入,手动将文件后缀名修改为.html,然后双击就能运行。

<html>
<style>.c {margin :1px;width:19px;height:19px;background:red;position:absolute;}
.d {margin :1px;width:19px;height:19px;background:gray;position:absolute;}
.f {top:0px;left:0px;background:black;position:absolute;}
</style>
<body></body><html>
<script>
    var over=false,shapes=("0,1,1,1,2,1,3,1;1,0,1,1,1,2,2,2;2,0,2,1,2,2,1,2;0,1,1,1,1,2,2,2;1,2,2,2,2,1,3,1;1,1,2,1,1,2,2,2;0,2,1,2,1,1,2,2").split(";");
    function create(tag,css){
        var elm=document.createElement(tag);
        elm.className = css;
        document.body.appendChild(elm);
        return elm;}
    function Tetris(c, t, x, y){
        var c=c?c:"c";
        this.divs = [create("div",c),create("div",c),create("div",c),create("div",c)];
        this.reset = function(){
            this.x = typeof x != 'undefined'?x:3;
            this.y = typeof y != 'undefined'?y:0;
            this.shape = t?t:shapes[Math.floor(Math.random()*(shapes.length-0.00001))].split(",");
            this.show();
            if(this.field&&this.field.check(this.shape,this.x,this.y,'v')=='D'){
                over=true;
                this.field.fixShape(this.shape,this.x,this.y);
                alert('game over');}}
        this.show = function(){
            for(var i in this.divs){
                this.divs[i].style.left = (this.shape[i*2]*1+this.x)*20+'px';
                this.divs[i].style.top = (this.shape[i*2+1]*1+this.y)*20+'px';}}
        this.field=null;
        this.hMove = function(step){
            var r = this.field.check(this.shape,this.x- -step,this.y,'h');
            if(r!='N'&&r==0){
                this.x-=-step;
                this.show();}}
        this.vMove = function(){
            if(this.field.check(this.shape,this.x,this.y- -1,'v')=='N'){
                this.y++;
                this.show();}
            else{
                this.field.fixShape(this.shape,this.x,this.y);
                this.field.findFull();
                this.reset();}}
        this.rotate = function(){
            var s=this.shape;
            var newShape=[3-s[1],s[0],3-s[3],s[2],3-s[5],s[4],3-s[7],s[6]];
            var r = this.field.check(newShape,this.x,this.y,'h');
            if(r=='D')return;
            if(r==0){
                this.shape=newShape;
                this.show();}
            else if(this.field.check(newShape,this.x-r,this.y,'h')==0){
                this.x-=r;
                this.shape=newShape;
                this.show();}}
        this.reset();}
    function Field(w,h){
        this.width = w?w:10;
        this.height = h?h:20;
        this.show = function(){
            var f = create("div","f")
            f.style.width=this.width*20+'px';
            f.style.height=this.height*20+'px';}
        this.findFull = function(){
            for(var l=0;l<this.height;l++){
                var s=0;
                for(var i=0;i<this.width;i++){
                    s+=this[l*this.width+i]?1:0;}
                if(s==this.width){
                    this.removeLine(l);}}}
        this.removeLine = function(line){
            for(var i=0;i<this.width;i++){
                document.body.removeChild(this[line*this.width+i]);}
            for(var l=line;l>0;l--){
                for(var i=0;i<this.width;i++){
                    this[l*this.width- -i]=this[(l-1)*this.width- -i];
                    if(this[l*this.width- -i])this[l*this.width- -i].style.top = l*20+'px';}}}
        this.check = function(shape, x, y, d){
            var r1=0,r2='N';
            for(var i=0;i<8;i+=2){
                if(shape[i]- -x < 0 && shape[i]- -x <r1)
                    {r1 = shape[i]- -x;}
                else if(shape[i]- -x>=this.width && shape[i]- -x>r1)
                    {r1 = shape[i]- -x;}
                if(shape[i+1]- -y>=this.height || this[shape[i]- -x- -(shape[i+1]- -y)*this.width])
                    {r2='D'}}
            if(d=='h'&&r2=='N')return r1>0?r1-this.width- -1:r1;
            else return r2;}
        this.fixShape = function(shape,x,y){
            var d=new Tetris("d",shape,x,y);
            d.show();
            for(var i=0;i<8;i+=2){
                this[shape[i]- -x- -(shape[i+1]- -y)*this.width]=d.divs[i/2];}}}
    var f = new Field();
    f.show();
    var s = new Tetris();
    s.field = f;
    s.show();
    window.setInterval("if(!over)s.vMove();",500);
    document.onkeydown = function(e){
        if(over)return;
        var e = window.event ? window.event : e;
        switch(e.keyCode){
        case 38: //up
            s.rotate();
            break;
        case 40: //down
            s.vMove();
            break;
        case 37: //left
            s.hMove(-1);
            break;
        case 39: //right
            s.hMove(1);
            break;}}
</script>

[转载]VS2005无法进行DEBUG:Binary was not build with debug information.

2011年6月24日  8,278 views 没有评论

今天遇到了VS2005无法进行DEBUG:Binary was not build with debug information.的问题,无法对编写的C++程序调试,每次调试都会提示No Debugging Information。在网上查找相关资料后得以解决,以下为参考文章全文,格式略作修改。

转载自smilelance

Its not an installation issue, the problem is, as the error message suggests, that you have not built your project with debug information.

To do this:

  1. Goto Project->Properties
  2. Make sure “Configuration” at the top is “Debug”
  3. On the left, select “C/C++”, then “General”
  4. On the right, change “Debug information format” to “Program Database for edit and continue (/ZI)”
  5. On the left, Select “Optimization”
  6. On the right, Change “Optimization” to “Disabled (/Od)”
  7. On the left, select “Code Generation”
  8. On the right, change “Runtime library” to “Multi-Threaded Debug (/MTd)”
  9. On the left, expand “Linker” and select “Debugging”
  10. On the right, change “Generate Debug info” to “Yes (/DEBUG)”
  11. Rebuild your project.
分类: 转载文章 标签: ,

[转载]你还在用百度吗?关于百度的五个真相

2011年5月14日  3,908 views 2 条评论

来源:http://www.xjp.cc/2010-log/12/five-facts-baidu.html

昨天看到互动百科“致百度CEO李彦宏的公开信”,文章太酸、太长、太烂,百度该不该骂?该!百度成为众矢之的离不开中文第一搜的地位,以至于骂百度已经成为媒体博取用户关注的一种手段,赚钱赚到这样让这么多人恶心的程度,也实属难得。

很多人知道百度,不一定完完全全地了解百度,笔者这里就权且列五条关于百度的不良记录,权当笑谈。

真相一:在搜索结果中放广告赚钱

百度搜索竞价排名是笔者目前了解到的,多年来百度收入占比最大的一块业务,即便多次更名也丝毫没有影响到它的核心地位,如果没有竞价广告就没有今天的百度。

但是与Google这样的关键词搜索广告相比,百度的竞价排名是完全和搜索结果融为一体,如果不仔细分辨你几乎很难发现竞价广告的存在。这一做法引发了截然不同的两种声音,赞同者认为这样的广告会增加客户的实际成交量,而反对者则认为这增加了商家的广告成本和无效用户,百度最夸张的时候一页搜索结果几乎全是竞价排名,商家疯狂追捧的背后是各方利益的追逐。

但是最核心的问题,百度作为搜索引擎的首先服务目标是用户,广告只是服务用户的附带收益,而毫无底线的竞价排名影响到了用户的正常搜索,几度改革的竞价排名虽然尊重用户的口号很大,最终作出的让步却很小。

真相二:大量的不道德案底

百度最广为人知的污点,莫过于央视曝光的医药搜索广告,当时百度为一些不正规的医药产品提供竞价广告服务,导致大量用户利益受到损害。百度事后表示将会拿出诚意痛改前非,所以我们就看到李彦宏出现在了当年的央视春晚上。医药搜索广告事件,揭示的是百度作为一个广告商,在同时面对金钱和道德作出了不正确的选择。医药、钓鱼网站、骗子…各种各样的骗术借着百度广告的外衣大行其道,展现出的是百度作为中国互联网巨头的社会责任感。

百度竞价广为流传的一个说法是,很多百度代理会威胁客户:如果你不买竞价排名,那么你的网站排名会一落千丈,甚至收录被清零。空穴来风,未必无因,越来越多客户的曝光证明了这种做法的存在。百度当然可以推说是部分代理商的做法,自己完全不知情,将会对那些不良代理商进行严厉惩处。听听,这口吻多像相关部门的官方基调,最后拿临时工顶包了事。这种调整权重、调整收录的做法,我不相信百度完全不知情,百度高层完全清白,最可能的事他们故作不知、听之任之,然后面对大把大把的钞票乐。

最典型的案例是,京东、新蛋、卓越亚马逊等大量商业网站,都曾经购买自己网站名称的竞价广告,这不是白白给百度送钱吗?他们怕的是什么?其中的秘辛恐怕只有当事人能够了解。

阅读全文…