2011年12月29日木曜日

直方体の重なり

ソニーの2013年の入社試験のプログラムコンテンストの練習問題をといてみました。
http://www.sony.co.jp/SonyInfo/Jobs/newgrads/sus/go_for_it.html
 重なる条件より、重ならない条件を考えたほうが楽なので、まず一次元で重ならない判定関数を作って試験をして、それを三次元に拡張しています。また、始点と終点を含めるか含めないかでテストケースも異なるのですが、とりあえずは始点は含める、終点は含めないでパターンで作成しています。

---------

#include <stdio.h>

class Cube{
    public:

    Cube(int xx,int yy,int zz,int ww,int hh,int dd);
    virtual ~Cube();

    static bool kasanaranai(int x0,int w0,int x1,int w1);
    bool kasanaru1d(Cube& cc);
    bool kasanaru(Cube& cc);

    private:
    int x,y,z,w,h,d;
};

Cube::Cube(int xx,int yy,int zz,int ww,int hh,int dd){
    x=xx;y=yy;z=zz;
    w=ww;h=hh;d=dd;
}


Cube::~Cube(){
}


bool Cube::kasanaranai(int x0,int w0,int x1,int w1){
    //printf("kita %d %d %d %x\n",x0,w0,x1,w1);
    if(x0+w0<=x1 || x1+w1<=x0)return true;
    return false;
}

bool Cube::kasanaru1d(Cube& cc){
    return !kasanaranai(x,w,cc.x,cc.w);
}

bool Cube::kasanaru(Cube& cc){
    return (!kasanaranai(x,w,cc.x,cc.w)) && (!kasanaranai(y,h,cc.y,cc.h)) && (!kasanaranai(z,d,cc.z,cc.d));
}


main(){
    Cube c0(0,0,0,2,2,2);
    Cube c1(2,2,2,2,2,2);
    Cube c2(-2,-2,-2,2,2,2);
    Cube c3(-2,-2,-2,3,3,3);
    Cube c4(-2,-2,-2,20,20,20);
    Cube c5(-2,-2,-2,20,20,2);
    Cube c6(-2,-2,-2,20,20,3);
    Cube c7(-2,-2,-2,2,20,20);
    Cube c8(-2,-2,-2,3,20,20);
    Cube c9(-2,-2,-2,20,2,20);
    Cube ca(-2,-2,-2,20,3,20);
    printf("t1\n");
    printf("%s\n",c0.kasanaru1d(c1)?"kasanaRU!!":"kasanaraNAI");
    printf("t2\n");
    printf("%s\n",c0.kasanaru1d(c2)?"kasanaRU!!":"kasanaraNAI");
    printf("t3\n");
    printf("%s\n",c0.kasanaru1d(c3)?"kasanaRU!!":"kasanaraNAI");
    printf("t4\n");
    printf("%s\n",c0.kasanaru1d(c4)?"kasanaRU!!":"kasanaraNAI");

    printf("t5\n");
    printf("%s\n",c0.kasanaru(c1)?"kasanaRU!!":"kasanaraNAI");
    printf("t6\n");
    printf("%s\n",c0.kasanaru(c2)?"kasanaRU!!":"kasanaraNAI");
    printf("t7\n");
    printf("%s\n",c0.kasanaru(c3)?"kasanaRU!!":"kasanaraNAI");
    printf("t8\n");
    printf("%s\n",c0.kasanaru(c4)?"kasanaRU!!":"kasanaraNAI");
    printf("t9\n");
    printf("%s\n",c0.kasanaru(c5)?"kasanaRU!!":"kasanaraNAI");
    printf("ta\n");
    printf("%s\n",c0.kasanaru(c6)?"kasanaRU!!":"kasanaraNAI");
    printf("tb\n");
    printf("%s\n",c0.kasanaru(c7)?"kasanaRU!!":"kasanaraNAI");
    printf("tc\n");
    printf("%s\n",c0.kasanaru(c8)?"kasanaRU!!":"kasanaraNAI");
    printf("td\n");
    printf("%s\n",c0.kasanaru(c9)?"kasanaRU!!":"kasanaraNAI");
    printf("te\n");
    printf("%s\n",c0.kasanaru(ca)?"kasanaRU!!":"kasanaraNAI");
}

2011年12月24日土曜日

アンパンマンなかよしコンサート

クリスマスやお正月が近いので日本のおもちゃについて。

メーカーで物を作っていて思うのですが、最近のおもちゃって中国製が多いので、コストの問題でなんか完成度が低いものが多いのですが、久しぶりに完成度の高いおもちゃを見ました。

