一次不严谨的C++、C、Pascal、Rust等对比

ops/2024/9/20 3:59:03/ 标签: c++, 开发语言, ACM, rust, java

起因

现在ACM用得多的基本上就两种语言,C++和Python3,还有部分Java,但是当年ACM必学的Pascal、新近流行的rust也有人用,只不过用户很少。

就以一道codeforce上的算法小题为样本,来对比一样用户数量、执行效率、易写程度。

题目

https://codeforces.com/contest/1997/problem/C

样本总量:20150

用户数量对比

C++20:7800

C++17:9150

C++11:1550

Python3:1050

Python2:1

Haskell:2

C:45

C#:17

Go:14

Java21:450

Java8:180

Kotlin:9

Pascal(FPC):3

Rust:30

各语言数量差异很大,很直观。基本上是C++统治的时代了。

语言代码量对比

就取各语言中代码量最少的一个

C++20

#include<bits/stdc++.h>
using namespace std;
int t,n,ans;
string st;
int main(){cin>>t;while(t--){cin>>n>>st;ans=n/2;for(int i=0;i<n;i++)if(st[i]=='(')ans+=2;cout<<ans<<endl;}return 0;
}

C

#include <stdio.h>char s[200100];
int main(void){int tt, ii;int ans;int n, i;scanf("%d", &tt);for (ii=1; ii<=tt; ii++){scanf("%d", &n);ans=n/2;scanf("%s", s+1);for (i=1; i<=n; i++){if (s[i]=='('){ans+=2;	}}printf("%d\n", ans);}return 0;
}

C++14

#include<bits/stdc++.h>
using namespace std;
int main(){string st;int t,n,ans;cin>>t;while(t--){cin>>n>>st;ans=n/2;for(int i=0;i<n;i++)if(st[i]=='(')ans+=2;cout<<ans<<endl;}return 0;
}

Python3

for _ in[0]*int(input()):print((y:=int(input()))//2+2*input().count('('))

Pascal

Vart,i,n,dem1:Longint;kq:Int64;a:Array[0..300000] of Longint;
Procedure giai;
Var i:Longint;s:ansistring;
BeginReadln(n);Readln(s);{d1:=0;d2:=0;For i:=1 to length(s) do if i mod 2=0 thenIf s[i]='(' then inc(d1) else inc(d2); Inc(d1);}dem1:=1;a[dem1]:=1;kq:=0;For i:=2 to length(s) doIf s[i]=')' thenBeginkq:=kq+i-a[dem1];Dec(dem1);EndElse if s[i]='(' thenBeginInc(dem1);a[dem1]:=i;EndElse if dem1>0 thenBeginkq:=kq+i-a[dem1];Dec(dem1);EndElseBeginInc(dem1);a[dem1]:=i;End;Writeln(kq);
End;
BEGIN// Assign(input,'contest168c.inp');Reset(input);// Assign(output,'contest168c.out');Rewrite(output);Readln(t);For i:=1 to t do giai();
END.

Rust

rust">use std::io::*;fn main() {let s = read_to_string(stdin()).unwrap();let mut it = s.lines();let mut nx = || it.next().unwrap();let t: usize = nx().parse().unwrap();for _ in 0..t {let _: usize = nx().parse().unwrap();let s = nx().chars();let mut sum = 0;let mut st = vec![];for (i,ch) in s.enumerate() {if ch == '_' {if st.is_empty() {st.push(i);} else {sum += i - st.pop().unwrap();}} else if ch == '(' {st.push(i);} else {sum += i - st.pop().unwrap();}}println!("{sum}");}
}

Java

java">import java.util.*;public class RanitMukherjee {public static void main(String[] args) {Scanner sc = new Scanner(System.in);int t = sc.nextInt();while(t-- > 0) {int n = sc.nextInt();char[] arr = sc.next().toCharArray();int count = 0;for(int i = 1; i < n; i+=2) {if(arr[i] == '(') count += 3;else count++;}System.out.println(count);}sc.close();}
}

Haskell

import qualified Data.ByteString.Char8 as C
import Data.MaybeconstOpen :: Char
constOpen = '('constClose :: Char
constClose = ')'constBlank :: Char
constBlank = '_'parseInt :: C.ByteString -> Int
parseInt x = fst (fromJust (C.readInt x))getInts :: IO [Int]
getInts = doline <- C.getLinelet res = map (parseInt) (C.words line)return resparseStr :: C.ByteString -> String
parseStr x = C.unpack xgetStrs :: IO [String]
getStrs = doline <- C.getLinelet res = map (parseStr) (C.words line)return resfill :: String -> String
fill [x] = [x]
fill (x : y : rest)| (y == constBlank && x == constOpen) = x : constClose : fill rest| (y == constBlank && x == constClose) = x : constOpen : fill rest| otherwise = fill (y : rest)getBracketPairs :: [(Char, Int)] -> [Int] -> [(Int, Int)]
getBracketPairs [] _ = []
getBracketPairs ((c, i) : rest) stack| (c == constOpen) = getBracketPairs rest (i : stack)| otherwise = (i, head stack) : getBracketPairs rest (tail stack)ans :: IO ()
ans = do[n] <- getInts[s] <- getStrslet sFill = constOpen : fill (tail s)let pairs = zip sFill [1 .. ]let bracketPairs = getBracketPairs pairs []let dists = map (\(x, y) -> x - y) bracketPairslet res = sum distsprint resreturn ()main :: IO ()
main = do[t] <- getIntssequence (replicate t ans)return ()

