准备编程竞赛的缩写和功能

时间:2011-10-21 00:13:57

标签: r

我明天参加一个大型的编程比赛,我使用R。

时间是主要因素(7个编码问题仅需2小时)。 问题与数学有关。

  1. 在定义函数时,我想写“f”而不是“function”。 这可以完成,我有代码这样做,但我失去了它,找不到它。

  2. 我在哪里可以找到度数输入的sin()函数,而不是弧度?

  3. (可选)是否有任何特定于算法的任务视图或库。

  4. 编程竞赛的任何提示?

  5. 我为比赛准备了以下备忘单: http://pastebin.com/h5xDLhvg

    ========编辑:==========

    所以我终于有时间记下我的经验教训了。

    编程比赛非常有趣,但不幸的是我得分不是很高。我排在前50%,但我的目标是进入前25%。

    主要问题是编程的时间非常短,总共只需2个小时。但我必须阅读问题描述,而且我还需要一些时间将结果粘贴到网络表单等中,所以它更像是90分钟的编程。

    希望12月的下一场比赛能延长时间,比如3-4个小时。组织者说也许会是这样。

    此外,比赛没有互联网访问,我的移动接待工作也没有真正起作用。

    对我而言,主要的教训是你必须使用你日常使用的语言才能获得真正的机会。特别是,如果只有大约90分钟的时间来编程。由于我在日常工作中使用的是haskell而不是R,我认为R不是最好的选择。在比赛期间,我混淆了haskell和R函数定义,并且我编写了太多小错误来编程得足够快。

    比赛的好处是,大约有80名参赛者共获得了大约2万美元的奖金。因此,前25%的参与者每人获得500至1500美元。此外,我认为排名前15%的人可以立即找到一家赞助商IT公司的工作。

    所以这是一个双赢的局面。这很有趣,而且你可以获得奖金。此外,IT公司非常高兴,因为他们可以访问顶级程序员。

    我利用这个机会与IT决策者交流。其中一个来自一家大银行。我大胆地建议他们考虑转换到Scala进行开发(来自Java的转换)。还要考虑使用R和Haskell。这很有趣,他们甚至说他们已经看过Scala了!

    有趣的是,我最好的朋友之一在比赛中取得了很好的成绩。他只有19岁,但他在前20%中排名第一,获得了500美元的奖金。他打败了我和我的6所大学,他们都拥有可敬的计算机科学学位。我的朋友程序更像是黑客风格,但他的速度非常快。

    排名前10的人使用: 1)Java 2)C#和 3)C ++ (前10名中没有其他编程语言!)。 我认为唯一合理得分的编程语言是Ruby。

    对于下一次比赛,选择的编程语言可能是haskell。出于一个原因,为haskell找到2个队友比为R编程更容易。最多可以有3人组成团队。

    我的理想情景是一个非常轻量级的框架,我可以同时使用多种编程语言进行比赛。这样,主代码可以用haskell编写(所有队友都可以编程)。一些特定的函数可以用R,Mathematica,甚至其他编程语言(如python / sage)编写。

    这听起来有点矫枉过正。但我认为这将是非常有用的。就像一个函数,它有一个矩阵作为参数并返回一个矩阵。然后这个框架工作从R代码自动生成RESTful服务,所以我可以从任何编程语言调用R函数。矩阵只是作为JSON数据(或其他一些序列化)传递。好的,但这不是主题......

    最后一些经验教训作为子弹列表:

    • 不带食物。你没有时间吃饭,之后有丰盛的自助餐
    • 时间是限制因素!
    • 如果您不以R为生,请不要使用R
    • 寻找有更多时间的比赛(最少3-4个小时!)
    • 总而言之,比赛的概念非常棒!既为参与者,也为赞助商。

    非常感谢'Iterator'帮助他的职位!!

3 个答案:

答案 0 :(得分:24)

我将回答一个相关但又不同的问题。没有冒犯,但你的原始建议对于编程竞赛来说似乎并不明智。在这种情况下花费的大部分时间是设计答案和调试(或者更好,避免调试的需要)。

