本を読む

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

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

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

 出題者のShiroさんのサンプルから。

(use util.match)

(define (get-parent-alist tree)
  (define (rec p t s)
    (match-let1 (n . ts) t
      (acons n p (fold (cut rec n <> <>) s ts))))
  (fold (cute rec (car tree) <> <>) '() (cdr tree)))

 黙読より朗読ということなので、Perlで写経してみます。

#!/usr/bin/perl
use strict;
use warnings;
use YAML;
use List::Util qw( reduce );

sub rec {
    my ($p, $s, $t) = @_;

    my $n = $t->{name};
    my $ts = $t->{node};

    my $r = reduce { rec($n, $a, $b) } $s, @{$ts};
    $p ? [{ child => $n, parent => $p }, @{$r}] : $r;
}

sub get_parent_alist {
    my ($tree) = @_;

    reduce { rec(undef, $a, $b) } [], @{$tree};
}

my $tree = Load(do { local $/; <DATA> });
my $result = get_parent_alist($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: LHip
  parent: Root
- child: LUpperLeg
  parent: LHip
- child: LLowerLeg
  parent: LUpperLeg
- child: LFoot
  parent: LLowerLeg
- child: RHip
  parent: Root
- child: RUpperLeg
  parent: RHip
- child: RLowerLeg
  parent: RUpperLeg
- child: RFoot
  parent: RLowerLeg
- child: Spine
  parent: Root
- child: LClavicle
  parent: Spine
- child: LUpperArm
  parent: LClavicle
- child: LLowerArm
  parent: LUpperArm
- child: LHand
  parent: LLowerArm
- child: RClavicle
  parent: Spine
- child: RUpperArm
  parent: RClavicle
- child: RLowerArm
  parent: RUpperArm
- child: RHand
  parent: RLowerArm
- child: Neck
  parent: Spine
- child: Head
  parent: Neck

コメント

コメントの投稿

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

トラックバック

http://emasaka.blog65.fc2.com/tb.php/404-6bd2261e

 | HOME | 

Categories

Recent Entries

Recent Comments

Recent Trackbacks

Appendix

emasaka

emasaka

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

Monthly


FC2Ad