読者です 読者をやめる 読者になる 読者になる

AOJ ITP1 8.Character

はい。
http://judge.u-aizu.ac.jp/onlinejudge/topic.jsp?cid=ITP1#problems/ITP1_8

A.Toggling Cases

python

n = list(raw_input())
 
for i in xrange(len(n)):
    if n[i].isupper(): n[i]=n[i].lower()
    elif n[i].islower(): n[i]=n[i].upper()
print ''.join(n)

C++11

#include<bits/stdc++.h>
#include<vector>
#include<algorithm>
using namespace std;

int main(){
    double pai=3.141592653589;
    char w;
    for(;;){
        scanf("%c",&w);
        if(w=='\n'){
            break;
        }else if(isupper(w)){
            w=tolower(w);
            printf("%c",w);
        }else if(islower(w)){
            w=toupper(w);
            printf("%c",w);
        }else{
            printf("%c",w);
        }
    }
    printf("\n");
    return 0;
}

概ねは同様の手法で解きました。 isupper(), islower()で大文字小文字判定してから置換させました。

B.Sum of Numbers

python

while 1:
    n,a=raw_input(),0
    for i in n:a+=int(i)
    if a:print a
    else:break

C++11

#include<bits/stdc++.h>
#include<vector>
#include<algorithm>
using namespace std;

int main(){
    double pai=3.141592653589;
    char w;
    int ans;
    for(;;){
        ans=0;
        for(;;){
            scanf("%c",&w);
            if(w=='\n'){
                printf("%d\n",ans);
                break;
            }else{
                ans+=(static_cast<int>(w)-48);
            }
            if(ans==0){
                return 0;
            }
        }
    }
    return 0;
}

1桁ずつintにキャストして対応しました。

C.Counting Characters

python

import sys
l=[0]*26
for h in sys.stdin:
    for i in h:
        k=ord(i.lower())
        if 96<k<123:l[k-97]+=1
for i in range(26):print chr(i+97),':',l[i]

C++11

#include<bits/stdc++.h>
#include<vector>
#include<algorithm>
using namespace std;

int main(){
    int cnt[26];
    char c;
    for(int i=0;i<26;i++){
        cnt[i]=0;
    }
    while(scanf("%c",&c)!=EOF){
        if(isupper(c)){
            cnt[static_cast<int>(c)-65]+=1;
        }else if(islower(c)){
            cnt[static_cast<int>(c)-97]+=1;
        }
    }
    for(int i=0;i<26;i++){
        printf("%c : %d\n",static_cast<char>(i+97),cnt[i]);
    }
    return 0;
}

普段はpythonでsys.stdinはあんまり使わないのですが長さが分からない複数行の文字列をraw_input()で受け取ろうとするとtry/exceptで入力エラー時に抜けるようにするよりも楽っぽいので今回は使用しました。C++はEOFで終端の情報を得るまで読み込ませて処理しました。

D.Ring

python

n=raw_input()*2
print'Yes' if raw_input() in n else'No'

C++11

#include<bits/stdc++.h>
#include<string>
#include<vector>
#include<algorithm>
using namespace std;

int main(){
    double pai=3.141592653589;
    char s[100], p[100];
    string scp,s2,chk;
    scanf("%s %s",&s,&p);
    scp=s;
    chk=p;
    s2=scp+scp;
    if(s2.find(p) != string::npos){
        printf("Yes\n");
    }else{
        printf("No\n");
    }
    return 0;
}

cinと違ってstring型を指定してscanfでは受け取れない残念な事由があるので、一旦がcharで受け取ってstring型にそのまま代入という手順を踏んでます。
時計回りに連続したリング状の文字列で〜〜というのを同じ文字列を足してつなげることで末尾からまた先頭の文字列が並ぶのでそれをリング状のものの代替で文字列を探す対象にしました。