相反,我将回答这个问题:“R中的哪些关键资源对快速原型设计很有用,重点是能够快速查找资源,能够快速调试,以及能够快速调查数据?如果我需要使用数值优化方法和代数系统,我应该调查什么?“

以下是我的答案:

  1. 安装RStudio或可能是Revolution Analytics的R,具体取决于哪种界面更适合您。两者都很好。前者具有非常流畅的GUI,后者具有更强大的界面,具有更多管理代码的功能。两者都有一些关于“社区”R的一些不错的属性,关于能够快速查找信息和导航帮助库。
  2. 熟悉example(),确定从哪里获取小插曲和教程(来自CRAN上的软件包页面),并简要了解demo()
  3. 使用sos库,掌握findFn
  4. 查看CRAN上的任务视图 - 确保您了解高性能计算的工具(如果这将是相关的)和优化工具 - 需要使用某种求解器,这是很常见的,有a task view for that
  5. 如果您的代码在原型设计或竞争过程中运行缓慢,则需要运行Rprof()。先把它旋转一下。如果您的代码涉及很多迭代,您也可以使用compiler包。简而言之: 您不想在计算机上等待。 您还可以查看foreachdoSMPdoMC你可以将工作分配到不同的核心。要汇总结果,请熟悉plyrldply等方法以及标准*apply函数,例如lapplyapply;另一个值得了解的好事是rapply。 (如果您需要处理大量内容并且需要一些时间,请查看mclapply.parallel函数的plyr参数。)
  6. 在Stack Overflow上:浏览JD Long's questions - 在你想要问之前,你会发现很多你不知道的东西。已经有答案了。
  7. 为自己创建一些小代码模板。掌握功能,这样您就不需要急于学习。使用debug()browser()
  8. 了解如何调试和逐步完成这些操作
  9. 如果你需要计算一些事情,请学习如何使用hash包(类似于Perl和Python哈希表)并学习如何使用digest来解决那些太长而无法用于{的问题。 {1}}(参见this question了解参考资料)
  10. 如果您需要绘制内容,请使用hashplot以及ggplot2hist和其他一些方式准备一些基本示例图。其他。如果你还不知道boxplot,那么推迟,但你应该熟悉它。如果您碰巧使用了大量数据,请确保知道ggplot2。如果您必须与数据进行互动,请了解hexbin及其中的有趣工具,例如iplotsiplot和平行坐标图(ihist)。
  11. 确保您知道如何使用列表,数据框和矩阵,包括下标,查找基于(行,列)索引的条目。 (同样,请务必调查ipcp以转换和操作其中一些对象。)
  12. 熟悉plyr - 对于您可能对数据框架和矩阵执行的许多操作而言,它非常有效。
  13. 如果你需要进行符号数学,请确保你知道那些包,或者获得另一个独立的符号数学工具。 Ryacas是一个看似有用的软件包。
  14. 在Nutshell中获取R的PDF,以便您可以快速搜索其中的有用方法。否则,得到这本书。各种其他书籍,如Venables&根据您的经验,Ripley,R Cookbook和其他人可能会有用。
  15. 如果您已经掌握了一个好的编辑器(例如emacs)或IDE(例如Eclipse),请坚持使用它并寻找与R的绑定。否则,您可以立即开始使用的一个简单的是Notepad ++。能够进行块选择是编辑器中非常有用的属性。能够搜索代码示例的整个目录层次结构是另一个有用的功能。
  16. 如果您需要做任何涉及数据库数据的事情,您可能想知道data.table()RSQLite,尽管这些可能与数学竞赛无关。
  17. 打开一堆R实例,以便您可以尝试一下。 :) [这实际上很严重:通过运行多个实例,您可以在一定程度上避免与顺序尝试,等待结果,然后调试结果相关的延迟。]

答案 1 :(得分:8)

对于(1),您可以执行类似

的操作
f <- function(..., body)
{
    dots <- substitute(...)
    body <- substitute(body)
    f <- function()
    formals(f) <- dots
    body(f) <- body
    environment(f) <- parent.env(environment())
    f
}

允许你编写,例如g <- f(x, y, body=x+y),但我不确定你能走多远。

答案 2 :(得分:5)

对于(2),你可以这样做:

sindeg <- function(x) sin(x*pi/180)