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

news2024/11/24 20:58:23

起因

现在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

Var
  t,i,n,dem1:Longint;
  kq:Int64;
  a:Array[0..300000] of Longint;
Procedure giai;
Var i:Longint;
    s:ansistring;
Begin
  Readln(n);
  Readln(s);
  {d1:=0;d2:=0;
  For i:=1 to length(s) do if i mod 2=0 then
    If s[i]='(' then inc(d1) else inc(d2); Inc(d1);}
  dem1:=1;
  a[dem1]:=1;
  kq:=0;
  For i:=2 to length(s) do
    If s[i]=')' then
      Begin
        kq:=kq+i-a[dem1];
        Dec(dem1);
      End
    Else if s[i]='(' then
      Begin
        Inc(dem1);
        a[dem1]:=i;
      End
    Else if dem1>0 then
      Begin
        kq:=kq+i-a[dem1];
        Dec(dem1);
      End
    Else
      Begin
        Inc(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

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

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.Maybe

constOpen :: Char
constOpen = '('

constClose :: Char
constClose = ')'

constBlank :: Char
constBlank = '_'

parseInt :: C.ByteString -> Int
parseInt x = fst (fromJust (C.readInt x))

getInts :: IO [Int]
getInts = do
	line <- C.getLine
	let res = map (parseInt) (C.words line)
	return res

parseStr :: C.ByteString -> String
parseStr x = C.unpack x

getStrs :: IO [String]
getStrs = do
	line <- C.getLine
	let res = map (parseStr) (C.words line)
	return res

fill :: 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] <- getStrs
	let sFill = constOpen : fill (tail s)
	let pairs = zip sFill [1 .. ]
	let bracketPairs = getBracketPairs pairs []
	let dists = map (\(x, y) -> x - y) bracketPairs
	let res = sum dists
	print res
	return ()

main :: IO ()
main = do
	[t] <- getInts
	sequence (replicate t ans)
	return ()

Kotlin

import java.util.LinkedList
 
