第24回 mixC++ Code Golf 結果報告

アバター
pes
記事: 2
登録日時: 14年前

第24回 mixC++ Code Golf 結果報告

投稿記事 by pes » 14年前

#第24回[The Program of the World]#

[問題]
与えられた整数c(1≦c≦9)に対して、
1以上100以下の整数のうち「cの倍数またはcが付く数字」すべてを昇順に出力する。
1つの行に1つの数字を出力するものとし、余計な文字や改行が含まれてはならない。
※最後の行に改行を入れるのはOKです
また、「cが付く数字」とは値がcである桁が存在する数字である。

9つの入力に対し、少なくとも2つについて正しい出力が得られれば正解とする。

[期間]
3/26(土)22:00 ~ 4/2(土)21:59

[hr]
=結果=

投稿数21件(7人)

1位 (60B)
kimuchi さん
i;main(n){for(gets(&n);4>printf("%d\n",i+=i/10-n?n%=8:1););}

2位 (62B)
matsu さん
i;main(t){for(gets(&t);i<100;printf("%d\n",i+=i/10-2?t&3:1));}

あーる さん
i;main(n){for(gets(&n);printf("%d\n",i+=n%2||i/10==2?:2)-4;);}

みけCAT さん
k;main(i){for(gets(&i);k<100;)printf("%d\n",k+=k/10-2?i&3:1);}

*1位1番乗り
kimuchi さん

[hr]
★解説

たくさんのご投稿をいただけて,たいへん嬉しく思います.
また,想定よりも短いコードがたくさん送られてきて,出題者としても楽しませていただきました.

せっかくの機会なので,普段とは違うタイプの問題を出してみようということで,
テストケースの解析により短縮を狙う問題を作ってみました.いかがでしたでしょうか.
少しでも楽しんでいただけたなら幸いです.

さて,解説ですが,入力の狙い目としては,c = 1, 2, 5 の3通りです.
これらの入力については,以下のような短縮を行うことが出来ます.
  • 1桁目がcであるかを判定しない
    1桁目がcならば必ずcの倍数なので,この判定を省略できます.
  • 条件を満たす数字の増分に注目する
    出力例を見ると,10の位がcのときは1ずつ,それ以外のときはcずつ,出力する値が増加しています.
    なので,10の位だけを見て,条件を満たす数字を列挙する事も可能です.
  • 入力を文字として読み込む
    文字コードは,'1'が49,'2'が50,'5'が53なので,
    getsなどを使って文字として読んだ値に対し,8で割った余りを取る事で入力の数字を得られます.
  • 100を出力した時点で終了する
    c=1, 2, 5はいずれも,最後に100を出力して終了します.
    printfは出力バイト数を返すので,「初めて4バイト以上を出力するときに終了する」と考えることで,
    終了判定を短縮することができます.
これらの性質をどのように利用するかが,短縮のポイントです.

アバター
みけCAT
記事: 6734
登録日時: 14年前

Re: 第24回 mixC++ Code Golf 結果報告

投稿記事 by みけCAT » 14年前

じゃあ、
k;main(i){for(gets(&i);printf("%d\n",k+=k/10-2?i&3:1)<4;);}
としたら59Bになるじゃないか。

アバター
pes
記事: 2
登録日時: 14年前

Re: 第24回 mixC++ Code Golf 結果報告

投稿記事 by pes » 14年前

> みけCATさん
皆さんのコードを見て、60B切るのか…と思ってましたが、結局このような結果に落ち着きました。
kimuchiさんのコードは1, 2, 5の3通りで正しい答えを返す分、冗長になってしまったようでした。
しかし、3通りで正しい答えを返すものとしては非常に完成度の高いものだったと思います。
感想戦のところに追加しておきます。

アバター
あーる@Reputeless
記事: 84
登録日時: 15年前

Re: 第24回 mixC++ Code Golf 結果報告

投稿記事 by あーる@Reputeless » 14年前

うわぁ、一人だけ3Bも長い式だー (/ω\;)  みなさん賢いなぁ。
kimuchi さんのは3通りで正しい出力が出るんですね!すごい。
pes さん出題ありがとうございました!

アバター
kimuchi
記事: 163
登録日時: 14年前

Re: 第24回 mixC++ Code Golf 結果報告

投稿記事 by kimuchi » 14年前

結構危なかったみたいですね・・・
「?:」の間に代入文を入れても動くことに歓喜してました。

アバター
pes
記事: 2
登録日時: 14年前

Re: 第24回 mixC++ Code Golf 結果報告

投稿記事 by pes » 14年前

> あーるさん
実はprintfの戻り値利用を想定していなかったので、最初の解答にはビックリしてしまいました。
出題企画、私も楽しませていただけて、ありがとうございました!
楽しかった一方で大変でもあり、毎週続けられている事に対しては頭が上がりません。
今後とも、よろしくお願いします。

> kimuchiさん
中間発表の後からずっと立ちはだかっていた62Bの壁を破っていただけて嬉しかったです。
私も、これ動くんだ!すげー!ってなってたのは内緒です。

アバター
五反田
記事: 21
登録日時: 15年前

Re: 第24回 mixC++ Code Golf 結果報告

投稿記事 by 五反田 » 14年前

全然力及ばずでしたか。
printfの返り値も思い浮かばずでしたし、いろいろと無駄な処理が多くて縮められませんでした。

上位の人達はおめでとうございます。そしてpesさん面白い問題ありがとうございました

アバター
pes
記事: 2
登録日時: 14年前

Re: 第24回 mixC++ Code Golf 結果報告

投稿記事 by pes » 14年前

> 五反田さん
作っておいた想定解が64Bだったので、レベル高いなぁ…と思いながら問題管理をやっておりました。
楽しんでいただけたようで何よりです。