Python の宿題ここで答えます Part 2

■ このスレッドは過去ログ倉庫に格納されています
2009/11/16(月) 06:27:36
【Pythonスレッド基本ルール】
1:問題文は自己省略せずに、直接全部貼り付けてください。
2:課題の「丸投げ」が最も好ましい提示法です。なるべく丸投げしてください。
3:数学問題は「○×法でせよ」だけでなく、その数式、前提条件も説明してください。
4:課題&宿題関連の質問はOKですが、それ以外の一般的な質問は禁止です。
5:もし回答プログラムがアップされたら、その返答と動作報告をお願いします。

【課題提示用テンプレ】
【 課題 】与えられた課題文をそのまま書きます 《必須》
【 用語 】数学用語、専門用語の意味、説明を書きます 《あれば必須》
【 期限 】提出期限、解答希望日があれば書きます
【 Ver  】希望するPythonバージョンがあれば書きます(必要があればOSも)
【 補足 】課題について自分なりに補足する事、何か思う事があれば書きます。
       丸投げでない場合は、途中までのソースとその経過報告、
       質問点、疑問点を書きます(なるべく丸投げにしてください)

【回答プログラムの掲載場所】
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.cgi

前スレ
http://pc12.2ch.net/test/read.cgi/tech/1153585095/
2011/01/15(土) 23:53:23
[1] 授業単元:プログラミング及び演習II
[2] 問題文(含コード&リンク):-偏差値と標準偏差の計算-
入力ファイル motofile.dat を事前に用意し、出力ファイル result.dat を
生成する Python ソースプログラム hensa.py を書け。
入力ファイルと出力ファイルは、コマンドライン引数から文字列として取得し、
プログラムでは必ず class を使用すること。
プログラムは以下の形式で実行する。

$ ./hensa.py < motofile.dat > result.dat

生成される result.dat の内容は以下の通りである。
http://codepad.org/8qupROUX
順位4位と順位9位に注意されたい。

[3] 言語:Python 2.5 以上
[4] 期限:2011年01月16日 19:00まで
[5] その他の制限:このプログラムを参考にして下さい。
http://codepad.org/xQ7jLJ15

平均・標準偏差・偏差値の計算式
Wikipedia -偏差値- 数式による解説にある計算式を使って下さい。

平方根の計算には、math.sqrt 関数を使用して下さい。
2011/01/16(日) 22:44:46
>>195
> 2. 次のような手順で、キーボードから入力した数値の合計を求めるものとします。実際に Python プログラム (q2.py) の形にして、実行してください。
> 合計に使う変数を 0 にする。
> キーボードから数値を入れる。
> 入力した数値が 0 より大きい間次のブロックを繰り返す:
> 合計に数値を加える。
> キーボードから数値を入れる。
> 合計を印刷する

import os
sum = 0.0
n = float(raw_input())
while n>0:
  sum += n
  n = float(raw_input())
os.system("echo %f | lp" % sum)  # windowsならos.system("echo %f >PRN" % sum)
198デフォルトの名無しさん
垢版 |
2011/01/17(月) 01:49:45
見習い
>>189 の 3. もおながいします。
2011/01/17(月) 02:43:58
>>189
メールの意味が訳わからん
2011/01/20(木) 17:18:41
>>189
3. g.py

import turtle
t = turtle.Turtle()
t.width(15)
t.color(240/256.0, 192/256.0, 32/256.0)
a = [(-14, 30), (24, 9), (-16, 6), (10, 6), (2, 4), (-14, 8), (17, 6),
(33, 2), (33, 2), (32, 1), (32, 1), (32, 1), (32, 4), (33, 4), (32, 2),
(32, 2), (32, 2), (-1, 2), (1, 4), (2, 5), (-15, 7), (30, 6), (-13, 3),
(13, 7), (33, 2), (33, 2), (-12, 2), (4, 8), (-16, 5), (10, 7), (33, 2),
(32, 1), (32, 1), (32, 1), (32, 2), (32, 2), (33, 3), (32, 3), (32, 2),
(32, 2), (-19, 7), (27, 2), (-27, 8), (2, 4), (2, 4), (-14, 8), (17, 6),
(33, 2), (33, 2), (32, 1), (32, 1), (32, 1), (32, 4), (33, 4), (32, 2),
(32, 2), (32, 2)]
for d in a:
  (p, q) = (t.down, d[0]) if d[0] > 0 else (t.up, -d[0])
  p(); t.left(q * 10); t.forward(d[1] * 10)