Kotlin

import java.util.LinkedListfun main() {repeat(readln().toInt()) {val n = readln().toInt()val s = readln()var ans = 0Lval bracketPositions = LinkedList<Int>()for (i in s.indices) {var c = s[i]if (c == '_') {c = if (bracketPositions.isEmpty()) '(' else ')'}if (c == ')') {ans += i - bracketPositions.pollLast()}elsebracketPositions.addLast(i)}println(ans)}
}

C#

using System.Text;namespace EvenPositions;
class Program
{private static readonly StreamReader reader = new StreamReader(Console.OpenStandardInput(1024 * 10), Encoding.ASCII, false, 1024 * 10);private static readonly StreamWriter writer = new StreamWriter(Console.OpenStandardOutput(1024 * 10), Encoding.ASCII, 1024 * 10);private static void Main(string[] args){int t = int.Parse(reader.ReadLine());for (int i = 0; i < t; i++){writer.WriteLine(Solve());}writer.Flush();}private static int Solve(){reader.ReadLine();string s = reader.ReadLine();int ans = 0;for (int i = 1; i < s.Length; i += 2){if (s[i] == ')') ans += 1;else ans += 3;}return ans;}
}

总结

一个语言用户数量的多少,最相关的还是难易程度,同样的代码写起来越简单肯定越受人喜欢;其次就是运行效率,尽管简单,过不了运行测试也不行;再就是用户基数,用的人多,学习资料才多,而用户基数就是前面两点确定的。


http://www.ppmy.cn/ops/95696.html

相关文章

浙大数据结构慕课课后题(06-图3 六度空间)

题目要求&#xff1a; 输入格式: 输入第1行给出两个正整数&#xff0c;分别表示社交网络图的结点数N&#xff08;1<N≤103&#xff0c;表示人数&#xff09;、边数M&#xff08;≤33N&#xff0c;表示社交关系数&#xff09;。随后的M行对应M条边&#xff0c;每行给出一对正…

【LeetCode】无重复字符的最长子串

给定一个字符串 s &#xff0c;请你找出其中不含有重复字符的最长子串的长度。 示例 1: 输入: s “abcabcbb” 输出: 3 解释: 因为无重复字符的最长子串是 “abc”&#xff0c;所以其长度为 3。 示例 2: 输入: s “bbbbb” 输出: 1 解释: 因为无重复字符的最长子串是 “b”&…

截屏工具:PixPin

省流&#xff1a;使用 PixPin 截图&#xff0c;设置格式为 JPG。 ‍ 一、介绍 PixPin ‍ 一个好用的截图工具。 官网&#xff1a;https://pixpinapp.com/ ​​ ‍ 支持功能&#xff1a; 截图。支持界面元素识别&#xff0c;支持 CtrlC​ 复制到剪贴板&#xff0c;Ctrl…

docker做Llm开发时可能会遇到的问题

如果没有开启GPU&#xff0c;会报错 docker: Error response from daemon: could not select device driver "" with capabilities: [[gpu]]. 原因可能是 &#xff1a;没有安装 GPU Docker 运行时 则按照如下参照安装&#xff0c; 基于 Docker 的深度学习环境&…

【数据结构与算法】选择排序

选择排序目录 一.问题引入二.图解三.具体实现四.每次找最小值实现五.完整代码 一.问题引入 假设我们想要将此排序按从小到大,那么我们可以怎么排呢? 我们可以每次从里面选择最大的,放在最后面,继续选剩下的最大的放在刚刚放在最后面的前面一个. 每次选择最小的放在前面也是同样…

57qi5rW35LqRZUhS pc.mob SQL注入漏洞复现

