見えない何かに邪魔され

Posted on

Paizaさんの問題続き。
D問題は全部解けたので次はCランクへ。絶妙な難易度UP感におののく。

問題
AとBがn回じゃんけんする。
Aが出した手とBが出した手が入力されるので、Aが勝った回数を1行目、Bが勝った回数を2行目に出力。

入力文字列
3
g g
c p
p g
(3回勝負で、1回めはAがg(=グー)、Bもg(=グー)、二回目はそれぞれチョキ・パー・・・って感じ)

なるほどですねー。
引き分け及び勝ち負け判定をどうしようかな。
AとBが同じ時は「引き分け」
、ではなかった時に、
AがグーでBがチョキだったら、
「Aが勝ち」
、ではなかった時に、
みたいに最初に引き分け判定して、
それに当てはまらなかったらAの勝ちパターンを3つ書いて、
それ以外はBが勝ち、ってことにしたらいいかな。

そいでまあ書いてみたは良いのですが、なんか全然うまく行かない。
具体的にどこがおかしいんだろう・・と見直していったらまぁもう最初の「引き分け」の判定がすでにできてない。
配列に変換してるのがダメなのかなぁとか、単純に===じゃダメなのかなぁとか
ちゃんと指定できてないのかなぁ、とか。
でもそこら辺はちゃんとできてると思うのよね。
最終的にただ比較演算子使うのはちょっとphp的には危ういよ、っていう説明を散見したのでstrcmpを使うことに。
ただそれでも最初のグーとグーの引き分けを判断してくれない。何なの!?じゃあ2つの違いは何なの?!って聞いたら「-1」ですよって。
えーーーー・・・?

困ったときのvar_dumpで改めて確認したらBの手の後にひっそり改行入ってるのね。こいつか!こいつが悪いんか!
まあそう見て思ったら確かに改行されてるし、問題文にも改行入ってますって書いてあるし、それはそうなんだけど、そんなことまで考えないといけないとか知らなかったんだもーーーーーん。
「GoogleさんPHPで改行削除する方法教えて!」

てことでやっと完成した

    $btl = fgets(STDIN);
    $score_A = 0;
    $score_B = 0;
    for ($i=0;$i<$btl;$i++){
        $result = explode(" ", trim(fgets(STDIN)) );
        if (!(strcmp($result[0],$result[1]) == 0)){
            if ($result[0] == "p" && $result[1] == "g"){
                $score_A ++;
            }
                elseif ($result[0]=="c" && $result[1]=="p"){
                    $score_A ++;
                }
                    elseif ($result[0]=="g" && $result[1]=="c"){
                        $score_A ++;
                }
                    else {
                       $score_B ++;
        }
    }}
    echo $score_A."\n".$score_B;

そういう事もあるんだなーと勉強になりました。


たったnつの冴えたやり方

Posted on

paizaさんが提供しているプログラミングゲームをちょこちょこ進めてます。
先週の時点では一番下の「D」ランク問題を見てもさっぱりわからず、どこから手を付けて良いのか検討もつかないという有様でしたが、やっと「こうすれば行けるかな?」だめでした「じゃあこすればいいかな」だめでしたx4回程繰り返して正解にたどり着く、みたいなナメクジ並の速度で進められるようになってきました。
わかる人が見ればなんでわからないのかがわからない、わからない人は何がわからないのかもわからない、っていう状況のわからない側に立って初めてわかることもある。

https://paiza.jp/botchi/より
問題例:
電波でデータ通信するプログラムが壊れてしまっており、あなたはそれを直そうとしています。
n回の通信をしたとき、受信した各データ各電波強度 d_i が与えられます。各電波強度 d_i は 0 から 10 の整数で表され、 5 以下では通信に失敗します。
n 回の通信のうち通信に成功した回数を出力してください。

入力:
6
9 9 8 3 1 9

期待される出力:
4

なるほど。1個めが通信回数、2個めが通信強度、6以上が何個あればいいのか数えればいいのね。
いつも「以下」はその数が含まれるのかどうか悩む・・・

とりあえず調べたところ、文字列を配列に変換する関数があるらしいのでそれで2個めの文字列を配列に。
その配列に6以上が何個あれば数えればいいのでは、と思ったんですが、なんか調べてもそれに当てはまるような関数がよくわからん。
array_searchだと見つかったら最初のキーを返してくるだけだし、array_count_valuesもなんか出力フォーマットがちょと違うような。。
しかもそれだと通信回数使ってないから出題側の想定から外れてる気がする。

通信回数でループを作って、、配列を1個ずつ順番で見て、、成功だったら 成功回数に+1していって、、
最終的に成功回数を出力、、でどうですかね?

$qty = fgets(STDIN);
$str = fgets(STDIN);
$str_array = explode (" ",$str);
  for ($i=0;$i<=$qty;$i++) {
    if ($str_array[$i] > 5) {
$result++;
}
}
echo $result;

こんな感じ?
で提出したら

やったー

ここまでの道のりがだいたい1時間ぐらいかかるw
どんだけ納期あっても間に合わなさそうww

実は中学の頃の将来の夢が「プログラマー」だったけどそりゃ実現しない訳だ。
数学の証明問題とかがほんと苦手で苦痛だったし。
マラソンと数学どっちが嫌いかって言われたら今なら迷いなくマラソン走るけど当時ならどうだったかなぁ。