前段时间,在csdn上的这篇文章  厌倦了编程书?来试试这3种提高编程技能的有趣方法吧  中看到了一个很有意思的网站: http://www.codewars.com/dashboard

你可以在上面做一些编程练习,往往是完成一个小方法或者函数,现在它支持的语言包括:Ruby  、JavaScript 、 CoffeeScript ,据说以后还会会支持其它的一些语言。我做了几道JavaScript 练习,觉得挺有意思的。因为在这里,你完成、提交一些练习之后,可以看到别人提交的答案。你会发现,同一个问题竟有那么多的解决方案,人和人之间的思维方式实在是相差得十万八千里。

就拿我今天做的这个练习来说吧。

题目要求如下:

You probably know the "like" system from Facebook and other pages. People can "like" blog posts, pictures or other items. We want to create the text that should be displayed next to such an item.Implement a function likes(), which must take in input array, containing the names of people who like an item. It must return the display text as shown in the examples:likes([]); // must return "no one likes this"
likes(['Peter']); // must return "Peter likes this"
likes(['Jacob', 'Alex']); // must return "Jacob and Alex like this"
likes(['Max', 'John', 'Mark']); // must return "Max, John and Mark like this"
likes(['Alex', 'Jacob', 'Mark', 'Max']); // must return "Alex, Jacob and 2 others like this"

看起来挺简单的不是吗?几个if ,else 拼接一下字符串不就行了?基于前几次的经验,我想我总得在其中用上点儿什么聪明的方法吧,不然,把这种粗暴的写法提交上去还不得被鄙视?下面是我的答案:

function likes(names) {var who;if(names.length==0){who = "no one";}else if(names.length<=2){who = names.length==1? names[0]:names[0]+" and "+names[1];}else{who = names.concat().splice(0,2).join(", ")+" and "+( names.length>3? names.length-2+" others":names[2] );} return who+( names.length>1? " like":" likes" )+" this";}

为了不让人鄙视,我用了一些自以为聪明的方法,可是说实话,这样看起来仍然怪怪的,仍然不够聪明,甚至看起来有些奇怪。下面是几个我认为很聪明、很优雅的别人的写法:

1、这种方法,大概很多人都能想到(我却没想到),简单粗暴,但比 if  else  清爽干净不是吗?

function likes(names) {names = names || [];switch(names.length){case 0: return 'no one likes this'; break;case 1: return names[0] + ' likes this'; break;case 2: return names[0] + ' and ' + names[1] + ' like this'; break;case 3: return names[0] + ', ' + names[1] + ' and ' + names[2] + ' like this'; break;default: return names[0] + ', ' + names[1] + ' and ' + (names.length - 2) + ' others like this';}
}

2、好聪明的写法啊。

function likes(names) {if(names.length >= 4) return templates[4].format(names.slice(0, 2).concat(names.length - 2));return templates[names.length].format(names);
}var templates = {0: 'no one likes this',1: '{0} likes this',2: '{0} and {1} like this',3: '{0}, {1} and {2} like this',4: '{0}, {1} and {2} others like this'
};String.prototype.format = function(args) {return args.reduce(function(acc, value, idx) {return acc.replace('{' + idx + '}', value); }, this).toString();
};

3、与第二种似乎类似,而且更优雅、更聪明。

function likes(names) {var str = ['no one likes this','%0 likes this', '%0 and %1 like this', '%0, %1 and %2 like this','%0, %1 and %C others like this'];return (names.length > 0) ? str[(names.length < 5 ? names.length : 4)].replace('%0',names[0]).replace('%1',names[1]).replace('%2',names[2]).replace('%C',names.length-2) : str[0];
}

当然,还有人的方法也许更聪明,但是似乎可读性太差了些。比如下面这位:

function likes(names) {var c = names.length;var s = [0, c && c < 3 ? undefined : 2];return !c ? "no one likes this" : names.slice(s[0], s[1]).join(c < 3 ? ' and ' : ', ') + ((c < 3) ? (' like' + ((c == 1) ? 's' : '') + ' this') : (' and ' + (c == 3 ? (names.slice(2, 3)) : (c - 2) + ' others') + ' like this'));
}

不得不让人感叹,这些家伙真是厉害。我想我们在写代码时,倘若时间允许,也应多思考如何聪明地写。不过啊,也要注意代码的可读性,,毕竟代码是写给人看的,聪明地写代码不等于复杂地写代码。看看上面第三种写法,即清楚明了又巧妙优雅,让人拍手称妙。

