平方根の数字

awkネタ

平方根を小数で表したときに、0~9までの数字が最も早くすべて現れる最小の整数を求めて下さい。
ただし、ここでは正の平方根のみを対象とします。
整数部分を含む場合と、小数部分のみの場合のそれぞれについて求めて下さい。
例)2の平方根:1.41421356237309514548・・・
(0~9がすべて現れるのに19桁が必要
#!/usr/bin/awk

BEGIN{
  num = 2;

  # 整数部分を含む
  while(1){
    for(a in array){
      delete array[a];
    }
    for(b in ret){
      delete ret[b];
    }
    n = sprintf("%10.10f",sqrt(num));                 # 整数、小数それぞれ10桁
    ten = index(n,".");                                        #  . の位置
    number = substr(n,1,ten - 1)  substr(n,ten + 1);  # .を除く文字列
    split(number,array,"");
    for(i in array){
      ret[array[i]]++;
      if(ret[array[i]] >= 2){                         # 重複があれば対象外
        break;
      }
    }
    if(length(ret) == 10){
      print num;
      print n;
      break;
    }
    num++;
  }



  num = 2;

  # 小数部分のみの場合
  while(1){
    for(a in array){
      delete array[a];
    }
    for(b in ret){
      delete ret[b];
    }
    n = sprintf("%10.10f",sqrt(num));                 # 整数、小数それぞれ10桁
    ten = index(n,".");                                        # . の位置
    number =  substr(n,ten + 1);                      #  .を除く文字列(小数部分のみ)
    split(number,array,"");
    for(i in array){
      ret[array[i]]++;
      if(ret[array[i]] >= 2){                         #重複があれば対象外
        break;
      }
    }
    if(length(ret) == 10){
      print num;
      print n;
      break;
    }
    num++;
  }
}
awk -f q12.awk
1362
36.9052841745
143
11.9582607431