それがこの「アンパンマンなかよしコンサート」という幼児向けのピアノ。
 昔は「アンパンマンわくわくコンサート」だったらしく、さらに初期のころは「ピヨピヨコンサート」というものだったらしいです。




 森 俊憲さんという方がデザインをされているようです。
http://carnival2009.blog66.fc2.com/category22-3.html#entry165
http://carnival2009.blog66.fc2.com/category22-3.html#entry184
http://carnival2009.blog66.fc2.com/category22-3.html#entry166

生産はもちろん中国なのですが日本でデザインをやっているようです。

音の出るおもちゃって基本的に音が良くないといけないと思うのですが、これはきちんとしたスピーカーの音がする。さらに、音の高さ、曲の調、など基本的に全部あっている。鍵盤をおした感覚が良い。塗装がきちんときれいにされている。色がきちんとしている。指をはさまないようになっている。なめても良いようになっている。落としても平気になっている。大きくなっても長い間楽しめるようになっている。・・・

などどれも基本的なことなのですが、これらのことを全部完璧にやっているおもちゃってなかなかないんですよね。とくに電子的な機構が入っているおもちゃって、電気的な部分にお金がかかるのでこういう部分がおろそかになるのですが、これはかなり完成度が高い。

また、物って目的がはっきりしていないといけないし、創造的でないといけないし、楽しくないといけないと思うのですが、これらもはっきりしてます。芸術の域に達している。

唯一の不満は、アンパンマンだけに本体がパンの色をしていないといけないと思うのですが、理由がたって色を変えたそうなのです。

 こういういいおもちゃがたくさん世の中に受け入れられると良いですね。

2011年12月23日金曜日

PDドライブを使う

15年くらい前に使われていた、SCSI接続のPDドライブ。同じ時期にMOドライブとかZIPドライブとかもあったのですが、これをWindows7のパソコンにつなげてみました。


いつものようにUSBに変換して接続します。
用意するものはSCSI-USB変換機 。

この変換機はOSの標準ドライバーを使うので、特にドライバーとかを入れる必要なく 、ケーブルをパソコンに接続するだけでPDが使えます。


Windows7のパソコンにPDドライブを接続して無事にPDディスクのフォーマット、読み込み、書き込みができました。
昔Windows3.1でこのドライブを使っていたときは、CD-ROMドライブとしても使ました。しかし、USB接続にすると、CD-ROMドライブとしては認識されないようで、CDをいれても何も起こりません。
 まあ、これはいいか。



2011年12月22日木曜日

グーグルとかマイクロソフトとかの入社試験

よーめー日記には技術的なことしか書かないと決めているのでたまにしか日記を書きません。
僕の日記の更新スピードと、Facebookが外部の日記のインポートをサポートしなくなるスピードを比べると、Facebookが古い機能をサポートしなくなるスピードのほうがはるかに早いです。
僕の日記がいつまでもFaceBookに繁栄されず、くっそーと思ったので、しばらくは一週間に一度くらい技術的な日記を書いてやる。

グーグルとかマイクロソフトとかの入社試験の問題が難問奇問のかなりユニークな問題なのは昔から有名な話ですが、昔からどのような人たちがどのような考えや目的で作っているのかとても気になっていました。
日本企業だったらこんな問題をつくっても採用部の上司がたぶん良い問題かどうかも判断できないし、絶対に実現しないと思っていたので、それに立ち会うこともないだろうと思っていました。
ですが、とある企業のユニークな入社問題の作成に偶然立ち会うことができました。

どんな人が作っているのか、それは、一言でいうとぼくの予想通り、やはり変な人が作っていました。
あらゆることに超こだわりを持っている変な人が変な問題をつくってるんですね。
どんな目的なのか、それは企業や世界を変えていけるような人材を採用することのようです。

そんななか問題作成者の共通点をみつけました。問題を作っている人は会社に自分のコーヒーメーカーを持っている。
そういえば、とても優秀な僕の後輩が昔会社の金で自分のコーヒーメーカーを買っていました。

まず、コーヒーメーカーを買うことが問題を解くための第一歩だと思った今日でした。

2011年12月20日火曜日

ソニーNEXのレンズをキャノンEOSにつける

カメラのレンズはマウントアダプターを使えば他のメーカのボディーにつけることができます。
しかし、フランジバックの長さが長いボディー用のレンズをフランジバックが短いボディーにはマウントアダプター経由でレンズがつけられるのですが、その逆はマウントアダプターが作れないというか、売られていないのでつけられません。

