Uploaded avatar of iHiD

是时候深入探索了!

@iHiD
接近4年前
视频

在 Exercism 上解决一个练习只是第一步。 真正的学习才刚刚开始!

本周,我们为练习推出了全新的“Dig Deeper”标签页。它旨在帮助你超越解题阶段,探索一个练习的细微之处和各种取舍,而无需向导师提问。

简介

对于我们的练习,大家提交的解答千差万别。 在大多数语言轨道中,最基础的“正式”练习是TwoFer。 一份典型的提交的解答长这样(这里用的是 Ruby,但大多数语言都类似):

module TwoFer
  def self.two_fer(name='you')
    "One for #{name}, one for me."
  end
end

然而,在最近通过测试的 500 份提交的解答中,有 350 多份是独一无二的 😲 即使你把空白字符、变量名这类东西都标准化,仍然有超过一半是真正独一无二的提交的解答。

所以,看看大家是怎么解题的,会是一件特别有意思的事。 但这又完全不现实。Exercism 上有数百万份提交的解答,把它们全部读完,真的需要花上一辈子。

不过!我们的团队设计了这些练习,也指导过数十万人完成它们,所以对大家采用的各种解题思路相当了解。 因此我们新增了“Dig Deeper”标签页,用来展示解决同一个练习的各种地道(或者不那么地道,但很有意思)的方式。

一个例子

我们来看一个例子,看看它是怎么运作的。 在 C# 中,翻转字符串有多种方式。

你可以使用Array.Reverse()方法:

var chars = input.ToCharArray();
Array.Reverse(chars);
return new string(chars);

或者用更短的、基于 LINQ 的方式:

return new string(input.Reverse().ToArray());

也可以用一个StringBuilder:

var chars = new StringBuilder();
for (var i = input.Length - 1; i >= 0; i--)
{
    chars.Append(input[i]);
}
return chars.ToString();

甚至可以稍微不那么地道(但性能更好!),改用Span<T>:

Span<char> chars = stackalloc[input.Length];
for (var i = 0; i < input.Length; i++)
{
    chars[input.Length - 1 - i] = input[i];
}
return new string(chars);

我们把每一种都称为一种“解题思路”,每一种都有独立的文章进行讲解。 这个练习的 Dig Deeper 页面把它们汇集在一起,还附有一篇探讨性能取舍的文章。

👉🏾 点这里看看(如果你还没解决这个练习,需要开启无痕模式)

还有更多!

除了这些关于不同解题思路的文档,我们的社区还制作了成千上万个视频:有的探讨练习,有的录制讲解,有的直播编程,还有的深入剖析地道的解答是怎么写出来的。 我们正在收集所有这些视频,并把它们放到页面上。

参与进来

在接下来的几周里,你会看到 Dig Deeper 标签页陆续出现在网站上的各个练习中。

如果你想贡献一种解题思路、一篇练习文章,或者告诉我们你的视频以便我们收录,请联系 jonathan@exercism.org,他会帮你上手。

最后,告诉我们你的想法,也把你的点子和意见发到论坛帖子里!

2022年10月30日 · 觉得有用吗?