Digital root Fixed

Digital root Fixed が終了した。この問題は、与えられた数値の各桁の数の和を取り、それが2桁以上であれば、同様の操作を繰り返し、最終的に一桁の数字(0〜9) に対応させる、という問題。ちょっと考えると、元の数値の mod 9 を求めればよいことがわかる。ただし、結果が 0 の場合は、代わりに 9 にする必要がある。以下の通り。

  0 -> 0
  1 -> 1
  2 -> 2
  3 -> 3
    :
  8 -> 8
  9 -> 9
 10 -> 1
 11 -> 2
 12 -> 3
    :
 17 -> 8
 18 -> 9
 19 -> 10 -> 1
 20 -> 2
 21 -> 3
    :

楽しみにしていた tails さんの 103B@sed 解。以下の通り。

h
:
y/0123456789/8-12345678/
s/\w/&-/g
t
x
G
s/.*/digital_root(&987654321/
s/\n\(.\{9\}\)*\(.\).*/)=\2/

前半の y と s は、与えられた数値の各桁の数字を、その値を長さに持つ文字列に変換している。みごとだな。自分では以下のような方法を考えていたが、長さに歴然の差がある。

s/9/80/g
s/8/70/g
s/7/60/g
s/6/50/g
s/5/40/g
s/4/30/g
s/3/20/g
s/2/10/g
s/1/00/g

後半の 2 つの s は、出力整形もあるが、mod 9 を実行している。前半で作成した文字列の後ろに "987654321" を付加し、先頭から、長さ 9 の文字列セグメントを可能な限り取り除くことで、mod 9 (ただし、0 は 9 に置換)を求めている。ここも、みごとだ。

追記

試行錯誤を重ね 1B 縮めることができた。102B
イデアは、数値を「長さを表す文字列」に変換する際、文字列の要素を '1' にすることで、後半の mod 9 を求める部分が、

s/.*/digital_root(&987654321/
s/\n\(.\{9\}\)*\(.\).*/)=\2/
↓
s/.*/digital_root(&98765432/
s/\n\(.\{9\}\)*\(.\).*/)=\2/

のように 1B 縮めることができる、というもの。

最近のあなごる問題

ICUP

少し難しすぎ。JavaScript と C で参戦したが、あまり感想も無い。ちょっと気になったのはロジックが癖があり、例えば、スペースが3つ空いているところと、4つ空いているところがあった場合、先に見つかったほう(つまり、より左側にある方)が選ばれるという点。なので、単純な最長スペース検索ではだめだった。

tritri fixed description

これもちょっと難しめだが、面白かった。解答パターンとしては、permutation に似ている。C で短い手ができたのだが、最後に、nu さんに抜かれた。2B 差だが追いつけないので、もう深追いはやめた。stats から、nu さんの解は、スペースがないんだな。"char a[];" は使っていないってことか。

the same ArrayA as ArrayB

相変わらず『埋め込み上等』問題が後を絶たないな。

Regular polygon

いい問題だね。浮動小数点の -0 と +0 にちょっと悩まされる。そもそも、浮動小数点に -0 がなぜ導入されたのだろう?
この問題では、kou さんの 100B@C が光っている。複素数を使うとは!オイラーも喜んでいそう。ただ、これって、vprintf() なんか使わずに、printf() に複素数をそのままぶっこめばいいんじゃないの?

i;main(n){for(scanf("%d",&n);i<n;)printf("%.f %.f\n",1e3*cexp(6.28318i*i++/n)+.01);}

↑こんな感じ。

追記

やってみたら 84B@C ができた。
JavaScriptは、91B@atami さん。Math.round() は、気づかなかった。これも、Math を with で出せば、もっと短くなるような。。。

Digital root Fixed

こちらは、まだ、アクティブな問題。なかなか良問だと思う。この問題の解で楽しみなのは、tails さんの 103B@sedsed は自分でもやってみたけど、180B くらいになってしまった。103B はかなり凄いな。公開されるのが楽しみだ。

guess what

guess what

ちょっと前に、guess what simpleguess what a little harderを出題した。
guess what simple の方は、グラフ化してみるとヒントになると思うが、それでも、よく当てられるなぁ。単純な式ということで、感でやってみたらうまくいった、という感じなのかなあ?それとも、何か論理的に導けるのだろうか。
guess what a little harder の方も、みなさんよく見つけられるなぁ。
ところで、これら私の2問も含めて "guess what" 系問題が何問か続いた。ただ一部の問題は、先頭の数項をググれば答えが見つかる、というものだった。それはちょっと、という感じ。

Time Arithmetic

これも私が出題したもの。自分で解いてみて面倒で嫌になった。それに、縮まらない。他の人はいろいろな言語で結構短い解を出している。どうやっているんだ?時間処理系のAPIを使うという手もあるのかなぁ?

