本を読む

読書やコンピュータなどに関するメモ

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

 Perlでやってみました。30分以上かかったと思うし、テラappend。効率からするとpushしていくほうがいいと思います。

 作ってからWikiの解答例を見たら、みなさんエレガントに書いてました ><

#!/usr/bin/perl
use strict;
use warnings;
use YAML;

sub ko_oya {
    my ($nodes, @parents) = @_;

    if (defined $nodes) {
	map { ko_oya_one($_, @parents) } @{$nodes};
    } else {
	return ();
    }
}

sub ko_oya_one {
    my ($node, @parents) = @_;

    my $name = $node->{name};
    my $subnode = $node->{node};

    my @children = ko_oya($subnode, ($name, @parents));
    my @mine = map { { child => $name, parent => $_ } } @parents;

    (@mine, @children);
}

my $tree = Load(do { local $/; <DATA> });
my @result = ko_oya($tree, ());
print Dump(\@result);

__DATA__
- name: Root
  node:
    - name: Spine
      node:
        - name: Neck
          node:
            - name: Head
              node:
        - name: RClavicle
          node:
            - name: RUpperArm
              node:
                - name: RLowerArm
                  node:
                    - name: RHand
                      node:
        - name: LClavicle
          node:
            - name: LUpperArm
              node:
                - name: LLowerArm
                  node:
                    - name: LHand
                      node:
    - name: RHip
      node:
        - name: RUpperLeg
          node:
            - name: RLowerLeg
              node: 
                - name: RFoot
                  node:
    - name: LHip
      node:
        - name: LUpperLeg
          node:
            - name: LLowerLeg
              node:
                - name: LFoot
                  node:

 結果。

---
- child: Spine
  parent: Root
- child: Neck
  parent: Spine
- child: Neck
  parent: Root
- child: Head
  parent: Neck
- child: Head
  parent: Spine
- child: Head
  parent: Root
- child: RClavicle
  parent: Spine
- child: RClavicle
  parent: Root
- child: RUpperArm
  parent: RClavicle
- child: RUpperArm
  parent: Spine
- child: RUpperArm
  parent: Root
- child: RLowerArm
  parent: RUpperArm
- child: RLowerArm
  parent: RClavicle
- child: RLowerArm
  parent: Spine
- child: RLowerArm
  parent: Root
- child: RHand
  parent: RLowerArm
- child: RHand
  parent: RUpperArm
- child: RHand
  parent: RClavicle
- child: RHand
  parent: Spine
- child: RHand
  parent: Root
- child: LClavicle
  parent: Spine
- child: LClavicle
  parent: Root
- child: LUpperArm
  parent: LClavicle
- child: LUpperArm
  parent: Spine
- child: LUpperArm
  parent: Root
- child: LLowerArm
  parent: LUpperArm
- child: LLowerArm
  parent: LClavicle
- child: LLowerArm
  parent: Spine
- child: LLowerArm
  parent: Root
- child: LHand
  parent: LLowerArm
- child: LHand
  parent: LUpperArm
- child: LHand
  parent: LClavicle
- child: LHand
  parent: Spine
- child: LHand
  parent: Root
- child: RHip
  parent: Root
- child: RUpperLeg
  parent: RHip
- child: RUpperLeg
  parent: Root
- child: RLowerLeg
  parent: RUpperLeg
- child: RLowerLeg
  parent: RHip
- child: RLowerLeg
  parent: Root
- child: RFoot
  parent: RLowerLeg
- child: RFoot
  parent: RUpperLeg
- child: RFoot
  parent: RHip
- child: RFoot
  parent: Root
- child: LHip
  parent: Root
- child: LUpperLeg
  parent: LHip
- child: LUpperLeg
  parent: Root
- child: LLowerLeg
  parent: LUpperLeg
- child: LLowerLeg
  parent: LHip
- child: LLowerLeg
  parent: Root
- child: LFoot
  parent: LLowerLeg
- child: LFoot
  parent: LUpperLeg
- child: LFoot
  parent: LHip
- child: LFoot
  parent: Root

追記2008-6-3

 回答例を見ていて気がついたけど、俺、問題の意味をとりちがえていたよ。しょぼーん。

コメント

コメントの投稿

管理者にだけ表示を許可する

トラックバック

http://emasaka.blog65.fc2.com/tb.php/403-84710622

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

 「与えられた木から、子→親への対応を作る」で自分が書いたコードがイマイチだったので、素直にお手本を参考にします。  出題者のShiro...

 | HOME | 

Categories

Recent Entries

Recent Comments

Recent Trackbacks

Appendix

emasaka

emasaka

フリーター。
連絡先はこのへん

Monthly


FC2Ad