一个有意思的编程练习网站相关推荐

  1. 一个在线练习编程的网站

    在笔者转发一篇非常有意思的文章:http://blog.csdn.net/chancein007/article/details/53731514中提到什么是"编码套路"(Code ...

  2. Mikutap!我发现了一个有意思的动态html网站

    因为这是第一次写博客,但是想来想去都还是想不到写什么 最后决定分享一个,很久之前发现的网站源码: Mikutap 先给你们放测试站,然后再慢慢介绍吧! Mikutap测试站:http://blog.t ...

  3. 这么多编程学习网站,总有一个适合你吧

    前 言 今天分享几个适用于编程开发自学的学习网站,主要涉及编程学习和练手.提问交流.公开课.在线刷题.以及问题搜索等几个方面,希望能有帮助. C语言网 该网站有很多C语言相关的教程.资源.博客和练手习 ...

  4. 一个适合在校生宝藏编程学习网站

    大家好,我是帅地. 今天给大家推荐一个编程网站- 先来看一看这个网站有哪些硬核内容 这是一个面向初学者 | 校招 | 面试的编程学习网站,里面的所有内容,都是帅地自己筛选过的内容,而不是像一些恶心的网 ...

  5. 推荐一个在线编程学习网站“泡面吧”

    最近看到一个在线编程学习网站,觉得比较好,就推荐下给大家,下面是它的简介: 泡面吧是面向中文用户的在线计算教育平台,采用伴随式教育的概念,让用户可以像泡面一样更高效.更主动的进行学习.泡面吧以练即是学 ...

  6. 用python开发一个影视网站_搜片大师,一个不需要编程就能拥有百万影视站点的搜片神器,Python编写,Windows版界面 - 卖知了的......

    这个世界太疯狂了,来北京好几个月了,都还没找到工作.俗话说,一天不编程,连hello world都写不出来.在这个"焦虑"的最后一个月,差不多每天吃馒头加山泉水,差点流落街头.可以 ...

  7. 推荐一个在线编程的网站

    推荐一个在线编程的网站:http://www.anycodes.cn/zh/ 用过其他的网站,没有这个好用,有的网站会出现点击编译后没有运行情况.

  8. 全网最全编程学习网站汇总来了,还不赶快收藏

    Java面试笔试面经.Java技术每天学习一点 公众号Java面试 关注我不迷路 作者:brightwang 来源:https 众所周知,程序员是一个需要不断学习的职业,而幸运的是,在这个互联网时代, ...

  9. 15 个边玩游戏边学编程的网站(包含 Python)

    前言 经常听到有朋友说,学习编程是一件非常枯燥无味的事情.其实,大家有没有认真想过,可能是我们的学习方法不对? 比方说,你有没有想过,可以通过打游戏来学编程? 今天我想跟大家分享几个网站,教你如何通过 ...

最新文章

  1. js 的try catch应用
  2. 安利一下这个群投票的小程序,比较好用
  3. Mac安装php和redis扩展
  4. 从2D到3D 开发者讲述“街霸V”的美术秘笈
  5. 【教学课件】IT教学课件和课程考试资料汇总
  6. MySQL高级 - insert优化
  7. Wasserstein metric的通俗解释
  8. 伪静态 apache重写
  9. getResourceAsStream的3种路径配置
  10. Js之History对象
  11. 上海嵌联自控供应车流量统计系统
  12. 浅入浅出Vivado IP之DDS Compiler
  13. golang操作sqlite3
  14. 分享!微信群二维码突破100人限制和7天不过期的方法
  15. C语言——输出一个正方形
  16. C++面向对象程序设计大作业:魔兽世界(三):开战
  17. 用PS去设计食品网站的展示
  18. html显示当前年份,js如何获取到当前年份 和当前的年份-1
  19. python在无人驾驶中的应用_深度学习在无人驾驶汽车中的应用
  20. Exata卫星通信仿真

热门文章

  1. spring-boot整合FTP文件服务器
  2. xp系统如可用计算机截图,我的是XP系统,用截图软件截取的图片,是如下显示。怎么处理??...
  3. 2023年全球及中国盐酸格拉司琼(试剂)行业头部企业市场占有率及排名调研报告
  4. 如何清理桌面缓存?(更新桌面图标失败解决办法)
  5. wireguard 组多地局域网
  6. 程序员最喜欢的22款软件开发工具
  7. 安装ubuntu系统详细步骤(双系统)
  8. 使用Docker搭建nginx静态资源服务
  9. git global
  10. 链接分析之随机游走模型和子集传播模型