投稿

2月, 2022の投稿を表示しています

N88-BASICでスライドパズル (3回目)

イメージ
2022/2/26(土) N88-BASICでスライドパズル (3回目)   Sliding puzzle(8)の解答探索 123      123      123 456 →   45  →  456 78       786      78   スペースの場所へ 1~8を動かしてから、 元に戻すパズルです。 上の例では 1回しか動かしていないので すぐ元に戻せますが、たくさん動かせば 元に戻すのが難しくなります。   動かしたい方向のカーソルキーで移動します。 (移動方向表示は30回またはEnterで改行) sキーで30回適当に移動します。 aキーで解答探索します。(qキーで途中中断) スペースキーで終了です。   解答探索        (1)    (2)    (3)       xxx    xxx    xxx 盤面    xx2 → xxx  , xx         x1     x 1    xx2 方法    ""     "→"   "↓"   (1)からは(2)と(3)の動かし方があります PUZZNは(1),(2),(3)の盤面を記憶する最大数です MOVENは(2),(3)へ至る方法を記憶する最大値です (2),(3)について(1)と同様に繰り返し、 初めに見つけた答えを表示しています。   深さ探索 (スタックの先入れ後出し)ではなく 幅探索 (ストリームの先入れ先出し)で検索しています ので初めに見つけた答えは最短経路の一つです。   1. (1)を保存 2. (1)を取出し移動可能な盤(2),(3)を保存 3. (2)を取出し移動可能な盤保存…(4)とします 4. (3)を取出し移動可能な盤保存…(5)~とします 5. (4)を取出し.... と保存しようとする盤が答えになるまで繰り返します。 ただし、今までと同じ盤面になったときは保存しない チェックを入れています。 このチェックを入れると、答えを見つけるまでの 時間が節約できる代わりに、メモリーが多く必要です。   以下のメモリーでは、メモリーが不足で途中中断 する場合が多いです 1050 PUZZN = 45000 1060 MOVEN = 15000 を増やせば最後まで検索できると思います。   NL-BASIC

N88-BASICでスライドパズル (2回目)

イメージ
2022/2/26(土) N88-BASICでスライドパズル (2回目)   Sliding puzzle(15) 1234      1234      1234 5678  →  5678 →  5678 9ABC      9AB       9ABC DEF       DEFC      DEF   スペースの場所へ 1~Fを動かしてから、 元に戻すパズルです。 上の例では 1回しか動かしていないので すぐ元に戻せますが、たくさん動かせば 元に戻すのが難しくなります。   動かしたい方向のカーソルキーで移動します。 (移動方向表示は30回またはEnterで改行) sキーで30回適当に移動します。 スペースキーで終了です。   解き方の例 (1) 1,234,59D 戻す (2) 6,78,AE 戻す (3) BCF 戻す 1234     1234      1234 5 xx  → 5678  →   5678 9xxx     9A x      9ABC Dxxx     DExx      DEF   上 1行と左1列が揃えば、3×3のパズルと同じです。   NL-BASICとblg~.zip(puzz002.bas)は 以下のリンクからダウンロードできます https://ulprojectmail.blogspot.com Readme.txtを読んで遊んで下さい

N88-BASICでスライドパズル (1回目)

イメージ
2022/2/24(木) N88-BASICでスライドパズル (1回目)   Sliding puzzle(8) 123      123      123 456 →  45  →  456 78       786      78   スペースの場所へ 1~8を動かしてから、 元に戻すパズルです。 上の例では 1回しか動かしていないので すぐ元に戻せますが、たくさん動かせば 元に戻すのが難しくなります。   動かしたい方向のカーソルキーで移動します。 (移動方向表示は30回またはEnterで改行) sキーで30回適当に移動します。 スペースキーで終了です。   解き方の例 (1) 1 戻す      (2) 2,3 戻す    (3) 4,7 戻す    (4)  xx    1xx      13     123      123    123      123 1xx →  xx  →  x2x → x x  →  74x → 4 x  →  456 xxx    xxx      xxx    xxx       xx    7xx      78   NL-BASICとblg~.zip(puzz001.bas)は 以下のリンクからダウンロードできます https://ulprojectmail.blogspot.com Readme.txtを読んで遊んで下さい      

N88-BASICでユークリッドの互除法

