POH6+ 「え、妻が松江?」回文作成 最短121バイト


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

前回149バイトまで縮めることに成功しましたが、どうもまだ縮められるような気がしてならない。

// 前回の149バイト
<?php for($f=split(B^H,`dd`);$r=strrev($v=$f[++$i]);)${$v.$c=$v!=$r?$v<$r?:!$v=$r:$x.=$v}?$p[]=$v:${$v.!$c}++;sort($p);echo$y=join($p),$x,strrev($y);

この圧倒的にややこしい三重三項演算子をこれ以上どうすればいいのか。
って待てよ、よく考えてみたら中央以外は重複ないんだから、
$v<$rかつin_array($r,$f)だけ抜き出す、という単純な考え方で行けるのでは…?

// 142バイト いけた
<?php for($f=split(B^H,`dd`);$r=strrev($v=$f[++$i]);){$v>$r&&in_array($r,$f)&&$p[]=$r;$v==$r?$x.=$v:1;}sort($p);echo$y=join($p),$x,strrev($y);

// 141バイト for内部を1文に
<?php for($f=split(B^H,`dd`);$r=strrev($v=$f[++$i]);){$v>=$r?$v!=$r?:$x.=$v:in_array($r,$f)&&$p[]=$v;}sort($p);echo$y=join($p),$x,strrev($y);

// 138バイト 三項演算子を整理
<?php for($f=split(B^H,`dd`);$r=strrev($v=$f[++$i]);)$v!=$r?$v>$r?:in_array($r,$f)&&$p[]=$v:$x.=$v;sort($p);echo$y=join($p),$x,strrev($y);

// 132バイト 先にソートしておけばjoinいらなくね?
<?php for($f=split(B^H,`dd`),$i+=sort($f);$r=strrev($v=$f[++$i]);)$v!=$r?$v>$r?:in_array($r,$f)&&$p.=$v:$x.=$v;echo$p,$x,strrev($p);

// 124バイト bashのsort使った方が短い
<?php for($f=split(B^H,`dd|sort`);$r=strrev($v=$f[++$i]);)$v!=$r?$v>$r?:in_array($r,$f)&&$p.=$v:$x.=$v;echo$p,$x,strrev($p);

// 121バイト sortもデフォルトが標準入力/標準出力なのでddいらない
<?php for($f=split(B^H,`sort`);$r=strrev($v=$f[++$i]);)$v!=$r?$v>$r?:in_array($r,$f)&&$p.=$v:$x.=$v;echo$p,$x,strrev($p);

結果。
https://paiza.jp/poh/joshibato/matsue-ruby/result/30aebdae

展開。

<?php
    for(
        $f=split(B^H,`sort`);
        $r=strrev($v=$f[++$i]);
    )
        $v!=$r
             ? $v>$r
                 ?: in_array($r,$f) && $p.=$v
             : $x.=$v ;

    echo$p,$x,strrev($p);

149バイトよりずっと短く、かつかなり簡単という結果になりました。
in_arrayとかもう少しすぱっとしたやり方にできそうな気がしないでもないんだが…?