はじめに
@mattnさんのホクホクのイモを読んでこれってAPLだと簡単に書けるんじゃと思ってやってみました。
GNU-APLによる実行例
説明
APLは読みづらいですが、やりたいことから少しづつ積み上げるようにすると書く方は楽なので順にやっていきます。
文字列
APLでは文字列は1次元の配列で、各要素に1文字ずつ対応します。←は変数への代入で、A[数字]で要素を取り出すことができます。APLで配列の添字はデフォルトで1オリジンですが、0オリジンにすることもできます。添字は複数書いて添字の個数分の要素の1次元配列を作ることもできます。
A←'ホクイモ'
A[2]
ク
A[4 3 2 1]
モイクホ
要素数は⍴で求められます。
⍴A
4
乱数
文字列から重ならない任意の2文字を抜き出すため乱数を調べていたらちょうど使えそうなのがありました。n?m は1~mまでの数字から任意の重複しないn個の数字をランダムに取り出します。
4?100
82 30 86 75
4?100
78 46 28 63
そうすると、文字列の長さは⍴Aで添字の範囲は1~⍴Aなので、Aから任意の文字2個を取り出すには以下のようにできます。
A[2?⍴A]
ホモ
A[2?⍴A]
イホ
変形と連結
これで任意の2文字を取り出せるようになりましたが、ホクホクのイモにするためには最初に取り出した2文字を繰り返す必要があります。⍴で1次元2要素の配列を1次元4要素の配列に変形します。変形する配列が大きい場合は元の配列の要素が繰り返して置き換えられます。
4⍴A[2?⍴A]
モホモホ
あとは 'モホモホ' 'の' 'イホ' みたいになるように連結すればOK。カンマで連結できます。
4⍴A[2?⍴A],’の’,A[2?⍴A]
ホイのク
あれ?なんかおかしい。APLは後ろから順に評価されるので、
A[2?⍴A],’の’,A[2?⍴A]
ホイのクホ
から4要素の1次元配列が作られるような動作になっています。変形する配列が小さい場合は元の要素の先頭から適用され入りきれなかった要素はカットされます。
括弧を使えばそちらから優先して評価されるので、意図通りにするには以下のように書きます。
(4⍴A[2?⍴A]),’の’,A[2?⍴A]
ホイホイのクホ
関数定義
最後に関数定義です。
実行モードで∇を入力すると定義モードになり、最初が関数名、続く文字が引数となります。
文番号が[1]のように表示されるので、内容を入力。定義モードの最後で∇のみを入力すると関数定義おわり。
※try-GNU-APLでは定義モードの文番号表示が最後にまとまって出力されるようです。
結論
∇IMO A
(4⍴A[2?⍴A]),’の’,A[2?⍴A]
∇
IMO 'ホクイモ'
イクイクのホイ
IMO 'ホクイモ'
イホイホのモホ
参考
TryAPL ※文字列に日本語使えません
try-GNU-APL