ラベル HSP製インタプリタ:サンプルスクリプト の投稿を表示しています。 すべての投稿を表示
ラベル HSP製インタプリタ:サンプルスクリプト の投稿を表示しています。 すべての投稿を表示

2009年1月10日土曜日

値が素数か調べるver2

この前書いたのが手抜きすぎなので
もう少しきちんと書き直してみました
;素数例:2039

d=0
s=""
input d,300,20,0
button "calc",*start
mesbox s,480,400,0
stop

*start
s=""
cls
input d,300,20,0
button "calc",*start


n=0
m=0
l=0
p=0
// 変数flag:素数であるの時1、素数でない時0
flag=0
s=""
// dは2の倍数であるか調べる
// 2は2n+1ではないので
// whileループの中に入れれない
n=d/2
m=d\2
if d!=2{
if m==0{
s+="× "+2+" * "+n+"\n"
flag=1
}else{
p=(n+1)*2
s+="○ "+2+" * "+(n+1)+" = "+p+"\n":
}
}

// 変数tmp:dがtmpの倍数であるか調べる数
// 値は2n+1
tmp=1
tmp+=2
// 変数tmp02:dがtmpの2乗より大きいか調べる数
tmp02=tmp*tmp
n=0
m=0
l=0
p=0

// dがtmpの2乗より大きい限りループ
while tmp02 <=d
n=d/tmp
m=d\tmp
if m==0{
s+="× "+tmp+" * "+n+"\n"
flag=1
}else{
p=(n+1)*tmp
s+="○ "+tmp+" * "+(n+1)+" = "+p+"\n"
}
tmp+=2
tmp02=tmp*tmp
n=0
m=0
l=0
p=0
await 1
wend
// flagの値で分岐して結果を表示
if flag=0{
s+=""+d+"は素数です"
}else{
s+=""+d+"は素数ではありません"
}
mesbox s,480,400,0
stop

2009年1月7日水曜日

数値が素数か調べる

ハッシュテーブルが257では小さすぎるので
2000くらいにしたいな。と思い
2000くらいの素数ないかな?と思い
その数が素数であるか調べるスクリプトを書いてみました

;素数例:2039

d=0
s=""
input d,300,20,0
button "calc",*start
stop

*start
cls
input d,300,20,0
button "calc",*start


tmp=1
n=0
m=0
l=0
p=0

n=d/2
m=d\2;注
if m==0{
s="× "+2+" * "+n
logmes s
s=""
goto *finish
}else{
p=(n+1)*2
s="○ "+2+" * "+n+" = "+p:
logmes s
s=""
goto *begin
}

*begin
tmp+=2
tmp02=tmp*tmp
n=0
m=0
l=0
p=0
s=""
if tmp02 <=d{
n=d/tmp
m=d\tmp;注
if m==0{
s="× "+tmp+" * "+n
logmes s
s=""
goto *finish}
else{
p=(n+1)*tmp
s="○ "+tmp+" * "+n+" = "+p
logmes s
s=""
goto *begin}
}
*finish
stop


注:¥が文字コードの関係で\になっています
ハッシュテーブルの大きさは2039にしよっと

2009年1月6日火曜日

ハッシュ値の計算

なんか書いてみるかな?ってことで
ハッシュ値を計算してみました

注:blueleafさん作のlongint.dllを使用しています


#include "longint.hsp"
#module
#defcfunc calc_hash var source
l=strlen(source)
tmp01=LongInt(0)
to_cmp=Longint(1)

dim v,l
repeat l
v(cnt)=peek(source,cnt)
loop

repeat l
tmp01+=Longint(v.cnt)*to_cmp
to_cmp*=31;注1
// logmes str(tmp01)
loop

tmp01\=2039;注2
r=int(tmp01)
// logmes str(tmp01)
return r

#global
s1="abc--start"
s2="def--start"
s3="abc--begin"
mes calc_hash(s1)
mes calc_hash(s2)
mes calc_hash(s3)
stop


注1:ハッシュ値は文字列の各要素に
31とか37を掛け続けた後、素数で除算して求めるみたいです

注2:文字コードの関係で¥が\になっています

ハッシュ値を計算できたはいいが
これをどんなデータ構造で管理するかは
今後の課題です

2008年12月17日水曜日

区切り文字で区切るモジュール

・FILE名:mdl_calc_one_dat.hsp

#module one_data NO,型,tmp_型,中身の数,中身,warn,n_warn

#modinit int number
NO=number
型=null
sdim tmp_中身,2000
sdim tmp_型,256
tmp_型=""
中身の数=0
sdim 中身,2000,32
repeat 32
中身.cnt=""
loop
n_warn=0
sdim warn,1000