イメージ
2022/2/21(月) N88-BASICでユークリッドの互除法   最大公約数を求めて分数を約分する   ユークリッドの互除法 ( Euclidean Algorithm ) a  ∈ Z  は、aは整数という意味( Z は二重線文字) ( Z :整数 Q :有理数 R :実数 C :複素数) 最大公約数はGCD(G reatest C ommon D ivisor ) なので、ここでは、GCD(a, b)と表すことにする   a, b, n, r ∈ Z a > b > 0 a / b = n … r とすると、 GCD(a, b) = GCD(b, r) が成り立ちます   図1 正方形1辺の長さ大=b,中=r,小=g   a / b の余りはr b / r の余りはg r / g の余りは0   よって、図1を見ると、 r = 2g b = 2r + g = 4g +  g =  5g a = 2b + r = 8g + 2g = 12g となり、 gはa,bの、大きいほうから初めに見つけた 公約数になっているので、最大公約数です   図1によると、 GCD(a, b) = GCD(b, r) = GCD(r, g) = g です ↑                      ↑ a / bの余り > 0         r / gの余り = 0   よって、アルゴリズムは、 (1) a / b の余りrを求める(a > b > 0) (2) a = b, b = r (3) b > 0なら(1)へ (4) aが答え   約分は A > 0, B > 0, G = GCD(A, B)として、 A / B = (A/G) / (B/G)   負数の場合は絶対値に対して計算し 後で符号を付ければ良いと思います   NL-BASICとblg~.zip(euc001.bas)は 以下のリンクからダウンロードできます https://ulprojectmail.blogspot.com Readme.txtを読んで遊んで下さい

N88-BASICでmRNA

イメージ
2022/2/16(水) N88-BASICでmRNA   mRNAの塩基配列を標準コドン表で アミノ酸配列(Amino acid sequence)にする   塩基の種類 アデニン(A)、グアニン(G) チミン(T)、シトシン(C)、ウラシル(U) (A=T,A=U,G≡C) (-は水素結合)   DNA(AGTC) → mRNA(UCAG) → tRNA+アミノ酸+(rRNA) → タンパク質(アミノ酸配列)   RNA$ = "AUGAGCUAG" 又は RNA$ = "AUG AGC UAG" のようにmRNAの塩基配列を書き RUNするとアミノ酸配列が いろいろな方法で表示されます (UAGは終止コドンです)   コドン表などに入力ミスがあるかも しれませんので お遊び程度に使用して下さい   NL-BASICとblg~.zip(mrna001.bas)は 以下のリンクからダウンロードできます https://ulprojectmail.blogspot.com Readme.txtを読んで遊んで下さい

N88-BASICでn進数 (2回目)

イメージ
2022/2/14(月) N88-BASICでn進数 (2回目)   n進数を10進数に変換します   n進数の数値をa≧0とします (負の数は-が付くだけなので 正の数のみ説明します)   [a]をaの整数部分Fract(a)を小数部分とする aの整数部分をx 0 、小数部分をy 0 とし   x = [a], y = Fract(a)と置く   a 1  = 2桁目 a 0  = 1桁目(右から数えて) a -1  = 小数第1位目 の数値とすると   10進数bは b = Σ(a i n i ) (i=-?~?) となります   例 1101.1101(2)→(10) 整数部分は2の(桁数-1)乗倍 小数部分は2の-(小数の位)乗倍 nの乗数を1減らすと1/n倍になる 2の乗数を1減らすと1/2倍になる 2 2  = 4 2 1  = 2 2 0  = 1 2 -1  = 1/2 = 0.5 2 -2  = 1/4 = 0.25   1101.1101(2) = 1 ・ 2 3 + 1・ 2 2 + 0・ 2 1 +  1・ 2 0 +  1 ・ 2 -1 + 1・ 2 -2 + 0・ 2 -3 + 1・ 2 -4   = 1 ・8   + 1・4   + 0・2   +  1・1   +  1 ・ 0.5 + 1・0.25 + 0・125 + 1・0.0625 = 8 + 4 + 1 + 0,5 + 0.25 + 0.0625 = 13.8125   1101.1101(2)→13.8125(10)   1桁を1文字で表すため11進数以上では 10~35をA~Z(26文字)に置換えて入力して下さい よって2≦n≦36となりますが エラーチェックは行っていません   また、小数の精度は倍精度実数型に依存 します(10進数で16桁程です)   NL-BASICとblg~.zip(nary002.bas)は このブログ(以下のリンク)からダウンロードできます https://ulprojectmail.blogspot.com Readme.txtを読んで遊んで下さい

N88-BASICでn進数 (1回目)

