paiza×Qiita記事投稿キャンペーンで
「プログラミング問題をやってみて書いたコードを投稿しよう!」
というお題が出ているのを見て
ふと皆でコードゴルフをしてみたくなり
投稿してみる事にしました。
コードゴルフとは問題文に対して
「より短いコード」を目指す遊びです。
正常に動作するならば
35 文字のコードより
34 文字のコードが優れているという事です。
「もっと短くできるよ!」
というのがあればコメント頂けると幸いです。
対戦よろしくお願いします。
条件
項目「じゃんけんの手の出し方 (paizaランク A 相当)」で最短のコードを探す。
使用する言語「paiza で使える任意の言語(なるべく短く済む言語を使用する)」
成功条件「paiza が用意しているチェックに全て通過する(paiza が用意していない入力で正常に動作しない分にはかまいません)(理論上 95% 以上の確率で、全てのチェックを通過するコードである必要があります。)」
タブと改行と空白文字は 1 文字相当でお願いします。
cシャープの Main メソッドや php の "<?php ?> も文字数にカウントして下さい。
問題文の URL
https://paiza.jp/works/mondai/a_rank_skillcheck_sample/janken
問題文
下記の問題をプログラミングしてみよう!
あなたはこれから友人と N 回じゃんけんをします。しかし、あなたは全てを見通す千里眼の持ち主なので、友人がこれから出す N 回のじゃんけんの手が全て分かってしまいました。
ただただ全勝してしまうのは面白くないので、あなたは、N 回のじゃんけんで出した指の本数の合計がちょうど M 本になるようにじゃんけんをすることにしました。このとき、あなたは最高で何回じゃんけんに勝つことができるでしょうか。
ここで、上の文中に出てくる「出した指の本数」というのは、じゃんけんで出した手の何本の指が立っていたか、ということであり、グー、チョキ、パーそれぞれ
- グー のとき ... 0 本
- チョキのとき ... 2 本
- パー のとき ... 5 本
の指を出していたということになります。
例えば、あなたが 4 回のじゃんけんで グー、パー、チョキ、グー と出したとすると、出した指の本数の合計は、
0 + 5 + 2 + 0 = 7
で 7 本となります。
入力例:
4 7
CGPC
出力例:
4
入力例:
5 10
GPCPC
出力例:
3
私の回答(Python3)
a=int(input().split(" ")[1])
b=input()
o=len(b)
m=0
for i in range(o):
for j in range(o):
k=o-i-j
if 5*i+2*j==a and i+j<=o:
m=max(m,min(k,b.count("C"))+min(i,b.count("G"))+min(j,b.count("P")))
print(m)
これはあくまでもコードゴルフなので
試行回数が長いコードになってしまっています。
コードを長くすれば処理時間を短く出来ますが
今回は paiza のチェックを通過する事ができるコードで
短いコードを作成する事が目的なので
このコードでいきます。
また正確には
range(o): の部分は
range(o+1): が正しいです。
私の回答はレギュレーションの穴を付いたコードなので
レギュレーションによっては
range(o+1): にして下さい。
私の回答はいかがでしたか?
私は色んな言語を使ってみて
233 文字より短くすることが出来ませんでした。
paiza で使えるならば
どんな言語でも良いため
もっと短くできるという意見があれば
コメント頂けると幸いです。
個人的にコードゴルフの記事は大好物なので
paiza×Qiita記事投稿キャンペーンを機に
コードゴルフのゴルフの記事が増えたら嬉しいです。
皆でこのお題を楽しんでいきましょう。
この記事が皆さんの暇つぶしになりますように。
閲覧ありがとうございました。
追記
コメント欄で、かなり文字数が短いコードを頂けました。
この問題はこんなに文字数を削れるのかと驚愕しました。
是非コメント欄も閲覧頂けると助かります。