数字の組み合わせ

repeat版の組み合わせの方が変更楽っぽいっすね
数字の組み合わせも書いてみました

sdim _4note,10000
 notesel _4note
 sdim youso,5,8
 youso.0="1"
 youso.1="2"
 youso.2="3"
 youso.3="4"
 youso.4="5"
 repeat 5
   tmp1=youso.cnt
   repeat 5
     tmp2=youso.cnt
     repeat 5
       tmp3=youso.cnt
       repeat 5
         tmp4=youso.cnt
         repeat 5
           tmp5=youso.cnt
           tmp=""+tmp1+tmp2+tmp3+tmp4+tmp5
           noteadd tmp,-1,0
         loop
       loop
     loop
   loop
 loop
 notesave "stn5_c.txt"
 sdim ar_stn5,8,notemax
 repeat notemax
 tmp_get=""
 noteget tmp_get,cnt
 ar_stn5.cnt=tmp_get
 loop

文字の組み合わせ(repeat版)

sdim _4note,10000
 notesel _4note
 sdim youso,5,5
 youso.0="s"
 youso.1="t"
 youso.2="n"
 repeat 3
   tmp1=youso.cnt
   repeat 3
     tmp2=youso.cnt
     repeat 3
       tmp3=youso.cnt
       repeat 3
         tmp4=youso.cnt
         repeat 3
           tmp5=youso.cnt
           tmp=""+tmp1+tmp2+tmp3+tmp4+tmp5
           noteadd tmp,-1,0
         loop
       loop
     loop
   loop
 loop
 notesave "stn5_b.txt"
 sdim ar_stn5,8,notemax
 repeat notemax
 tmp_get=""
 noteget tmp_get,cnt
 ar_stn5.cnt=tmp_get
 loop

文字の組み合わせ

高校一年くらいで習うのかな
数字の組み合わせだったような
いやいや
whitespaceの字句解析のデバッグ用に書きました
配列のサイズがあんま自由じゃないんで
追記:そういえばHSPは配列の大きさは大きくなりますなw
ノート命令に書き込んでから配列に代入してます

sdim _4note,10000
 notesel _4note
 s="s"
 t="t"
 n="n"
 tmp1=s
 gosub *sub_d
 tmp1=t
 gosub *sub_d
 tmp1=n
 gosub *sub_d
 notesave "stn5.txt"
 sdim ar_stn5,8,notemax
 repeat notemax
 tmp_get=""
 noteget tmp_get,cnt
 ar_stn5.cnt=tmp_get
 loop
 stop
 *sub
 tmps=tmp1+tmp2+tmp3+tmp4+s
 tmpt=tmp1+tmp2+tmp3+tmp4+t
 tmpn=tmp1+tmp2+tmp3+tmp4+n
 noteadd tmps,-1,0
 noteadd tmpt,-1,0
 noteadd tmpn,-1,0
 return
 *sub_b
 tmp4=s
 gosub *sub
 tmp4=t
 gosub *sub
 tmp4=n
 gosub *sub
 return
 *sub_c
 tmp3=s
 gosub *sub_b
 tmp3=t
 gosub *sub_b
 tmp3=n
 gosub *sub_b
 return
 *sub_d
 tmp2=s
 gosub *sub_c
 tmp2=t
 gosub *sub_c
 tmp2=n
 gosub *sub_c
 return

これは初稿でサブルーチンを利用して繰り返してます
逆にコレ書いた後なんで
繰り返しでも書けました

WhiteSpace/my_WhiteSpace用命令(HSP)

WhiteSpaceをHSPに翻訳するにあたり、いらない文字を削除する命令と、数値表現(1と2と3)文字表現(sとtとn)デフォルト表現(スペースとタブと改行(0A))を置き換えて(sとtとn)の表現に統一する用の命令を書きました

#module
//いらない文字を削除する命令(返り値あり)
#defcfunc trim_ws var p_src,int p4trim_a,int p4trim_b,int p4trim_c
	//半角英数字っぽく繰り返し。2byte文字非対応
	repeat 256
		//指定した文字は削除しない
		if cnt==p4trim_a||cnt==p4trim_b||cnt==p4trim_c{
			continue
		}
		//cntの文字削除
		p_src=strtrim(p_src,3,cnt)
	loop
	return p_src
