No Such Blog or Diary

«Prev || 1 | 2 | 3 |...| 55 | 56 | 57 | 58 || Next»

ただいまの最小n回HelloWorldプログラム

とりあえず,bash などのシェルスクリプトで外部の yes と head を呼ぶバージョン:

yes $0|head -$1

ただし,"Hello World"というファイル名で保存して,

bash Hello\ World 10

などで実行.とりあえず 15バイトで今のところ最小.

次に,perl で

print"$0\n"x$ARGV[0]

を同様に "Hello World" というファイル名で保存.

perl Hello\ World 10

などで実行.とりあえず 20 バイトで外部コマンド使用せず.

実行時のファイル名を使用しない場合には,それぞれ $0 を Hello World で置き換えるべし.その場合,24バイトと29バイトになる.

さて,これ以上縮まるかどうか... とりあえず言語の候補としては perl 以外に無い気がするのでむりかも.文字列と数値を自動で変換してくれて繰り返しが簡単でコマンドライン引数が簡単に扱えて... そんな言語が他にあったかなぁ?

最短のn回 "Hello World "

ちょっとした疑問.

コマンドライン引数から回数 n を読み込み,"Hello World"を n 回(n行)出力する

というプログラムを作るとして,ソースコードのバイト数換算で最短となるプログラムはどれくらい短いのだろうか? 条件として以下を考える.

  • インタプリタ形式であれば
    interpreter sourcecode n
    
    のようにインタプリタプログラムを指定してよい.(#! の行はバイト数にカウントしない)
  • 外部のファイルに対して入出力してはいけない.(stdout のみ出力可能)
  • Hello World 以外の文字を出力してはいけない.('"'とかを出してはいけない)
  • 自前でプログラミング言語を作った場合はその処理系も倍とすうとしてカウントする.
  • コマンドライン引数が正当でない場合の処理は考えなくてよい.

さてどれくらい短くできるかな? Unix の標準的なコマンド sed, grep, awk, head, tail, yes とかは使ってもいい場合にはどうだろう?

JApplet の add と setLayout

Swing のいくつかのコンポーネントは getContentPane() というメソッドを使って ContentPane を取得し,そのContentPane に子要素を追加(add)したりレイアウト指定(setLayout)しなければならない.

で,Java 1.4 では JApplet もこの制約のかかるクラスであるため,間違って直接 add を使うコードを書くとコンパイルは通るが実行時にエラーを吐いて止まってしまう.一方,Java 5 では親切なことに add などが getContentPane().add などにリダイレクトされるようにオーバーライドされている.よって,直接 add を使うコードを Java 1.4 でコンパイルしたバイトコードも,実行環境が Java 5 であれば実行時にエラーを吐くことなく動く.

と,こんな仕様のため,今日はマシンによって動かないプログラムを見事に作ってしまったのであった.

メモリ1Gゲット

ふとメモリを増設してみたくなったので秋葉へいって DDR400-512Mx2 で1G分のメモリを購入.SAMSUNGの純正メモリだけど今載ってるやつとあわせて Dual Channel でうまく動くかは不明.とりあえずこれから memtest でも実行して試してみよう.

Java の & のオーバロード

とあるプログラミング初心者の Java プログラムを見ていたら,

if( a <= b & a <= c) {
    ....
}

みたいなコードが書かれていた.

はじめ見たときはC言語であればまったく問題ないコードだけど Java で論理演算の結果を bit 演算しちゃダメだろ,と考えていた.

しかしながら,実はこのコードはコンパイルも通るしちゃんと動く.int と boolean でキャストが自然に起こるようになったのかとも考えたが,実のところ & は boolean 同士をオペランドに取れるようにオーバロードされているだけだった.でもまあ,今までまったく知らなかったので少々驚きだった.

ちなみに,よく考えてみると AND を && でとると左のオペランドが false のときに右側のオペランドは評価されないので,これと対になって両方とも評価される & が存在することは当然だなぁと思う.うーむ,こんなことにも気づかずに何年間 Java 使ってたんだろ... 恥ずかしい

HelloWorld

Java で Hello World を書いてみた.ちょっと離れて見ると Hello World になっている.

 class Hello             {{{      {{{           
  {{{   {{{               {{       {{           
  {{{   {{{               {{       {{           
  {{{   {{{    {{{{{{     {{       {{     {{{{{{{  
  {{{{{{{{{   {{    {{    {{       {{    }}     }}
  }}}   }}}   }}}}}}}}    }}       }}    }}     }}
  }}}   }}}   }}          }}       }}    }}     }}
  }}}   }}}   }}    }}    }}       }}    }}     }}
 }}}}} public  static    void     main    (String 
 
 []a){   {{{{{                       {{{         {{{ 
  {{{     {{{                         {}          }} 
  }}}     }}}                         }}          }} 
  }}}     }((   (System   . out))     ).     println 
  ((( "H" +""  +(     ""   ))+  ""    )+    ""    +( 
  "e" )+( "l"  +(     ""   ))         +(    ""    )+
  "l" +(( "o"  +(     ""   ))         +(    ""    )+
   ""+" "+((   ""     )+   ""         )+    ((    "" 
   +""   ))+    "W"+"o"   +"rl"      +"d"    ));}}{}} 

動かすとちゃんと Hello World を出力する.C ほどへんなことができないのであまり面白くない... 先の自己出力プログラム生成プログラムに食わせると,Hello World をバナーみたいに出力できてうれしいかも.

«Prev || 1 | 2 | 3 |...| 55 | 56 | 57 | 58 || Next»
Search
Feeds

Page Top