0x01 产品简介 57qi5rW35LqRZUhS是大中型企业广泛采用人力资源管理系统。某云是国内顶尖的HR软件供应商,是新一代eHR系统的领导者。 0x02 漏洞概述 57qi5rW35LqRZUhS pc.mob 接口存在SQL注入漏洞,未经身份验证的远程攻击者除了可以利用 SQL 注入漏洞获取数据库中的信息(例…

政务大数据解决方案(六)

政务大数据解决方案通过构建全面的数据集成平台&#xff0c;将来自不同政府部门和公共服务领域的多维度数据汇聚起来&#xff0c;运用先进的数据分析和人工智能技术进行深度挖掘与预测&#xff0c;从而为政府提供实时、精准的信息支持&#xff0c;优化决策流程&#xff0c;提高…

JDBC连接Mysql

一、JDBC实战技术 1.1JDBC概念 JDBC&#xff08;Java DataBase Connectivity&#xff1a;java数据库连接&#xff09;是一种用于执行SQL语句的Java API&#xff0c;可以为多种关系型数据库提供统一访问&#xff0c;它是由一组用Java语言编写的类和接口组成的。JDBC的作用&…

C语言—函数递归

一、递归概念 递归其实是⼀种解决问题的⽅法&#xff0c;在C语⾔中&#xff0c;递归就是函数⾃⼰调⽤⾃⼰。下面举一个例子&#xff1a; 上述就是⼀个简单的递归程序&#xff0c;只不过上⾯的递归只是为了演⽰递归的基本形式&#xff0c;不是为了解决问题&#xff0c;代码最终…

gitlab设置中文

Centos7&#xff08;最小化&#xff09;系统安装部署私人gitlab远程仓库-CSDN博客 目录 登录gitlab 点击edit profile 点击preferences&#xff08;偏好&#xff0c;爱好&#xff09;&#xff0c; 下滑找到Localization&#xff08;本地&#xff09; 点击language&#xf…

redis五种数据结构以及一些基本操作

Redis 支持五种基本的数据结构&#xff0c;这些数据结构使得 Redis 能够灵活应用于各种场景。 字符串&#xff08;Strings&#xff09; 是 Redis 中最基本的数据类型&#xff0c;可以被理解为简单的 key-value 对&#xff0c;其中 value 是字符串。字符串类型的数据可以是任何…

为什么要有二级指针

提示&#xff1a;文章 文章目录 前言一、背景二、 2.1 2.2 总结 前言 前期疑问&#xff1a; 本文目标&#xff1a; 一、背景 之前一直疑问为什么要有二级指针&#xff0c;一直没有写这个帖子&#xff0c;今天整理了一下&#xff0c;收获颇丰 二、 2.1 // 增加对二级指针…

数据可视化之旅,从数据洞察到图表呈现,可视化的产品设计

图表作为数据可视化的重要工具&#xff0c;是对原始数据进行深度加工与解读的有效手段&#xff0c;它助力我们洞悉数据背后的真相&#xff0c;使我们能更好地适应这个由数据驱动的世界。无论是工作汇报、项目实施、产品设计、后台界面还是数据大屏展示&#xff0c;图表都扮演着…

【学习笔记】Day 16

一、进度概述 1、ddnet_main 相关代码学习 二、详情 今天的主要内容是逐句分析 ddnet_main 相关代码&#xff0c;暂未完成&#xff0c;具体整理见明天的笔记。 在阅读代码的过程中&#xff0c;发现自己的 Python 相关代码能力还有些弱&#xff0c;很多语法&#xff0c;用法上的…

已解决ArkTS开发webview,html页面中的input和按钮等操作均无响应

在使用 ArkTS 开发 HarmonyOS 应用时&#xff0c;如果遇到 WebView 中的 HTML 页面元素&#xff08;如 input 输入框和 button 按钮&#xff09;无法响应操作的情况&#xff0c;通常与 WebView 的配置或权限设置有关。以下是常见的原因和解决方法。 1. 启用交互权限 确保你的…

Spring boot 使用 jSerialComm 对串口使用发送信息并接收

什么是 jSerialComm&#xff1f; jSerialComm 是一个 Java 库&#xff0c;旨在提供一种独立于平台的方式来访问标准串行端口&#xff0c;而无需外部库、本机代码或任何其他工具。它旨在替代 RxTx 和&#xff08;已弃用的&#xff09;Java Communications API&#xff0c;具有更…

周报_2024/8/18

周报 时间 2024/8/12——2024/8/18 科研进展 修改了et-bert的微调代码&#xff0c;使用et-bert模型在ISCX-botnet数据集的训练集部分做多分类预测&#xff0c;目前效果&#xff1a;5分类任务&#xff0c;acc0.9938 (930082/935928) 下周计划 1.做实验对比et-bert原论文中的数…

c语言中比较特殊的输入函数

目录 一.getchar()函数 1.基本功能 2.使用方法 (1).读取单个字符 (2).读取多个字符&#xff08;直到遇到换行符&#xff09; (3).处理输入中的空白字符 3.返回值 4.应用场景 5.注意事项 二.fgets()函数 1.函数原型 2.工作原理 3.使用示例 (1).从标准输入读取一行…

Redis主从哨兵模式

简介 主从 – 用法 像MySQL一样&#xff0c;redis是支持主从同步的&#xff0c;而且也支持一主多从以及多级从结构。 主从结构&#xff0c;一是为了纯粹的冗余备份&#xff0c;二是为了提升读性能&#xff0c;比如很消耗性能的SORT就可以由从服务器来承担。 redis的主从同步是异…

电脑监控怎样看回放视频?一键解锁电脑监控回放,守护安全不留死角!高效员工电脑监控,回放视频随时查!

你是否曾好奇那些键盘敲击背后的秘密&#xff1f;电脑监控不仅是守护企业安全的隐形盾牌&#xff0c;更是揭秘高效与合规的魔法镜&#xff01;一键解锁安企神监控回放&#xff0c;就像打开时间宝盒&#xff0c;让过去的工作瞬间跃然眼前。无论是精彩瞬间还是潜在风险&#xff0…