2005-06-01から1ヶ月間の記事一覧

続・格子点の数え上げ

id:ocs:20050622の続き。 とりあえず全部計算してから、距離の短い順に並び替えるスクリプトを書いてみた。r は適当な半径。 r = 5 lattices = [(x**2 + y**2, x, y) for x in range(1, r) \ for y in range(1, r) if x**2 + y**2 < r**2] lattices.sort() f…

一行野郎

さっきのを無理やり一行で書くと、こんな感じ。 (1..10**7).each{|i| k=1;(1..7).each{|j| k*=i.to_s.count(j.to_s)};p i if k==1}これで 77byte! おぉ、最初に比べてずいぶん短くなったもんだ。

Ruby っぽくいこう

さっきのヤツは、どうも Ruby っぽくない。というのも「いかにも構造化プログラミングです!」みたいな匂いがするのだ。 で、イテレータ風味に書き直してみた。 (1..10 ** 7).each{ |i| k = 1 (1..7).each{ |j| k *= i.to_s.count(j.to_s) } p i if k == 1 }…

続・順列の数え上げ

初出はこちら。→id:ocs:20050621 今回は Ruby で書いてみた。いかにも初心者! みたいなコーディング。うっわ、ハズいわぁ〜(/ω\) for i in 1234567..7654321 k = 0 for j in 1..7 k += i.to_s.count(j.to_s) ** 3 end p i if k == 7 endgenerate-and-tes…

思考過程

Pythonで書くことを考える。 単純にリストを出すだけなら、適当な r について [(x, y) for x in range(1, r) for y in range(1, r) if x**2 + y**2 < r**2]で済む話だ。しかし、「原点から近い順」というのが曲者である。普通のループの回し方じゃダメなんだ…

円の内部にある格子点の数え上げ

座標平面上で、原点を中心とする半径 r の円を考える(x^2 + y^2 = r^2)。 上記の円の内部、かつ第一象限である格子点を、原点から近い順に数え上げよ。

思考過程2

全部計算したあとに並び替えるのはちょっと頭が悪すぎる。できれば、 計算しながら並べる 小さい順に計算する のどちらかをやりたい。前者のほうが簡単そうに見えるなぁ。

切り詰め作業

len(s) を引数で渡すように変更し、見やすさを捨てて余計な改行やスペース等をすべて取り除き、改行コードを CR+LF から LF に変更し……等々、数々の切り詰めを作業を行ったが、それでもまだ 128byte もある。記述方法自体に問題がありそうだなぁ。

思考過程4

できた! def f(s): t = len(s) + 1 return map(lambda i: s[:i] + str(t) + s[i:], range(0, t)) L = ['1'] for x in L: if len(x) < 7: L += f(x) else: print xが、160byte くらい使ってるなぁ。 とりあえず 100byte を切れないか、いろいろ考えてみよう。

思考過程3

長さ n の文字列を食わせて長さ n+1 の文字列のリストを得る関数はできた。 def f(s): return map(lambda i: s[:i] + str(len(s) + 1) + s[i:], range(0, len(s) + 1))例えば、"123456" を食わせると f('123456') ['7123456', '1723456', '1273456', '123745…

思考過程2

さっきのは 3 までの決め打ちなので、使い回せない。ただ、この方針で煮詰めてみる価値はありそう。とりあえず、問題を帰納的に捉えてみよう。 問題の条件を満たす、長さ n の文字列を仮定する。 この文字列に n+1 を挿入する。挿入する位置は n+1 箇所ある…

思考過程

とりあえず 1 から 3 までの数え上げを考えてみる。 Python で書くと、 v = range(1, 4) [100*x+10*y+z for x in v for y in v for z in v if (x!=y) and (y!=z) and (z!=x)]こんな感じか? 出力結果は、 [123, 132, 213, 231, 312, 321]ん、大丈夫っぽい。 …

順列の数え上げ

1 から 7 までの数字を一回だけ使って作れる、7 文字の文字列のすべての組み合わせを出力するプログラムを、「できるだけ短く」書け。 言語は自由。実行速度不問。

切り詰め作業2

そもそも、一度しか呼ばない関数をわざわざ定義する意味なんぞないことに気づけという話か。 L=['1'] for x in L: n=len(x)+1 if n<8:L+=map(lambda i:x[:i]+str(n)+x[i:],range(n)) else:print xこれで 99byte! なんとか 100byte 切りは達成。