challenge あみだくじ

次のような書式で与えられた「あみだくじ」があります。
(あみだくじはコード中に埋め込んでも、標準入力や
外部ファイルから読み込んでも、書きやすい方法でかまいません)

A B C D E
| | |-| |
|-| | |-|
| |-| |-|
|-| |-| |
|-| | | |

このあみだくじをたどって
A B C D E
| | |-| |
|-| | |-|
| |-| |-|
|-| |-| |
|-| | | |
B D C A E
のように結果を表示させるプログラムを作ってください。

Posted feedbacks - Perl

ひねりなし

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
use strict;
use warnings;

sub swap {
    @_[0, 1] = @_[1, 0];
}

sub amida {
    my $str = shift;
    my @lines = split /\n/, $str;
    my @header = split //, shift @lines;

    print join '', @header, "\n";

    for (@lines) {
        print $_, "\n";
        while (/-/g) {
            swap($header[pos() - 2], $header[pos]);
        }
    }

    print join '', @header, "\n";
}

my $data = do { local $/; <DATA> };
amida($data);

__DATA__
A B C D E
| | |-| |
|-| | |-|
| |-| |-|
|-| |-| |
|-| | | |

短かさと, 正規表現の小手先にこだわりました. 
標準入力とかから, アミダクジを与えて下さい. 
1
2
3
$_=<>;print;while($b=$a=<>){print$a;chomp$a;$i=1;$a=~s/(-|\|)/$1eq'-'?' ':'(.)'
/eg;$b=~s/(\|-\||\|)/$1eq'|'?'$'.$i++:'$'.++$i.' $'.($i++ -1)/eg;eval"s/$a/$b/"
}print

Index

Feed

Other

Link

Pathtraq

loading...