ニンテンドーワイヤレスキーボード for android

常々android用のコンパクトなBluetoothキーボードが欲しかった。
そこで買ってきたのが↓

バトル&ゲット ポケモンタイピングDS (シロ)

バトル&ゲット ポケモンタイピングDS (シロ)

近所のスーパーで2000円弱で売っていた。
英語配列で使うことを覚悟して買ってきたが、我が家にあるSO-03D、SO-05Dは標準で日本語配列として認識したから驚いた。最近のスマホはすごいね。
もう一つソニタブSは標準では英語配列として認識されたが、Google日本語入力を使うと日本語配列として認識された。

どうやらハードウェアキーボードの配列は入力用のアプリで決まるらしい。つまり、Google日本語入力さえ入れてしまえば、大体のandroid端末で日本語配列として認識してくれるということだろう。

任天堂製ということできっと丈夫にできているだろうし、よい買い物をしました。


まとめている方がいらしたのでそのリンクも貼っておきます。
http://itpc.blog87.fc2.com/blog-entry-129.html



まぁ、きっとゲームは一度も起動せず終わるだろうな。。。。。。

7行はさみ将棋もどき

7行はさみ将棋。結構無理やり。言語はC。
もう少し短くなりそうな気もするけど、もう眠いよ。。。。

相変わらず大半は7行オセロのパクリなんだが、とりあえず新歓はなんとかなりそうだ。

char*h="・△▼ \n 123456789",*r="AKMW";int p,t,d,a,c,v,i,m[121],x,y,f 
;k(){for(c=i=4;c&&i--;){for(v=p;m[v+=r[i]-76]==(f?0:3-t);)if(v==x)c=0;if(m[v] 
==t)for(v=p;m[v+=r[i]-76]-t;m[v]=0);}}main(){for(i=11;i--;m[i*11+10]=3,m[i*11]= 
m[i]=4+i)t=m[i%9+12]=2,m[i%9+100]=1;for(;t=3-t;a=p=0){for(;p<110;)for(printf( 
"%c%c",h[m[p]*2],h[m[p]*2+1]),i=m[++p]==t,i*=4;i--;)a+=!m[p+r[i]-76];for(d=a;a;) 
if(scanf("%d%d%d%d",&p,&i,&x,&y),m[p+=i*11]==t)if(f=x+=y*11,k(),!c)f=a=m[p]=0,m
[p=x]=t,k();if(!d)printf("%dP win.\n",3-t),t=3;}} 

遊び方は、駒の位置(x,y)と移動先の位置(x,y)を指定して行くだけ。
△の人からスタート。

1≦x,y≦9 の範囲を超えるような入力に対する処理は作ってないのでバグります。
まぁ、このくらいいいよね。


一応、改行してあるやつも載せとく。
暇なら解読でもすればいいと思うよ。

char*h="・△▼ \n 123456789",*r="AKMW"; 
int p,t,d,a,c,v,i,m[121],x,y,f; 

k(){ 
  for(c=i=4;c&&i--;){ 
    for(v=p;m[v+=r[i]-76]==(f?0:3-t);) 
    if(v==x)c=0; 
    if(m[v]==t) 
      for(v=p;m[v+=r[i]-76]-t;m[v]=0); 
  } 
} 

main(){ 
  for(i=11;i--;m[i*11+10]=3,m[i*11]=m[i]=4+i) 
    t=m[i%9+12]=2,m[i%9+100]=1; 

  for(;t=3-t;a=p=0){ 
    for(;p<110;) 
      for(printf("%c%c",h[m[p]*2],h[m[p]*2+1]),i=m[++p]==t,i*=4;i--;) 
        a+=!m[p+r[i]-76]; 
      for(d=a;a;) 
        if(scanf("%d%d%d%d",&p,&i,&x,&y),m[p+=i*11]==t) 
      if(f=x+=y*11,k(),!c) 
        f=a=m[p]=0,m[p=x]=t,k(); 
      if(!d)printf("%dP win.\n",3-t),t=3; 
  } 
}

−−−


参考にしたのでオセロのコードも貼っとっきます。


530 :デフォルトの名無しさん:2008/12/21(日) 00:27:40
自由課題
オセロの”ベース”を作ってもらいたいです。
環境Mac
言語C++
期限12月21日


 123456
1・・・・・・
2・・・・・・
3・・○●・・
4・・●○・・
5・・・・・・
6・・・・・・
↑こんな感じです。

「(3,2)などの座標を入力すれば○と●が交互に置かれて、挟まれたら裏返る」という、ベースの段階を作ってもらいたいです。
人vs人でプレーするものが良いです。上の図のように、座標を表す数字もお願いします。
後から自分で、○と●の数をカウントしたり、どっちが勝ったか表示されるように手を加えたいと思っています。
そのため、大学ではiostreamで書いているので私が後から理解できるようにiostreamを使って欲しいです。

