まずはProlog (処理系は SWI-Prolog を使用)
nnn(0, []). nnn(X, L) :- length(L, X), append(M, [M], L), succ(Y, X), nnn(Y, M).
これは、双方向に使えます。例えば、「?- nnn(2, X).」のようにすると整数からノイマンの形式に、また、「?- nnn(X, [[], [[]]]).」のようにすれば、ノイマンの形式に対応する整数が得られます。 しかも「?- nnn(X, Y).」とすれば、まず0について、「;」でバックトラックすると1, 2, 3, 4と次々に生成します。
次にCommon Lisp (処理系は CLISP を使用)
(defun nnn (x) (if (zerop x) nil (let ((m (nnn (1- x)))) (append m (list m)))))
Prologに比べると当たり前過ぎてイマイチ面白くない(こらこら:-)
と、ここまでは「再帰的な構造しているから、プログラムも再帰呼び出し必須だよなぁ」と思ってたんですが、ふと、「COBOL で書けないかな?」と思いついたけど、流石に COBOL は最近触ってないし、可変長データ構造のサポートの現状がわからないので、「そうか、再帰を使わずに繰り返しで書ければ COBOL でも実質書けると言えるか」と思い、Common Lispで再帰を使わずに書いてみました。
(defun nnni (x) (prog ((i 0) (r nil)) loop (if (>= i x) (return r)) (setq r (append r (list r))) (setq i (1+ i)) (go loop)))
いやぁ、 Lisp とは名ばかりなキチャナイプログラムになりました。繰り返しのスタイルが古臭いのは勘弁してください:-)
で、ここまでで一旦掲載。この後他の言語等追加するかもしれません。
それさえもおそらくは現実逃避:-)
以下、追加第1陣(2016/5/20 01:45頃)
さて、非再起な手続き型といえば古のMS-BASICですが、それっぽいものでプチコンV1.2が手元にあったので、それでも組んでみました。あまり頑張ってません:-)
INPUT X IF X==0 THEN PRINT "{}":END I=0 R$="{{}}" @LOOP IF I>=X-1 THEN PRINT R$:END R$=MID$(R$,0,LEN(R$)-1)+","+R$+"}" I=I+1 GOTO @LOOP
となります。(久々の手コピー:-)
というわけで、この辺にしときましょう。
(2016/5/20 23:37頃)
プチコンのBASICプログラムに冗長な行が1行あったので、削除しました。
(2016/5/21 0:40頃)
COBOLでやってみるとか(old)awk、bashではなくshとか、色々考えたんですけど、少し変な言語ということで、Windowsのバッチファイルで書いてみました:-)
ただ世の中でバッチファイルというと16ビット時代からの COMMAND.COM で実行する *.BAT と思われるようですが、今や64ビット時代なので:-)、32ビットWindowsからずっと使えている CMD.EXE で実行する *.CMD として作成しました。というか、 *.BAT では流石に無理があります:-)
@echo off set /p x=? if %x% equ 0 ( echo {} goto :end ) set i=0 set r={{}} :loop set /a x1=%x%-1 if %i% geq %x1% ( echo %r% goto :end ) set r=%r:~0,-1%,%r%} set /a i=%i%+1 goto :loop :end
これを越える「変な」言語とすれば、vimではなく元祖viぐらいしかのこってないかもしれない:-)