游戏王ygocore吧 关注:244,182贴子:2,911,389
  • 24回复贴,共1

【No.C101】【某ZisIsNotZis的技术水】【寂静荣誉卡组统计骑士】

只看楼主收藏回复

【程序名称/代码名称】
-游戏王 YGOCore YDK 文件批量分析核心
【思路来源/Origin】
-吧友 @lwx19911226 提供的思路
【程序主要目的/大体介绍】
-分析大规模的卡组文件并从中得到统计信息
-解决我没有事干的烦恼
-编完了自己不用又不发简直是浪费
-也许能为吧友提供一定的帮助
-好久没编程序了练练手(我不会告诉你我在qsort上卡了半天的)
【程序功能/详细介绍】
-读取至多 2^64 个卡组文件并尽心统计
-读取卡密卡名对应文件 DATA.txt 并整合于统计
-得出所给出卡组的数量
-得出所有给出卡组中第N流行卡
-得出所有给出卡组中所有流行卡排序列表
-得出所给出的卡组中卡密为N的卡的数量
-得出含有某特定卡的卡组中含有另一某卡的概率
-得出含有某特定卡的卡组中的第N流行卡
-得出含有某特定卡的卡组中的流行卡排序列表
-也许会使用一定程度的BUG来逗你笑
【程序语言/Programming Language】
-C++
【编译方法/Makefile】
-g++ XXX.cpp -O3 (-DDEBUG)
-括号中的参数能启用debug模式,debug模式会有多余的状态输出
【程序使用方法/Manual Page】
-参数:XXX 【数据文件】 【卡组文件】xN
-参数:数据文件即 DATA.txt
-使用方法:等待程序读取数据/建立缓存/初始化完备,会出现像命令行一样的":"图标,表示处理完毕,可以输入数据
-使用发法:以下的格式与上方的“得出”按顺序一一对应,所有的 M, N 都为未知数,请自行给出
-使用方法:0 0(回车)
-使用方法:0 1(回车)N(回车)
-使用方法:0 1(回车)0(回车)
-使用方法:0 N(回车)
-使用方法:M N(回车)
-使用方法:M 1(回车)N(回车)
-使用方法:M 1(回车)0(回车)
【程序代码/Code】
-因为在百度贴吧所有的TAB与空格都会被删除,所以在此用 下划线 代替 TAB
#include<iostream>
#include<fstream>
#include<cstdlib>
using namespace std;
#define tablePos(a,b) a>b?a*(a-1)/2+b-1:b*(b-1)/2+a-1
#define tablePosAb(a,b) a*(a-1)/2+b-1
#define tablePosaB(a,b) b*(b-1)/2+a-1
#define stdForm(no,name,nomi,denomi) cout<<no<<'.'<<name<<endl<<' '<<nomi<<'/'<<denomi<<endl
void qBiSort(unsigned int *data,unsigned int *name,unsigned int L,unsigned int R){
_unsigned int midData=data[R],midName=name[R],l=L,r=R;
_while(l<r){
__while(l<r&&data[l]>=midData)l++;
__data[r]=data[l];name[r]=name[l];
__while(r>l&&data[r]<=midData)r--;
__data[l]=data[r];name[l]=name[r];}
_data[l]=midData;name[l]=midName;
_if(l-1>L)qBiSort(data,name,L,l-1);
_if(l+1<R)qBiSort(data,name,l+1,r);}
int main(unsigned long long int argc,char *argv[]){
_unsigned long long int i;
_unsigned int *num=new unsigned int[99999999+1];
_unsigned int *table=new unsigned int[9999*9999/2];
_string *realName=new string[10000];
_unsigned int name[10000],stat[10000],statSort[10000],statName[10000],tmp[10000],tmpName[10000],numCount=1,tmpCount,c,j,k;
_string C;bool p;ifstream file;
_for(i=1;i<10000;i++)stat[i]=0;
_file.open(argv[1]);_
_while(getline(file,C)){
__c=atoi(C.c_str());
__if(c>99999999)continue;
__num[c]=numCount;
__name[numCount]=c;
__getline(file,realName[numCount]);
__#ifdef DEBUG
__cout<<numCount<<'.'<<c<<':'<<realName[numCount]<<endl<<flush;__
__#endif
__numCount++;}
_file.close();
_for(i=2;i<argc;i++){
__#ifdef DEBUG__
__cout<<argv[i]<<endl;
__#endif
__file.open(argv[i]);
__tmpCount=0;
__while(getline(file,C))if(C[0]>47&&C[0]<58){
___c=atoi(C.c_str());
___if(c>99999999)continue;
___if(num[c]==0){num[c]=numCount;name[numCount]=c;numCount++;}
___p=true;for(j=0;j<tmpCount;j++)if(tmp[j]==num[c]){p=false;break;}
___if(p){tmp[tmpCount]=num[c];tmpCount++;}}
__tmpCount--;
__for(j=0;j<tmpCount;j++){
___for(k=j+1;k<=tmpCount;k++)table[tablePos(tmp[j],tmp[k])]++;
___stat[tmp[j]]++;}
__stat[tmp[tmpCount]]++;
__file.close();}
_for(i=1;i<numCount;i++){
__statSort[i]=stat[i];
__statName[i]=i;}
_qBiSort(statSort,statName,1,numCount-1);
_alwaysTrueWhileLoop:
_cout<<':';cin>>j>>k;
_if(j==0){
__if(k==0)stdForm(0,0,0,argc);
__else if(k==1){
___cout<<':';cin>>i;
___if(i==0)for(i=1;i<numCount;i++)stdForm(i,realName[statName[i]],statSort[i],argc);
___else stdForm(i,realName[statName[i]],statSort[i],argc);}
__else stdForm(0,realName[num[i]],stat[num[j]],argc);}
_else{if(k==1){
___j=num[j];
___for(i=1;i<j;i++){
____tmp[i]=table[tablePosAb(j,i)];
____tmpName[i]=i;}
___for(i=j;i<numCount;i++){
____tmp[i]=table[tablePosaB(j,i)];
____tmpName[i]=i;}
___qBiSort(tmp,tmpName,1,numCount-1);
___cout<<':';cin>>i;
___if(i==0)for(i=1;i<numCount;i++)if(tmp[i]!=0)stdForm(i,realName[tmpName[i]],tmp[i],stat[j]);else break;
___else stdForm(i,realName[tmpName[i]],tmp[i],stat[j]);}
__else{j=num[j];k=num[k];
___stdForm(0,realName[k],table[tablePos(j,k)],stat[j]);}}
_goto alwaysTrueWhileLoop;}
【程序源码下载/辅助文件下载/Files】
【Linux 可执行文件下载】
-准备上传中,下载地址稍后给出
-事实上我可以预言:地址为 pan.baidu. com/s/1eQDZwYY
【样例输入/输出/Sample Input/Output】
-78371393 为 【U姐】
:78371393 1 1
:1.死者苏生
133/154
:78371393 1 2
:2.于贝尔-被憎恶的骑士
129/154
:78371393 1 3
:3.于贝尔-极度悲伤的魔龙
125/154
:78371393 1 4
:4.终末之骑士
123/154
【程序综合评价/Rating】
-时间复杂度:自己算
-空间复杂度:0 (常数,不随N的变化而变化,所以为0 )
-运行速度:非常快
-占用空间:非常少
-BUG数量:0(暂未发现)
【发帖目的/HeHeHeHe】
-希望这个程序能对吧友或多或少起到帮助
-希望来个人把这个程序 UI 化了,不然一般人不会用
-希望 手抄网 本身能集成这个功能
-或者希望 手抄网插件 新增记录功能。不管有没有下载,全部记录下来,然后提供此程序的分析功能
-你不觉得这个程序很有意思很好用吗


