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

AOJ 0169 ブラックジャック & AOJ 0201 錬金マスター & AOJ 0512 シーザー暗号

AOJ 0169 ブラックジャック

404 Not Found クソ有り難い入力問題。s+=" ";は番兵。

#include <iostream>
#include <cstdio>
#include <cstdlib>
using namespace std;

int main(){
	string s,t;
	int sum,ones;
	while(getline(cin,s)&& s != "0"){
		s+=" ";
		sum = ones = 0;
		for(int i=0;i<s.size();i++){
			if(s[i]==' '){
				if(atoi(t.c_str())==1){
					ones++;
				}else{
					if(atoi(t.c_str())<10)
						sum+=atoi(t.c_str());
					else
						sum+=10;
				}
				t.clear();
			}else{
				t+=s[i];
			}
		}
		sum+=ones*11;
		for(;ones--&&sum>21;)
			sum-=10;
		printf("%d\n",sum>21?0:sum);
	}
}

ショートコーディング後は299Byteだった。300Byte切ることを目標にクソ適当に縮めたので載せない。

8/4 適当にショートコーディングした

C 135Byte 絶対もっと縮まる。特に{}とか

c,s,o;main(d){
	for(;scanf("%d%c",&d,&c),d;){
		d-1?s+=d>9?10:d:o++;
		if(c<11){
			for(s+=o*11;o--&&s>21;)s-=10;
			printf("%d\n",s>21?0:s);
			s=o=0;
		}
	}		
}

AOJ 0201 錬金マスター

パソコン甲子園2009予選の問題。一発書きでほぼ完成だったのは嬉しい。

クソかわいい再帰。もう再帰しか考えられない!

レシピで作った時の値段 > 素材の値段のケース忘れてて1回WrongAnswer出した。テストケースに無いのは恐いね。

#include <map>
#include <iostream>
#include <vector>
using namespace std;
map<string,int> item;
map<string,vector<string> > rec;

int saiki(string str){
	int ret = 0;
	if(rec[str].size()){
		for(int i=0;i<rec[str].size();i++){
			ret += saiki(rec[str][i]);
		}
	}else{
		ret=item[str];
	}
	if(item[str]&&item[str]<ret)ret=item[str];
	return ret;
}

int main(){
	int n,m,t;
	string s,rs;
	while(cin >> n && n){
		item.clear();
		rec.clear();
		for(int i=0;i<n;i++){
			cin >>	s;
			cin >> item[s];
		}
		cin >> m;
		for(int i=0;i<m;i++){
			cin >> rs >> t;
			for(int j=0;j<t;j++){
				cin >> s;
				rec[rs].push_back(s);
			}
		}
		cin >> s;
		cout << saiki(s) << endl;
	}
}

AOJ 0512 シーザー暗号

3問くらいショートコーディングしたら全部WrongAnswerした。原因はわかったのだけど理由が分からない。不可解すぎる。scanfの仕様が未知。

ということで、404 Not Foundをショートコーディング

69Byte

main(t){for(;~(t=getchar());)putchar(t-10?65+(t-42)%26:10);exit(0);}