Polynominal interpolation

この問題は、係数から項を求めるものと、項から係数を求めるものと、両方向が混ざっている。今までも、たまに、こういった両方向混ざった問題ってあったけど、その都度、どっちかにして欲しい、と思った。

ICUP

面白い問題だ。でも結構難問だな。どう取り組むんだろう?現在、ush さんが 215@C を出している。C で 200B 越えということは、かなり難しいな。
〜〜〜〜〜
梅雨入り。鬱陶しいな。

あなごる

4 9 skip numbers

パッと見、面倒そうと思ったけど、でも結局8進数なんだとわかったら短い解ができた。
68B@C by leonidさん。

k;main(c){for(;read(0,&c,1);)k=c-10?k*8+c%47*4/5:!printf("%d\n",k);}

'c%47*4/5' の部分。なるほど。さすがです。

guess what it does extreme

ふむ。extremeだ。難しすぎ。

Time Arithmetic

時間の計算は今までなかったような気がするので出題した。思ったより面倒。コードは長めになる感じ。

guess what simple

"guess what 〜" は、問題として面白いと思う。ただ、どこまで guess できるかは、出題者にはなかなか判断しがたい。答えを知っているので。
本問は、易しいと思うのだが、難しかったらごめんなさい。よくわからないので、time limit は設けなかった。

guess what it does extreme

guess what it does extreme

プロットしてみた。

  • アップダウンを交互に繰り返し振動している。
  • 左右非対称
  • 両端で振幅は小さい

なんなんだ?

追記

微分してみた。音声データ?みたいな。

あなごる

最近仕事が忙しく、あなごる参戦やこの日記がおろそかになっている。正常といえば正常だけど。

I love you

この問題は、記述がわかりにくいが、結局、

128*e**490

だ。タイトルの意味が未だわからず。215桁あるので、large numberのサポートが無い言語だと難しい。GroovyやJavaはBigInteger/BigDecimalがあるのだが、そういった高精度の数を扱う数学関数(expとか)はまったく無いのでつらい。なので、bc で参戦した。

Real Zero

実数のゼロ?0.0を出力するというもの。例によって、Whitespace, Minus, Whirlで投稿した。しかし、Whirlの難しさ、はんぱないな。
Groovyはちょっと面白かった。以下で、0.0が出力される。

print 0f

fはfloatのリテラルサフィックス。何で、0.0なんだか良くわからない。ベースとなっているJavaも同じだ。

A plus B problem

これは、56B@C がすごい。すでに3人が解答している。57B は簡単で以下の通り。

main(a,b){for(;~scanf("%d%d",&a,&b);)printf("%d\n",a+b);}

これからどう 1B 縮めろというんだ?

foofoo_free sequence

面白い問題だと思う。Groovy/JavaScript/Cで地道な方法でといたがもっと良い方法があるのだろうか?

Egyptian fraction

greedy algorithmで解けばよいようなので、まず、C でやってみたが、途中、integer overflow してしまい、面倒になって投げ出してしまった。

Tag system

これも面白かった。Collatz sequenceとの関係は Wikipedia に出ていた。jsgs では、a, b, c という変数を作成し、eval してやることでコンパクトな解が求まった。

Bowling again

過去問の bowling scorer と同じだ。問題のサンプル数が多くなっているので、embed 解が排除されるのだろうが、元の問題でも、ちゃんと計算したほうが短かったりする。
この問題も同じ方針で解けたので、spoiler とコメントして js で解を投稿したのだが、その解がまさに spoiler だった。失敗。shinh さん endless に変更してくれないかなぁ。
〜〜〜〜〜
最近、また、多くの言語が追加された。Malbolge が凄そうだな。そのうち調べてみようと思う。まだ、見ていない。Piet も凄いな。png イメージをつくらなければならないのか?
euphoria をちょっとやってみた。なんとなく Basic みたいだが、sequence という型がちょっと特殊だ。
出力は、puts() や printf() で行うが、atom と呼ばれているスカラの数値は、? で出力できる。
入力は、getc() や gets() で読むのだが、文字列(sequence)操作が貧弱っぽいので面倒。scanf() がほしい。数値を読みたい場合は、get() があるのだが、get() を使うためには、その定義を include しなければならない。しかも、現行の構成が正しくないのか、include ファイルはフルにパス指定をしてやらないと読めない。これも shinh さん直してくれないかなぁ。
以下、I/O ともに行うサンプルとして、Enumeration of divisor の例。

include../local/euphoria/include/get.e
object s
s=get(0)for i=1to s[2]do
if remainder(s[2],i)=0then?i end if
end for