イメージ
2022/2/11(金) N88-BASICでn進数 (1回目)   10進数をn進数に変換します   10進数の数値をa≧0とします (負の数は-が付くだけなので 正の数のみ説明します)   [a]をaの整数部分Fract(a)を小数部分とする aの整数部分をx 0 、小数部分をy 0 とし   x 0  = [a], y 0  = Fract(a)と置く   x i+1  ← [x i  / n] (商) b 1+1  ← x i  - n[x i  / n] (余り) i = 0, 1, … (x i+1 >0の間繰返す)   y i+1  ← Fract(y i  ・ n) c 1+1  ← [y i  ・ n] i = 0, 1, … (y i+1 >0の間繰返す)   結果n進数は … b 2  b 1  . c 1  c 2  … つまり b i が右から数えてi桁目c i が小数第i位目となる   例 13.8125(10)→(2)   整数部分は 5を2で割った余りを並べる 2より小さくなれば割らなくても それが余りです   2 )13 2 ) 6  … 1  ← 1桁目(最下位) 2 ) 3  … 0  ← 2桁目   1   … 1  ← 3桁目    ↑    4桁目(最上位) 1101です   小数部分は 13.8125の小数部分を2倍し整数部分を並べ 小数部分は繰り返す   小数部分0.8125 ・2 = 1.625 小数第1位は1 小数部分 0.625 ・2 = 1.25  小数第2位は1 小数部分 0.25  ・2 = 0.5   小数第3位は0 小数部分 0.5   ・2 = 1     小数第4位は1 小数部分0で終了   13.8125(10)→1101.1101(2)   1桁を1文字で表すため11進数以上では 10~35をA~Z(26文字)で表す事にすると 2≦n≦36となりますが エラーチェックは行っていません   また、小数の桁数は倍精度実数型に依存 します(10進数で16桁程です)     NL-BASICとblg~.zip(nary001.bas)は このブログ(以下のリンク)からダウンロードできます https://ulprojectmail.blogspot.com Readme.txtを読んで遊んで

N88-BASIC(88)でレイトレーシング

イメージ
2022/2/10(木)   N88-BASIC(88)でレイトレーシング   PC-8801でレイトレーシングしました   https://ulprojectmail.blogspot.com/2021/06/n88-basic-1.html N88-BASICでレイトレーシング (1回目) ~(8回目) の ray008.bas(PC-9801用640×400×8色)を PC-8801用(640×200×8色)に変更しました   XL-BASIC(Alt+6で高速化)で動きます   1390 A = 4 の4を2や1にすると、解像度が上がります 動画はA = 4、静止画はA = 1で実行した結果です   XL-BASICとblg~.zip(ray301x.bas)は 以下のリンクからダウンロードできます https://ulprojectmail.blogspot.com Readme.txtを読んで遊んで下さい  

N88-BASIC、Cで初心者向けプログラミング (4回目)

イメージ
2022/2/6(日) N88-BASIC、Cで初心者向けプログラミング (4回目)   配列と文字列   BASICの配列 DIM A(10)で A(0)~A(10)の変数が作られます I = 5ならA(I)はA(5)になります DIMを省略してA(0)などを使用すると DIM A(10)とした時と同じになります DIM B(2, 1)は B(0, 0) B(1, 0) B(2, 0) B(0, 1) B(1, 1) B(2, 1) が作られます   BASICの文字列 "で囲まれた文字の列を文字列といい、 最後に$を付ければ文字変数になります A $ = "abc" B$ = A$ + "efg" PRINT B$ でabcdefと表示されます 文字列の長さは0~255文字までです   C言語の配列 int a[10];で a[0]~a[9]の変数が作られます i = 5ならa[i]はa[5]になります int b[3][2]は b[0][0] b[0][1] b[1][0] b[1][1] b[2][0] b[2][1] が作られます   C言語の文字列 char b;でbは文字変数になります b = 'a';文字は'で囲みます char a[10];で9文字の文字列に なります char d[] = "abc"; は、宣言時のみ代入可能で、 a = "abc"などはエラーになります char d[4]; d[0] = 'a'; d[1] = 'b'; d[2] = 'c'; d[3] = '\0'; と同じです  '\0'は文字コード0で、文字列の 最後を意味します 255より多い文字数も可能です   何月かを入力し英語を表示する 月以外の数値の入力で終了する   BASICでは、 100 DIM M$(11) 110 M$(0) = "January": M$( 1) = "February": M$( 2) = "March" 120 M$(3) = "April"  : M$(

N88-BASIC、Cで初心者向けプログラミング (3回目)

イメージ
2022/2/5(土) N88-BASIC、Cで初心者向けプログラミング (3回目)   制御命令(条件による分岐)   平成の年を入力し平成又は令和を表示する   BASICでは、 10 INPUT "平成"; Y 20 WHILE Y > 0 30   IF Y > 30 THEN PRINT "令和";: Y = Y - 30 ELSE PRINT "平成"; 40   IF Y =  1 THEN PRINT " 元 年" ELSE PRINT Y; "年" 50   PRINT 60   INPUT "平成"; Y 70 WEND   C言語では、 #include <stdio.h> void main(void) {     int y;       printf("平成? ");     scanf("%d", &y);     while (y > 0)     {         if (y > 30) { printf("令和"); y -= 30; } else printf("平成");         if (y == 1)         {             printf(" 元 年\n");         }         else         {             printf(" %d 年\n", y);         }         printf("\n");         printf("平成? ");         scanf("%d", &y);     } }   BASICの説明 IF Y > 30 THEN PRINT "令和";: Y = Y - 30 ELSE PRINT "平成"; IF 条件式 THEN .. ELSE .. は1つの行に 書かなければいけません 条件 式は0が偽、0以外