sdim of_sep_A,1000
sdim of_sep_B,1000
return
#modfunc add_warn str w
if n_warn=0{ warn=w : n_warn++ }
else{ warn+="\n"+w : n_warn++ }
return
#defcfunc sep2 var to_sep,var from_sep_01,var from_sep_02
l2sep=strlen(to_sep)
ans_of_sep=instr(to_sep,0,"||")
if ans_of_sep==-1{
from_sep_01=to_sep
return 1
}else{
from_sep_01=strmid(to_sep,0,ans_of_sep)
l=l2sep-ans_of_sep-2
from_sep_02=strmid(to_sep,-1,l)
return 2
}
return -1
#modfunc search_sep_error
if tmp_型==""{add_warn thismod,"区切り文字の前に何もありません" }
ii=中身の数-1
if 中身の数>0{
if 中身.ii==""{add_warn thismod,"区切り文字の後に何もありません" }
}
n=中身の数
if n>=2{
repeat (n-1)
if 中身.cnt=""{add_warn thismod,"区切り文字の間に何もありません" }
loop
}
return
#modfunc set_one_data var data
ans=sep2(data,of_sep_A,of_sep_B)
tmp_型=of_sep_A : 中身の数=0
n_cnt=0
while ans==2
tmp_中身=of_sep_B
ans=sep2(tmp_中身,of_sep_A,of_sep_B)
中身.n_cnt=of_sep_A
中身の数++
n_cnt++
wend
search_sep_error thismod
return

#modfunc dump
logmes "NO = "+str(NO)
logmes "型 = "+tmp_型
logmes "中身の数 = "+中身の数
repeat 中身の数
logmes "中身"+cnt+" = "+中身.cnt
loop
if warn!=""{
logmes "警告:"+warn }
return
#global


テストコード その1

#include "mdl_calc_one_dat.hsp"
sdim sn,4000
sdim tmp_sn,256
sdim one_sc,256

sdim to_test,2000,32
to_test.0="this"
to_test.1="this||a"
to_test.2="this||a||b"
to_test.3="this||a||b||c"
to_test.4="this||a||b||c||d"

newmod one_dat_01,one_data,1
set_one_data one_dat_01,to_test.0
dump one_dat_01

newmod one_dat_02,one_data,2
set_one_data one_dat_02,to_test.1
dump one_dat_02

newmod one_dat_03,one_data,3
set_one_data one_dat_03,to_test.2
dump one_dat_03

newmod one_dat_04,one_data,4
set_one_data one_dat_04,to_test.3
dump one_dat_04

newmod one_dat_05,one_data,5
set_one_data one_dat_05,to_test.4
dump one_dat_05


・テストコード その2

#include "mdl_calc_one_dat.hsp"
sdim sn,4000
sdim tmp_sn,256
sdim one_sc,256

sdim to_test,2000,32
to_test.0="this"
to_test.1="this||"
to_test.2="||a||"
to_test.3="a||b||||||||c"
to_test.4="this||a||b||c||d||e||f||||g"

newmod one_dat_01,one_data,1
set_one_data one_dat_01,to_test.0
dump one_dat_01

newmod one_dat_02,one_data,2
set_one_data one_dat_02,to_test.1
dump one_dat_02

newmod one_dat_03,one_data,3
set_one_data one_dat_03,to_test.2
dump one_dat_03

newmod one_dat_04,one_data,4
set_one_data one_dat_04,to_test.3
dump one_dat_04

newmod one_dat_05,one_data,5
set_one_data one_dat_05,to_test.4
dump one_dat_05

2008年12月7日日曜日

行頭のタブとスペースを取り除く

プログラミング言語って行頭と行末のタブとスペースを取り除いてくれますよね
シナリオにそんな機能もつけたいと思い
まずは行頭のタブとスペースを取り除くスクリプトを書いてみました
2byte文字の関係で行末のタブとスペースの取り除き方はわからないけどな!
sdim sn,4000
sdim tmp_sn,256

notesel sn
noteload "scenario_test02.txt"

repeat notemax

noteget tmp_sn,cnt
l_tmp_sn=strlen(tmp_sn)
css=" "
cs=peek(css,0)
c=peek(tmp_sn,0)
if c=='\t'|c==cs{flag=1}
else {flag=0}

while(flag)
l_tmp_sn--
tmp_s=strmid(tmp_sn,-1,(l_tmp_sn))
tmp_sn=tmp_s

c=peek(tmp_sn,0)
if c!='\t'&c!=cs{_break}
wend

noteadd tmp_sn,cnt,1
loop

stop