2025-01-08
0と1の二進法の論理演算で動いているのがコンピューター。すべての演算は、ANDとORとNOTがあれば表現できます。演算子3つ、これがミニマムでしょうか?

実は、ORしてNOTする、NOR(ノア)や、ANDしてNOTするNAND(ナンド)という演算子1つあれば、AND、OR、NOTもつくることができるので、演算子は実は1つで十分!


「Nor」

名前のかわいさを優先して新プログラミング言語「Nor(ノア)」を「Wirth(ヴィルト)」をベースに開発しました。


「Nor Playground」

演算子として使えるのは論理和(or)を否定する(not)する、"nor"のみ。0か1の1bit同士の演算なので、パターンは4つしかありません。

まずは not を作ります。

function not(a) return a nor a end print not(0) # → 1 print not(1) # → 0

notができたら、norをnotすればorに!

function or(a, b) return not(a nor b) end

演算する前のaとbをnotすれば、andに!(ド・モルガンの法則

function and(a, b) return not(a) nor not(b) end

ANDとORとNOTができたので、1bitの足し算、半加算器を作ります。


「Wikipedia 加算機 における半加算器の図に、注釈追加」

AとBの足し算の計算結果Sと、繰り上がり(キャリー)CのAND/OR/NOTによる組み立て例です。

function halfadd(a, b) c = and(a, b) s = and(or(a, b), not(c)) return [c, s] end

複数bitの足し算をするためには、下の桁からの繰り上がりをサポートした全加算器を作ります(参考、加算機 - Wikipedia

function fulladd(a, b, x) cs1 = halfadd(a, b) cs2 = halfadd(cs1[1], x) c = or(cs1[0], cs2[0]) s = cs2[1] return [c, s] end

全加算器を使って、4bitの足し算をしてみます

function add(a, b) x = 0 s = [0, 0, 0, 0] for i = 3 to 0 step -1 cs = fulladd(a[i], b[i], x) x = cs[0] s[i] = cs[1] next return s end a = [0, 1, 0, 0] # 4 b = [0, 1, 0, 1] # 5 print add(a, b) # → [1, 0, 0, 1] 9

配列を使って2進法4bitの数を表現しています。


「Nor - Playground」

Norの実行環境で実際に試してみてください!

links
- Pascalリスペクトの教育用構造化プログラミング言語「Wirth」

2025-01-07
東京都江戸川区 子ども未来館で開催された、はんだづけ、プログラミング、オルゴールづくりを体験するIchigoJamを使ったワークショップ!昨年に続く、第二弾!今回も講師は、リトルプラネットさん!


はんだづけがおわったら、いろいろプログラミングしてみよう!


はんのうそくどゲームで対戦!
IchigoJam ミニゲームズから気になるプログラムを入力して、遊ぶ!


夢中にやきゅうゲームする小学生!


人気だった、やきゅうゲーム!

10 Y=0 20 CLS 30 LC 4,15:?"%" 40 LC 5,Y:?"O",W 50 IF BTN() GOTO 90 60 Y=Y+1 70 WAIT W 80 GOTO 20 90 IF Y=15 ?"HIT!"

1行足して、2人で対戦するゲームに改造!

35 IF Y=0 IF BTN(32)=0 GOTO 35 ELSE W=3+BTN(30)*2-BTN(31)*2

ピッチャー側がキーボード、バッター側はIchigoJamのボタン。
RUNしたら、ピッチャー側はこっそり、スペースキーで投げる。このとき、カーソルで上か下を押すと球のスピードが変わるよ!

90行をちょっと改造。たまにホームランがでるようにする改造

90 IF Y=15 IF RND(4)=0 ?"HOMERUN!" ELSE ?"HIT!"


やきゅうゲームの改良、過去ブログを探してみると、こちら「IchigoJam Q&A オープンデータとQA検索アプリ」では、ボールやストライクのカウントを数える機能を追加してました。アウト3つでチェンジをつくって、交代を作ったり、点数を表示したりするのもいいですね!


リアルバットにセンサーを付けて打てるように改造した「やきゅうゲーム」を応募してくれたPCNこどもプロコン2019-2020、中学1年生、田中魁さんの作品「Crazy Baseball」

かわくだりゲームが動くひみつを質問されたので、LC(LOCATE、ロケート、位置指定)と?(PRINT、表示)を動かしながら解説。


ファミマ入店音をPLAYコマンドのMMLで再現してた!ボタンを押すと鳴る改造を伝授!


「エレコム キーボード 有線 メンブレン Rohs指令準拠 1000万回高耐久 ホワイト TK-FCM064WH/RS」

ちょっと古い規格、PS/2に対応したキーボードを用意して、おうちでも遊んでみよう!こちらおすすめキーボード。


おうちのテレビ、黄色い端子がない?でも、まだあきらめないで。
AV入力という端子があれば、


こんなケーブルを使えば、IchigoJamがつながるよ!
HDMIにも変換できる、新型IchigoJam P、2024年誕生!

links
- 東京都江戸川区ではんだづけからのIchigoJamプログラミングワークショップ、オルゴールを作ろう!

2025-01-06
2021年に考案、開発した緯度経度精度を1文字列にエンコードする「Geo3x3(ジオスリーバイスリー)」の特徴は、対応言語の多さ。


「Geo3x3」

今回、開発した2025年新登場の構造化プログラミング言語「Wirth(ヴィルト)」に対応して、対応言語数が109となりました。


「Geo3x3 in Wirth」

Wirthを使ったエンコード「geo3x3.wirth」はこちら

function encode(lat, lng, level) res = "E" if lng < 0 res = "W" lng = lng + 180 endif lat = lat + 90 # 180:the North Pole, 0:the South Pole unit = 180 for i = 1 to level - 1 unit = unit / 3 x = lng // unit y = lat // unit res = res + (x + y * 3 + 1) lng = lng - x * unit lat = lat - y * unit next return res end

ちなみに、Wirth氏が開発したPascalでの記述「geo3x3.pas」はこちら

function Geo3x3_encode(lat: real; lng: real; level: integer): string; var unitsize: real; i: integer; x: integer; y: integer; begin result := 'E'; if lng < 0.0 then begin result := 'W'; lng := lng + 180.0; end; lat := lat + 90.0; { 180:the North Pole, 0:the South Pole } unitsize := 180.0; for i := 1 to level - 1 do begin unitsize := unitsize / 3.0; x := Floor(lng / unitsize); y := Floor(lat / unitsize); result := result + IntToStr(x + y * 3 + 1); lng := lng - x * unitsize; lat := lat - y * unitsize; end end;

型宣言が不要で、then、begin、セミコロンなどなくていいものを極力省いてよりシンプルにしています。

Pythonでの記述「geo3x3.py」はこちら

def encode(lat: float, lng: float, level: int): res = "" if lng >= 0: res += "E" else: res += "W" lng += 180 lat += 90 # 180:the North Pole, 0:the South Pole unit = 180 for i in range(1, level): unit /= 3 x = int(lng / unit) y = int(lat / unit) res += chr(ord('0') + x + y * 3 + 1) lng -= x * unit lat -= y * unit return res

一番お気に入りのオブジェクト指向言語、JavaScriptの「geo3x3.js」はこちら

const encode = (lat, lng, level) => { let res = "E"; if (lng < 0.0) { res = "W"; lng += 180.0; } lat += 90.0; // 180:the North Pole, 0:the South Pole let unit = 180.0; for (let i = 1; i < level; i++) { unit /= 3.0; const x = Math.floor(lng / unit); const y = Math.floor(lat / unit); res += x + y * 3 + 1; lng -= x * unit; lat -= y * unit; } return res; };

どれも似てますが、ちょっとずつ違うのがおもしろいですね!

links
- Pascalリスペクトの教育用構造化プログラミング言語「Wirth」

2025-01-05
プログラミング言語Pascalの開発者、ニクラウス・ヴィルト氏が亡くなり1年。Pascalが教育用に作られたことを知る。

商用言語は複雑すぎる。

BASICからC言語、C++、Java、JavaScriptと、begin/endなどで構造を記述する言語と縁が遠かった人生。ただ、一般的な文章では馴染の薄い括弧 { } を使わない記法にもいいところがあるかもしれない。そこで、Pascalのヴィルト氏リスペクト、DNCL3をベースに新しい教育用構造化プログラミング言語「Wirth(ヴィルト)」を作成。


「Simple Structured Programming Language (Virth) - GitHub」

Wirth (pronounced 'virt') is an easy-to-learn, sleek structured programming language. (forked DNCL3)
ヴィルトと発音する「Wirth」は、学びやすく、洗練した構造化プログラミング言語です。括弧で構造を表現するDNCL3をベースに開発しました。仕様書はひとまず英語で記述。


「Wirth Playground」
src on GitHub
一通り動作します。

DNCL3のカッコ書きと、Wirthの表記、どちらが好みですか?


DNCL3 と Wirth

ifの終わりは endif、ループ系の終わりは next、関数定義の終わりは end で表現。パースの関係で do-whileはなく、do-untilのみ対応です。

手続き型言語 IchigoJam BASIC の表記により近いので、構造化プログラミング言語のステップアップにはこちらの表記がよいかもしれない。

links
- 【訃報】プログラミング言語「Pascal」の開発者ニクラウス・ヴィルト氏が89歳で死去、ソフトウェア設計のパイオニアとして複数のプログラミング言語を考案し1984年にチューリング賞を受賞 - GIGAZINE
- オープンソースの新プログラミング言語、共通テスト用プログラム表記「DNCL3」を実装と共に提案

Tweet
クリエイティブ・コモンズ・ライセンス
本ブログの記事や写真は「Creative Commons — CC BY 4.0」の下に提供します。記事内で紹介するプログラムや作品は、それぞれに記載されたライセンスを参照ください。
CC BY / @taisukef / アイコン画像 / プロフィール画像 / 「一日一創」画像 / RSS