たとえばキャノンのEOSのレンズはソニーのNEXのカメラにマウントアダプターを介してつなぐことができます。しかし逆にソニーのNEXのレンズはキャノンのEOSのカメラにはつなげられません。

でも本当は作れるんです。無理やり作ってつなげると標準レンズがマクロレンズになりますが、イメージサークルが同じならばきちんと撮影できるはず。マウントアダプターが売られない理由はたとえ作ったとしてもレンズがマクロレンズになってしまうためにただ作らないだけなのです。

そこで、NEXレンズをEOSボディーにつなぐマウントアダプターを作ってみました。
作り方。
まず、NEX用の接写リングとニコン用の接写リングをそれぞれ用意します。
 ソニーのEマウントとニコンのFマウントは内径が同じなので、接写リングのボディー側とレンズ側の口が相互につながります。これでソニーEマウントからニコンFマウントのアダプターができます。
 ニコンFマウントからEOSのEFマウントに変換するアダプターは市販されているので、されにこれをつなげるとソニーEマウントからEOSのEFマウントに変換するアダプターができます。
フランジバックがとても長くなっているのでNEX用の標準レンズをつなぐとマクロレンズになってしまいますが、イメージサークルの大きさはどちらもAPS-Cサイズなのでイメージセンサーの全領域できちんと画が写るはず。うちの赤ん坊が横でこのカメラをペロペロしようと狙っているのでマクロ撮影がゆっくりできませんが、とりあえずきちんと撮れています。真ん中しかピントがあっていないのでもう少し絞りとかを調整しないといけないと思うのですが、それはまたあとでゆっくりやります。

2011年12月12日月曜日

PCカードのCD-ROMドライブをUSB接続にする

最近のノートパソコンはCD-ROMドライブがついていません。
たまにしか使わないのに、買うのももったいないので、昔のノートパソコン用のPCカード接続のCD-ROMドライブをUSB接続に改造してみました。
PCカードは当時はPCMCIAとか呼ばれていたものなのですが、それをUSBで最近のノートパソコンに接続する方法は誰も日記に書いていないので書きます。
まず、昔のPCカード接続のCD-ROMドライブを用意します。
とりあえず今回は家にあった、VAIO用のPCGA-CD51というものを使用します。


次に、ATA用のスリムドライブのケースを用意します。PCカードのCD-ROMドライブは中身はスリムATAのドライブなのです。スリムATA用のケースを買い、中に入っているスリムATA→USB変換基板を取り出します。今回はAmazonで売っている、変換名人というブランドのケースを使用しました。
そして、この取り出した基板をVAIOのCD-ROMドライブに取り付けます。
逆に、VAIOのCD-ROMドライブをスリムATAのケースに取り付けても良いのですが、せっかくVAIOのかっこいいケースがあるので、今回は基板をVAIOのCD-ROMドライブに取り付けます。

 USBと電源の端子の部分が飛び出していてそのままではケースが閉まらないので、ケースの内側をカッターで削り、 USBと電源の端子がケース内に収まるように加工します。

これで蓋をすれば、PCカードのCD-ROMドライブをUSB接続にすることができます。
変換名人のケースを買うと、USB変換基板とともに、USBケーブルと電源ケーブルが付いているので、ケース以外のすべての部品がそのまま使えます。


 最近いろいろな機器の仕組みを勉強したら、いろいろなつながらないものが実は簡単につながることうがわかりました。次はソニーのNEXのレンズをキャノンのEOSのカメラにつないでみようと思います。反対のEOSのレンズをNEXにつなぐのは簡単なんですがね。

2011年11月11日金曜日

WLAE-AG300Nをルータにする

コンセントに直挿しできるバッファローの無線LANルータがほしいのですが売っていません。
なので無線LANコンバータWLAE-AG300Nを改造して自分で作ります。

まず、WLAE-AG300NにDD-WRTをいれます。

ここからファームをダウンロードします。
http://www.dd-wrt.com/site/index

ここのページから以下のメニューを選択します。

Router-Database
other-downloads

さらに、以下のディレクトリにいきます。

others/eko/BrainSlayer-V24-preSP2/2011/06-14-11-r17201/buffalo_wlae_ag300n

ここから次のファームをダウンロードします。
buffalo-to-dd-wrt_webflash-MULTI.bin

パソコンとWLAE-AG300NをLANケーブルでつなぎます。
WLAE-AG300NにはLANポートが2つついています。
DD-WRTを入れるとバッファローのロゴが印刷されている正面から見て右側がLANポート、左側がWANポートになります。
なので右側のLANポートとPCとをつないでください。

