作者都是各自领域经过审查的专家,并撰写他们有经验的主题. 我们所有的内容都经过同行评审,并由同一领域的Toptal专家验证.
Eva Bojorges Rodriguez的头像

Eva Bojorges Rodriguez

Toptal的拉丁美洲社区领导者, Eva专门研究人工智能,并在世界各地的活动中发表关于博弈论和数据科学的演讲.

Previously At

Docker Inc
Share

Toptal开始了JavaScript编码挑战 web app 作为吸引人们来我们的展台的一种方式. Seeing how successful it was, 我们决定在网上做一个试点, 对我们社区和他们的网络中的每个人开放.

Toptal的JavaScript速度编码挑战的截图,显示了第一个问题. A function named "double" is supplied, and its body consists of a comment, "return x doubled."

At launch time, 我们鼓励有动力的开发人员想出创造性的方法,在整个JavaScript编码挑战中获得高分. 伟大的独立自由职业者的一些关键成功因素是能够跳出框框思考,并在一系列限制条件下找到创造性的工作方式.

JavaScript编码挑战问题

护手是由一些 JavaScript 问题——类似于那些可能被用作 interview questions-从非常基本的JavaScript挑战问题:

box.double = function double (x) {
    //return x doubled
    
    
};

…to more intermediate ones:

box.dateRank =函数dateRank (x) {
    // x以字符串形式表示2019年的日期(例如:"06/30/2019")
    //返回2019年当天的排名(i.e.,“09/01/2019”翻译成244)
};

我们希望初学者和高级开发人员都能玩得开心,并邀请他们的朋友和同事与他们竞争最高分. 这些问题是按分数排序的,所以即使是初级开发人员也可以得到一些分数. 得分相同的问题的顺序是随机的, 所以每次的体验都略有不同, 而整个星期的全套问题都是一样的.

目标是在三分钟的时间限制内完成尽可能多的任务. 以防有人找到一种方法来完成JavaScript编码挑战中的所有任务, 每剩一秒得10分. 我们允许多次尝试来完成挑战.

我们预计会发生的第一件事是人们会花一些时间来 solve the questions 在一个悠闲的节奏,然后复制和粘贴到web应用程序的答案.

在进行了1小时40分钟的挑战之后, 第一个人按照这个方法得到了应用程序允许的1445分, 再加上我们每剩一秒就给的额外分数.

JavaScript编码挑战的转折点

使用复制-粘贴方法, 顶尖选手专注于自己编写答案并没有什么好处. 相反,他们把注意力转向提高自动化技能的速度.

此时最简单的方法是编写一些JavaScript来解决每个任务,同时等待一个循环,直到按钮准备好, 并将其复制粘贴到浏览器控制台:

const solutions = {
  'double': 'return x*2',
  'numberToString': '...',
  'square': '...',
  'floatToInt': '...',
  'isEven': '...',
  'squareroot': '...',
  'removeFirstFive': '...',
  // ...
  'dateRank': '...',
  // ...
};
const get_submit_button = () => document.querySelector('.task-buttons > .col > .btn');
const solve = () => {
  const ace_editor = ace.edit(document.querySelector('.ace_editor'))
  const submission = ace_editor.getValue()
  for (const key in solutions) {
    if (submission.includes('box.' + key + ' ')) {
      ace_editor.insert(solutions[key])
      get_submit_button().click()
      setTimeout(() => {
        get_submit_button().click()
        setTimeout(() => {
          solve()
        }, 400)
      }, 900)
      return
    }
  }
}
solve()

这个部分也可以使用常规的自动化工具,如 Selenium. 但更快的方法是自动化使用API,将解决方案发送给任务:

Const request = require('request');
const runTask = (data, entryId, callback) => {
  const tests = data.nextTask.tests_json;
  const results = Object.fromEntries(
    Object.entries(tests).map(([key, value]) => [key, value.result])
  );
  request.post(`http://speedcoding.shandonghotspot.com/webappApi/entry/ $ {entryId} / attemptTask”{
    form: {
      attempt_id: data.attemptId,
      tests_json: JSON.stringify(results),
    },
  }, (error, res, body) => {
    if (error) throw error;
    const next = JSON.parse(body).data
    if (next.isChallengeEntryFinished) {
      callback(next)
      return
    }
    运行任务(next, entryId, callback)
  });
}
const runEntry = (callback) => {
  request.post('http://speedcoding.shandonghotspot.com/webappApi/entry', {
    form: {
      challengeSlug:“toptal-speedcoding”,
      email: ...,
      leaderboardName: ...,
      isConfirmedToBeContacted: ...,
      dateStop: ...
    },
  }, (error, res, body) => {
    if (error) throw error;
    const {
      data
    } = JSON.parse(body);
    const entryId = data.entry.id
    运行任务(data, entryId, callback)
  });
}
runEntry(console.log)

One thing to note is that, 在这个版本的速度编码挑战, 代码只在客户端进行了测试. Because of this, 简单地将答案发送给测试用例而不是代码是可能的. 这允许进行优化,并在客户端减少一些毫秒.

After three days, 比赛真的开始白热化了, 每三小时桶的尝试次数突然从不到1次,000 to nearly 100,000.

三天来,分数保持不变. 有些人正在为他们的代码编写微优化, 有几个人循环提交了他们的解决方案, 希望服务器不会那么拥挤,这样他们就能领先几分. We were due for a big surprise.

打破JavaScript编码挑战的最高分

First, 让我们快速计算一下:完成所有任务,我们总共获得1445分, 时间为180秒. 如果我们在应用程序中每秒钟奖励10分, 在立即提交所有答案的情况下,理论上可以达到的最高分数是3245分.

我们的一个用户获得了超过6000的分数,随着时间的推移,这个分数一直在稳步增长.

怎么会有人得到这么高的分数?

经过简短的回顾,我们发现发生了什么. 我们的顶级选手,一个专业的全栈开发人员和Toptaler拥有超过15年的经验 competitive programming 经验丰富,发现了漏洞设置的编码挑战. He spawned multiple bots, which slowed down the server; meanwhile, 他可以尽可能多地完成相同的任务(即获得最多分数的任务),并将分数分配给单个条目, 不断增加条目的分数.

This wasn’t against the rules, as we allowed for creative solutions; however, 他使用的特定方法导致服务器相当繁忙, 使其他人的网络请求变慢. 我们做的第一件事就是提高服务器的能力, which only made him go from 56,000 to 70,000分,保持第一名的位置.

而我们不想干预人们与挑战互动的方式, 这些尝试降低了服务器的速度,以至于其他用户很难使用该挑战, 所以我们决定修补这个漏洞.

这个修复使得其他人不可能在JavaScript编码挑战的最后一天获得相同的分数. 正因为如此,我们决定增加给顶级选手的奖项数量. 最初,最高奖项——一对airpods——应该只颁发给一名顶级选手. 最后,获得前六名的人获得了AirPods.

卑微的开始和可怕的结束:一些JavaScript编码挑战统计

即使是我们的最高分选手在开始时也遇到了一些困难. In fact, 在所有尝试了五次以上的人中, 任何人第一次尝试的最高分数是645分, 这组人第一次尝试的平均得分只有25分.

By the end of the contest, 人们可以从尝试的总次数中猜测正在尝试的策略. 而有些人比其他人更有效率, 遥遥领先的选手尝试次数最多.

A combined, 对数柱状图显示前20名选手的最高分数和总尝试次数. 而尝试次数最多的是得分最高的人, the second-, third-, 第四高的尝试次数是13次, ninth-, and second-place contestants, respectively. Exactly half of the top 20, 包括第四名和第六名的选手, had under 1,000 attempts. 有两名选手尝试次数不足100次,还有一名选手甚至不足10次.

Moving Forward

What does the future hold?

这只是第一次JS编码挑战迭代. 我们希望在未来做更多的JavaScript编程挑战,学习吧 lessons 从之前的运行,使它更加令人兴奋. 我们要做的第一件事是实现尝试节流,以限制提交的数量. 我们还希望扩展到JavaScript中的编码挑战之外, 使它们在广泛的编程语言中可用.

Lastly, 同时我们正在采取措施使JavaScript编码挑战更加安全, 我们计划继续允许使用机器人和其他创造性的方法来应对未来的挑战.


Special thanks to Pavel Vydra, Anton Andriievskyi, Tiago Chilanti, and Matei Copot 感谢他们对挑战和这篇文章的贡献,感谢@Zirak open-source project 这构成了比赛应用程序的基础. 同样,感谢每一个参加和跑过比赛的人.

Understanding the basics

  • 我如何练习编程挑战?

    成为解决编码挑战的专家, 你应该通过选择越来越难的问题来不断提高自己. Toptal的JavaScript挑战包含大量的任务难度级别. 不要跳过那些看起来乏味的问题:唯一提高自己的方法就是集中精力解决这些问题.

  • What is a JavaScript challenge?

    JavaScript挑战旨在测试您在定时环境中的编程知识. To complete one successfully, 您应该能够智能地选择数据结构并快速设计算法.

  • 我可以在哪里练习JavaScript编码?

    Exercism, Codewars, Codility, 和Toptal的速度编码挑战(如果可用)是练习JavaScript编码的好地方-竞争或其他.

聘请Toptal这方面的专家.
Hire Now
Eva Bojorges Rodriguez的头像
Eva Bojorges Rodriguez

Located in Mexico City, Mexico

Member since November 11, 2014

About the author

Toptal的拉丁美洲社区领导者, Eva专门研究人工智能,并在世界各地的活动中发表关于博弈论和数据科学的演讲.

Toptal作者都是各自领域经过审查的专家,并撰写他们有经验的主题. 我们所有的内容都经过同行评审,并由同一领域的Toptal专家验证.

Previously At

Docker Inc

世界级的文章,每周发一次.

订阅意味着同意我们的 privacy policy

世界级的文章,每周发一次.

订阅意味着同意我们的 privacy policy

Toptal Developers

Join the Toptal® community.