与えられた木から、子→親への対応を作る(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でいけそうかなあ、と思いつつ、手を出すとさらにかかりそうだったんで断念。あとで気が向いたら考えます。