ケーブルをつなぐとパソコン側のIPアドレスがAutoIPのアドレス、169.254.*.*になるので、パソコン側のIPアドレスを固定IPに変更します。
固定IPへの設定変更はコントロールパネルのネットワークの設定から行います。
PC側のIPアドレスは192.168.11.2、ネットマスクは255.255.255.0に設定します。


ブラウザから以下のURLを開きます。
http://192.168.11.100

WLAE-AG300Nの設定画面が開きます。
ファーム更新画面からbuffalo-to-dd-wrt_webflash-MULTI.bin
を選びファームを更新してください。

ファームの更新が終わったら赤いLEDがつきっぱなしになります。
ファーうの更新でWLAE-AG300Nのデフォルトの設定用IPアドレスが192.168.1.1に変わります。
なので、PC側のIPアドレスは192.168.1.2、ネットマスクは255.255.255.0に設定します。

ファームの更新が終わったら以下のURLにアクセスしてルータの設定をします。
http://192.168.1.1

DD-WRTの設定画面になるので、WANの設定メニューを選びます。
WANのIP設定をENABLEを選びWANのIPの設定をDHCPにします。
設定を保存し、適用ボタンを押し、設定を反映させます。

続いてWirelessの設定メニューを選びます。
無線の動作モードをAPに設定します。

これでWLAE-AG300Nがルータになります。

2011年9月28日水曜日

Google Code Jam Japan 2011 #3

例の解けないB問題のlarge、集合同士の合併は無いと思っていたのですが計算してみたらどうやらあるらしい。そこで忠実に集合の合併を行うようにコードを修正してみました。とりあえず答えは正しいのですが、どういうときに集合の合併が起きるのかいまだによくわからないです。

------------------------------
 #include <stdio.h>
#include <stdlib.h>
#include <string.h>

#if defined(_MSC_VER) && _MSC_VER<1300
#define longlong _int64
#define PLLD "%I64d"
#else
#define longlong long long
#define PLLD "%lld"
#endif

#define PLD "%ld"
#define PD "%d"


int p[1000001];
int rank[1000001];
char isPrime[1000001];

int root(int x) {
    if (p[x] != x)
        p[x] = root(p[x]);
    return p[x];
}
  
void funion(int a, int b) {
    int aa,bb;
    aa=a,bb=b;

    a = root(a);
    b = root(b);
    //printf("SS a=%d b=%d root(a)=%d root(b)=%d rank[a]=%d ranl[b]=%d\n",aa,bb,a,b,rank[a],rank[b]);

    if (rank[a] < rank[b]){
        p[a] = b;
    }
    else {
        p[b] = a;
        if (rank[a] == rank[b]){
            rank[a]++;
            //if(rank[a]>=2){
            //    printf("kita!\n");
            //}
        }
    }
    //printf("EE a=%d b=%d root(a)=%d root(b)=%d rank[a]=%d ranl[b]=%d\n",aa,bb,a,b,rank[a],rank[b]);
}
  
