精华内容
下载资源
问答
  • PTA 估值亿的AI核心代码 (20 分)

    千次阅读 2019-03-31 07:56:20
    本题要求你实现一个稍微更值钱一点的 AI 英文问答程序,规则是: 无论用户说什么,首先把对方说的话在一行中原样打印出来; 消除原文中多余空格:把相邻单词间的多个空格换成 1 个空格,把行首尾的空格全部删掉,把...

    估值一亿的AI核心代码 (20 分)
    AI.jpg

    以上图片来自新浪微博。

    本题要求你实现一个稍微更值钱一点的 AI 英文问答程序,规则是:

    无论用户说什么,首先把对方说的话在一行中原样打印出来;
    消除原文中多余空格:把相邻单词间的多个空格换成 1 个空格,把行首尾的空格全部删掉,把标点符号前面的空格删掉;
    把原文中所有大写英文字母变成小写,除了 I;
    把原文中所有独立的 can you、could you 对应地换成 I can、I could—— 这里“独立”是指被空格或标点符号分隔开的单词;
    把原文中所有独立的 I 和 me 换成 you;
    把原文中所有的问号 ? 换成惊叹号 !;
    在一行中输出替换后的句子作为 AI 的回答。
    输入格式:
    输入首先在第一行给出不超过 10 的正整数 N,随后 N 行,每行给出一句不超过 1000 个字符的、以回车结尾的用户的对话,对话为非空字符串,仅包括字母、数字、空格、可见的半角标点符号。

    输出格式:
    按题面要求输出,每个 AI 的回答前要加上 AI: 和一个空格。

    输入样例:
    6
    Hello ?
    Good to chat with you
    can you speak Chinese?
    Really?
    Could you show me 5
    What Is this prime? I,don 't know
    输出样例:
    Hello ?
    AI: hello!
    Good to chat with you
    AI: good to chat with you
    can you speak Chinese?
    AI: I can speak chinese!
    Really?
    AI: really!
    Could you show me 5
    AI: I could show you 5
    What Is this prime? I,don 't know
    AI: what Is this prime! you,don’t know
    自己无法编译用c++11就行了
    非常暴力的模拟,昨天电脑蓝屏(昨天写了30min以上),今天早上复原了下,然后也写了20min,还是15分,不过换电脑导致我没时间看别的题目,我还傻逼的继续写这个题

    #include <bits/stdc++.h>
    using namespace std;
    int main()
    {
        int T;
        cin>>T;
        cin.get();
        while(T--)
        {
            string s;
            getline(cin,s);
            cout<<s<<"\nAI: ";
            int f1=0,n=s.length();
            for(int i=0; i<n; i++,f1++)
                if(s[i]!=' ')break;
            s=s.substr(f1);
            n=s.length(),f1=n;
            for(int i=n-1; i>=0; i--,f1--)
                if(s[i]!=' ')break;
            s=s.substr(0,f1);
            n=s.length();
            //cout<<"@"<<s<<"\n";
            string tmp;
            for(int i=0; i<n; i++)
            {
                if(s[i]>='A'&&s[i]<='Z')
                {
                    if(s[i]=='I')tmp+='I';
                    else tmp+=s[i]-'A'+'a';
                }
                else if(s[i]=='?')
                {
                    tmp+=" !";
                }
                else if(s[i]==','||s[i]=='.'||s[i]=='!')
                {
                    tmp=tmp+' '+s[i];
                }
                else if(s[i]!=' ')
                {
                    tmp+=s[i];
                }
                else
                {
    
                    for(; i<n; i++)
                        if(s[i]!=' ')break;
                    if(s[i]==','||s[i]=='.'||s[i]=='?'||s[i]=='!'||s[i]==39)
                    {
    
                    }
                    else tmp+=' ';
                    i--;
                }
            }
            tmp+=' ';
            //cout<<"@"<<tmp<<"@\n";
            map<string,string>M;
            M["can you "]="I can ";
            M["could you "]="I could ";
            M["I "]="you ";
            M["me "]="you ";
            set<string>S;
            S.insert("can ");
            S.insert("could ");
            int f=0;
            string t,ans;
            for(auto X:tmp)
            {
                t+=X;
                if(X==' ')
                {
                    f++;
                    if(f==1)
                    {
                        if(M.count(t))
                        {
                            ans+=M[t];
                            f=0;
                            t="";
                        }
                        else if(!S.count(t))
                        {
                            ans+=t;
                            f=0;
                            t="";
                        }
                    }
                    else if(f==2)
                    {
                        if(M.count(t))
                        {
                            ans+=M[t];
                            f=0;
                            t="";
                        }
                        else
                        {
                            ans+=t;
                            f=0;
                            t="";
                        }
                    }
                }
            }
            ans+=t;
            //cout<<"#"<<ans<<"\n";
            s=ans,tmp="";
            for(int i=0;ans[i+1];i++)
            {
                if(s[i]==' '&&(s[i+1]==','||s[i+1]=='.'||s[i+1]=='?'||s[i+1]=='!'))
                {
    
                }
                else tmp+=s[i];
            }
            cout<<tmp<<"\n";
        }
        return 0;
    }
    

    目前主要在博客园,其实这个很久之前也写过一份满分代码,现在放出来。

    #include <bits/stdc++.h>
    using namespace std;
    string M[4][2]={
        "can you","* can",
        "could you","* could",
        "I","you",
        "me","you"
    };
    int main()
    {
        int T;
        cin>>T;
        cin.get();
        while(T--)
        {
            string s;
            getline(cin,s);
            cout<<s<<"\nAI: ";
            //去除首尾空格
            while (s[0]==' ')s.erase(s.begin());
    		while (s[s.length()-1]==' ')s.erase(s.end()-1);
            //处理其他空格
            for (int i = 1; i < s.size(); i++)
            {
                if (s[i] == ' ')
                {
                    //去除连续空格
                    while (s[i + 1] == ' ')s.erase(i + 1, 1);
                    //去除标点符号前空格
                    if (isalnum(s[i+1])==0)
                    {
                        s.erase(i, 1);
                    }
                }
            }
            for(auto&c :s)
            {
                if (isupper(c)&&c!='I')c+=32;
                if (c=='?') c='!';
            }
            for(int j=0;j<4;j++)
            {
                int i = s.find(M[j][0]),l=M[j][0].length();
                while(i!=-1)
                {
                    if ((i == 0 || !isalnum(s[i - 1])) && (i+l==s.size()||!isalnum(s[i + l])))
                        s.replace(i, l, M[j][1]);
                    i = s.find(M[j][0],i+1);
                }
            }
            for(auto&c :s)
            {
                if (c=='*') c='I';
            }
            cout<<s<<"\n";
        }
        return 0;
    }
    
    
    展开全文
  • 三、第一个cocos2d程序代码分析

    万次阅读 2013-02-19 17:31:36
    在第一讲中已经新建了第一个cocos2d程序,运行效果如下: 在这讲中我们来分析下里面的代码,了解cocos2d的工作原理,看看屏幕上的这个"Hello World"是如何显示出来的。 这是HelloWorld项目的代码结构: ...

    第一讲中已经新建了第一个cocos2d程序,运行效果如下:


    在这讲中我们来分析下里面的代码,了解cocos2d的工作原理,看看屏幕上的这个"Hello World"是如何显示出来的。

    这是HelloWorld项目的代码结构:

    下面,我们开始分析项目中的这些源文件:


    从程序的入口点开始

    这么多源文件在这里,究竟先看哪个呢?有些人可能会先挑内容少的来看,觉得这样就可以轻松解决掉一个源文件了,其实这是不对的,这样看起来更加是一头雾水,根本搞不清楚每个源文件之间的联系。正确的做法应该是从程序的入口开始看起,慢慢理顺各个源文件之间的关系。

    有过iOS开发经验的朋友都知道,一个iOS程序的入口是main函数,这个main函数存在于main.m中。打开main.m文件,看看main函数的内容:

    int main(int argc, char *argv[]) {
        NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
        int retVal = UIApplicationMain(argc, argv, nil, @"AppDelegate");
        [pool release];
        return retVal;
    }

    重点是这句代码:UIApplicationMain(argc, argv, nil, @"AppDelegate"),UIApplicationMain函数会根据第4个参数传入的类名创建一个应用程序的代理对象,这里创建的是AppDelegate对象,因此AppDelegate对象就是整个应用程序的代理。

    那应用程序的代理有什么作用呢?

    UIApplicationMain函数创建好应用程序的代理之后,会开启事件循环,一旦监听到系统事件,就会通知代理对象,并调用代理对象相关的生命周期方法来处理事件。比如:

    * ios设备的内存极其优先,如果一个应用程序占用了太多内存,操作系统会发出内存警告,在应用程序接收到这个事件后它会调用代理的applicationDidReceiveMemoryWarning方法,代理在这个方法内可以进行释放内存的操作以防止操作系统强制终止应用程序的运行

    * 当应用程序成功加载完毕后,会调用代理的application:didFinishLaunchingWithOptions:方法,一般会在这个方法里面初始化应用程序的第一个界面


    AppDelegate解读

    从上面的分析可知,一般会在AppDelegate的application:didFinishLaunchingWithOptions:方法中初始化应用程序的第一个界面,是的,开发者会在该方法中添加cocos2d的所有初始化代码

    打开AppDelegate.m,查看application:didFinishLaunchingWithOptions:方法

    提示:我在这个方法里面加了相应的中文注释

    - (void) applicationDidFinishLaunching:(UIApplication*)application
    {
    	// 初始化窗口
    	window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    	
    	// 设置CCDirector的类型
    	if( ! [CCDirector setDirectorType:kCCDirectorTypeDisplayLink] )
    		[CCDirector setDirectorType:kCCDirectorTypeDefault];
    	
    	// 获取CCDirector的单例对象
    	CCDirector *director = [CCDirector sharedDirector];
        
        // 初始化控制器
    	viewController = [[RootViewController alloc] initWithNibName:nil bundle:nil];
    	viewController.wantsFullScreenLayout = YES;
    	
        // 创建一个视图对象
    	EAGLView *glView = [EAGLView viewWithFrame:[window bounds]
    								   pixelFormat:kEAGLColorFormatRGB565
    								   depthFormat:0];
        // 关联这个视图对象到CCDirector
    	[director setOpenGLView:glView];
        
        // 设置屏幕方向
    #if GAME_AUTOROTATION == kGameAutorotationUIViewController
        // 如果是使用UIViewController来实现旋转,就设置竖屏
    	[director setDeviceOrientation:kCCDeviceOrientationPortrait];
    #else
        // 其他情况,就设置横屏
    	[director setDeviceOrientation:kCCDeviceOrientationLandscapeLeft];
    #endif
    	
        // 设置刷新间隔时间
    	[director setAnimationInterval:1.0/60];
        // 设置是否要显示FPS
    	[director setDisplayFPS:YES];
    	
    	
    	// 设置控制器的视图
    	[viewController setView:glView];
    	
    	// 添加控制器的视图到window中
    	[window addSubview: viewController.view];
    	// 显示window
    	[window makeKeyAndVisible];
    	
    	// 设置纹理格式
    	[CCTexture2D setDefaultAlphaPixelFormat:kCCTexture2DPixelFormat_RGBA8888];
    
    	// 消除启动时的闪烁
    	[self removeStartupFlicker];
    	
    	// 设置第一个显示的屏幕
    	[[CCDirector sharedDirector] runWithScene: [HelloWorldLayer scene]];
    }

    看完这个方法后,你可能会一头雾水,看到一大堆没见过的API,这些就是cocos2d的API。

    1.UIKit与OpenGL

    这么多看不懂的代码,该怎么解读呢?有些人可能会硬着头皮一行一行按顺序往下解读,这样往往是事倍功半。

    一般是先找自己能够看懂的代码,比如这几句:

    // 初始化控制器
    viewController = [[RootViewController alloc] initWithNibName:nil bundle:nil];
    viewController.wantsFullScreenLayout = YES;
    // 设置控制器的视图
    [viewController setView:glView];
    	
    // 添加控制器的视图到window中
    [window addSubview: viewController.view];
    // 显示window
    [window makeKeyAndVisible];
    可以看出,屏幕上显示的内容就是这个glView视图,这个glView是EAGLView类型的:

    // 创建一个视图对象
    EAGLView *glView = [EAGLView viewWithFrame:[window bounds]
    								   pixelFormat:kEAGLColorFormatRGB565
    								   depthFormat:0];
    
    cocos2d利用OpenGL将内容都渲染到了这个glView上,最后呈现到屏幕上给用户看。因此,cocos2d的本质是在UIKit和OpenGL之间进行了转换。


    2.CCDirector

    cocos2d中以节点(CCNode)为基本元素,整个游戏都是由节点构成的,其实一个很重要的节点元素就是场景(CCScene类,继承自CCNode),一个游戏里面可能有很多个场景,比如闯关游戏,可以一个关卡就是一个场景,一个游戏设置界面也可以是一个场景。怎样才能正常显示一个场景呢?那么就需要CCDirector这个类,没有CCDirector,就不能显示场景。

    CCDirector类是整个cocos2d游戏引擎的核心,全局只有一个实例,通过[CCDirector sharedDirector]可以获取这个单例对象。

    // 获取CCDirector的单例对象
    CCDirector *director = [CCDirector sharedDirector];

    CCDirector的主要用途:

    * 运行、替换、推入和弹出场景(即场景过渡)

    * 访问正在运行的场景

    * 暂停、恢复、终止游戏

    * 在UIKit和OpengGL之间转换坐标

    * 获取窗口的尺寸


    下面这句代码非常关键:

    // 关联这个视图对象到CCDirector
    [director setOpenGLView:glView];

    给CCDirector设置视图后,CCDirector才知道场景(CCScene)上的内容要渲染到哪个视图上面。因此,说CCDirector是UIKit和OpenGL之间的桥梁,一点也不为过


    cocos2d提供了4种类型的CCDirector,不同类型的CCDirector有不同的更新游戏状态的方式,这些更新方式会对游戏的性能、与UIKit视图的兼容性产生很大影响。

    下面这句代码就是设置CCDirector的类型:

    // 设置CCDirector的类型,如果iOS<3.1,就不支持kCCDirectorTypeDisplayLink,使用kCCDirectorTypeDefault
    if( ! [CCDirector setDirectorType:kCCDirectorTypeDisplayLink] )
    		[CCDirector setDirectorType:kCCDirectorTypeDefault];
    
    可以供设置的4种CCDirector:

    kCCDirectorTypeNSTimer \ kCCDirectorTypeDefault 最慢
    kCCDirectorTypeMainLoop 比NSTimer快,但是与UIKit视图存在兼容性问题
    kCCDirectorTypeThreadMainLoop 比NSTimer快,但是与UIKit视图存在兼容性问题
    kCCDirectorTypeDisplayLink 最快,最实用,但iOS版本至少是3.1

    3.设置屏幕方向

    通过CCDirector来设置屏幕方向

    // 设置屏幕方向  
    #if GAME_AUTOROTATION == kGameAutorotationUIViewController  
        // 如果是使用UIViewController来实现旋转,就设置竖屏  
        [director setDeviceOrientation:kCCDeviceOrientationPortrait];  
    #else  
        // 其他情况,就设置横屏  
        [director setDeviceOrientation:kCCDeviceOrientationLandscapeLeft];  
    #endif  
    GAME_AUTOROTATION是一个宏定义,可以用来判断设备对旋转的支持情况,iOS第1和2代设备上面的旋转是十分耗性能的,但从iOS第3代设备开始,可以使用UIViewController来轻松实现自动旋转。

    下面列出设备支持的所有方向:

    kCCDeviceOrientationPortrait
    kCCDeviceOrientationPortraitUpsideDown
    kCCDeviceOrientationLandscapeLeft
    kCCDeviceOrientationLandscapeRight


    4.设置游戏帧率

    大家都知道,游戏界面上的内容是需要经常刷新的,比如一个子弹打出去,需要经常刷新子弹的位置。刷新速度就取决于游戏帧率。

    [director setAnimationInterval:1.0/60];
    这里设置的1.0/60并不是指游戏帧率,是指刷帧的时间间隔,即屏幕连续2次刷新之间的时间间隔:1.0/60秒。换算一下,可以得出游戏帧率为60fps(frame per seconds,帧/秒),即1秒钟刷新60帧。当然,如果游戏比较复杂,CPU/GPU需要画大于1.0/60秒的时间来刷新屏幕,就无法保证游戏始终保持60fps的刷新速度,会造成帧率不稳定。如果游戏的帧率发生大幅度波动,会造成时快时慢的效果,会严重降低玩家的用户体验,因此,复杂游戏的帧率不用设置得太高,最好设置为30fps。

    注意:由于设备的限制,在iOS设备上的帧率不能大于60fps。如果强迫cocos2d以大于60fps的帧率进行渲染,很有可能会反而使帧率降低。因此,要想达到最快的渲染速度,使用60fps的帧率即可。


    5.显示游戏帧率

    // 设置是否要显示FPS
    [director setDisplayFPS:YES];
    设置了显示帧率后,屏幕左下角显示的数字就是游戏的帧率,当前是59.9fps。

    cocos2d会隔一段时间就更新这个数值,通过修改ccConfig.h的CC_DIRECTOR_FPS_INTERVAL值可以调整刷新数值的时间间隔,默认是0.1,即1秒钟更新10次。ccConfig.h在项目的libs/cocos2d文件夹中。

    #ifndef CC_DIRECTOR_FPS_INTERVAL
    #define CC_DIRECTOR_FPS_INTERVAL (0.1f)
    #endif


    6.设置游戏的第一个场景

    [[CCDirector sharedDirector] runWithScene: [HelloWorldLayer scene]];
    这里调用CCDirector的runWithScene:方法来设置游戏的第一个场景,这个场景对象是通过[HelloWorldLayer scene]这个静态方法创建。

    因此,需要搞清楚屏幕上显示的"Hello World"是怎么弄出来的,还得查看HelloWorldLayer这个类


    7.在发出内存警告时释放资源

    - (void)applicationDidReceiveMemoryWarning:(UIApplication *)application {
    	[[CCDirector sharedDirector] purgeCachedData];
    }
    
    

    HelloWorldLayer解读

    打开HelloWorldLayer.h,可以发现HelloWorldLayer继承了CCLayer,意为图层

    @interface HelloWorldLayer : CCLayer
    {
    }
    
    // returns a CCScene that contains the HelloWorldLayer as the only child
    +(CCScene *) scene;
    
    @end

    那之前看到的场景(CCScene)和图层(CCLayer)究竟有什么联系呢?

    下面我先详细阐述场景(CCScene)和图层(CCLayer)之间的关系:

    一个游戏里面可能有很多个场景,比如闯关游戏,可以一个关卡就是一个场景,一个游戏设置界面也可以是一个场景。一个场景里面又可以包含多个图层。

    拿捕鱼达人来说,下面列出捕鱼达人中的4个场景:

    场景1
    场景2

    场景3
    场景4

    可以看出,不同的业务逻辑就放在不同的场景中。但是,如果一个场景过于复杂,场景里面又可以分出多个图层(CCLayer)。

    比如场景4中的捕鱼界面,根据图层的功能,大致可以分为3个图层:


    1> 底部的Background Layer是背景层,用来显示背景图片

    2> 中间的Game Layer是游戏层,用来显示游戏中的精灵(CCSprite,可以用来表示游戏中的人物、道具等),这里的鱼就是精灵

    3> 顶部的UI DOM Menu是菜单层,用来显示一些菜单按钮、控制按钮


    再查看HelloWorldLayer.m中scene方法的实现

    +(CCScene *) scene
    {
    	// 创建一个场景对象
    	CCScene *scene = [CCScene node];
    	
    	// 创建一个图层对象
    	HelloWorldLayer *layer = [HelloWorldLayer node];
    	
    	// 添加图层到场景中
    	[scene addChild: layer];
    	
    	// 返回场景
    	return scene;
    }
    CCScene和CCLayer都继承自CCNode,可以通过CCNode的+(id) node方法快速创建一个自动释放的对象。

    这里使用[CCScene node]创建了一个CCScene对象,使用[HelloWorldLayer node]创建了一个HelloWorldLayer对象。

    最后通过[scene addChild: layer]将图层layer添加到场景scene中,可以看出layer是scene的一个子节点。实际上addChild:方法也是属于CCNode的,可以看出每个CCNode都有自己的子节点。


    那"Hello World"这段文字是怎么显示到屏幕上的呢?看看HelloWorldLayer的init方法

    -(id) init
    {
    	// always call "super" init
    	// Apple recommends to re-assign "self" with the "super" return value
    	if( (self=[super init])) {
    		
    		// create and initialize a Label
    		CCLabelTTF *label = [CCLabelTTF labelWithString:@"Hello World" fontName:@"Marker Felt" fontSize:64];
    
    		// ask director the the window size
    		CGSize size = [[CCDirector sharedDirector] winSize];
    	
    		// position the label on the center of the screen
    		label.position =  ccp( size.width /2 , size.height/2 );
    		
    		// add the label as a child to this Layer
    		[self addChild: label];
    	}
    	return self;
    }
    首先初始化了一个CCLabelTTF标签对象,标签显示的文字为"Hello World",使用Marker Felt字体,字体大小为64,CCLabelTTF继承自CCSprite,属于精灵,CCSprite又继承自CCNode。

    CCLabelTTF *label = [CCLabelTTF labelWithString:@"Hello World" fontName:@"Marker Felt" fontSize:64];
    接着获取屏幕的宽度和高度

    CGSize size = [[CCDirector sharedDirector] winSize];
    设置标签在父节点中的位置(默认情况下,精灵的中心点会在position属性所指定的位置上)

    label.position =  ccp( size.width /2 , size.height/2 );
    cpp其实是个宏定
    #define ccp(__X__,__Y__) CGPointMake(__X__,__Y__)
    最后添加标签到图层中

    [self addChild: label];

    就这样,"Hello World"就显示到我们的屏幕上

    分析可得,我们这个游戏里面存在着3个节点:

    CCScene里面有个CCLayer,CClayer里面有个CCLabelTTF


    总结

    说了这么多内容,最后做个大总结:

    1.要想利用cocos2d在屏幕上显示点东西,就必须使用CCDirector运行一个场景(CCScene),比如

    [[CCDirector sharedDirector] runWithScene: [HelloWorldLayer scene]];

    2.场景(CCScene)可以添加多个图层(CCLayer),每个图层又可以添加其他子节点,比如精灵(CCSprite)

    3.cocos2d会利用OpenGL将场景(CCScene)中的所有内容渲染到UIKit视图上(这里用的是EAGLView),EAGLView被添加到UIWindow中,最终显示在屏幕上

    4.大部分情况下,都是直接面向cocos2d进行开发,即直接用cocos2d的CCSprite、CCLayer、CCScene等类进行开发,不需要关心OpenGL与UIKit之间的转换

    5.cocos2d的基本元素是节点(CCNode),屏幕上的任何东西都可以称之为节点,像我们常用的CCSprite、CCLayer、CCScene,都是CCNode的子类,因此,它们都是节点。一个节点又可以包含多个子节点


    展开全文
  • 原创 转载请声明,谢谢 估值一亿的AI核心代码 (20 分)* ...本题要求你实现一个稍微更值钱一点的 AI 英文问答程序,规则是: 无论用户说什么,首先把对方说的话在一行中原样打印出来; 消除原文...

    原创 转载请声明,谢谢

    估值一亿的AI核心代码 (超级简洁,通俗易懂)(20 分)*

    题目链接 https://pintia.cn/problem-sets/994805046380707840/problems/1111914599412858885

    在这里插入图片描述
    以上图片来自新浪微博。

    本题要求你实现一个稍微更值钱一点的 AI 英文问答程序,规则是:

    1. 无论用户说什么,首先把对方说的话在一行中原样打印出来;
    2. 消除原文中多余空格:把相邻单词间的多个空格换成 1 个空格,把行首尾的空格全部删掉,把标点符号前面的空格删掉;
    3. 把原文中所有大写英文字母变成小写,除了 I;
    4. 把原文中所有独立的 can you、could you 对应地换成 I can、I could—— 这里“独立”是指被空格或标点符号分隔开的单词;
    5. 把原文中所有独立的 I 和 me 换成 you; 把原文中所有的问号 ? 换成惊叹号 !;
    6. 在一行中输出替换后的句子作为 AI的回答。

    输入格式:
    输入首先在第一行给出不超过 10 的正整数 N,随后 N 行,每行给出一句不超过 1000 个字符的、以回车结尾的用户的对话,对话为非空字符串,仅包括字母、数字、空格、可见的半角标点符号。

    输出格式:
    按题面要求输出,每个 AI 的回答前要加上 AI: 和一个空格。
    输入样例:

    6
    Hello ?
    Good to chat with you
    can you speak Chinese?
    Really?
    Could you show me 5
    What Is this prime? I,don 't know

    输出样例:

    Hello ?
    AI: hello!
    Good to chat with you
    AI: good to chat with you
    can you speak Chinese?
    AI: I can speak chinese!
    Really?
    AI: really!
    Could you show me 5
    AI: I could show you 5
    What Is this prime? I,don 't know
    AI: what Is this prime! you,don’t know

    这道题主要考察对字符串应用以及对空格的增删
    思路是 在每个标点和空格之前加一个空格 ,划分成一块一块的,然后 逐个判断输出就可以了

    以下是代码:

    #include<bits/stdc++.h>
    using namespace std;
    int main() {
    	int n;
    	cin >> n;
    	getchar();  // 吸收换行
    	string s;
    	while (n--) {
    		string str[1005];
    		int cnt = 0;
    		getline(cin, s);
    		cout << s << endl << "AI:";
    		for (int i = 0; i < s.size(); ++i) {
    			if (isalnum(s[i])) {
    				if (s[i] != 'I')
    					s[i] = tolower(s[i]);
    			}
    			else {
    				s.insert(i, " ");    //对每个非字母和数字之前加空格
    				i++;
    			}
    			if (s[i] == '?')
    				s[i] = '!';
    		}
    		stringstream ss(s);        //主要依靠这个函数来取消单词之前的空格
    		while (ss >> s) {
    			str[cnt++] = s;
    		}
    		if (!isalnum(str[0][0]))     		// 如果 第一个单词的第一个位置就是标点  那么要输出一个空格,题中要求 每个 AI 的回答前要加上 AI: 和一个空格。
    			cout << " ";
    		for (int i = 0; i < cnt; ++i) {
    			if (str[i].find("can") != string::npos && str[i + 1] == "you") { // &&优先级大于|| ,所以要加括号
    				if (!isalnum(str[i][0]))
    					cout << str[i][0];
    				else
    					cout << " ";
    				cout << "I can";
    				i++;
    			}
    			else if (str[i].find("could") != string::npos && str[i + 1] == "you") {
    				if (!isalnum(str[i][0]))
    					cout << str[i][0];
    				else
    					cout << " ";
    				cout << "I could";
    				i++;
    			}
    			else if (!isalnum(str[i][0])) {      // 判断第一个字符是否是 标点,标点前面不要输出空格
    				cout << str[i];
    			}
    			else if (str[i] == "I" || str[i] == "me") {
    				cout << " you";
    			}
    			else
    				cout << " " << str[i];
    		}
    		cout << endl;
    	}
    }
    
    

    还有什么问题,请留言,谢谢;
    本文原创,转载请声明。

    展开全文
  • 今天,朋友圈被一则AI届的重要事件刷屏!今天,是一个里程碑式的开始!从今日起每一个AI人都可以昂头挺胸的说我们不光只有PPT!!!我们还有估值1个亿的开源代码!!!周五快...
        

    今天,朋友圈被一则AI届的重要事件刷屏!


    今天,是一个里程碑式的开始!


    从今日起


    每一个AI人


    都可以昂头挺胸的说


    我们不光只有PPT!!!


    我们还有估值1个亿的开源代码!!!


    640?wx_fmt=jpeg


    周五快乐喽


    本图来源网络,如以此忽悠你投资,建议举报


     近期热文:


    关注我

    640?wx_fmt=jpeg


    点击“阅读原文”,看本号其他精彩内容

    展开全文
  • Spring源码解析 - springMVC核心代码

    万次阅读 多人点赞 2018-10-25 00:07:26
     、首先来讲解下springMVC的底层工作流程 1、首先我们重点放在前端控制器(DispatcherServlet) 其类图: 因为从流程图看,用户的请求最先到达就是DispatcherServlet。他是springmvc的核心,也是中央出...
  • 重要的核心代码,是不希望被非核心成员,或者新招来的程序接触到的。否则,招程序,人家试用期没过,反倒把你代码拷走了,回头想攻击、破解、贩卖,都是分分钟的事儿。这种事儿,我已经见过不止次了。本文就讲...
  • 大家看见没有,迅雷只能启动一个,这个在代码中间是如何实现的呢,我们来亲自在代码中实践一下。 #include #include int main(int argc,char *argv[]) { HANDLE hMutex; DWORD dwErr; hMutex=CreateMutex(NULL,//无...
  • 连连看游戏核心代码(C++实现)

    千次阅读 2013-12-16 20:04:09
    这两天研究了一下连连看游戏的源代码,...),然后自己把核心代码整理如下,与大家共享。需要说明的是,这只是核心算法的代码,界面设计和操作的代码均已略去。 #include #include //图片类 class picture { public:
  • 我们以我们最初学到的“hello ...事实上执行g++ helloworld.cpp可以分为四个步骤,分别是预处理,编译,汇编,和链接,这就像一个被隐藏的过程,使用者可以通过简单的命令即可完成复杂的步骤。 一,预处理首先是源代码
  • 有时候难免会需要自己做个个性化浏览器玩玩,基于IE或Edge核心代码遍地都是,但基于Chrome的不多。现在发现一个,留个种子。 是Delphi的,支持xe7、xe2、7.0等 ...
  • 微信小程序风靡全国已经好多年了,首先是微信小程序,后面百度等多个平台都发布了自己的小程序了,可我还从未尝试过开发一个玩玩,其实对于一个程序员而言,开发一个程序实在不是什么难事情,所以今天就要聊此心愿...
  • iPhone开发指南-应用程序核心

    千次阅读 2009-11-03 12:04:00
    应用程序内核每iPhone应用程序都基于UIKit框架而构建,因此拥有同样的核心架构。UIKit提供运行应用程序的关键对象并且协调用户输入处理和屏幕内容显示。应用程序彼此之间区分开来的地方在于如何配置这些缺省对象和...
  • 上一节教大家如何在本地运行php后台项目,并可以被小程序访问到,这一节就来给大家讲一个实际工作中常用的需求,微信小程序openid的获取。当然了,还是用我们的php做为后台。 老规矩,先看效果图 通过上图我们可以...
  • 一、US-100的电气参数: 工作电压 DC2.4V~5.5V.../*启动测距信号,只需要在 Trig/TX 管脚输入一个 10US 以上的高电平,系统便可发出 8 个 40KHZ 的超声波脉冲,然后检测回波信号。 当检测到回波信号后,模块还要进行温
  • 开发程序不写代码,而是靠拼图?

    万次阅读 多人点赞 2021-01-29 18:54:11
    Blockly 是一个向 Web 和移动应用程序添加可视化代码编辑器的库,块之间使用互锁的图形块来表示代码,如变量,逻辑表达式,循环等。该编辑器将代码表示为一个个的图形块,通过图形块之间的连接保证语法的正确性,...
  • vue代码转换成小程序

    千次阅读 2020-05-06 11:58:03
    mpvue:是由美团点评团队出品的小程序开发的一款基于vue的框架,从整个Vue的核心代码上经过二次开发而形成的一个框架,相当于是给Vue本身赋能,增加了开发微信小程序的能力。 二.mpvue开发流程 1、小程序账号配置 ...
  • 用户态驱动程序核心态驱动程序

    千次阅读 2016-03-11 21:42:05
    Windows驱动既可以运行在用户态也可以运行在和心态。...核心态驱动程序是系统执行者中的一部分在运行,底层的操作系统组件支持一个或多个受保护的子系统。 用户态驱动和核心态驱动有着不同的架构,不同的
  • 零基础入门微信小程序开发

    万次阅读 多人点赞 2018-07-03 02:45:07
    本课程是一个系列入门教程,目标是从 0 开始带领读者上手实战,课程以微信小程序核心概念作为主线,介绍配置文件、页面样式文件、JavaScript 的基本知识并以指南针为例对基本知识进行扩展,另外加上开发工具的安装...
  •  对于前端开发而言,微信小程序因为其简单快速、开发成本低、用户流量巨大等特点,也就成了前端开发工程师必会的一个技能。  2.开发准备:  (1)有人开玩笑说,会vue小程序根本都不用学:  微信小程序虽然是...
  • 如何快速开发一个自己的微信小程序

    万次阅读 多人点赞 2018-07-18 01:15:24
    对于前端开发而言,微信小程序因为其简单快速、开发成本低、用户流量巨大等特点,也就成了前端开发工程师必会的一个技能。 &nbsp; 2.先看看小程序效果 (1)欢迎页 &nbsp; &nbsp; (2)首页:...
  • 如何定位安卓程序关键代码

    千次阅读 2013-11-05 10:42:03
    我们知道,一个Android 程序一个或多个Activity 以及其它组件组成,每个Activity 都是相同级别的,不同的Activity 实现不同的功能。每个Activity 都是Android 程序一个 显示“页面”,主要负责数据的处理及展示...
  • 程序代码中,怎么区分status和state?

    万次阅读 多人点赞 2018-10-21 16:40:07
    程序代码中,status和state是我们经常使用的两个单词,他们一般被解释为[状态]。但是虽然都被解释为[状态],但是它们...下面是我在知乎上看到的关于status vs state的比较通俗易懂的解释,也是赞同率最高的一个。 ...
  • 如何阅读他人的项目源代码程序

    千次阅读 多人点赞 2018-09-30 21:26:01
    相信很多人和我一样,面对着别人密密麻麻的代码,宁愿自己从零开始编写自己的代码,也不...然而,阅读他人的项目源码是每一个程序的人(我只是个在项目需要的时候偶尔写程序的,不敢自称程序员)必须经历的事情。...
  • 核心代码 for(j=0;j&amp;amp;lt;N-1;j++) for(x=0;x&amp;amp;lt;N-j-1;x++) if(b[x]&amp;amp;lt;b[x+1]) { temp=b[x]; b[x]=b[x+1]; b[x+1]=temp; } for(j=0;j&amp;amp;lt;N;j++) ...
  • 程序代码包压缩 策略&方案

    千次阅读 2019-06-14 21:21:18
    其中很重要的一点得益于小程序的轻量级特性,每程序最多不超过2MB,招之即来挥之即去,相比于几十上百兆的APP,用户进入小程序,或者说,小程序获取新用户,的成本大大降低。 但与之相应的,是开发资源的限制。...
  • 微信小程序一个调查问卷(二)

    万次阅读 2019-01-08 15:13:34
    即将不定期的开放代码核心代码呈现在微信小程序如何展示富文本编辑器设置的内容多使用缓存技术,防止过多无效的访问题目分为单选题、多选题、简答题设置有其他选项,可进行手动输入选项多选题选择数设置,只可最多...
  • 匈牙利算法的MATLAB 程序代码

    万次阅读 2017-09-16 20:11:43
    匈牙利算法的MATLAB 程序代码如下(算例):
  • 程序核心--复杂度

    千次阅读 2015-10-05 21:57:39
    在《the art of unix programming》中,复杂度的控制被看的非常的重,里面句话提到编程项目的核心就是对于复杂度的控制,以及simple原则其实也在讲这事情。 我自己在08年也写了关于这的话题: 7年过去了,也...
  • 微信小程序代码包压缩策略

    千次阅读 2018-07-11 19:46:38
    避开小程序官方规定的2M限制,代码包体积超过上限时将无法进行预览/上传/发布。2. 减小代码包体积,可以降低小程序下载时长、首次加载时长,降低新用户流失率。3. 能减少下载流量和本地空间占用,提升用户体验。...
  • 深入编程之QQ盗号核心代码

    千次阅读 2011-11-26 00:44:56
    经常有听到有朋友QQ被盗的消息,总感觉做出这种行为的人是可鄙的,不就是对QQ窗口进行监视,然后再是记录用户输入的号码和密码,认为没什么了不起。 对于Windows核心编程,本人...即使一个小小的问题都足以让我这

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 966,303
精华内容 386,521
关键字:

一个程序的核心代码