サンプルプログラム3(PL JavaScript編)

寄り道のコード

1. 回数を決めた繰返し:

2. 文字列を横に並べて印字する

3. String.prototype.reverse() を書くなら

Rubyでは String#reverse が既存のものとして用意されているが、JavaScriptには String.prototype.reverse() はない。 これを(講義の本編のように Array.prototype.reverse() を借用するのではなく)自分で作るとしたら…

(対象の文字列は変数 s に保持されているとする。 それぞれの考え方の解説は本編を参照。)

  1. もとの場所で、交換:

    ただし、JavaScriptには、文字列の指定位置の部分文字(列)を置き換えるメソッドは用意されていない(同じことをするためには、変更しない前部、変更対象、変更しない後部を連結するやり方になる)。

    なので、まずは配列に変換して反転させた後にjoinするアプローチから入ることにする。

    let a=s.split(''), l=s.length
    [...Array(l/2>>0).keys()].forEach(i=>[a[i],a[l-i-1]]=[a[l-i-1],a[i]])
    a.join('')
    // slice を使う場合
    let rev=s=>s.length<=1?s:s.slice(-1)+rev(s.slice(1,-1))+s[0]; rev(s)
    // 正規表現 を使う場合
    let rev=(s,m)=>(m=s.match(/(.)(.*)(.)/))?m[3]+rev(m[2])+m[1]:s; rev(s)
  2. 新しい場所に向けて、交換:

    let l=s.length
    [...Array(l).keys()].map(i=>s[l-i-1]).join('')
  3. 回れ右(の列を押し込んで行く)

    やはり配列(空の配列から出発)を使うことになる。また、対象となる文字列 s も配列に分割してから順々に forEach で送り込むという使い方になる。

    let r=[]
    s.split('').forEach(c=>r.unshift(c))
    r.join('')
補足

4. コマンドラインから引数を渡す