IP属地:上海1楼2014-04-28 09:42回复
    好赞!虽然我自己的卡组是没有啥分析价值了,但还是顶一个


    IP属地:山东来自Android客户端2楼2014-04-28 10:08
    收起回复
      2026-01-25 01:29:35
      广告
      不感兴趣
      开通SVIP免广告
      把大仙的卡组整合统计一下总感觉会发生什么


      IP属地:广东3楼2014-04-28 10:10
      收起回复
        下意识的再看了下帖子


        来自Android客户端4楼2014-04-28 11:11
        收起回复
          ”time“命令实测,3162个最新卡组,程序初始化所需时间,real:0.12s (共计时间),user:0.08s (用户时间),sys:0.03s (系统时间)


          IP属地:上海5楼2014-04-28 12:24
          回复

            程序员最好了


            IP属地:上海来自iPhone客户端6楼2014-04-28 12:28
            收起回复
              -_-#给膝盖
              【悬念伏笔铺垫,虚拟主将从现。
               椭圆函数曲线,小球弹簧斜面。
               水解平衡沉淀,基因遗传突变。】


              IP属地:广东来自Android客户端7楼2014-04-28 12:50
              回复
                跪了,另外我想说求下载地址


                IP属地:江西来自手机贴吧8楼2014-04-28 19:24
                收起回复
                  2026-01-25 01:23:35
                  广告
                  不感兴趣
                  开通SVIP免广告
                  虽然看不懂。。但好赞


                  IP属地:湖北来自Android客户端9楼2014-04-29 06:46
                  回复
                    【怒水】 回复的数量与标题高端的程度呈反比


                    IP属地:上海10楼2014-04-29 19:25
                    回复