Uiua

NBUゆるゆるかれんだー Advent Calendar 2023

7日目の記事です。

たったいま覚えたばかりのプログラム言語 Uiua うぃうぁ を紹介します。とても短く書けます。

https://www.uiua.org/ Uiuaのサイトです。スタック操作と配列、関数スタイルな言語です。一目見て面白そう。スタック操作の言語を触るのはForth以来です。


参照 スタックベースの 配列プログラミング言語 - Uiua

Uiua の基本的なスタック操作関数

Uiua - ↯ reshape 関数

言語の作者のサイトのコード例です。

平均を求めるコードとフィボナッチ数列を求めるコード。なんだこれは?!

コードは  から読んで解釈します。

[1 5 8 2] 配列をスタックの先頭に積む

. 配列をコピーして積む

/+ 配列を取り出して要素の合計を積む

: スタックを入れ替える

 ⧻ スタックトップのコピー元の配列を取り出して要素数を積む

 ÷ スタックから要素数と合計を取り出して割ってスタックに積む

スタックに残った値が出力結果です。


フィボナッチ数列

1 1 をスタックに積む

⊙∘ スタックから2つ取り出してそのまま戻す

+ スタックから2つ取り出して足してスタックに積む

↑2つの操作をスタックを分岐して実行する

9回繰り替えす

⇌[ ] 配列を逆順に並べ替える

説明書 と ツアー と チュートリアル と チートシート にざっと目を通しました。難しい。

ここからUiuaのコードを実行して試せます。スマホでも書けるのでありがたい。

ちょっと頑張ってみました。

200x200の各ピクセルをグレースケールでランダムに表示。ノイズ画像。

ランダム関数が ⚂ なのがイイですね。

https://uiua.org/pad?src=0_5_1__4oqeKOKagjs7KS7ih6EyMDAK

20x20マスを白黒でランダムに初期化して行と列を10倍にコピーしてモザイク風にした。

2次元配列の転置が ⍉ でイメージしやすいですね。

https://uiua.org/pad?src=0_5_1__4oqeKOKBheKagjs7KS7ih6EyMAriiLXihq8xMArijYkK4oi14oavMTAK4oavMjAwXzIwMAo=

-1~+1のxy座標に対して0,0からの距離をグレースケールのピクセルで描画した。

数学は役に立ちますね。スタックを使った計算の訓練にもなって良い感じです。

https://uiua.org/pad?src=0_5_1__4oqeKCvigb8yOuKBvzIpLsO3MTAwLTEwMOKHoTIwMAo=

模様を作りました。

剰余計算は です。そう言えば周期作るときに三角になりますね。

https://uiua.org/pad?src=0_5_1__4oqeKCspLsO3OuKXvyzih6EyMDAgNjAK

サウンド出力もできます。

なんと で配列を平滑化(フラット)すると、要素が音声っぽい場合サウンド出力になります。

音楽記号のフラットにもちなんでそう。

https://uiua.org/pad?src=0_5_1__4oqeKCspLsO3OuKXvyzih6EyMDAgNjAK4pmt

カラー画像やGIFアニメーション、ネットワーク通信も書けるらしい。

また機会があったら挑戦してみたいです。

現在、4時34分。

今日はフレッシュマンセミナーの1年生10名を引率して大学から名古屋の映像制作スタジオまで見学に行くので、寝ます。

2023.12.10追記

スタックを一つ飛ばして関数適用する ⊙ が便利。値をコピーして使い回すときに。

サウンドプログラミングの修行してみた

https://uiua.org/pad?src=0_6_1__U2F3IOKGkCDima3ihq8xMDDDt-KKmS0uMTAw4oehMjAwCkVudiDihpAgw7c64oeM4oehLsOXMTAwIDIwMApIIOKGkCDiiqLijYnihq_iioLijIjDtyzip7ss4oqZ4oiYCkwg4oaQIOKZreKNieKGr-KKmeKImApEIOKGkCDihpnDtzrip7ss4oqZ4oiYCkMg4oaQIOKZreKJoeKHjOKGr-KMiuKKgsO3LOKnuyziipniiJgKUiDihpAg4pmt4oav4oqZ4oiYCk0g4oaQIMOX4oaZ4oqZOuKKmeKGmS7ihqfip7ss4qe7LOKKmeKImApMMsOXU2F3IEVudgriioI6w5dTYXcgRW52CuKKgjpEMsOXU2F3IEVudgriioI6RDTDl1NhdyBFbnYK4oqCOkw0w5dTYXcg4oeMRW52CuKKgjpIMsOXU2F3IOKHjEVudgriioI6w5dSNEg0U2F3IOKHjEVudgriioI6TSBSMTJINlNhdyBSMTZIOEVudgriioI6QzMxLgo=


定数や関数をシンボル(アルファベットの文字列)に大域的にバインドする。ローカルなバインドはUiuaのコンセプト的に実装されていない

⊙∘ 関数定義でスタックを2つ消費して使い回す

↯⌊⊂ スタック2つを配列にしてreshapeする。配列の数値が整数になるように切り捨て

M ← ×↙⊙:⊙↙.↧⧻,⧻,⊙∘ 2つの配列をxする際に長さを短い方に揃える

M ← ×∩↙⊙:.↧⊃∩⧻⊙∘ 別の書き方。⊃でスタックをコピー。∩でスタックを2か所操作


Saw ノコギリ波の波形の配列

Env エンベロープ。1から0に減衰

H 配列を間引く。高音化

L 配列を伸長する。低音化

D 配列をN分の1で切る。

C 配列をN個に分けてそれぞれを反転

R 配列をN回リピート

プログラム言語UiuaでByteBeatしてみた。