#global
#if 1
//適当な文字列
_123="123456789  \nabc\t12456"
//'1''2''3'以外削除
_123=trim_ws(_123,'1','2','3')
//結果表示
mes ""+_123
//適当な文字列
stn="1234st56n789  \nasbc\t12t456n"
//'s''t''n'以外削除
stn=trim_ws(stn,'s','t','n')
//結果表示
mes ""+stn
//適当な文字列
ws_char="1234  56\t789  \nabc\t12456"
//' ''\t'0A(改行もどき)以外削除
ws_char=trim_ws(ws_char,' ','\t',$0A)
//結果表示
mes ""+ws_char
#endif
#module
//"1"を"s"に、"2"を"t"に、"3"を"n"に置き換える
//マイwhite_spaseの文字は"s""t""n"が本命
#deffunc ws_char_rep_123tostn var p4rep
	strrep p4rep,"1","s"
	strrep p4rep,"2","t"
	strrep p4rep,"3","n"
	return
//" "を"s"に、"\t"を"t"に、0A(改行もどき)を"n"に置き換える
#deffunc ws_char_rep_wschar_tostn var p4rep
	strrep p4rep," ","s"
	strrep p4rep,"\t","t"
	sdim tmp_0A,4
	poke tmp_0A,0,$0A
	strrep p4rep,tmp_0A,"n"
	return
#global
#if 1
//  さっき使った文字列"1""2""3"とか、を"s""t""n"に置き換える
	ws_char_rep_123tostn _123
// 結果表示
	mes _123
	ws_char_b=ws_char
//  さっき使った文字列" ""n"0A(改行もどき)とか、を"s""t""n"に置き換える
	ws_char_rep_wschar_tostn ws_char_b
// 結果表示
	mes ws_char_b
#endif

強くてニューゲーム(ひょっとしてブレークスルーしたかも)

一昨日、久しぶりにwhitespaceという簡易言語を写経してたら
えたーなってたまんまのHSPへの移植が進みました
ひょっとして俺、ブレークスルーしたかもって調子こいてます
今回こそは上手くいくかもwww

なんか写経も一日100行くらいなのに
まあ昨日も100行くらいなんですがw
一昨日は300行くらいやったしw

なんか最近、カリスマブロガーマナブ様のYOUTUBEにはまってて
それ見てたら、なんだか、人生、上手くいくような気がしてきて
そっから派生したブレークスルー疑惑でしたw

whitespaceのHSPへの移植も、これこそ強くてニューゲームっすよw

HSP kaijou

hiroi様のとこのサイトの階乗の処理をHSPで書いてみました

http://www.nct9.ne.jp/m_hiroi/light/ruby01.html

#const INT_MAX 256*256*256*128-1

mes INT_MAX
mes INT_MAX+1

mes INT_MAX / (128*256)
mes "kaijou"
repeat 15,1
mes ""+cnt+":"+ kaijou(cnt)
loop
stop

// p4mul_A(例えば10000)*p4mul_B(例えば10000)が
// over flowしないかcheck
#defcfunc over_INT_MAX int p4mul_A,int p4mul_B
	if p4mul_B==0:return 1
	if p4mul_A<(INT_MAX / p4mul_B){
		return 1
	}else{
		return -1
	}

#defcfunc kaijou int p
	m = 1
	max=p+1
	for i,1,max,1
		if over_INT_MAX(m,i)==-1:return -1
		m*=i
	next
	return m

HSP version White Space 002 heap module

HSP ver WS 企画第二弾です
前回はStackモジュールでしたが、
今回はHeapモジュールです。
Ruby版とかはハッシュ使ってやってるのですが、
C版は配列で実装しててそれに倣ってます
配列もどきな構造なのですが
配列のindexともども登録した順に代入しています
それではよろしくお願いします

#ifndef HSPWS_DEFINE
#define HSPWS_DEFINE

#define STACK_MEMBERS 			1024
#define HEAP_MEMBERS 			500
#define MAX_LABELS 			200
#define MAX_LABEL_LENGTH 		500
#define MAX_INSTRUCTIONS 		30
#define MAX_INSTRUCTION_LENGTH 	        10
#define MAX_NESTED_SUBROUTINES	        20
#endif