注文が多く時間も少なくて申し訳ないですが、どうかよろしくお願いしますm(__)m


538 :デフォルトの名無しさん:2008/12/21(日) 06:00:00
>>530 7行に収めましたのでどうぞ。
#include
char*h="・○● \n 12345678",*r="ABCKMUVW";int p,t,a,d,c,v,i,m[101],s;
void k(){for(i=!m[++p]*8;i--;){for(c=0,v=p;m[v+=r[i]-76]==3-t;)c++;if(c&&m[v]==
t){a+=c;v=p;if(d)while(m[v]=t,m[v+=r[i]-76]-t);}}}int main(){for(i=10,m[46]=m[
55]=t=2;i--;m[i*10]=3,m[i*10+1]=m[i+1]=4+i)m[45]=m[56]=s=1;for(;t=3-t;a=d=p=0){
for(;p<91;k())std::cout<

cin>>p>>i,p+=i*10;else if(s)s=0,std::cout<<"pass";else break;}return 0;}

訂正.  かっこわるい><

char t[1000][1000];d[1000][1000];a;i;f(i,j){--a&&(d[i-1][j]==a?t[--i][j]=36:d[i
+1][j]==a?t[++i][j]=36:d[i][j-1]==a?t[i][--j]=36:d[i][j+1]==a?t[i][++j]=36:0,f(i
,j));}main(j){for(;gets(t[i++]););for(;;a++)for(j=0;j<1e3;j++)for(i=0;i<1e3;i++)
if(a||t[i][j]==83)if(d[i][j]==a){!a||t[i][j]==32?d[i+1][j]||(d[i+1][j]+=a+1),d[i
-1][j]||(d[i-1][j]+=a+1),d[i][j+1]||(d[i][j+1]+=a+1),d[i][j-1]||(d[i][j-1]+=a+1
):(d[i][j]=0);if(t[i][j]==71)goto L;}L:f(i,j);for(i=0;*t[i];i++)puts(t[i]);}

6行だけど.

解いた.491byte.なげぇ.

http://okajima.air-nifty.com/b/2010/01/post-abc6.html

char t[1000][1000];d[1000][1000];i;j;a;f(i,j){--a&&(d[i-1][j]-a?d[i+1][j]-a?d[i
][j-1]-a?d[i][j+1]-a?:(t[i][++j]='$'):(t[i][--j]='$'):(t[++i][j]='$'):(t[--i][j
]='$'),f(i,j));}main(){for(;gets(t[i++]););for(;;a++)for(j=0;j<1e3;j++)for(i=0;
i<1e3;i++)if(a||(!a&&t[i][j]=='S'))if(d[i][j]==a){!a||t[i][j]==' '?d[i+1][j]||(
d[i+1][j]+=a+1),d[i-1][j]||(d[i-1][j]+=a+1),d[i][j+1]||(d[i][j+1]+=a+1),d[i][j-
1]||(d[i][j-1]+=a+1):d[i][j]=0;if(t[i][j]=='G')goto L;}L:f(i,j);for(i=0;t[i][0]
;i++)puts(t[i]);}

一応7行らしい.文字定数を普通の数字に直して,i,jをmainの引数に持っていけば7byteくらい短くなる.

Neko mimi f**k♥ インタプリタ

defineを書き換えれば前回のTsun dere Fu**♥でも動作する.
東大の実践的プログラミングのwikiにあったソースを元につくりました.
http://www.graco.c.u-tokyo.ac.jp/icpc-challenge/

−−−

#include <stdio.h> 
#include <string.h> 
#define RIGHT "ネコミミ!" 
#define LEFT "ネコミミモード" 
#define PLUS "おにいさま" 
#define MINUS "私のしもべー" 
#define OUT "や・く・そ・く・よ" 
#define IN "フルフルフルムーン" 
#define JP "キスキス…" 
#define LB "キス…したくなっちゃった…" 
#define COMMENT "な・い・しょ・だ・よ" 

unsigned char *a; 

struct data{ 
char s[30]; 
int len; 
int ope; 
}; 

#ifdef __GNUC__ 
#include <sys/stat.h> 
int filelength(int f){ 
struct stat b; 
if(fstat(f,&b)==-1)return -1; 
return b.st_size; 
} 
#endif 

int *cmp(struct data *a,struct data *b){ 
return strlen(a->s)-strlen(b->s); 
} 

