最近のあなごる問題

weekday names

当初『埋め込み+圧縮』かと思っていたら、曜日名を出力するフォーマッターがあることが分かった。

js

Date オブジェクトに toLocaleString() メソッドというのがあった。'%A' で曜日名が得られる。ロケールが US English なので、Monday ... が得られるというもの。

Groovy

Groovy (というか Java5 以降) は、PrintWriter#printf() が、java.util.Formatter のフォーマット機能をサポートしている。これは、C の printf() と違って、Date/Time のフォーマッティングもサポートしている。Date/Time の場合は、フォーマットされるオブジェクトは、Date や Calendar 以外に、Epoch Time と呼ばれる 1970/1/1 からの秒数を表している Long オブジェクトも渡せる。しかしなぁ、teebee さんの解のように、4..10 を 58 ビット左シフトすると、ちょうど、Monday .. Sunday になるとは!これは、見つけられなかった。

electronic dice

これは、なかなか良質な問題だと思った。LED counter と性格が似ているが、本問題の方がシンプルなため、答えのアプローチ方法は異なる。
さいころは n=1〜6 で、また、パターンの対象性から、結局、

左上右下    n>2
左右中央    n>5
左下右上    3%n%2
中央        n%2

だけで表すことができる。

vi

vim では、

C^R=[@->2,0,3%@-%2,@->5,@-%2,@->5,3%@-%2,0,@->2]
^[

とリストを使ってやることで、シンプルで短い解ができたが、残念ならが最短ではなかった。

C

C も同じアプローチを取ったが、こちらも、この方法より、ビットパターン埋め込みの方が短かった。ただ、単純にやると 9 ビット必要だが、対象性より左上と右下が常に同じであることを利用し、i%8 とやることで、8 ビットに埋め込んでいるinaniwa さんの解、さすがです。

partition by parity

この問題は、偶数と奇数の間に空行を1行はさむこと、および、問1において、11 が 2 度現れることにどう対処するかが難しかった。

js

xulapp さんの解

push([~n&1,9e5-n,n])

ソートするための情報を配列に収めて、その情報の配列をソートする。なるほど、うまいな。

Groovy

teebee さんの解。抜いたり抜かれたりを繰り返しだいぶ戦ったが、最終的に 1B 差で負けた。この解は、"-1" をデータに加え、ソート後に、値が負なら空行を表示するというロジック。みごとだな。

C

not さんの解。配列、a[] には、出現回数を記録し、表示時には、その回数分ループするという方法で 11 のダブりに対応している。これもみごとだ。

trimming

この問題は、割と面倒なので、埋め込み系の回答が多い。そんな中で、vi は、まともに、上と左右の空白をトリムしている。もっと、問題のサンプル数を増やせるといいな。埋め込みにしてしまうには、惜しい問題だ。