201見習い
垢版 |
2011/01/24(月) 15:47:12
占い文を fortune.dat から取り出すようにしなさい。
(q1.py という名前で作成)

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# a.py
# いちご占い
print '*** いちご占い ***'
fortune = {
'いちご': '幸運が訪れます',
'みかん': '努力が必要です',
'りんご': '我慢が必要です'
}
ans = raw_input('好きなフルーツの名前をどうぞ: ')
if fortune.has_key(ans):
print '%sの好きなあなたには%s.' % (ans, fortune[ans])
else: print '%sの好きなあなたは健康に気をつけてください.' % an

ヒント

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# a.py
# いちご占い
print '*** いちご占い ***'
#fortune.datからディクショナリを読み込むようにここに数行追加。
ans = raw_input('好きなフルーツの名前をどうぞ: ')
if fortune.has_key(ans):
print '%sの好きなあなたには%s.' % (ans, fortune[ans])
else: print '%sの好きなあなたは健康に気をつけてください.' % an
2011/01/24(月) 17:55:12
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# a.py
# いちご占い
print '*** いちご占い ***'
with open("fortune.dat", "r") as f: fortune = eval(f.read())# からディクショナリを読み込むようにここに数行追加。
ans = raw_input('好きなフルーツの名前をどうぞ: ')
if fortune.has_key(ans):
print '%sの好きなあなたには%s.' % (ans, fortune[ans])
else: print '%sの好きなあなたは健康に気をつけてください.' % an
203まるっきりの初心者。
垢版 |
2011/01/24(月) 20:44:42
import osg,osgDB,osgViewer,osgGA
import sys,math,random,time

#function for move
def moveX( dx ):
global cbx,current,colorpat
if current < 0: return
if(cbx == 9 and dx == 1) or (cbx == 0 and dx == -1 ):return
cbx = cbx + dx
position = colorpat[current].getPosition()
pos = osg.Vec3d(cbx,position.y(),position.z())
colorpat[current].setPosition( pos )

def moveY( dy ):
global cby,current,colorpat
if current < 0: return
if(cby == 9 and dy == 1) or (cby == 0 and dy == -1 ):return
cby = cby + dy
position = colorpat[current].getPosition()
pos = osg.Vec3d(position.x(),cby,position.z())
colorpat[current].setPosition( pos )

def speedFall():
for i in range(3):
if(fallBox() == False):
createNewBox(root)
break

204まるっきりの初心者。
垢版 |
2011/01/24(月) 20:46:23
# keyboard handler
class KeyboardHandler(osgGA.GUIEventHandler):

def __init__(self):
osgGA.GUIEventHandler.__init__(self)

def handle(self,ea,aa,obj,nv):
vwr = osgViewer.GUIActionAdapterToViewer(aa)
if not vwr:return False
eventtype = ea.getEventType()
if eventtype == ea.KEYDOWN:
if ea.getKey() == ea.KEY_Right:
moveX( 1 )
return True
elif ea.getKey() == ea.KEY_Left:
moveX( -1 )
return True
elif ea.getKey() == ea.KEY_Up:
moveY( 1 )
return True
elif ea.getKey() == ea.KEY_Down:
moveY( -1 )
return True
elif ea.getKey() == ea.KEY_Space:
speedFall()
return True
return False
205まるっきりの初心者。
垢版 |
2011/01/24(月) 20:47:09
#create frame
def createFrame( root ):
for i in range( 8 ):
if(i % 2 == 0): x,bx = 5,10
elif((i-1)%4==0): x,bx = -0.25,0.5
else: x,bx =10.25,0.5
if(i%2 == 1):y,by = 5,10
elif(i%4 == 0):y,by = -0.25,0.5
else:y,by = 10.25,0.5
if(i<4):z,bz = 0,0.5
else:z,bz = 20,0.5


box = osg.Box(osg.Vec3(x,y,z),bx,by,bz)
bb = osg.ShapeDrawable( box )
bb.setColor(osg.Vec4(0.5,0.5,0.5,0.1))
gg = osg.Geode()
gg.addDrawable( bb )
root.addChild( gg )

cbx = -1
cby = -1
cbz = -1

stack = [[]]
for x in range(10):
stack.append([])
for y in range(10):
stack[x].append(0)
206まるっきりの初心者。
垢版 |
2011/01/24(月) 20:47:49
#shifting the plane if the plane is satisfied
def shiftingPlane():
global current,stack
satisfied = True
for i in range(100):
if( satisfied and stack[i / 10][i % 10]< 1 ):
satisfied = False
break
if ( satisfied ):
for x in range(10):
for y in range(10):
stack[x][y] = stack[x][y]-1
for i in range( current ):
position = colorpat[i].getPosition()
z = position.z()-1
pos = osg.Vec3d(position.x(),position.y(), z)
colorpat[i].setPosition( pos )
207見習い
垢版 |
2011/01/29(土) 13:26:55
3. 下記の手順に従ってsin(x)/x=0.90の近似解xを求めるスクリプトを作成しなさい。なお、sin(1.)/1.≒0.85で、ここからxの減少に伴ってsin(x)/xの値が単調増加することはわかっているものとします。スクリプトの名前はkinji.pyとしてください。