void execute(char *p){ 
char *x=p,c; 
int i=0,marker; 
while(c=*(x+i)){ 
i++; 
switch(c){ 
case 1: a++;break; 
case 2: a--;break; 
case 3: (*a)++;break; 
case 4: (*a)--;break; 
case 5: putchar(*a);break; 
case 6: *a=getchar();break; 
case 7: if(*a)execute(x+i); 
marker=1; 
while(marker){ 
if(*(x+i)==7)marker++; 
if(*(x+i)==8)marker--; 
i++; 
} 
break; 
case 8: if(*a)i=0;else return;break; 
default: return; 
} 
} 
} 

int L_Change(struct data word[8],FILE *f){ 
char op[30]; 
int i,l,p=0; 
memset(op,0,sizeof(char)*30); 
for(i=0;i<9;i++){ 
for(;op[p]!=EOF&&p<word[i].len;op[p]=='\n'||op[p]==' '||op[p]=='\t'?p--:p)op[p++]=fgetc(f); 
if(strcmp(word[i].s,op)==0){ 
printf("%s\n",word[i].s); 
return word[i].ope; 
} 
} 
return -1; 
} 

int main(int argc, char **argv){ 
int c,i,l; 
unsigned char *da; 
char *p,*x; 
FILE *f; 
struct data word[9]; 
if(argc!=2){printf("Brainfuck Interpreter\nUsage: bf _.bf\n");return 1;} 
f=fopen(argv[1],"r"); 
if(!f){printf("Cannot open file: %s",argv[1]);return 2;} 

l=filelength(fileno(f)); 
x=p=malloc(l); 
memset(p,0,l); 
da=a=malloc(0x10000); 
memset(a,0,0x10000); 

strcpy(word[0].s,RIGHT); 
strcpy(word[1].s,LEFT); 
strcpy(word[2].s,PLUS); 
strcpy(word[3].s,MINUS); 
strcpy(word[4].s,OUT); 
strcpy(word[5].s,IN); 
strcpy(word[6].s,JP); 
strcpy(word[7].s,LB); 
strcpy(word[8].s,COMMENT); 
for(i=0;i<9;i++){ 
word[i].len=strlen(word[i].s); 
word[i].ope=i+1; 
} 
qsort(word,9,sizeof(struct data),cmp); 

i=0; 
while( (c=L_Change(word,f))>=0 ){ 
switch(c){ 
case 1: 
case 2: 
case 3: 
case 4: 
case 5: 
case 6: *(x++)=c;break; 
case 7: i++;*(x++)=c;break; 
case 8: i--;*(x++)=c;break; 
case 9: while( (c=fgetc(f))!='\n' )if(c==EOF)break;break; 
} 
} 

fclose(f); 
i ? printf("COMPILE ERROR\n") : (execute(p),printf("\n")); 
free(p);free(da); 
return 0; 
} 

−−−−−−−−−−−−−−−−−−−−−−−−−−−−

改行コードを気にしないと動作しないのはご愛嬌。
スペース、タブを無視することをしようと思ったけど、文字コードの壁に阻まれ、うまく動作しない。マルチバイトのスペース、タブってどんな扱いなのだろうか。

ぷろぐらみんぐ

これは今年の4月にmixiに書いた記事である。

−−−


後輩にプログラミングの興味を持たせるためにこんな言語を作ってみた。

新言語 Tsun dere Fu**♥
  ねぇっ、                        ポインタをインクリメント
  きゃっ!                         ポインタをデクリメント
  ばか!                        ポインタが示すメモリ位置のデータをインクリメント
  変態!                         ポインタが示すメモリ位置のデータをデクリメント
  べ、別にあんたのためじゃないんだからっ!  ポインタが示すメモリ位置のデータを出力
  聞いてるのっ!?                  ポインタが示すメモリ位置のデータに入力
  もう…                           ポインタが示すメモリ位置のデータがヌルなら対応する 私がいなくちゃだめなんだから… までジャンプ
  私がいなくちゃだめなんだから…        ポインタが示すメモリ位置のデータがヌルじゃないなら対応する もう… までジャンプ


・一桁+一桁の答えを求めるプログラム。

