六村リオ / 霧島京子 / 緑川つばめ / 島根ルミ / 島根ルミ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
みたいな入力が来たら間違うんだけど正解したからまあいいや。