int main(){
    FILE *fi=NULL,*fo=NULL;
    char buf[1024];

    int i,j,y;
    int caseCnt,caseNum;

    //fi=fopen("test.txt","rt");
    //fi=fopen("B-small-practice.in","rt");
    fi=fopen("B-large-practice.in","rt");

    //fo=fopen("result.txt","wt");
    //fo=fopen("result-small.txt","wt");
    fo=fopen("result-large.txt","wt");

    if(fi==NULL || fo==NULL)goto end;


    fgets(buf,sizeof(buf),fi);
    sscanf(buf,PD,&caseCnt);

  
    memset(isPrime,1,sizeof(isPrime));
    isPrime[0]=0;
    isPrime[1]=0;
    for (i=2; i<=1000000; i++)
        for (j=2*i; j<=1000000; j+=i)
            isPrime[j] = 0;


    for (caseNum=1; caseNum <= caseCnt; caseNum++) {
            longlong A,B;
            longlong x;
            int P;
            int res;

            fgets(buf,sizeof(buf),fi);
            sscanf(buf,PLLD PLLD PD ,&A,&B,&P);

            for (i=0; i < B - A + 1; i++) {
                p[i] = i;
                rank[i] = 0;
            }
            res = (int)(B - A + 1);
            for (i=P; i<=1000000; i++) {
                if (!isPrime[i]) continue;
                x = A / i * i;
                if (x < A) x += i;
                x -= A;
                for (y=(int)x+i; y < B - A + 1; y += i)
                    if (root((int)x) != root(y)) {
                        res--;
                        funion((int)x, y);
                    }
            }
            printf("Case #" PD ": " PD "\n",caseNum,res);
            fprintf(fo,"Case #" PD ": " PD "\n",caseNum,res);
            //break;
        }

end:
    if(fi)fclose(fi);
    if(fo)fclose(fo);
    return 1;



------------------------------

2011年9月21日水曜日

Google Code Jam Japan 2011 #2

Code Jam の問題がどうしても答えが合わないので別のアルゴリズムでといてみました。
前回は集合を足していく方法で求めたので、今回は集合を引いていく方法で求めて見ました。
やはりGoogleと答えが合わない。

------------------------------
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#if defined(_MSC_VER) && _MSC_VER<1300
#define longlong _int64
#define PLLD "%I64d"
#else
#define longlong long long
#define PLLD "%lld"
#endif

#define PLD "%ld"
#define PD "%d"


char sosu[1000010];
int sosu_list[100000];

char onaji[1000010];

main(){
    FILE *fi=NULL,*fo=NULL;

    char buf[256];
    longlong a,b,p;
   
    int i,j,c;
    int sct,kotae;

    //sosou wo motomeru
    sosu[0]=1;
    sosu[1]=1;
    for(i=2;i<1000003;i++){
        if(sosu[i]==0){
            for(j=i*2;j<1000010;j+=i)sosu[j]=1;
        }
    }

    for(sct=0,i=0;i<1000003;i++)if(sosu[i]==0){
        sosu_list[sct++]=(int)i;
    }

    printf("sosu=%d\n",sct);
    //fi=fopen("test.txt","rt");
    //fi=fopen("B-small-practice.in","rt");
    fi=fopen("B-large-practice.in","rt");

    //fo=fopen("result.txt","wt");
    //fo=fopen("result-small.txt","wt");
    fo=fopen("result-large.txt","wt");

    if(fi==NULL || fo==NULL)goto end;


    fgets(buf,sizeof(buf),fi);
    sscanf(buf,PD,&c);



    for(i=0;i<c;i++){

        fgets(buf,sizeof(buf),fi);
        sscanf(buf,PLLD PLLD PLLD ,&a,&b,&p);

        kotae=(int)(b-a+1);
        memset(onaji,0,sizeof(onaji));

        // kousoku soinnsuu bunkai
        printf("bunkai\n");
        for(j=0;j<sct;j++){
            longlong t;
            int flag=0,kita=0;
            if((longlong)(sosu_list[j])<p)continue;
            if((longlong)(sosu_list[j])>b)break;

            t=a+sosu_list[j]-1;
            t/=sosu_list[j];
            t*=sosu_list[j];

            //printf(PLLD"\n" ,t);
            while(t<=b){
                int pos=t-a;
                kita=1;
                if(onaji[pos]==0)kotae--;
                else flag=1;
                onaji[pos]=1;
                t+=sosu_list[j];
            }
            if(flag==0 && kita==1)kotae++;
        }

        printf("Case #%d: %d\n",i+1,kotae);
        fprintf(fo,"Case #%d: %d\n",i+1,kotae);
        //break;
    }


end:
    if(fi)fclose(fi);
    if(fo)fclose(fo);

}


------------------------------

2011年9月20日火曜日

Google Code Jam Japan 2011

Google Gode JamJapan 2011  の練習問題を解いてみました。
http://code.google.com/codejam/japan/

A.数珠繋ぎ
B.数の集合
C.遊園地

と三つ問題があります。
僕が思うにBだけ異常に難しい。 しかもBのlargeだけgoogleの解答と僕の解答が合わない。
いろいろチェックしたんだけどなぁ。本当にGoogleあってんの?



A.数珠繋ぎ
------------------------------
#include <stdio.h>
#include <stdlib.h>
#include <string.h>



main(){
    FILE *fi=NULL,*fo=NULL;
    char buf[256];
    int t=0,n=0,k=0;
    int i,j,l;

    int syuki=0;
    int no=0;


    //fi=fopen("test.in","rt");
    fi=fopen("A-small-practice.in","rt");
    //fi=fopen("A-large-practice.in","rt");

    //fo=fopen("result.txt","wt");
    fo=fopen("small-result.txt","wt");
    //fo=fopen("larget-result.txt","wt");

    if(fi==NULL || fo==NULL)goto end;


    buf[0]=0;
    fgets(buf,256,fi);
    sscanf(buf,"%d",&t);

   
    for(i=0;i<t;i++){
        fgets(buf,256,fi);
        sscanf(buf,"%d%d",&n,&k);

        no=1<<n;
       
        printf("i=%d n=%d,k=%d\n",i,n,k);
        printf("Case #%d: %s\n",i+1,(k%no)==no-1?"ON":"OFF");
        fprintf(fo,"Case #%d: %s\n",i+1,(k%no)==no-1?"ON":"OFF");
    }

end:
    if(fi)fclose(fi);
    if(fo)fclose(fo);
}
------------------------------


B.数の集合
------------------------------
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#if defined(_MSC_VER) && _MSC_VER<1300
#define longlong _int64
#define PLLD "%I64d"
#else
#define longlong long long
#define PLLD "%lld"
#endif

#define PLD "%ld"
#define PD "%d"


char sosu[1000010];
int sosu_list[1000010];
//char sosu_flag[1000010];

int onaji_list[1000010];
int onaji_ct;

struct st_kazu{
    int sosu[16];
    int ct;
};

struct st_kazu kazu[1000010];


void clear_onaji(){
    onaji_ct=0;
}

void add_onaji(int n){
    int i;
    for(i=0;i<onaji_ct;i++){
        if(onaji_list[i]==n)return;
    }
    onaji_list[i]=n;
    onaji_ct++;
}

main(){
    FILE *fi=NULL,*fo=NULL;

    char buf[256];
    longlong a,b,p;
   
    int i,j,k,l,m,n;
    int sct,c,kaisu,kotae;

    //sosou wo motomeru
    sosu[0]=1;
    sosu[1]=1;
    for(i=2;i<1000003;i++){
        if(sosu[i]==0){
            for(j=i*2;j<1000010;j+=i)sosu[j]=1;
        }
    }

    for(sct=0,i=0;i<1000003;i++)if(sosu[i]==0){
        sosu_list[sct++]=(int)i;
    }

    printf("sosu=%d\n",sct);
    //fi=fopen("test.txt","rt");
    //fi=fopen("B-small-practice.in","rt");
    fi=fopen("B-large-practice.in","rt");

    //fo=fopen("result.txt","wt");
    //fo=fopen("result-small.txt","wt");
    fo=fopen("result-large.txt","wt");

    if(fi==NULL || fo==NULL)goto end;


    fgets(buf,sizeof(buf),fi);
    sscanf(buf,PD,&c);



    for(i=0;i<c;i++){
        fgets(buf,sizeof(buf),fi);
        sscanf(buf,PLLD PLLD PLLD ,&a,&b,&p);

        kaisu=(int)(b-a+1);
        kotae=0;
        memset(kazu,0,sizeof(kazu));

        // kousoku soinnsuu bunkai
        printf("bunkai\n");
        for(k=0;k<sct;k++){
            longlong t;
            if((longlong)(sosu_list[k])<p)continue;
            if((longlong)(sosu_list[k])>b)break;

            //printf("sosu=%d\n" ,sosu_list[k]);

            t=a+sosu_list[k]-1;
            t/=sosu_list[k];
            t*=sosu_list[k];
            //printf(PLLD"\n" ,t);
            while(t<=b){
                int pos=t-a;
                kazu[pos].sosu[kazu[pos].ct++]=sosu_list[k];
                t+=sosu_list[k];
            }

        }

        printf("check1\n");
        for(j=0;j<kaisu;j++){
            longlong t;
            t=a+j;
           
            //printf(PLLD ": ",t);
            //for(k=0;k<kazu[j].ct;k++){
            //    printf("%d ",kazu[j].sosu[k]);
            //}
            //printf("\n");

            if(kazu[j].ct==0)kotae++;
        }

        printf("check2\n");

        for(j=0;j<sct;j++){
            longlong t;

            if((longlong)(sosu_list[j])<p)continue;
            if((longlong)(sosu_list[j])>b)continue;

            t=a+sosu_list[j]-1;
            t/=sosu_list[j];
            t*=sosu_list[j];


            clear_onaji();
            while(t<=b){
                int k=t-a;
                for(l=0;l<kazu[k].ct;l++){
                    add_onaji(kazu[k].sosu[l]);
                }
                t+=sosu_list[j];
            }

            //printf("sosu %d to onazi \n",sosu_list[j]);
            //for(k=0;k<onaji_ct;k++){
            //    printf("%d ",onaji_list[k]);
            //}
            //printf("\n");

            if(onaji_ct==1)kotae++;
            if(onaji_ct>1){
                int mmiinn;

                mmiinn=onaji_list[0];
                for(k=1;k<onaji_ct;k++){
                    if(mmiinn>onaji_list[k])mmiinn=onaji_list[k];
                }
                if(mmiinn==sosu_list[j]){
                    kotae++;
                }

            }
        }
        printf("Case #%d: %d\n",i+1,kotae);
        fprintf(fo,"Case #%d: %d\n",i+1,kotae);
        //break;
    }


end:
    if(fi)fclose(fi);
    if(fo)fclose(fo);

}


------------------------------


C.遊園地
------------------------------
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#if defined(_MSC_VER) && _MSC_VER<1300
#define longlong _int64
#define PLLD "%I64d"
#else
#define longlong long long
#define PLLD "%lld"
#endif

#define PD "%d"
#define PLD "%ld"


int g[1000];
longlong nn[1000];
int nx[1000];

main(){
    FILE *fi,*fo;
    int t,n,r,k;
    int i,j,l,cc;
    longlong m,c;
    char buf[1000*100];
    char*p;

    //fi=fopen("test.in","rt");
    //fi=fopen("C-small-practice.in","rt");
    fi=fopen("C-large-practice.in","rt");

    //fo=fopen("result.txt","wt");
    //fo=fopen("result-c-small.txt","wt");
    fo=fopen("result-c-large.txt","wt");

    if(fi==NULL || fo==NULL)goto end;

    fgets(buf,sizeof(buf),fi);
    sscanf(buf,"%d",&t);
    for(i=0;i<t;i++){

        m=0;

        fgets(buf,sizeof(buf),fi);
        sscanf(buf,"%d%d%d",&r,&k,&n);
        fgets(buf,sizeof(buf),fi);

        p=buf;
        for(j=0;j<n;j++){
            sscanf(p,"%d",&(g[j]));
            p=strchr(p,' ');
            p++;
        }
   
        for(j=0;j<n;j++){
            c=0;
            for(cc=0;cc<n;cc++){
                if(c+g[(j+cc)%n]>k)break;
                c+=g[(j+cc)%n];
            }
            nn[j]=c;
            nx[j]=(j+cc)%n;
        }
        j=0;
        for(l=0;l<r;l++){
            m+=nn[j];
            j=nx[j];
        }
        printf("Case #" PD ": " PLLD "\n",i+1,m);
        fprintf(fo,"Case #" PD ": " PLLD "\n",i+1,m);
    }


end:
    if(fi)fclose(fi);
    if(fo)fclose(fo);
}


------------------------------

2011年7月24日日曜日

NEXの設定の仕方がわかってきた

会社の同期が、子供の動画や写真というのは最高品質で撮らないと子供が大きくなってぐれる、と言うので、今月はソニーのデジカメNEXとキャノンの30年前のマニュアルフォーカスレンズであるFDレンズで写真に挑戦しています。
きちんと背景がボケた写真を撮る方法をいろいろ模索しているのですが、今日やっとカメラのホワイトバランスとか露出とか絞りの設定方法がわかった。ネットにかかれているとおり、NEXでボタンを押して設定するのは少しめんどくさい。
 さらに、子供というのはとっても動くのでマニュアルフォーカスレンズで撮るのって難しい。
背景がボケて子供がぶれなくて子供が笑顔でピンとあわせてカメラの真ん中に来て・・・なんてことは絶対にない。そもそも室内だとオートフォーカスでもぶれる。

いままで人の写真をたくさん撮ったことがないので、とりあえずNFD50/1.4のレンズで赤ちゃんをかわいく撮る練習。
よく本に書いてあるように確かにポートレートの焦点距離の単焦点レンズというのは人が綺麗に撮れる。



2011年7月22日金曜日

ぼくの赤ちゃん

ソニーNEXのカメラとキャノンのFDレンズでぼくの赤ちゃんをとっても適当にとってみました。
明るいレンズに変えるとちゃんとボケるじゃん。
でもシャッタースピードの変更の仕方がわからない・・・・。




2011年6月29日水曜日

偽ダイソン

最近の中国製の電化製品ってすごいですね。
ソフトウェアが入っているものはさすがに真似できないのですが、ソフトウェアが入っていないものは本物より性能が良いらしい。
いろいろな偽者がある中、どの偽者が一番高性能か調べてみました。
僕の調査では、風の強さを調節するボリュームの上に楕円形の黒オレンジ色の丸があり、首振りスイッチが三角矢印のシルクで、ボリュームに小さな丸が4つのシルクがあるやつが一番そっくりかつ高性能。25cm、30cm版があります。本物にはラインナップがない、長細いやつの小型もあります。
価格は一万円前後。基本的に高いほうが高性能ですね。
とりらえず秋葉原で買ってきました。





2011年6月27日月曜日

NIKKORレンズ

ソニーのミラーレス一眼NEXにニコンのレンズをつけてみるとよさそうな気がするので、買って見ました。NEXのレンズマウントであるEマウントは、フランジバックが短いので、いろいろなレンズが使えるのがとても良いですね。キャノンのレンズに続いてニコンのレンズに浮気してみました。

Ai Nikkor35mm f2s

Ai Nikkor28mm f2.8s

Ai Nikkor28mm f2.8sはマクロレンズのように超近くまでよってとることができることで有名なのですが、確かにとっても近くまでよって撮影できます。こりゃーすげー。

Ai Nikkor35mm f2sは有名な某人がすべてのニコンユーザーは持ってないといけないというくらいすばらしいレンズらしいですが、シャープな感じがすごいですね。

どちらもとっても良いのですが、ニコンのレンズはキャノンのFDレンズと違い現在売られている一眼にもそのまま使えるためレンズが高い。といっても新品の短焦点レンズを買うよりはるかに安いですが。

次は中望遠系のレンズを調べてみようと思います。

2011年6月20日月曜日

ホワイトビズ

週末にいつものように葛西のイトーヨーカドーに買い物に。
すごい人だと思ったらSuperGirlsが来てました。

最初はCMにでているグループの名前を知らなかったので、ポスターを見てわかった。
 そのポスターの隣にあったホワイトビズのポスター
これ、うちの会社ではないか!
きっとかっこよく会社に来る会社員をイメージしていると思うのですが、こんなかっこいい社員いません。

2011年6月13日月曜日

FDレンズ

僕の普段使っているソニーのデジカメNEX。
ごっつい一眼レフより確かに軽くて便利なんですけど、なかなか良い絵が撮れない。
何でだろうと考えたのですが、とりあえずレンズが良くないのだろうということに。


でもNEXのレンズは値段が高くて数が少ないという状態。
マニュアルフォーカスだけどキヤノンのFDレンズを付けたほうがちょっとの出費できれいな写真がとれるのではないかと。



とりあえず買ってみました。

2011年6月11日土曜日

放射線量を測ってみました

松戸に放射線量が高いホットスポットがあるらしく、東京は放射線量が高いらしいという記事がたくさんあるので、線量計を借りてきて実際に自分で計って見ました。

新小岩、東京都江戸川区本一色のうちの近くは0.2μSv/hらしいのですが、確かに地上1メートルの道路はそれくらいあります。ところによっては0.4μSv/hあるところもあります。
 新宿とか中野も0.15 μSv/hくらいあるんだねぇ。

年間で1mシーベルト以上被曝してしまうじゃないか!
確かに 東京にも放射能とんできているようです。
東京電力、電気代はらわんぞ!



2011年5月30日月曜日

Prototiping Lab

毎日毎日本ばっかり買っていて良いのかと思うのですが、また買ってしまいました。
この本はとてもよくまとまっていて良いです。

ダッバーワーラー

うちの会社にいるインド人がインドには弁当を配達するシステム「ダッバーワーラー」があり、そのシステムがすごいと言っていたんですが、ついにその記事を発見。

http://dailynewsagency.com/2011/05/28/dabbawallah/

コンピュータなんて一切使わずに複雑なトランザクション処理を行うなんてすごい。
組織や配達する人の最適化ぶりもすごい。



Arduinoプログラム

Arduinoは慣例として一番最初にLEDを点滅させるプログラムを書くようなので作ってみた。






int ledPin=13;

void setup()
{
    pinMode(ledPin,OUTPUT);
}

void loop()
{
    digitalWrite(ledPin,HIGH);
    delay(1000);
    digitalWrite(ledPin,LOW);
    delay(1000);
}
 

2011年5月26日木曜日

AE-ATmega

Arduinoをとりあえず自分で作ってみようと思い、その互換ボードを作ってみた。
先日紹介した、本の付録の基板で作る「Ejackino」と秋月電子で売っている「AE-ATmega」というキットで作る方法の二通りがあるらしい。



意外と簡単にできます。

2011年5月25日水曜日

Arduino

フィジカルコンピューティングをやるためには、Arduinoというマイコンボードを使うのがよさそう。
マイコンボード自体がオープンソースで公開されているボードも自分で作れるらしい。
とりあえず本を買ってみた。

2011年5月23日月曜日

フィジカルコンピューティング

簡単なマイコンを使った電子工作と、その作ったものを動かすためのプログラムを書くことをフィジカルコンピューティングというらしい。厳密にはもっときちんとした定義があるらしいが、面白そうなのでとりあえずフィジカルコンピューティングの本を買ってみた。