SRM466 DIV2

最近一ヶ月放置余裕でしたな感じがひどい・・・
おまけに久しぶりに出られたSRMも結果は散々orz
もっと頭使おう。

250

与えられた4つの数値を使って指定された答えが出せるかっていう問題。
割とあっさり解けたぜ!とか余裕こいてたら落とされてたorz
全パターンを試しておかなければいけなかったのに、降順でソートして計算しただけじゃ駄目ですよね・・・
行けると思ったんだけどなあ。浅はかすぎた。
例題のテストパターンが解けたからって油断しないようにしよう。

500

与えられた数値の桁を0か既存の桁の数値で書き換えて、約数が奇数個になる最小の書き換え回数を求めろっていう問題。
だと思うけど英語が怪しい・・・
考えてる間に時間切れ。プログラミングは数学だよ兄貴!

ぎゃーす

気が付いたら一ヶ月まるまる放置してたのに気が付いたorz
ログファイルの出力が上手くいってなかったようですね!
猛省・・・

transpose lines

forを1回にまとめたのと、getcharをreadに変えて5B短縮。101B。
後は余分な括弧とか数値を入れてるのを削っていきたいところ。100B未満に抑えたい。
getcharをreadに変えると短くなるなと思った時点で、前の日記に書いた気がして見返してみたら書いてあったorz
物忘れが激しいというか学習してないというか・・・

char c[99][99];
j, k, l=99;

main(i)
{
  for(; j <= l;)
    read(0, &i, 1) ? i > 10 ? c[j++][k] = i : (l = j, j = 0, k++) : puts(c[j++]);
}

Member SRM461 DIV2

初めてのChallengeが成功したSRM
いつものように問題を読むのに手間取ったけど、少しづつ早くなってきた。
翻訳エンジンに頼るより自分で読んだ方が理解できる場合も増えてきたのが嬉しい。
内容は散々だったけどrateは+50点が影響してちょっと増えた。
でもグリーンコーダーはまだまだ遠いなあ・・・

250

兎が罠にかかるのは最短で何秒後かっていう問題。
問題を理解してからコーディングまでは良かったものの、動作がおかしくてしばらく悩む。
こんなコードのどこにバグがあるんだろうと思ったら、変数の扱いが滅茶苦茶だった。
変数の取り扱いは計画的にね!
そのおかげで大分失点してしまったのが情けない・・・
おまけにChallengePhaseで他の人のソースを読んで深い悲しみに包まれた。
なんていう解き方してるんだ自分orz

#include <iostream>
#include <vector>

using namespace std;

class TrappingRabbit
{
  public:
  int findMinimumTime(vector <int> trapX, vector <int> trapY)
  {
    int ans = 1000000000;
    int rabbitX = 0;
    int rabbitY = 0;
    
    for(int i = 0; i < trapX.size(); i++)
    {
      rabbitX = 0;
      rabbitY = 0;
      
      for(int j = 0; j < trapX[i] - 1; j++)  rabbitX++;
      for(int k = 0; k < trapY[i] - 1; k++)  rabbitY++;
      
      if(ans > rabbitX + rabbitY)
        ans = rabbitX + rabbitY;
    }
    
    return ans;
  }
};

550

問題文と格闘することしばし、さっさと諦める。

ペースダウン

ゴルフやるペースがすっかり落ちてしまった。
モチベーション上げて行こう。

transpose lines

入力された文字列を縦読みして出力しろっていう問題。
最初の方針として文字列を全て読み込んでから、1行の長さを判断して1文字づつ縦読みしていく方針で挑んでみた。
長くなりそうだなと思いつつ、とりあえず作ってみたけど案の定長くなってしまってへこむorz
そこから軽く削ってみてやっぱり駄目だと思って放棄。
出力用の文字列を作っておいてまとめて出力する方針に変更して106Bまで縮んだ。
まだまだ無駄が多いけど80B台まで削っていけるかな・・・


106B

char c[99][99];
j, k, l;

main(i)
{
  for(; (i = getchar()) > 0;)
    i > 10 ? c[j++][k] = i : (l = j, j = 0, k++);
  for(; j < l;)
    puts(c[j++]);
}

記録として最初のコードもぺたり。
124B版

char c[];
j, k , l, m;

