关于周赛 328·T2 暴力没有被 re 这件事,以及刷题语言选择这件事儿【水】
4368
2023.01.18
2023.01.18
发布于 未知归属地
  1. 侥幸上分的一场周赛
  2. 最适合的刷题语言?伪命题🤣?
  3. 原因猜测
  4. 吵架专区

侥幸上分的一场周赛

第二次正式参加周赛,这次分数更新的比较貌似比上次早。

这场周赛中,由于眼神不好,外加数学是幼儿园体育老师教的,我把 T2 的暴力步数当成了 ,然后勇敢地暴力提交,并侥幸 AC。被网友指出后,我已经对结果「自暴自弃」,等待被 rejudge。

没想到,rejudge 的达摩克里斯之剑,居然没掉下来,我居然涨了 33 分🤣🤣。

真的好心虚,因为我看到大家在疯狂吐槽。吐槽点主要有 2:

  1. 凭什么 T2 java 能过,C++ 和别的语言不能过。对了,我用的 java。
  2. 为什么光 re T3、T4,而无视 T2。

我一开始还在想,会不会官方已经 re 了第二题了,只是 java 暴力解法在被 re 后依然胜出了?毕竟有人已经在 github 了和官方提交了新的 case,我觉得 leetcode 官方不会这么狗,但是这个 issue 确实没有被官方采纳,我也不懂官方说的 library limitations 是啥意思:

image.png

最适合的刷题语言?伪命题🤣?

我目前只会 4 种语言,并且都在生产环境中用过:javascript、java、python、php。我最开始刷题的时候,本来是用 javascript 的,毕竟这是我的编程母语(别惊讶,我是非科班转码,web前端出身,不会 C 语言),而且我很爱它灵活。

但是我发现用 js 刷题,执行时间的方差极大。哪怕完全一样的 js 代码多次提交,其执行时间也是天差地别,仿佛是 leetcode 的程序员随机给了个数一样🤣。这种体验太差了,完全体现不出不同算法的优劣程度。

我猜想,可能是因为 js 这样的语言太靠近应用层了,需要用在 V8 之类的引擎上。所以我决定选择一门更靠近机器底层的静态语言来刷题。(ps:这只是基于我贫瘠的认知,求轻喷哈哈。毕竟怎么样才算是“靠近底层”,我也说不清楚。靠近底层的语言,是不是相同代码相同机器下执行时间的方差真的更小,我也不知道)。

但是我又不会 C/C++,在我的认知里,只有和硬件打交道的大佬们才玩这个(也是基于我对 IT 的浅薄认知,大概率不符合事实,求轻拍)。 Python 是出了名的慢,慢到让人哭泣的那种。php 太久不用早忘了,而且在慢这一点上,应该和 python 是难兄难弟。

所以我只能用 java 了哈哈,换成 java 后,执行时间确实稳定了太多太多。然后,这次侥幸涨了 33 分。

我试了一下 周赛 328 T2 在不同语言下的暴力写法,C++、python2、python3 都TLE 了,但是 java 和 js 都 ok。

C++
Java
JavaScript
Python3
python2
/*超时*/
class Solution {
public:
    vector<vector<int>> rangeAddQueries(int n, vector<vector<int>>& queries) {
        vector<vector<int>> ret(n, vector<int>(n, 0));
        for(vector<int> q: queries){
            for(int i = q[0]; i <= q[2]; i++){
                for(int j = q[1]; j <= q[3]; j++ ){
                    ret[i][j]++;
                }
            }
        }
        return ret;
    }
};

原因猜测

对这个结果我还是很迷的。我认知里最快的 C++ 会超时,而网友安利最多的最好刷题语言 python居然也超了。🤣。

