あみだくじ

どう書くorgに簡単に解けそうな問題があった.

splitが思うように動作してくれず,結局s///置換をして,m/./gで一文字ずつ取得した.

他人の解答を見て,読み込みながらswapする問題ということに今更気づく.
というわけで阿呆コード誕生.

実行結果:
% perl amida.pl data.txt
A B C D E
| | |-| |
|-| | |-|
| |-| |-|
|-| |-| |
|-| | | |
B D C A E

そーすこーど

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

die "Input data file\n" if (@ARGV < 1);
open IN, '<', $ARGV[0] or die "Cannot open $ARGV[0]\n";

## Load input file
my $first_line = <IN>;
chomp $first_line;

## Global variables
my $debug = 0;

## obtain first line
my @input_list = split / /, $first_line;
my @amida_list;

## obtain connection information
while(my $line = <IN>){
  chomp $line;
  $line =~ s/\|//g;
  my @connection_list = ($line =~ /./g);
  push @amida_list, \@connection_list;
}
close(IN);

## print information
print "@input_list\n";

foreach my $line (@amida_list) {
  foreach my $connection (@{ $line }) {
    print '|' . $connection;
  }
  print "|\n";
}


## main
my @answer_list = ();
for(my $i = 0; $i < @input_list; $i++){
  my $position = $i;

  for(my $j = @amida_list - 1; $j >= 0; $j--){

    # check right side
    if ($position < @input_list - 1 && $amida_list[$j]->[$position] eq '-'){
      $position++;
    }elsif ($position > 0 && $amida_list[$j]->[$position - 1] eq '-'){
      $position--;
    }
  }

  $answer_list[$i] = $input_list[$position];
}
print "@answer_list\n";