馬鹿ネタの類。
別に django である必然性はないが、Collatz 予想 の実装として、url を書き換えてリダイレクトしていくことで、collatz_length 相当のものを実現する。
最長を探すのもできるとは思うが、今回はパス。
まずは、django を用意する。
適当にプロジェクト(以下 hoge)を作って、setting.py をいじる。
db はいらない。
ここに collatz というアプリケーションを作成。
urls.py は collatz の urls.py に委譲するようにしてあるとして、collatz/urls.py はこんな。
from django.conf.urls.defaults import *
urlpatterns = patterns('hoge.collatz.views',
(r'^(?P<n>\d+)/(?P<count>\d+)/?$', 'collatz_length'),
(r'^.*', 'index'),
)
一方、collatz/views.py は、
from django.http import HttpResponse, HttpResponseRedirect
from django.shortcuts import render_to_response
def index(request):
if 'n' in request.POST:
n = int(request.POST['n'])
if 'count' in request.POST:
count = int(request.POST['count'])
else:
count = 0
return HttpResponseRedirect('/hoge/collatz/%d/%d/' % (n, count))
return render_to_response('collatz/index.html')
def collatz_length(request, n, count):
n, count = int(n), int(count)
if n == 1:
return render_to_response('collatz/result.html',
{'count': count})
elif n & 1:
return HttpResponseRedirect('/hoge/collatz/%d/%d/' % (3*n+1, count+1))
else:
return HttpResponseRedirect('/hoge/collatz/%d/%d/' % (n//2, count+1))
テンプレートの中に collatz/{index,result}.html を用意。
index.html には入力フォームを設け、/hoge/collatz/ に POST するようにする。
result.html はカウント結果の表示。
これを動かしておき、http://localhost:8000/hoge/collatz/ のフォームでたとえば 55 と入力すると、
[04/Aug/2006 00:00:00] "POST /hoge/collatz/ HTTP/1.1" 302 0
[04/Aug/2006 00:00:00] "GET /hoge/collatz/55/0/ HTTP/1.1" 302 0
[04/Aug/2006 00:00:00] "GET /hoge/collatz/166/1/ HTTP/1.1" 302 0
[04/Aug/2006 00:00:00] "GET /hoge/collatz/83/2/ HTTP/1.1" 302 0
...
[04/Aug/2006 00:00:00] "GET /hoge/collatz/1132/50/ HTTP/1.1" 302 0
...
[04/Aug/2006 00:00:00] "GET /hoge/collatz/106/100/ HTTP/1.1" 302 0
...
[04/Aug/2006 00:00:00] "GET /hoge/collatz/8/109/ HTTP/1.1" 302 0
[04/Aug/2006 00:00:00] "GET /hoge/collatz/4/110/ HTTP/1.1" 302 0
[04/Aug/2006 00:00:00] "GET /hoge/collatz/2/111/ HTTP/1.1" 302 0
[04/Aug/2006 00:00:00] "GET /hoge/collatz/1/112/ HTTP/1.1" 200 482
といったリダイレクトの繰返しで、ステップ数 112 が求まる。
ちなみに深いリダイレクトはブラウザが諦めたりするので、前もって設定を変更しておくなどの準備が必要かもしれない。
少なくとも Firefox では network.http.redirection-limit がデフォルトで 20 だったので 200 に変えて実行した。
|