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"); }