カメヲラボ

主にプログラミングとお勉強全般について書いてます

やるで(`ω´)

今日は最低5問くらいはやりたい!というわけで、適当にこのエントリを更新しつつやっていきます。とりあえず2問終了。3748以降の問題が中国語なので、一瞬躊躇しましたが、正解率がやけに高いのでかなり易しいと見ました。Google翻訳は、日本語以外の翻訳なら結構使えるので、中国語→英語で大丈夫です。というか、INPUTとOUTPUT見れば大体わかるしね(´ー`)

2010.02.12追記
1日経ったので、コードを晒しときます。POJは純粋なゴルフ場ではないので気楽に出来ました。あと、一緒に遊んでくれた方々どうもありがとうございました。来年からはまたひっそりモードに戻ります。

  • 3748位操作

http://acm.pku.edu.cn/JudgeOnline/problem?id=3748
最下位ビットを0位として、x位を0、y位から3ビットを110に置き換える問題。まあ、単純なビット演算です。
scanfで3つ数字を読むので、返り値の3が使えるかなーと。ビット演算自体は特に工夫していません。もちょっと簡単にできるのかな?
75B。

main(r,x,y)
{
  printf("%x",scanf("%x,%d,%d",&r,&x,&y)<<y-1|r&~(1<<x|1<<y-2));
}
  • 3749破译密码

http://acm.pku.edu.cn/JudgeOnline/problem?id=3749
タイトルは意味わからんけど要するにcipher。もうイヤっちゅうくらいやったね。
普通にアルファベットの大文字だけっぽいので、わりと単純な式で良さそう。
69B。

c;main(s)
{
  for(;read(0,&c,1);s-=c<11)s%3||putchar(c<65?c:c%70%44+65);
}
  • 3750小孩报数问题

http://acm.pku.edu.cn/JudgeOnline/problem?id=3750
たとえば、

  A B
H     C
G     D
  F E

みたいなかんじで円形に子供が並んでるとする。で、スタート場所とステップが与えられたときに、該当順に円から抜けていって、その順番を答える問題。上の例で、Aからスタートしてステップを3とすれば、CFAEBHDGの順に抜けていく。
なんか書いてるうちにワケわからなくなってきた。見た目が汚いので、120Bくらいですっきり書けそうな気がしますが…。
132B。

v[][9];n;j,k;
main(i,s)
{
  for(;gets(v[n=-i--]););
  sscanf(v+--n,"%d,%d",&k,&s);
  for(k-=2;~++i;*v[k]=puts(v[k%=n]))for(j=s;j-=!!*v[++k%n];);
}
  • 3751时间日期格式转换

http://acm.pku.edu.cn/JudgeOnline/problem?id=3751
なんか時間の表示方法を変えるやつ。Cだと面倒。とりあえず通しただけ。
123B。

char v[];
main(n)
{
  for(;gets(v);v[3]&&printf("%s/%s-%02d%s%cm\n",v+5,v,n%12?:12,v+13,(n=atoi(v+11))>11?112:97))v[4]=v[10]=0;
}

http://acm.pku.edu.cn/JudgeOnline/problem?id=3752
スパイラル。これまたCだと面倒っぽい。苦手だ(>_<)。アルゴリズムによって縮めやすさが全然違うと思うので、めちゃ短く書く方法があるかもしれない。誰か挑戦してみて!
204B。

v[999][999];
a,b,j,x,y,k,t,d,n;
main(s,u)
{
  scanf("%d%d",&a,&b);
  u=b,s=a;
  for(x=k=-1;b;n=0)
    for(t=a,a=b,b=t-1,t=j,j=-k,k=t;n<a;++n)
      v[y+=k][x+=j]=d++;
  for(;n>=u?n=puts(""),++b<s:printf("   %c",v[b][n++]%26+65););
}
  • 3753根据关键字进行字符串拷贝

http://acm.pku.edu.cn/JudgeOnline/problem?id=3753
SafeStrcpy2KeyWordという関数の実装。ある文字列sから、キーワードkを見つけて、sの先頭からkが見つかった手前までをコピーして文字数を返す。長さが0のときはNULLと表示する。
Cで文字列操作はイヤですねぇ…。かなり手間取った。
キーワードの1文字目が'E'なら'END’、'N'なら'NULL'しか入力に含まれないみたいなので、文字コードで判定。あとはstrstrとかを使う。
142B。

char*k,w[];u[];
main(a,v)
{
  for(;gets(u);)
    for(;gets(w),*w-69;printf("%d %s\n",a,a?v:"NULL"))
      k=*w-78?strstr(strcpy(v,u),w):v,k?*k=0:0,a=strlen(v);
}
  • おまけ

3716番教えてけれってメールがあったので、ここに書いときます。まあ、プロゴルファーにとってはごく普通のコードなので、説明は省略。…と思ったけどちょっとだけ。ゴルフ初心者には優しく(´ー`)

3716's problem is here.
(1)use gets instead of scanf
(2)'b' is **argv
(3)scanf returns '-1' on failing
so write '~scanf(...)'
because ~(-1)==0

main(a,b)
{
  for(gets(b);~scanf("%d%d",&a,&b);)
    printf("%.3f\n",(a+b+10)/7.);
}