(1) xを1.とする。
(2)次の過程を無限ループで繰り返す 。
(2.1)sin(x)/xを計算してyに代入する。
(2.2)xとy(sin(x)/x)の値を表示する。
(2.3)yの値が0.90以下の場合、xの値を0.01小さくして(2.1)にもどる。
(2.4)yの値が0.90以上であれば、”近似解がみつかりました。解は***です”というメッセージを示して、プログラムを終了する。

実行例
./kinji.py
sin(x)/x=0.9の近似解を求めます
x=0.99 sin(x)/x=0.844470685455
x=0.98 sin(x)/x= 0.84744629642
中略 .......

x=*** sin(x)/x=**************
近似解が見つかりました。解は***です。


(ヒント:ループから抜けるbreak)

2011/01/29(土) 14:44:52
>>207
手続き型言語なんだから、手続きが書いてある場合は、書いてある通りにとりあえず書いてみろ。

import sys
import math
# (1) xを1.とする。
x = 1.
# (2)次の過程を無限ループで繰り返す 。
while True:
# (2.1)sin(x)/xを計算してyに代入する。
  y = math.sin(x)/x
# (2.2)xとy(sin(x)/x)の値を表示する。
  print x, y
# (2.3)yの値が0.90以下の場合、xの値を0.01小さくして(2.1)にもどる。
  if y <= 0.90:
    x -= 0.01
    continue
# (2.4)yの値が0.90以上であれば、”近似解がみつかりました。解は***です”というメッセージを示して、プログラムを終了する。
  if y >= 0.90:
    print "近似解がみつかりました。解は%fです" % x
    sys.exit()

さて。書き方が不自然になったが、あえて、問題文の通りの手順でやってみた。
もしbreakを使わないといけないのだったら、使うように自分で改造してくれ。
209見習い
垢版 |
2011/01/29(土) 15:30:57
1.半径rの円の面積の値を戻す関数carea(r)を,モジュールq1.pyに作成しなさい。また,インタラクティブモードで正しく動作することを確認しなさい。解答には,q1.pyの中身と実行結果を含めてください。

実行例 (python interactive mode)
>>> imort q1
>>> q1.carea(3)
28.274333882308138

2.r! (1x2x.......r) を計算してその値を戻す関数kaijo(r)をモジュール q2.pyに作成して、インタラクティブモードで正しく動作することを確認しなさい。解答には,q2.pyの中身と実行結果を含めてください。
実行例 (python interactive mode)
>>> imort q2
>>> q2.kaijo(4)
>>>24
3. 2で作成したkaijo(r)を利用して,nCr(注1)を計算する"スクリプト"cmb.pyを作成しなさい。nとrは下記のように、スクリプトの引数で指定するようにしてください。
また, r>nが入力された場合には下記のようなエラーメッセージが出るようにしてください。

入力値が不正です.
用法: cmp.py n r(nCr、n>=r)”
解答には,cmb.pyの中身と実行結果を含めてください。
実行例
% chmod +x cmp.py
% ./cmp.py 6 2
6C2=15
% ./cmp.py  4 5
入力値が不正です.
用法:  cmp.py n r(nCr、n>=r) ヒント:nCr=n!/(r!・(n-r)!)
2011/01/29(土) 20:56:23
またおまえかよ
2011/01/29(土) 21:08:49
>>209
1.
carea = lambda r: __import__('math').pi * r ** 2

2.
kaijo = lambda r: (lambda f, n: f(f, n))((lambda f, n: n * f(f, n-1) if n > 0 else 1), r)

3.
import sys
import q2
print (lambda n, r: '入力値が不正です.' if n < r else q2.kaijo(n)/q2.kaijo(r))(*sys.argv[1:3])
2011/01/29(土) 21:31:24
問題読んでる途中で寝てしまった orz
2011/01/30(日) 05:01:33
【 課題 】
コマンドラインで指定したディレクトリ(例: c:\test)について、
各サブディレクトリ毎のファイル数、ファイルサイズ(バイト単位)等を
下記(例)の様な書式でレポート出力するプログラム(s31.py)を作成する。
出力内容は次の通り。
dir はサブディレクトリ名 (ネストに対応すると得点up。その場合の書式拡張は各自考察せよ。)
files はファイル数 (ディレクトリは数えない)
dirsize は上記ファイル数のファイルサイズの合計
maxsize は上記ファイル数の中で最大のファイルのサイズ (ファイル名を行末に表記しても良い。)
ave は dirsize / files を小数点第1位まで表示
※出力例は等幅フォントです。
【 期限 】2011/01/31 15:00 まで
【 Ver  】Windows XP, Vista, 7 / Python 2.5
【 補足 】丸投げです。おながいします。

