気が付いたら春でした

来年は頑張るって書いた次が5ヶ月後ってどうなのさ自分。
でも書いてなかっただけでこそこそやってたんだよ!ほんとだよ!
ということでAOJでゴルフが行われていたらしい0006と0015をやったのでコードをぺたり。
いつの間にか普通に提出しても+2Bされなくなってたのが地味に嬉しい。

0006 Reverse Sequence

逆順で出力するなら再帰でやるのがいいんじゃないかな、と思ってmain再帰で挑んだ。
入力が1行の場合しか正しく動作しないケース依存の解き方で56B。
1文字取ってくる系はreadでやった方が短くなる場合が多いと思うけど、今回のケースはgetcharの方が短くなった。
後はreturnが削れれば・・・

main(i)
{
  return i - 10 && main(getchar()) & putchar(i-1 ? i : 10);
}

最初に通した65Bもおまけでぺたり。
若干めんどくさいことしてたなあ。

main(i)
{
  i + 1 && i != 10 ? main(getchar()), putchar(i - 1 ? i : 10) : 0;
  return 0;
}

0015 National Budget

最初は何をやってもWrong Answerが帰ってきたので、どんだけ自分駄目なんだとおもいっきりへこんでた。
やけくそになってコード変えたら普通にAccept。なん・・・だと・・・?
問題になってた部分はここ。

for(i = 0; i < j; i++) puts(a[i]); //aには答えが入ってる

答えを最後にまとめて出力するんじゃなかったのか・・・
一番詰まったのがここだったので、似たような問題を解く時は気を付けよう。
Acceptされてから縮み始めて268Bまで縮んだけど、今のところここからあまり縮む気がしない。
トップの方のコードは一体どうなってるんだろう。

char a[99], o[99], t[99];
p, q, c, n, l;
main(i)
{
  for(scanf("%d", &i); i--; *a = 49, puts(strlen(a + !c) > 80 | l ? "overflow" : a + !c))
    for(c = !scanf("%s\n%s", o, t), p = strlen(o), q = strlen(t), l = p > q ? p : q, memset(a, 0, 99); l < 81 && l; a[l--] = n % 10 + 48)
      n = (--p > -1 & --q > -1 ? o[p] - 48 + t[q] : p > -1 ? o[p] : t[q]) - 48 + c, c = n / 10;
}

やってることは文字コードを数値に直して1桁1桁足し算してるだけ。
だけど、最後に答えの文字列の先頭に1を入れてるので、答えを出力する時に最後の1桁を計算した結果
桁上がりが発生していない場合、ポインターを1個進めてやらないと余計な1が出力されちゃう。


途中で書いた292Bのコードもとりあえずぺたり。
これからこっちを短くしてもいいんじゃないかなと思う。

b[];
char a[99], o[99], t[99];
p, q, c, n, l;

main(i)
{
  for(scanf("%d", &i); i--; puts(strcpy(a, l < 1 & c | l < 0 ? "overflow" : c ? strcat(b, a) : a)))
    for(scanf("%s\n%s", o, t), p = strlen(o), q = strlen(t), c = 0, l = 80, *b = 49, memset(a, 0, 99); p-- > 0 | q-- > 0; l--)
      n = (p > -1 & q > -1 ? o[p] - 48 + t[q] : p > -1 ? o[p] : t[q]) - 48 + c, c = n / 10, n % =10, a[p > q ? p : q] = n + 48;
}

書いてて思った。strcpyいらなくね?
あばばばば。

来年は頑張る

また大放置してしまった・・・
アウトプットの手段として選んだはずなのに、アウトプットしないってどうなの。
文章を書くという行為が苦手で、直そうと思ったのもあったはずなんだけどなあ。
些細なことでも書くようにした方がいいのかな。
とにかくアウトプットするっていう癖をつけないと。
もうちょっとお手軽な感じにできればいいんだけどな。


それと今日は都合よくXmas Contest 2010がやってたので参加してきた。
けど結果は無知を晒しただけというorz
思考が短絡的すぎて死にたい。
この辺りは永遠に直らない気がしてきた・・・
直せないなら気をつけましょう自分。もっと勉強しましょうね!

SRM479 DIV2

丁度SRM479に出られる時間に家にいたので参加した。
ちょっと遅いけど結果を書いておこう。
散々だったのが悲しいけど。

250