聞いてるのっ!?ねぇ、聞いてるのっ!?聞いてるのっ!?もう…変態!きゃっ!ばか!ねぇ、私がいなくちゃだめなんだから…
ばか!ばか!ばか!ばか!ばか!ばか!もう…きゃっ!変態!変態!変態!変態!変態!変態!変態!変態!ねぇ、変態!私がい
なくちゃだめなんだから…きゃっ!もう…ねぇ、ばか!ねぇ、ねぇ、ばか!きゃっ!きゃっ!きゃっ!変態!私がいなくちゃだめ
なんだから…ねぇ、ねぇ、ねぇ、ねぇ、ねぇ、ばか!ばか!ばか!ばか!ばか!ばか!ばか!もう…きゃっ!ばか!ばか!ばか!
ばか!ばか!ばか!ばか!ばか!ねぇ、変態!私がいなくちゃだめなんだから…きゃっ!ばか!ばか!きゃっ!もう…変態!ねぇ
、変態!もう…ねぇ、私がいなくちゃだめなんだから…きゃっ!きゃっ!私がいなくちゃだめなんだから…きゃっ!もう…ねぇ、
ねぇ、もう…変態!私がいなくちゃだめなんだから…きゃっ!ばか!ばか!ばか!ばか!ばか!ばか!ばか!もう…変態!ねぇ、
ばか!ばか!ばか!ばか!ばか!ばか!ばか!きゃっ!私がいなくちゃだめなんだから…ねぇ、べ、別にあんたのためじゃないん
だからっ!きゃっ!きゃっ!変態!変態!変態!変態!変態!変態!変態!変態!変態!変態!ねぇ、私がいなくちゃだめなんだ
から…きゃっ!べ、別にあんたのためじゃないんだからっ! 

ふむ。思ったよりうまく行ったと思う。
釘宮の代表的なツンデレのキャラクターは ばか と 変態 を連呼すればいいだけだから簡単だな。


ついでにHello,World!

ばか!ばか!ばか!ばか!ばか!ばか!ばか!ばか!ばか!もう…ねぇ、ばか!ばか!ばか!ばか!ばか!ばか!ばか!ばか!
ねぇ、ばか!ばか!ばか!ばか!ばか!ばか!ばか!ばか!ばか!ばか!ばか!ねぇ、ばか!ばか!ばか!ばか!ばか!きゃっ!
きゃっ!きゃっ!変態!私がいなくちゃだめなんだから…ねぇ、べ、別にあんたのためじゃないんだからっ!ねぇ、ばか!ばか!
べ、別にあんたのためじゃないんだからっ!ばか!ばか!ばか!ばか!ばか!ばか!ばか!べ、別にあんたのためじゃないんだか
らっ!べ、別にあんたのためじゃないんだからっ!ばか!ばか!ばか!べ、別にあんたのためじゃないんだからっ!ねぇ、変態!
べ、別にあんたのためじゃないんだからっ!変態!変態!変態!変態!変態!変態!変態!変態!変態!変態!変態!変態!べ、
別にあんたのためじゃないんだからっ!きゃっ!ばか!ばか!ばか!ばか!ばか!ばか!ばか!ばか!べ、別にあんたのためじゃ
ないんだからっ!変態!変態!変態!変態!変態!変態!変態!変態!べ、別にあんたのためじゃないんだからっ!ばか!ばか!
ばか!べ、別にあんたのためじゃないんだからっ!変態!変態!変態!変態!変態!変態!べ、別にあんたのためじゃないんだか
らっ!変態!変態!変態!変態!変態!変態!変態!変態!べ、別にあんたのためじゃないんだからっ!ねぇ、ばか!べ、別にあ
んたのためじゃないんだからっ!

Cのプロトタイプ宣言のミスによる素敵な動作

まず,ファイルを二つ用意します.


File1 : test_prototype.c

void prototype_test(char a, short b, float c){
printf("char = %d, short = %d, float = %f \n",a,b,c);
}



File2 : test_main.c

//void prototype_test();
//void prototype_test(double,float,char);
//void prototype_test(int,int,int);
//void prototype(int);
//void prototype_test(char,short,float);
int main(){
prototype_test(-1,-1.,-1);
}


mainのほうのプロトタイプ宣言をいろいろ変えて,動作を確認してみましょう.
素敵なことが起こるかもしれません.
ちなみに,プロトタイプ宣言が無くても,コンパイルは通ります.

  • Wallをつけないと警告すらでませんw





まぁ,結果は変なことになるんですが,
その原因は K&R C と ANSI C の上位互換を保持の仕様のため.

K&R C ではプロトタイプ宣言は関数名を引数なしで書く.
しかも,int以下の整数型の引数はintにキャストされ,floatはdoubleにキャストされる.

コンパイラを簡単にするための仕様だったらしい.


このあたりの事情により,ファイル間の変数の受け渡しを行う型が一致せず,へんな動作を起こす.
まー,説明が難しいので本を読んだほうがいいかもしれない.



−−−−



とりあえず解析を試みたんだが,コンパイラレジスタをつかったりしているためか,動作はよく分からなかった.

とりあえず,その過程である変数のメモリ中身を見るマクロを作成した.



#define MEM_PRINT(c) {int _i;for(_i=0;_i