まったく使ったことのない言語awkで15:30に始めて2時間を目標に開始
ubuntuだとmawk
説明に関して、確実なことは言えないのでコメントは全て推測です
7分で一回挫折
1) awkファイルを作ってhiを表示させる 15:54
↑をp.awkで保存
2) awkは+で無理やり計算をする 15:56
bの最初の1を数値として認識したのではないか?
3) 文字列の結合 なんと並べるだけ 16:01
4) 文字列の部分抽出とループ 16:08
文字列、配列の先頭は1から、らしい
(↑修正 配列は連想配列だけらしいので、先頭という概念はない)
5) 関数の実装 サンプルを探してコピって読んだだけ 16:21
6) 文字列の一文字置き換えと盤の表示 16:41
7) 配列は連想配列しかない 連番で追加を自作 17:31
8) 連想配列の全削除と乱数の実装 18:17
9) 条件分岐とwhile、速度検索、デバッグ後、少し圧縮 23:37
ソースリスト
function put( mp,p,c){ return substr(mp, 1, p-1) c substr(mp, p + 1) } #pの位置の文字をcに置き換える
function get( mp,p){ return substr(mp, p, 1) }
function rnd( n){ return int(rand() * n) } # 0からn-1までの整数値を返す
function push_ps(l,n){ ps[l + 1] = n } #psを配列のように扱う l長さ n追加する数値 なんかはまってとりあえずこの形
function move( mp,p,d){ #function spaceより後はローカル変数になる らしい
rmp = mp
c = get(mp, p)
if (c==" " || c=="#"){ return mp }
delete ps
for( p1 = 6; p1 < 36; p1++){
if (get(mp, p1) == c){
np = get(mp, p1 + d)
if (np == " " || np == c){
push_ps(length(ps), p1 + d)
rmp=put(rmp, p1, " ")
}else{ return mp }
}
}
for(i = 1; i <= length(ps); i++){ rmp = put(rmp, ps[i], c) }
return rmp
}
function write( mp){
for (i = 0; i < 7; i++ ){ print substr(mp, i * 6 + 1, 6) }
print ""
}
BEGIN{
st=systime()
ds[1] = -1
ds[2] = 1
ds[3] = -6
ds[4] = 6
mp = "#######FDDM##FDDM##JBBG##JKSG##H Q#######"
write(mp)
ep = 3 + 5 * 6
co = 0
while (!(substr(mp,ep,2) == "DD")){
mp = move(mp, rnd(30) + 6, ds[rnd(4) + 1])
co++
if ((co % 1000000) == 0){ write(mp) }
}
write(mp)
print systime() - st #秒
}