1102 LC-Display

1102 -- LC-Display
1102's Status List
二つの整数の入力値(s,n)に対して、一文字を幅s+2,高さ2s+3にnの電卓表記を拡大して出力する。
縦線は'|'、横線は'-'、それ以外は半角空白で埋め、各数字の後ろに半角スペースを、また全ての数字を出力したら改行を入力する。
(s,n)==(0,0)で終了。
以下コード晒し。
GCCで265byte。

char a[9];i,j,k,t,u,v,y[]={1005,881,927,892,325,1019,877};
main(s){
  for(;scanf("%d%s",&s,&a),s++;puts(""))
    for(i=0,t=s+1;i<s+t;i++,puts(""))
      for(j=0;u=a[j];j++,putchar(32))
        for(k=0,u-=48,v=1<<u;k<t;k++)
          putchar(i%s?k%s||!(y[k/s+i/s*3+1]&v)?32:'|':k%s&&y[3*i/s]&v?45:32);
}

思ったほど減らない。条件節を減らすのはまた今度にしよう。

(追記:2006/06/26 11:38)
241byte。

char a[9];i,j,k,u,v,y[]={18,142,96,131,698,4,146};
main(s){
  for(;scanf("%d%s",&s,&a),s++;puts(""))
    for(i=0;i<=s*2;i++,puts(""))
      for(j=0;u=a[j];j++)
        for(k=0,u-=48,v=1<<u;k<s+2;k++)
          putchar(i%s?k%s|y[k/s+i/s*3+1]&v?32:'|':!k|k>=s|y[3*i/s]&v?32:45);
}