POH6+ 「え、妻が松江?」松江Ruby会議07協賛 回文作成プログラミングコンテスト


六村リオ / 霧島京子 / 緑川つばめ / 島根ルミ / 島根ルミ149 / 島根ルミ121 / 共通解

回文を求める問題
Ruby会議とか華麗にスルーしてPHPでの回答です。

「すべての単語は同じ長さ」より、「abcd」「cb」「a」のような左右非対称区切りを考える必要は無い。
従って複雑な組み合わせを全て試したりする必要はなく、反転すると同じになる単語を探してペアにしていけばよい。

2単語をペアにできる条件は、
・単独で左右対称
・単独で左右対称ではなく、そのままでは等しくないが、50音順にすると等しい

さらに、
・単独で左右対称で、ペアになってないものは中央に入る

いまいち微妙にすっきりしない条件ですね。

<?php
    // インプット
    $f = file('php://stdin', FILE_IGNORE_NEW_LINES|FILE_SKIP_EMPTY_LINES);
    // 1行目は不要
    unset($f[0]);

    // 初期化
    $list = [];
    $pair = [];

    foreach($f as $v){
        // ペアになれるなら$pairに持ってく、なれなければ$listに
        $v=($c=($v<=>$r=strrev($v))+1)===2?$r:$v;
        if($list[$v][2-$c]>0){
            $pair[$v]++;
            $list[$v][2-$c]--;
        }else{
            $list[$v][$c]++;
        }
    }

    // 前半
    ksort($pair);
    $str = '';
    foreach($pair as $k=>$v){
        $str .= str_repeat($k, $v);
    }

    // 中央の文字があれば
    $c = '';
    foreach($list as $k=>$v){
        if($v[1]){
            $c = $k;
            break;
        }
    }

    // 出力
    echo $str . $c . strrev($str);

さくっとできた。

PHP Parse error: syntax error, unexpected '>' in /workspace/Main.php

あふん。

<?php
    // インプット
    $f = file('php://stdin', FILE_IGNORE_NEW_LINES|FILE_SKIP_EMPTY_LINES);
    // 1行目は不要
    unset($f[0]);

    // 初期化
    $list = [];
    $pair = [];

    foreach($f as $v){

        // <=>を展開しただけ
        $r = strrev($v);
        if($v < $r){
            $c = 2;
        }elseif($v > $r){
            $v = $r;
            $c = 0;
        }else{
            $c = 1;
        }

        // ペアになれるなら$pairに持ってく、なれなければ$listに
        if($list[$v][2-$c]>0){
            $pair[$v]++;
            $list[$v][2-$c]--;
        }else{
            $list[$v][$c]++;
        }
    }

    // 前半
    ksort($pair);
    $str = '';
    foreach($pair as $k=>$v){
        $str .= str_repeat($k, $v);
    }

    // 中央の文字があれば
    $c = '';
    foreach($list as $k=>$v){
        if($v[1]){
            $c = $k;
            break;
        }
    }

    // 出力
    echo $str . $c . strrev($str);

https://paiza.jp/poh/joshibato/matsue-ruby/result/c6559412
100点、830byteでした。
バイト数が出てるってことはgolfれって意味だよなあ。

これで全問題100点になりました。
めでたし。

よく見たら$listをソートしてないので、

cdc
aba

みたいな入力が来たら間違うんだけど正解したからまあいいや。