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

cookies.txt      .scr

ただのテキストファイルのようだ

AOJ 1601 Short PhraseのShort Coding

AOJ 1601 Short Phrase

最近追加されたっぽい。といた。問題タイトル的にも、なんとなくショートコーディングしたくなったので、した。 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になっちゃうんだけど。

187 bytes

#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したということかな。