与えられた木から、子→親への対応を作る(ruby)

id:suminさんのところ見て知りました。

“与えられた木から、子→親への対応を作る”を Squeak Smalltalk で - Smalltalkのtは小文字です
与えられた木から、子→親への対応を作る


やってみました。

tree = [:Root, [:Spine ,[:Neck ,[:Head]],
                [:RClavicle, [:RUpperArm, [:RLowerArm, [:RHand]]]],
                [:LClavicle, [:LUpperArm, [:LLowerArm, [:LHand]]]]],
        [:RHip, [:RUpperLeg, [:RLowerLeg, [:RFoot]]]],
        [:LHip, [:LUpperLeg, [:LLowerLeg, [:LFoot]]]]]

def f(a, ret=[])
   a[1..-1].each{|e|
      ret << [e[0],a[0]]
      f(e, ret)
   }
   ret
end

p f(tree)

そしてやったあとにid:sumimさんがすでにruby訳していることに気づきました。


最初、超絶ダーティーなのが25分くらいで出来たけど、晒したら44マグナムで撃たれそうな出来だったのでさらに10分くらいかけてこれに。
再帰は若干慣れてきているのだけど、tree構造にあんまり縁がないのがネックだったかなあと思いました。


あとshiroさんのおっしゃる、

再帰が身についてるかどうかを見るのに手頃かな。 appendによる無駄も、push!による副作用も嫌う場合、再帰パターンが樹状であっても結果がまっすぐなリストならfoldでつないでゆけることは覚えとくと便利かもしれません。

は、やりながらこれinjectでいけそうかなあ、と思いつつ、手を出すとさらにかかりそうだったんで断念。あとで気が向いたら考えます。