fun main() {
    repeat(readln().toInt()) {
        val n = readln().toInt()
        val s = readln()
 
        var ans = 0L
        val 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()
            }
            else
                bracketPositions.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.coloradmin.cn/o/2063810.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

校园综合服务小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;用户管理&#xff0c;卖家管理&#xff0c;发布信息管理&#xff0c;订单信息管理&#xff0c;类型管理&#xff0c;系统管理 微信端账号功能包括&#xff1a;系统首页&#xff0c;发布信息&#xff0…

【PyCharm】从零到一:Python爬虫实战教程,小白、绕过反爬虫机制、实战案例全解析

文章目录 前言一、使用的工具二、安装必要的库三、编写程序1.引入库2.发送GET请求3.绕过反爬虫机制4.解析HTML内容5.输出需要的内容 四、完整源码总结 前言 爬虫&#xff08;Web Crawler&#xff09;是一种自动浏览万维网并从中收集信息的程序。它们常被用于搜索引擎、数据分析…

基于UDP/TCP的 c/s 通信模型

基于UDP c/s通信模型 客户端&#xff08;socket&#xff1b;sendto ...&#xff09; 服务器端 ---把自己的地址公布出去 &#xff08;socket&#xff1b;bind //绑定&#xff1b; recvfrom ...&#xff09; 1.recvfrom函数&#xff1a; ssize_t recvfrom( int sockfd, /…

浮毛难清除、异味难消散?选到不好的宠物空气净化器会有什么危害

近年来&#xff0c;不少人家里都养了宠物&#xff0c;有些是猫、有些是狗&#xff0c;甚至有些是兔子&#xff0c;不少人希望能通过它们抒发心中的郁闷&#xff0c;成为自己的搭子。这些宠物在能带来欢乐的同时也会带来一些小烦恼&#xff0c;比如宠物的浮毛、异味都困扰着我们…

Linux日志管理基本介绍及日志轮替原理

&#x1f600;前言 本篇博文是关于日志管理&#xff0c;希望你能够喜欢 &#x1f3e0;个人主页&#xff1a;晨犀主页 &#x1f9d1;个人简介&#xff1a;大家好&#xff0c;我是晨犀&#xff0c;希望我的文章可以帮助到大家&#xff0c;您的满意是我的动力&#x1f609;&#x…

ai智能写作生成器哪个好用?推荐五款!

在内容创作日益重要的今天&#xff0c;ai智能写作生成器成为了众多创作者的得力助手。它们不仅能提高写作效率&#xff0c;还能提升写作内容的质量。然而&#xff0c;市场上的ai智能写作生成器众多&#xff0c;选择一个合适的生成器并非易事。本文将为你推荐5款好用的ai智能写作…

[图解]用例规约之业务规则不是算法

1 00:00:01,530 --> 00:00:03,090 像这种某某算法之类的 2 00:00:03,100 --> 00:00:04,130 它往往是什么 3 00:00:05,590 --> 00:00:07,440 某种实现的一个选择 4 00:00:08,140 --> 00:00:09,550 它很可能不是需求 5 00:00:10,620 --> 00:00:13,240 你要问他…

汉服推广网站

TOC springboot0790汉服推广网站 绪论 1.1研究背景 随着网络不断的普及发展&#xff0c;汉服文化平台网站依靠网络技术的支持得到了快速的发展&#xff0c;首先要从用户的实际需求出发&#xff0c;通过了解用户的需求开发出具有针对性首页、汉服知识、服装展示、用户相册、…

实训day34(8.22)

一、回顾 高并发集群 饿了么后端的登录模块 1、数据库 1. 主从复制(高可用) 2. 传统的主从复制 3. gtids事务型的主从复制 4. 注意 1. server_id唯一 2. 8.x版本需要get_ssl_pub_key 3. 5.x不需要 4. change master to 5. stop | start slave 5. 非交互 import pymys…

Redis7基础篇(八)

redis集群 是什么 能干吗 集群算法-分片-槽位slot redis集群的槽位slot redis集群的分片 分片和槽位的优势 槽位映射的解决方案 上面的三个方案分别对应了小厂 中厂 大厂 哈希槽取余分区 缺点 一致性哈希算法分区 小总结 哈希槽分区 经典面试题 这里说的redis是ap而不是cp的 …

全球著名地标卫星影像收藏第3辑

世界那么大&#xff0c;一起去看看&#xff01; 我们在《全球著名地标卫星影像收藏第2辑》一文中&#xff0c;为大家分享了10全球著名地标高清卫星影像&#xff0c;现在继续为大家分享10个著名地标。 我们整理的这些地标KML文件可以分享大家&#xff0c;你也可以打开相应的UR…

哪款骑行耳机值得入手?精选五款热门骑行耳机实测分析!

骨传导耳机作为骑行爱好者最受欢迎的数码装备之一&#xff0c;凭借其独特优势在骑行爱好者中广受好评&#xff0c;然而由于骨传导耳机市场上品牌众多&#xff0c;它们的品质良莠不齐&#xff0c;让众多消费者无从下手&#xff0c;特别是那些缺乏专业技术支撑的劣质产品&#xf…

Day97:云上攻防-云原生篇KubernetesK8s安全APIKubelet未授权访问容器执行

知识点&#xff1a; 1、云原生-K8s安全-名词架构&各攻击点 2、云原生-K8s安全-Kubelet未授权访问 3、云原生-K8s安全-API Server未授权访问 K8S集群 Kubernetes是一个开源的&#xff0c;用于编排云平台中多个主机上的容器化的应用&#xff0c;目标是让部署容器化的应用…

83.游戏改造-窗口化

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 内容参考于&#xff1a;易道云信息技术研究院 上一个内容&#xff1a;82.游戏改造-修改分辨率 逆向窗口化的思路&#xff1a; 首先使用Ollydbg工具打开 82.游…

《重温JavaScript五子棋小游戏》

目录 全部运行代码&#xff1a;五子棋游戏的基本步骤&#xff1a;代码剖析&#xff1a;1. 初始化游戏界面2. 管理游戏状态3. 玩家交互4. 电脑AI5. 胜负判定6. 游戏控制 本文通过实现一个基本的五子棋游戏&#xff0c;展示了如何使用HTML、CSS和JavaScript来构建一个简单的交互式…

校园疫情防控系统

TOC springboot0780校园疫情防控系统 第1章 绪论 1.1背景及意义 随着社会的快速发展&#xff0c;计算机的影响是全面且深入的。学校管理水平的不断提高&#xff0c;日常生活中学生对校园疫情防控方面的要求也在不断提高&#xff0c;学生的人数更是不断增加&#xff0c;使得…

虚幻5|AI视力系统,听力系统,预测系统(3)预测系统

虚幻5|AI视力系统&#xff0c;听力系统&#xff0c;预测系统&#xff08;2&#xff09;听力系统-CSDN博客 一&#xff0c;添加一个AI预感感官配置 1.选中我们的AIPerception,右侧细节添加一个AI预感感官配置&#xff0c;然后我们把所有感官的年龄都调成5&#xff0c;是所有 2…

jmeter——添加测试片段

问&#xff1a;为什么要添加测试片段&#xff1f; 答&#xff1a;在测试的过程中&#xff0c;有可能遇到这一个测试需要上一个测试为前提的情况&#xff0c;例如&#xff1a;登录之后才能下单&#xff0c;所以先要进行登录&#xff0c;因此就用到【测试片段】。 1、右键【测试…

网络协议概述,ip协议,TCP协议,udp协议,二者区别,python中用socket类实现网络通信程序的编写(服务器套接字实现TCP编程,UDP编程)

七层协议 ① ip协议 ②TCP协议 TCP协议面向连接的&#xff0c;可靠的协议&#xff0c;有三次握手来保证可靠性 ③ udp协议 不一定可以保证数据发过去&#xff0c;像发短信一样&#xff0c;对方不一定在线&#xff0c;号码也不一定对 TCP,UDP之间存在一些区别&#xff1a…

JavaSocket编程

一、JavaSocket编程 1.1HTTP协议 后端原理 2. 特点 同步&#xff1a;就是两个任务执行的过程中&#xff0c;其中一个任务要等另一个任务完成某各阶段性工作才能继续执行&#xff0c;如厨师A炒番茄&#xff0c;将葱花放入锅中&#xff0c;然后需要放入番茄&#xff0c;但是厨…