#module heap_model m_address,m_value,m_elements
#modinit
	dim m_address,500
	dim m_value,500
	m_elements=0
	return
// heap領域に値をSET
#modcfunc heap_put int p_val,int p_addr
	// 最初にそのaddressが使われてるか調べる
	for i,0,m_elements,1
		if m_address.i == p_addr {
			m_value.i = p_val
			return 1
		}
	next
	
	// そうじゃなければ領域が余ってるか調べて加える
	if m_elements < HEAP_MEMBERS@ {
		i = m_elements
		m_address.i = p_addr
		m_value.i = p_val
		m_elements++
		return 1
	}
	return 0
// heap領域から値をGET
// addressからデータを取得出来るか調べて
// 存在したら値を返し
// 存在しなければ0を返す
#modcfunc heap_get int p_addr
	for i,0,HEAP_MEMBERS@,1
		if m_address.i == p_addr:return m_value.i
	next
	return 0
#global

#if 1
newmod heap,heap_model
#endif

#if 1
er=heap_put(heap,10,1)
mes er
er=heap_put(heap,20,2)
mes er
er=heap_put(heap,30,3)
mes er
er=heap_put(heap,40,4)
er=heap_put(heap,50,5)
er=heap_put(heap,100,10)
er=heap_put(heap,90,9)
er=heap_put(heap,80,8)
er=heap_put(heap,70,7)
er=heap_put(heap,60,6)
er=heap_put(heap,100,1)
er=heap_put(heap,200,2)
er=heap_put(heap,300,3)
mes heap_get(heap,1)
mes heap_get(heap,2)
mes heap_get(heap,3)
mes heap_get(heap,4)
mes heap_get(heap,5)
mes heap_get(heap,6)
mes heap_get(heap,7)
mes heap_get(heap,8)
mes heap_get(heap,9)
mes heap_get(heap,10)
mes heap_get(heap,11)
mes heap_get(heap,12)
#endif

HSP version White Space 001 stack module

自分は以前、WhiteSpaceをHSPに移植しようとして挫折したんですけどw
それからしばらくして上手く行きそうな気がしてきまして
再挑戦企画です
とりあえず、以前は型の違うデータを格納するstackとか作ろうとして
理解しにくい形になったんですが
本家WhiteSpaceもstackに入れれるのは数値だけで
簡単な配列で表現してるし
今回はちょこっと数値配列表現の(moduleですがw)
stackを書いてみまして
本家の仕様に近い形でやれば、なんかやれそうな気がしてきた
今日なのです

#ifndef HSPWS_DEFINE
#define HSPWS_DEFINE

#define STACK_MEMBERS 			1024
#define HEAP_MEMBERS 			1024
#define MAX_LABELS 			200
#define MAX_LABEL_LENGTH 		500
#define MAX_INSTRUCTIONS 		30
#define MAX_INSTRUCTION_LENGTH 	        10
#define MAX_NESTED_SUBROUTINES	        20
#endif

#module stack_model m_size,m_current,m_contents
#modinit int p_size
	m_size=p_size
	m_current=p_size
	dim m_contents,p_size
	return
#modcfunc stack_push int p_val
	if m_current >= 1 {
		m_current--
		m_contents.m_current = p_val
		return 1
	}
	return -1
#modcfunc stack_pop
	if m_current < m_size
		m_current++
		return m_contents(m_current-1)
	return 0
#modcfunc stack_peak int p_depth
	if (m_current+p_depth) < m_size{
		return m_contents(m_current + p_depth)
	}
	return 0
#global
#if 1
newmod stack,stack_model,STACK_MEMBERS
#endif

#if 1
er=stack_push(stack,100)
er=stack_push(stack,200)
er=stack_push(stack,300)
er=stack_push(stack,400)
er=stack_push(stack,500)
er=stack_push(stack,600)
er=stack_push(stack,700)
er=stack_push(stack,800)
mes "peak 2:"+stack_peak(stack,2)
mes "peak 3:"+stack_peak(stack,3)
mes "pop:"+stack_pop(stack)
mes "pop:"+stack_pop(stack)
mes "peak 2:"+stack_peak(stack,2)
mes "peak 3:"+stack_peak(stack,3)
#endif