LoginSignup
4
4

More than 5 years have passed since last update.

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

Last updated at Posted at 2015-09-06

六村リオ / 霧島京子 / 緑川つばめ / 島根ルミ / 島根ルミ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

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

4
4
8

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
4