AOJ 1601 Short PhraseのShort Coding
最近追加されたっぽい。といた。問題タイトル的にも、なんとなくショートコーディングしたくなったので、した。 223bytes。
それなりに改行入り↓
#include<iostream> #define f(X) for(c=0;c<X;c+=v[p++]);if(c-X)goto L; using namespace std; main(){ for(int n,v[50],s,p,c;cin>>n,n;){ string t; for(s=0;s<n;)cin>>t,v[++s]=t.size(); s=0; L: p=++s; f(5)f(7)f(5)f(7)f(7) cout<<s<<endl; } }
改行最小限↓
#include<iostream> #define f(X) for(c=0;c<X;c+=v[p++]);if(c-X)goto L; using namespace std;main(){for(int n,v[50],s,p,c;cin>>n,n;){string t;for(s=0;s<n;)cin>>t,v[++s]=t.size();s=0;L:p=++s;f(5)f(7)f(5)f(7)f(7)cout<<s<<endl;}}
知見
- scanfよりcinつよい
- printfよりcoutつよい
- defineで末尾セミコロンつよい(vimのauto indentなんかがききづらくなるが)
- strlen(char*)よりstring::size()
- forよりgoto loopのほうがつよい可能性
- mainは型名をつけなくても、0を返さなくても(AOJは)とおる
- ラベル名は一行占拠する必要も、行頭にある必要もない
- 1-basedな問題には1-basedにすることで出力行での+1が不要に
- 今回はendlを'\n'にすることで同バイト数だったが、strlen("using namespace std") == 4 * strlen("std::")
いろいろがんばったけどこれ以上は思いつかない...
2016/06/29 06:00 update
サークルの部長satosくんに見せたら、彼はとてもつよかった。
少しアドバイスをもらっただけで、劇的に短くなった。負けた。つらい。 まあC++じゃなくてCになっちゃうんだけど。
#define f(X) for(c=0;c<X;c+=v[p++]);if(c-X)goto L; int n,v[50],s,p,c,a[9]; main(){ for(;n=atoi(gets());){ for(s=0;s<n;v[++s]=strlen(gets())); s=0; L: p=++s; f(5)f(7)f(5)f(7)f(7) printf("%d\n",s); } }
#define f(X) for(c=0;c<X;c+=v[p++]);if(c-X)goto L; n,v[50],s,p,c,a[9];main(){for(;n=atoi(gets(a));){for(s=0;s<n;v[++s]=strlen(gets(a)));s=0;L:p=++s;f(5)f(7)f(5)f(7)f(7)printf("%d\n",s);}}
a[9]は完全にgetsに与えるためだけの領域。 問題文によると、一行に与えられる文字列は10文字になりうるから足りないと思うかもしれないが、こいつはintなのでsizeof(int)*9 bytesまでは大丈夫。
あと、もしitoaが動かせたら、puts(itoa(s)) <- printf("%d\n",s) になってよいのになぁって。
cの闇を感じた今日このごろ。
これをさっきの記録を更新したと認めると、つまり言語が変わってしまっても許された訳で、つまりRubyで挑戦したときに文句を言えなくなるわけで。
新たに他の言語でShort Codingしたということかな。