我只知道如何在程序内部统计程序自身某个片段的执行时间,但是我不了解算法竞赛中,是如何在程序外部求出算法程序的实际运行时间的。下面是基于我贫瘠的认知,进行的一番头脑风暴,大家控制一下嘲讽的欲望,一起讨论或教一下我:

  1. 或许有一些 linux 命令,可以简单地做到这一点?比如通过 linux 下的 time 命令。
  2. 又或许,对不同的编程语言,要通过不同的方式来进行?毕竟每个算法都有入参和出参,我的大脑实在想不出如何在 linux 这一层,如何将入参喂给不同语言写成的算法的。所以我猜测,可能还是要对不同的语言语言,将用户提交的算法代码进行统一包装,得到一个该语言版本的“包装程序”,然后再调用 time调用这个包装程序。
  3. 编程语言有静态的,有动态的。如果是 C/C++,统计出的是编译后的可执行程序的运行时间;如果是 java,统计出来的 java 虚拟机程序运行编译产出物的时间;如果是 python,统计出的是 python 解释器执行“包装程序”的时间;如果是 javascript,统计出的是 v8 引擎(或者别的)执行“包装程序“的时间。
  4. 对于需要编译的语言,要保证对所有用户代码的编译参数的统一。
  5. 对于所有用户,必须在相同的机器中执行其代码;并且统计算法执行时间时,机器中不能运行其他的程序。
  6. 以【题目-语言-测试用例集】为联合主键,对每道题设置一个 TLE 的阈值,这个值具有一定的主观性。 否则就不不会出现 C++ TLE了,但是 java 没有的情况。或许,将这道题 C++ 的 TLE 阈值提高一点,或者将 java 的阈值降低一点,会更公平一点?
  7. 因为 TLE 的阈值有一定的主观性,所以可能出现:一个算法,在 AC 和 TLE 的边缘来回试探的情况。我觉得这个基本无解,只能调整心态:这一场你侥幸过关了,要明白下一场可未必;这一场不幸被 re 了,下一场你也可能侥幸过关🤣

原谅我比较懒,我对这个问题只想直接要答案,就不自己去研究了🤣,哪位小伙伴有这方面的知识,可以甩我几个链接,我去看看。 如果@LeetCode官方的程序员,来分享一个这个话题,那就更棒了哈哈。

吵架专区

什么是最好的编程语言,这几乎是 IT 界的月 jing 问题了。

我对编程语言没那么纠结,毕竟都是图灵完备的,我对因为语言卡求职者的面试官(比如要求必须有 nodejs 服务器端开发经验,我有两年 java 服务器端经验都不能行),一直都深深地鄙视。毕竟,学一门新语言没多少难度,一门语言之所以流行,我觉得本质上还是取决于其生态的繁荣度和使用人数。

对了,我特别讨厌 TypeScript,我觉得这门语言不伦不类,完全破坏了 js 灵活好用的特色,毒化了本来就混乱的前端生态。我觉得搞后端的同行想顺便玩一下前端,就好好学一下 js,不要发明 TypeScript 这种怪物来折磨日子本来就不好过的前端。我被迫需要 996,但真的不想被迫学 TS。

前端都发展这么多年了,居然还在编程语言里折腾,我真为自己感到悲哀。生命有限,我想探索世界更多的规律,但是我真的不想在编程语言选择这个层级上来回打转。程序员为啥要这样难为程序员??

我可以为了找工作,捏住鼻子去学习 TypeScript,也可能我学完后会觉得真香。但是,我现在真的很厌恶他。我已经失业半年了,有两次面试就是因为我流露出对 TypeScript 的恶感,惨遭淘汰。

我甚至因此不想做前端了。

TypeScipt 的信仰者,如果香喷我,你不妨假设一下,有朝一日你也 35 了,辛辛苦苦任劳任怨工作 12 年,掌握的一手好 TypeScipt 并引以为傲,然后突然发现你失业了;你信心满满地重新找工作的,发现所有的公司都要求你精通 ShiftScript 这样一门新语言,你会作何感想?

我相信你,正如相信我,我们都可以不费力地学会 TypeScipt、ShiftScript 或者 ShitScript;但是生命有限,注定要被用来折腾的生命,应该折腾在更值得的地方。

评论 (55)