main(i)
{
  for(i = read(0, c, 999), j = strchr(c, 10) - c; m < j;)
    l < i / (j + 1) ? putchar(c[k]), k += j + 1, l++ : (puts(""), k = ++m, l = 0);
}

119B版

char c[];
j, k , l, m;

main(i)
{
  for(j = read(0, c, 999), i += strchr(c, 10) - c; m < i;)
    l < j / i ? putchar(c[k]), k += i, l++ : (puts(""), k = ++m, l = 0);
}

落ち着いたからゴルフ

やっとこ落ち着いてきた感じなのでゴルフ。
TopCoderにあまり出られなくなりそうな感じなのでゴルフを頑張ろうと思う。
ので軽く前にやったのを見直して縮めてみた。

delete last line

1行1行読んで最後の行だけ出力しない方向から、まとめて読み込んで規定文字数だけ出力する方向に変更した。
完全にケース依存になってしまったけど3B縮んで48B。

main(i)
{
  read(0, &i, 999);
  write(1, &i, i & 64 ? 146 : 17);
}

Greatest Common Divisor

1行読み込んで最初の文字列だけ見てるんだったら最初の文字だけ取ってくればいいじゃない。
ということで1文字だけ読み込んで、数値も先に修正しておくようにした。3B縮んで53B。
地味に3B縮めてたら最短が10Bも一気に縮んでて絶望した!

main(i)
{
  i = getchar() - 50;
  puts(i ? i > 2 ? "32768" : "14" : "3");
}

すっかり明けてました

年明けからなんかばたばたしててすっかり放置してしまった・・・
最近ゴルフも手付かずだし、何も作ってないしで非常にまずい。
やりかけのまま放置してるEFFのDESクラッカーのソースもきちんと読んでおきたいし、並列プログラミングもきちんと勉強したい。
とにかく基礎学力が足りてないのが今になって相当響いてる。
時間が欲しいなあ・・・

join lines

標準入力から与えられる文字列の改行を取り除いて出力しろっていう問題。
ソースが公開される問題だけどこっちにも記録として残しておく。
何個か通して35Bまで削ったけど、35B意外のコードが見つからないのでとりあえず35Bのだけ。
34Bのソースを読まずに34Bまで行けるかな・・・

main(i)
{
  for(; gets(&i); printf(&i));
}

printfの第1引数に文字列のポインターを渡すと、改行無しで表示できるのに気付いたので縮んだ。
おもいっきり盲点。

printf("Hello World!");

なんていうのも動くんだった・・・
すっかりフォーマットで出力するものだと思い込んでたので、気が付いた時はとても複雑な気分でした。
なんか他にも思い込みとか勘違いとか盛大にやらかしてそうな気がしてきた。

コンパイラとゴルフ

anarchy golfのサーバーが新しくなったので、コンパイラのバージョンも当然変わってた。
GCC4.1.2からGCC4.3.4になってたのだけど、この影響で動かなくなったコードも出たみたい。
googleの55Bのコードを通してなかったので、通しておこうと思ったら動かなくなってた。
よって、現時点での最短コードは私のコードということになる。ばんざーい!
なんて言ってもなんか切ない・・・
ゴルフをする上で、コンパイラのバージョンによって動く動かないを把握しておくのも大事だなと思った。

Greatest Common Divisor

その名の通り最大公約数を求めろっていう問題。
テストケースが多ければ普通に計算した方が短くなるかもしれないけど、いつものように答えを埋め込んだものを提出。
特に工夫もなく56Bだけど、同じようにずるしてると思われるコードが44Bってどういうことだろう。乱数?

main(i)
{
  gets(&i);
  i = i & 15;
  puts(i > 2 ? i > 5 ? "32768" : "14" : "3");
}

reverse lines

入力された文字列をひっくり返して出力しろっていう問題。
ひっくり返すということで、再帰で行うのが短くなりそうと思いmain再帰で行くことに。
そのアプローチが正しかったようで41Bまで縮めることができた。
ゴルフをする場合でも、ローカル変数が役に立つこともあるのだということを学習した。


46B版

main()
{
  int c[99];

  gets(c) && main();
  *c && puts(c);
}

41B版

main()
{
  int c[99];

  gets(c) && main() & puts();
}