Hit&Blow int配列版 from HSP3

昨日HSP3で作ったHit&Blowのint配列使用版。HSPは配列周りの仕様がとてつもなく貧弱なので愚直にforeachを回し続ける。

昨日HSP3で作ったHit&Blowのint配列使用版。HSPは配列周りの仕様がとてつもなく貧弱なので愚直にforeachを回し続ける。

  • タグ:
  • タグはありません
#runtime "hsp3cl"
#cmpopt varinit 1
randomize

#module Program
	#defcfunc getDigit
		sdim ln
		repeat
			mes "桁数を入力してください > ",1
			input ln,,2
			digit=int(ln)
			if 1<=digit & digit<=9: break
			mes "1-9の数字を入力してください。"
		loop
	return digit

	#deffunc refSeq int _digit,array _seq
		dim seq,10
		foreach seq
			seq.cnt=cnt
		loop
		repeat length(seq)-1,1: i=length(seq)-cnt
			r=rnd(i+1)
			tmp=seq.i
			seq.i=seq.r
			seq.r=tmp
		loop

		dim _seq,_digit
		foreach _seq
			_seq.cnt=seq.cnt
		loop
	return

	#deffunc refInputSeq int _digit,int _chkCnt,array _seq
		sdim seq
		numList="0123456789"
		sdim ln
		repeat
			mes strf("[%d] ",_chkCnt),2
			input ln,,2
			sdim seq,,strlen(ln)
			foreach seq
				seq.cnt=strmid(ln,cnt,1)
			loop

			isDigit=_digit=length(seq)

			isNum=1
			foreach seq
				if -1=instr(numList,,seq.cnt){
					isNum=0
					break
				}
			loop

			isUnique=1
			foreach seq
				i=cnt
				foreach seq
					if i!cnt && seq.i=seq.cnt {
						isUnique=0
						break
					}
				loop
				if 0=isUnique: break
			loop

			if isDigit & isNum & isUnique: break
			mes "入力が不正です。"
		loop

		foreach seq
			_seq.cnt=seq.cnt
		loop
	return ln

	#deffunc main
		digit=getDigit()
		dim ans
		refSeq digit,ans

		repeat
			dim user
			refInputSeq digit,cnt,user

			hit=0
			blow=0
			foreach user
				if ans.cnt=user.cnt {
					hit++
				}
				else {
					i=cnt
					foreach ans
						if user.i=ans.cnt {
							blow++
							break
						}
					loop
				}
			loop

			mes strf("hit: %d blow: %d",hit,blow)
			if hit=digit: break
		loop

		mes "Congratulation!"
		sdim ln
		input ln,,2
	return
#global
main