(例)
C:\Documents and Settings\Administrator>s31.py c:\test
dir: files dirsize maxsize ave
  -: 1 287581 287581 287581.0
  0: 33 2010948 231763 60937.8
  1: 1683 376414953 1410886 223657.1
...
(略)
...
  y: 3 233678 95453 77892.7
  z: 12 1259272 236288 104939.3
total = 11336
214213
垢版 |
2011/01/30(日) 05:05:41
ageます。

出力例がずれているのですが、
html ソースを見ると空白が入っているので
恐れ入りますが空白数はそちらを参照してください。
2011/01/30(日) 05:21:43
c:\test直下のファイルとサイズは数えなくていいのか?
ディレクトリ階層全体のサイズも気にしなくていいのか?
それからtotalって何の合計?
2011/02/03(木) 23:33:36
次のスレッドタイトルは「Python の宿題ここで答えます 3匹目」にしようや。
Partだとつまんない、とRubyの宿題スレが「xx限目」ってなってるのを見て思った。
2011/02/03(木) 23:51:47
3缶目だとjk
2011/02/04(金) 01:13:28
角電池3本目
2011/02/06(日) 01:35:45
我々の武器は3つ
2011/02/06(日) 04:07:47
単3
2011/02/09(水) 03:08:02
目指してる 未来が違うwwww byシャープ
http://twitter.com/MASA_37/status/8040170771185664 
222デフォルトの名無しさん
垢版 |
2011/02/09(水) 08:51:54
    2011年数学IIB第6問
    nを2以上の自然数とし、以下の操作を考える。
     (i)nが偶数ならば、nを2で割る。
     (ii)nが奇数ならば、nを3倍して1を加える。
    与えられた2以上の自然数にこの操作を行い、得られた自然数が1でなければ、
    得られた自然数にこの操作を繰り返す。2以上10の5乗以下の自然数から始めると、
    この操作を何回か繰り返すことで必ず1が得られることが確かめられている。
    たとえば、10から始めると
     10→5→16→8→4→2→1
    である。ただし、a→bは1回の操作で自然数aから自然数bが得られたことを意味する。
    Nを2以上10の5乗以下の自然数とするとき、F(N)をNから始めて1が得られるまでの
    上記の操作の回数と定義する。また、F(1)=0とおく。たとえば、上の例から、
    F(10)=6である。
    (1)F(6)=「ア」、F(11)=「イウ」である。
    (2)10の5乗以下の自然数Nについて、F(N)を求めるため、次のような「プログラム」を作った。
    ただし、INT(X)はXを超えない最大の整数を表す関数である。
    「プログラム」
    100 INPUT N
    110 LET I=N
    120 LET C=0
    130 IF I=1 THEN GOTO 「エ」
    140 IF INT(I/2)*2=I THEN
    150 「オ」
    160 GOTO 190
    170 END IF
    180 LET I=3*I+1
    190 「カ」
    200 「キ」
    210 PRINT "F(";N;")=";C
    220 END
223デフォルトの名無しさん
垢版 |
2011/02/09(水) 08:52:40
    「エ」に当てはまるものを、次の0〜5のうちから一つ選べ。
    0. 130 1. 140 2. 150 3. 190 4. 200 5. 210
    「オ」、「カ」、「キ」に当てはまるものを、次の0〜8のうちから一つ選べ。
    0. LET C=1 1. GOTO 130 2. GOTO 140
    3. GOTO 210 4. LET C=C+1 5. LET I=I+1
    6. LET I=I/2 7. NEXT N 8. LET I=2*I+1
    「プログラム」を実行して、Nに24を入力すると、180行は「ク」回実行される。
    (3)Mを10の5乗以下の自然数とする。(2)で作成した「プログラム」を変更して、
    M以下の自然数Nのうち、F(N)<=10となるすべてのNについて、F(N)の値を
    出力するプログラムを作成する。そのために、まず、「プログラム」の100行を
    次の二つの行で置き換える。
    100 INPUT M
    101 FOR N=1 TO M
    さらに、210行を次の二つの行で置き換える。
    210 IF 「ケ」 THEN PRINT "F(";N;")=";C
    211 「コ」
    「ケ」に当てはまるものを、次の0〜5のうちから一つ選べ。
    0. INT(I/2)=I 1. C>10 2. M>=C
    3. N=I 4. C<=10 5. I=N
    「コ」に当てはまるものを、次の0〜5のうちから一つ選べ。
    0. LET M=M+1 1. GOTO 120 2. NEXT M
    3. NEXT N 4. LET C=C+1 5. NEXT I
    変更後のプログラムを実行して、Mに10を入力すると、210行のPRINT文は
    「サ」回実行される。