飛行機に入っている燃料だけで何回飛べるかっていう問題。
問題自体はすごく簡単だったけど、問題を理解するまでに時間がかかった。
他の方がどんどん提出していく中で、自分だけ問題文と戦っているのは心臓に悪いorz
解けたには解けたけどこれじゃ全然駄目だ。
提出したコードを見直したらなんか変なコードで更にへこむ。


この問題はチャレンジで落とせそうなのを見つけたので、嬉々として落としに行ったら失敗した。
for文を抜けた先にReturnが無いコードだったので、どんな動作をするのかわからなかったけど、まさか正解を返すとはorz
なんでじゃーと思ったら最後に使った変数の値を返していたみたい。
そういえばAOJでゴルフする時にそんな小技が使えたな、と失敗してから思い出した・・・

#include <iostream>
#include <vector>

using namespace std;

class TheAirTripDivTwo
{
  public:
  int find(vector <int> flights, int fuel)
  {
    int ans = 0;
    int v_size = flights.size();
    
    for(int i = 0; v_size--; fuel -= flights[i], i++)
    {
      if(flights[i] <= fuel)  ans++;
      else break;
    }
    
    return ans;
  }
};

500

スチュワーデスがコーヒーとお茶を乗客に配り終えるまで最短で何分かかるかっていう問題。
またしても問題文と格闘することしばし。
終了まで10分切った時点で理解してコーディング始めたけど当然間に合わなかったorz
得点できそうな問題だっただけにがっかり感がひどい。

ひさしぶり

しばらくゴルフしてなかったので再開した。やっぱり楽しい。
ひさしぶりに今までやったコードを眺めてたら、縮められそうなのを見つけたので早速縮めた。

transpose lines

あちこち細々と修正をかけて5B短縮することができた。現在96B。
大きい値が欲しいなら、わざわざ値を代入しないでアドレス入れればいいんじゃ?
と思って入れてみたら動いた。ばんざーい。
後は配列をどうにかして削れれば80B台が見えてくるかな。

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

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

本当に知っていること

軽くプログラミング的なことの説明を求められたことがあって、説明したけど上手く言えてなかった。
知っているはずなのに上手く説明できないのは、本当に理解していないからだろうなと思ってへこむ。
もちろん話が下手なのもあるとは思うけど、そっちはまた別の問題だよなあ・・・
理解したつもりなことと、本当に理解したことはどうすれば判別できるんだろう。
クマのぬいぐるみに向かって勉強したことを話せばいいのかなw
本を読んで理解したつもりになって行動が伴ってないから、とにかく実践あるのみ、なんだろうなー

SRM471 DIV2

久しぶりに出られて意気込んでたらサーバーが落ちたorz
キャンセルになりそうなのでこのまま終了。
250点問題は一応得点できそうだったけど、相変わらず500点問題がなかなか解けないのが悲しい。
もっと頭使っていこう。

250

与えられた数を2のn乗で割っていった答えの中に、素数は何個あるかっていう問題。
総当りでも時間的にいけそうだったので総当りで解いた。
今更だけどソースをぺたり。
もっと上手く書けるようになりたいな。

#include <iostream>

class PrimeContainers
{
  public:
  int containerSize(int N)
  {
    int n = N;
    int ans = 0;
	
    for(; 1 < n; n /= 2)
    {
      int flag = 0;
		
      for(int i = 2; i < n; i++)
      {
        if(n % i == 0)
        {
          flag = 1;
          break;
        }
      }

      if(!flag) ans++;
    }
	
    return ans;
  }
};

500

問題文を必死で読んでたらサーバーが落ちた。
問題が解けないのも問題だけど、英語ももっと読めるようにならないとなあ・・・

基本情報

日曜日に基本情報受けてきたので感じたこととかメモ。

時計は持ち込もう

あると便利。

お昼ご飯も持ち込もう

買いに出たりすると食べる時間が無くなる。

パニクるな

基本中の基本だけど、午後の試験の冊子が予想外に厚かったのでびっくりしてちょっと思考停止した。
そのうち実際使うのは半分あるかないかなので、落ち着いて解けば問題ないはず。

データベースやろう

データベースが嫌いでずっと避けてきたけどちゃんとやろう。
半分くらい外したっぽいからここは課題だなあ。
でも面白みが全然わからないのは如何ともしがたい・・・
データベースの楽しさを語れる人がいたら是非話を聞きたい。


午後の試験で選択問題変更を乱発したり他にも反省点多数。
なんか全然進歩してない気がするorz
けど受けてみて良かったかなと思う。他の試験とかも受けてみようかな。