pythonで解いてみてくだされ
2011/02/10(木) 20:13:39
確認するがプログラムの作成の部分だよな?
2011/02/10(木) 21:58:26
pythonでプログラムを作成してください
ただしループが何回回るかも知りたいです
2011/02/13(日) 15:50:27
>>222のプログラムは
n = int(raw_input())
i = n
c = 0
while i != 1:
 c += 1
 i = 3*i+1 if i%2 else i/2
print 'F(', n, ') =', c

>>223のループ追加するとかそういうのは面倒だから自分でやれ
227デフォルトの名無しさん
垢版 |
2011/02/14(月) 05:56:14
ありがとうございました
228デフォルトの名無しさん
垢版 |
2011/02/14(月) 06:46:36
◆QZaw55cn4c
2011/02/17(木) 02:08:54
project euler problem02
http://odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%202

フィボナッチ数列の項は前の2つの項の和である。最初の2項を 1, 2 とすれば、最初の10項は以下の通りである。
1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ...
数列の項が400万を超えない範囲で、偶数の項の総和を求めよ。

(´・ω・`)再帰で書いたら深度が深すぎて怒られました。だれか教えてください。
2011/02/17(木) 02:20:00
>>229
x, y = 1, 2
sum_ = 0
while x < 400 * 1000:
    if x % 2 == 0: sum += x
    x, y = y, x+y
print sum_


def fib(stop):
    x, y = 1, 2
    while x <= stop:
        yield x
        x, y = y, x+y

print sum(x for x in fib(400 * 1000) if x % 2 == 0)

2011/02/17(木) 03:05:51
>>230
答えは257114ですか?
入力したら間違ってるて言われた・・・
2011/02/17(木) 03:14:27
>>231
400 * 10000
2011/02/17(木) 03:17:19
あ、ほんとだ0一個足りないですね。
気付かなかった
2011/02/18(金) 14:42:07
>>189 の 3.
>>200
エディタを作ったのでどうぞ
ttp://www5.puny.jp/uploader/download/1298007172.zip
2011/02/18(金) 14:43:53
↑パス書き忘れた orz
turtle
です
236デフォルトの名無しさん
垢版 |
2011/02/19(土) 23:21:19.92
適当なサイトからリンク先へとどんどんクロールしたいんですがurllibとre.compile()でURL見つけて再帰処理って感じで良いでしょうか?
2011/02/20(日) 07:21:55.93
>>236
真面目に「リンク」を辿りたいならhtmlparserを使うべきだろ。
素のテキストやコメントに書かれたURLを追っかけていっちゃってもいいというやっつけ仕様なら正規表現もアリだが。
2011/02/20(日) 19:51:45.98
ttp://hogehoge とかにも対応したいんで正規表現で逝きます
2011/02/21(月) 18:15:28.88
>>237
ありがとうございました。
htmlparser使うようにします。
2011/02/21(月) 19:08:05.82
壊れたHTML文書に出会いませんように
2011/02/22(火) 02:13:32.37
>>240
会社にそういったプログラムを仕事で書いてる人がいるけど
真面目に頑張るとかなり苦労するよーw
2011/02/22(火) 21:29:41.55
>>241
htmlparserってきっちり書かれたHTML以外は容赦なくはねるよね。Webクローラに使うにはちょいと実用性がアレなので、
正規表現を駆使してアバウトなHTMLでも読めるHTMLパーサを書いたことがあったが、実にしんどかった。
2011/02/22(火) 21:39:40.08
つlxml.html
2011/02/24(木) 16:49:31.84
Beautiful Soupってどうなの?
2011/02/26(土) 22:27:24.99
なかなかいいよ
246デフォルトの名無しさん
垢版 |
2011/03/01(火) 01:26:57.10
【 課題 】
以下のページにあるPythonのコードを実行してウインドウを表示させよ。
http://www.not-enough.org/abe/manual/program-aa08/pyopengl1.html

【 Ver  】Python2.7.1 OS・・・windows7-64bit、開発環境Eclipse,PyDev
【 補足 】
↓Eclipse上で実行してみると、以下のようなエラーが出たため

Traceback (most recent call last):
File "C:\Users\username\workspace\PyOpenGL\src\PyOpenGL1.py", line 3, in <module>
from OpenGL.GL import *
ImportError: No module named OpenGL.GL


↓PyOpenGLというのをDLしてみました。
http://pyopengl.sourceforge.net/
モジュール?DLしたからには、Pythonのフォルダ内かどこかに
入れないといけないのでは無いかと思うのですが
モジュールを格納してる場所がどこにあるのか分かりません。
おしえてください><
2011/03/01(火) 01:40:52.05
【 課題 】
ある 3桁の数とそれぞれの桁を逆に並べた 3桁の数を足し合わせ
それが回文数になるまで同じ操作を繰り返したとき
最も回文数になりにくい 3桁の数を見つけてください

【 Ver  】Python2.x

【 補足 】

回文数とは 44 や 363 のように逆に並べると元の数と同じ数になるものです
なお 2桁の場合は 89, 98 が最大で 24回だそうです
2011/03/01(火) 17:39:09.29
>>247
しょーがねぇ、俺がとっておきを披露してやろう。
#! /usr/bin/python
open("hello.c", "w").write('''
#include <stdio.h>
int main(void)
{
printf("hello, world.\n");
return 0;
}
''')
os.system('gcc -o hello hello.c')
os.system('./hello')
raise SystemExit
2011/03/01(火) 23:39:48.44
ひどすぎる
2011/03/02(水) 00:30:45.95
>>247
def reversed_num(n):
    x = 0
    while n > 0:
        n, m = divmod(n, 10)
        x = x * 10 + m
    return x

def solve(n):
    i = 0
    nn = n
    rn = reversed_num(nn)
    while True:
        if nn == rn: break
        i += 1
        nn  = nn + rn
        rn = reversed_num(nn)
    print n, i, nn

for n in range(100, 1000):
    solve(n)

馬鹿正直なコードを書いてみたけど、下から試すと196、上から試すと986で
かなり時間がかかって、ちょっと待っても戻ってこない
もっと賢いことをやらないと駄目そう
2011/03/02(水) 01:13:16.28
>>250
def reversed_num(n):
    return int(str(n)[::-1])
にしたら少しは速くなるかもしれないけど、もっと根本的な枝刈りが必要だね。
2011/03/02(水) 02:04:24.48
初心者なのですが勉強で>>247をやってみようと思って、
以下のコードを書いたのですが、タプルを返してるつもりが、
19をはじめ、ところどころNoneで返ってきてしまいます。
returnするまではtupleなのですが、returnするとNoneになるようです。
すみませんが、なぜか教えていただけますでしょうか。

def f(x, count):
    y = int(str(x)[::-1])
    z = x + y
    if z == int(str(z)[::-1]) :
        return (z, count)
    else :
        f(z, count + 1)

if __name__ == '__main__' :
    
    for i in range(10, 99) :
        print type(f(i, 1))
2011/03/02(水) 02:08:52.72
>>252
else: の後をよく見てみよう。
2011/03/02(水) 02:12:23.22
return がなかったです…。ありがとうございます。これで寝られます。
2011/03/04(金) 18:30:06.95
ベストアンサーまだですか?
2011/03/05(土) 21:50:19.02
回文数を先に抜き出して、そこから足し合わせじゃなく引き合わせにすれば速くなるか…な
2011/03/06(日) 18:48:07.22
>>247
「1の位が0」「1と10の位が0」の数についてはどう扱うべきなのかな?
たとえば100をひっくり返すと001だけど。
2011/03/06(日) 19:04:24.47
>>257
001は3桁の数ではなく1桁の数とする。
が普通だろう。
2011/03/06(日) 20:04:42.97
>>258
であれば、ひっくり返した数が100未満ならその時点で除外できなくね?
2011/03/06(日) 20:38:31.99
>>259
そう思う。
261デフォルトの名無しさん
垢版 |
2011/03/07(月) 08:19:40.19
>>222
http://ja.wikipedia.org/wiki/%E3%82%B3%E3%83%A9%E3%83%83%E3%83%84%E3%81%AE%E5%95%8F%E9%A1%8C
262デフォルトの名無しさん
垢版 |
2011/03/07(月) 08:22:53.77
>>259
101〜999までの間に
ひっくり返したら
3桁じゃなくなる数って
そんなに多くないぞ
2011/03/07(月) 14:06:29.17
196
295
394
493
592
689
691
788
790
879
887
978
986

さぁどれだ
2011/03/07(月) 16:12:10.53
ちょっと何言いいたいのか分からないっすね
2011/03/08(火) 02:39:40.59
ある程度長いのが絞られてきたみたいですね
2011/03/08(火) 03:04:11.21
ある3桁の数(単数か複数かは不明)が回文数にならないことを証明することは出来ていないんだろうか?
2011/03/08(火) 09:16:55.89
回文数にならないものってどうやって見つけんのよ
2011/04/25(月) 20:07:16.29
1000回まで計算した。計算しきれなかったのは>>263と同じ。
それらがすべて、永遠に回文数にならないので解ではないなら、
23回 187 286 385 583 682 781 880
が解。特徴的。この数字はどれも、1回の操作で968になる。

>>263を、この特徴に合わせて分けると
a) 196 295 394 493 592 691 790
b) 689 788 887 986
c) 879 978
このうち、少なくともbは解じゃない。aを1回操作すると788になるから、aの方がbより1回多い。

……ここまでしか分からんかった。
269268
垢版 |
2011/04/25(月) 20:08:36.16
誤 aを1回操作すると788になるから
正 aを1回操作すると887になるから
2011/04/26(火) 01:30:26.68
http://en.wikipedia.org/wiki/Lychrel_number
でぐぐったら、結構出てくるなぁ。
2011/04/27(水) 17:55:15.88
>>267
少なくとも判定は出来ると思う
3桁の数なら
「回文数になる」
「回文数になる前に(おおざっぱに)1000個の数字がすべて出てくる」
「1000個出てこなくてもどこかで同じ数字が出てきて循環する」
のどれかになるんじゃないかな
2011/04/27(水) 19:16:53.31
>>271
余りをとったり、しないんだよね。
そしたら、足すたびに数字は増えるので循環とか数字全部出るとかはありえないよ。
2011/04/27(水) 20:12:16.88
>>372
うは
ごめん
素で勘違いしてたわ
2011/04/28(木) 01:13:33.28
ロングパス入りました。
2011/04/28(木) 01:21:22.71
>>372
世の中には、勘違いしてても気づかない奴もいるって事よ。
2011/04/29(金) 20:53:12.21
ゴールドバッハの予想
与えられた値を2つの素数の和で現してください
verは出来れば2.6で
エラトステネスのふるいを用いた素数リストを使って値を出すようにしてください
お願いします
2011/04/30(土) 00:48:17.11
>>276
n = int(raw_input())
def get_primes(n):
  ary = [0 for i in range(n+1)]
  primes = []
  i = 2
  while i <= n:
    if not ary[i]:
      primes.append(i)
      j = i
      while j <= n:
        ary[j] = 1
        j += i
    i += 1
  return primes
primes = get_primes(n)
for p in primes:
  if n - p in primes:
    print p, n - p
2011/04/30(土) 06:55:17.50
>>277
ありがとうございます
279デフォルトの名無しさん
垢版 |
2011/06/02(木) 06:22:08.84
日本の大学とかでPythonの宿題がでる(Python使って教えている)ところって多いの?
2011/06/02(木) 17:55:17.03
The university of second channel
281デフォルトの名無しさん
垢版 |
2011/06/14(火) 19:57:57.72
カーニハンの『プログラミング作法』の3章に出てくる、マルコフ連鎖の
Perl版の奴をPythonに移植したいんのですが、データ構造をどう実装すれば
いいのかよくわかりません。

英文を読み込んで、単語1、単語2という組み合わせを読み込み、その後に
付く単語をsuffixとして記憶する(複数の場合にはチェインする)というもの
です。
読み込み部分のソースはこんな感じです。

>$NONWORD = "\n";
>$w1 = $w2 = $NONWORD; #initial state
>while (<>) { # read each line of input
> foreach (split) {
> push(@{$statetab{$w1}{$w2}}, $_);
> ($w1, $w2) = ($w2, $_); #multiple assignment
> }
>}
push(@{$statetab{$w1}{$w2}}, $NONWORD); # add tail

たとえばRubyに移植するとこんな感じになると思います。
>statetab = Hash.new{|h,k| h[k] = Hash.new{|h2,k2| h2[k2]= []}}
中略
> statetab[w1][w2].push(word)
Pythonでもこういうハッシュ+リストみたいなのを実現するにはどうやれば
いいでしょうか?
2011/06/14(火) 20:37:04.18
>>281
In [1]: from collections import defaultdict
In [2]: d = defaultdict(lambda: defaultdict(list))
In [3]: d['w']['x'].append('z')
In [4]: d
Out[4]: defaultdict(<function <lambda> at 0x12c7488>, {'w': defaultdict(<type 'list'>, {'x': ['z']})})

statetab[(w1, w2)] みたいに、1階層で単語のタプルをキーにすることもできるね。
2011/06/14(火) 21:16:40.59
>>282
サンクス。
そっかタプルってキーにできるんですね。それがわかり易そうだなあ。
lambdaはよくわからないので・・・。
2011/08/01(月) 21:52:27.42
テキストファイル、複数キー、ソートで検索したところ、下記のソースを見つけました。
しかし、lines.sort(cmp=lambda 〜 の 行の意味が解かりません。
lambda式がcmpに代入されている意味。
後半に出てくるcmpと先頭のcmpは、同じcmp関数?
コラム指定された部分がx,yに代入されて比較されている、と思うのですが、
これをsortに渡すとファイル全体がソートされる動作が想像できません。
解説をお願いいたします。

# filesort.py
# coding:shift_jis
# ファイルのSORT
import string
import time
from datetime import datetime
startTime = time.clock()
print datetime.today().strftime("%Y年%m月%d日 %H時%M時%S秒 処理開始")
fr = open("C:/in.txt", "r") # 入力ファイル
fw = open("C:/out.txt", "w") # 出力ファイル
lines = fr.readlines()
cnt = len(lines)
# SORT ソート位置を変更するときは下記行を修正。
# ソートキーは複数指定していて、11カラムから5桁と1カラムから9桁です。
lines.sort(cmp=lambda x,y: cmp(str(x)[10:15]+str(x)[0:9], str(y)[10:15]+str(y)[0:9]))
fw.writelines(lines)
fr.close()
fw.close()
# 終了メッセージ
print datetime.today().strftime("%Y年%m月%d日 %H時%M時%S秒 処理終了")
print cnt, '件を', time.clock() - startTime, '秒で処理しました。'
print '何かキーを押せば終了します。'
raw_input()
2011/08/01(月) 22:01:30.90
>しかし、lines.sort(cmp=lambda 〜 の 行の意味が解かりません。

名前付き引数
2011/08/03(水) 18:11:59.06
285です。
先のcmpはsort()の名前付き引数、後のcmpはcmp関数、という事は解かりました。
ですが、やはり、ファイル全体がソートされる動作が想像できません。
2011/08/03(水) 18:13:27.10
286 です。 >285です。 は、284の間違いでした。
2011/08/03(水) 19:31:32.77
了解
2011/08/03(水) 21:03:18.52
>>286
sort()の中でリストの要素同士の大小比較をするときに、cmp引数で指定された比較関数を呼び出して
比較しているから、cmp引数でソートの挙動をカスタマイズできるんだよ。
文字列全体じゃなくて一部分だけを比較のキーにする、みたいに。
ちなみにcmp引数に何も指定しないと、要素そのものをキーとして組み込み関数のcmp関数を呼ぶ。
290289
垢版 |
2011/08/03(水) 21:07:06.99
補足しておくと、昔はともかく今のPythonでこんなげろんちょな比較関数を書く必要は無い。
sort()にkey引数ってのが導入されて、リストの要素からソートキーを得る関数を指定できる。
もちろん、指摘しなければリストの要素がそのままソートキーになるんだけど。

つまり>>286と全く同じことを
lines.sort(key = lambda x: x[10:15] + x[0:9])
と書ける。
291286
垢版 |
2011/08/04(木) 17:36:23.52
>>289
>>290
ありがとうございます。
>lines.sort(key = lambda x: x[10:15] + x[0:9])
こちらはソートのキー指定をしている事が、直感的に納得できました。こちらを使います。
292デフォルトの名無しさん
垢版 |
2011/10/04(火) 08:58:36.28
 ̄( ̄( ̄(A ∩ B) ∩ A) ∩  ̄( ̄(A ∩ B) ∩ B))
293デフォルトの名無しさん
垢版 |
2011/11/03(木) 17:32:29.90
宿題誰か作って下さい><お願いします!

C:\Users\workspace\pythonというディレクトリの中に
下の画像のように、pythonファイルとテキストファイルが存在するとします。
@http://up3.viploader.net/ippan/src/vlippan243126.jpg(Python実行前)
【それぞれのテキストファイルの中には、変数にpathを代入するような記述が書いてあります
必ずしも、1行目と2行目にpath1,path2の変数があるとは限りません。】
Ahttp://viploader.net/ippan/src/vlippan243130.jpg(Python実行後)
pythonファイルを実行すると、
pythonがあるディレクトリと同ディレクトリの全てのテキスト形式ファイル(test1.test2,test3,test4)内にある
path1、path2に格納されている文字列を画像Aのように置き換えたいです。
2011/11/03(木) 19:13:43.01
for i in range(1, 5):
    with open('test{}.txt'.format(i), 'r+') as fp:
        d = fp.read().replace(r'C:\aaa\aaa\aaa\aaa', r'C:\Users\workspace\python').replace(r'C:\iii\iii\iii\iii', r'C:\Users\workspace')
        fp.seek(0, 0)
        fp.truncate()
        fp.write(d)
2011/11/04(金) 10:29:57.94
↑汎用性のないしょぼいプログラム書いてんじゃねえよ死ね!
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況