Python の宿題ここで答えます Part 2
【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/ >>258 であれば、ひっくり返した数が100未満ならその時点で除外できなくね? >>259 101〜999までの間に ひっくり返したら 3桁じゃなくなる数って そんなに多くないぞ 196 295 394 493 592 689 691 788 790 879 887 978 986 さぁどれだ ある3桁の数(単数か複数かは不明)が回文数にならないことを証明することは出来ていないんだろうか? 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回多い。 ……ここまでしか分からんかった。 誤 aを1回操作すると788になるから 正 aを1回操作すると887になるから >>267 少なくとも判定は出来ると思う 3桁の数なら 「回文数になる」 「回文数になる前に(おおざっぱに)1000個の数字がすべて出てくる」 「1000個出てこなくてもどこかで同じ数字が出てきて循環する」 のどれかになるんじゃないかな >>271 余りをとったり、しないんだよね。 そしたら、足すたびに数字は増えるので循環とか数字全部出るとかはありえないよ。 >>372 世の中には、勘違いしてても気づかない奴もいるって事よ。 ゴールドバッハの予想 与えられた値を2つの素数の和で現してください verは出来れば2.6で エラトステネスのふるいを用いた素数リストを使って値を出すようにしてください お願いします >>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 日本の大学とかでPythonの宿題がでる(Python使って教えている)ところって多いの? The university of second channel カーニハンの『プログラミング作法』の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でもこういうハッシュ+リストみたいなのを実現するにはどうやれば いいでしょうか? >>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階層で単語のタプルをキーにすることもできるね。 >>282 サンクス。 そっかタプルってキーにできるんですね。それがわかり易そうだなあ。 lambdaはよくわからないので・・・。 テキストファイル、複数キー、ソートで検索したところ、下記のソースを見つけました。 しかし、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() >しかし、lines.sort(cmp=lambda 〜 の 行の意味が解かりません。 名前付き引数 285です。 先のcmpはsort()の名前付き引数、後のcmpはcmp関数、という事は解かりました。 ですが、やはり、ファイル全体がソートされる動作が想像できません。 286 です。 >285です。 は、284の間違いでした。 >>286 sort()の中でリストの要素同士の大小比較をするときに、cmp引数で指定された比較関数を呼び出して 比較しているから、cmp引数でソートの挙動をカスタマイズできるんだよ。 文字列全体じゃなくて一部分だけを比較のキーにする、みたいに。 ちなみにcmp引数に何も指定しないと、要素そのものをキーとして組み込み関数のcmp関数を呼ぶ。 補足しておくと、昔はともかく今のPythonでこんなげろんちょな比較関数を書く必要は無い。 sort()にkey引数ってのが導入されて、リストの要素からソートキーを得る関数を指定できる。 もちろん、指摘しなければリストの要素がそのままソートキーになるんだけど。 つまり>>286 と全く同じことを lines.sort(key = lambda x: x[10:15] + x[0:9]) と書ける。 >>289 >>290 ありがとうございます。 >lines.sort(key = lambda x: x[10:15] + x[0:9]) こちらはソートのキー指定をしている事が、直感的に納得できました。こちらを使います。  ̄( ̄( ̄(A ∩ B) ∩ A) ∩  ̄( ̄(A ∩ B) ∩ B)) 宿題誰か作って下さい><お願いします! 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のように置き換えたいです。 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) ↑汎用性のないしょぼいプログラム書いてんじゃねえよ死ね! 宿題の題意には特記事項としての汎用性は求められていませんでしたが 1から10までの整数の順列をすべて表示するプログラムをお願いします。 299です。[1,2,3,4,5..,10]みたいな感じのリストになるようにお願いします。 print [1,2,3,4,5,6,7,8,9,10] 何も考えずにlist(itertools.permutations(range(1, 11)))とかしたら危うく a = [[0]] r = 1 while r < 11: cl = [] for x in range(len(a)): for y in range(len(a[0])): a[x][y] = a[x][y] + 1 for x in range(len(a)): for y in range(len(a[0])+1): cl.append(a[x][0:y] + [0] + a[x][y:len(a)]) 初めて書いたコードが動いただけで満足してたんですが2行で済んでしまうとは驚きです。また勉強します。ありがとうございます ・1から2000までの数字が昇順に格納された 要素2000個の配列を用意 ・乱数にて1から2000までのキー値を生成し、 上記配列を二分探索で探索してキー値を見つけるまでの 探索回数を記録 ・以上を1000回繰り返し、平均探索回数を算出 ・上記の平均探索回数を、理論値log2・2000と比較して示せ という宿題を出されたのですが、まるでわかりません。 よろしくお願いします。 >>308 サクっと書けるから回答はすぐもらえるだろうけど、 Python関係なく用語自体わかってないなら 学校はじまる前に調べるなり・聞いたりしないとヤバイよ。 自力で(というか、入門書とWEBを漁りまくって) 12時間かけて何とかできました。疲れた… 要素数と試行回数を指定できるように作ったので よければ遊んでみてください。 http://codepad.org/RaKvygkr >>311 The resource could not be found. あやー 見てくれる人いたんですか。 あれからちょこちょこいじっているので URL変わっちゃってます。 http://codepad.org/oX8W6350 しかし、こうして探索している様子がわかると面白いですね。 こんな半分ずつ探索範囲を狭めていくやり方で 漏れなく見つかるんだって感動する。 import sys import random import string import ctypes if __name__ == '__main__': class CONSOLE_SCREEN_BUFFER_INFO(ctypes.Structure): _fields_ = [ ('w', ctypes.c_short), ('h', ctypes.c_short), ('x', ctypes.c_short), ('y', ctypes.c_short), ('a', ctypes.c_int), ('l', ctypes.c_short), ('t', ctypes.c_short), ('r', ctypes.c_short), ('b', ctypes.c_short), ('maxw', ctypes.c_short), ('maxh', ctypes.c_short)] h = ctypes.windll.kernel32.GetStdHandle(-11) b = CONSOLE_SCREEN_BUFFER_INFO() ctypes.windll.kernel32.GetConsoleScreenBufferInfo(h, ctypes.byref(b)) ctypes.windll.kernel32.SetConsoleTextAttribute(h, 10) chrs = string.ascii_letters + string.digits + string.punctuation chrs += ' ' * len(chrs) sz = len(chrs) try: while True: sys.stdout.write(chrs[random.randint(0, sz - 1)]) finally: ctypes.windll.kernel32.SetConsoleTextAttribute(h, b.a) |....,,__ |_::;; ~"'ヽ | //^''ヽ,,) | i⌒" | ∀`) < 誰もいない きのこるならいまのうち |⊂ | ノ _,,,......,,__ /_~ ,,...:::_::;; ~"'ヽ (,, '"ヾヽ i|i //^''ヽ,,) ^ :'⌒i i⌒" |( ´∀`) < きのこ のこーのこ げんきのこ ♪ |(ノ |つ | | ⊂ _ ノ ""U _,,,......,,__ /_~ ,,...:::_::;; ~"'ヽ (,, '"ヾヽ i|i //^''ヽ,,) ^ :'⌒i i⌒" (´∀` )| < エリンギ まいたけ ブナシメジ ♪ ⊂| (ノ | | | ヽ _ ⊃ .U"" | | ミ | ミ サッ! | ミ | range(1, 5) これがPythonはダメだよな if __main__ にロジックを大量に書くとデバッグしにくくなるからやめなさい。 代わりに何か適当な関数を作って、ロジックはその中に置く。 if __main__ にはその関数への呼び出しを書いておけばいい。 http://www.artima.com/weblogs/viewpost.jsp?thread=4829 import sys import random import string import ctypes class CONSOLE_SCREEN_BUFFER_INFO(ctypes.Structure): _fields_ = [ ('w', ctypes.c_short), ('h', ctypes.c_short), ('x', ctypes.c_short), ('y', ctypes.c_short), ('a', ctypes.c_int), ('l', ctypes.c_short), ('t', ctypes.c_short), ('r', ctypes.c_short), ('b', ctypes.c_short), ('maxw', ctypes.c_short), ('maxh', ctypes.c_short)] def main(): h = ctypes.windll.kernel32.GetStdHandle(-11) b = CONSOLE_SCREEN_BUFFER_INFO() ctypes.windll.kernel32.GetConsoleScreenBufferInfo(h, ctypes.byref(b)) ctypes.windll.kernel32.SetConsoleTextAttribute(h, 10) chrs = string.ascii_letters + string.digits + string.punctuation chrs += ' ' * len(chrs) sz = len(chrs) try: while True: sys.stdout.write(chrs[random.randint(0, sz - 1)]) finally: ctypes.windll.kernel32.SetConsoleTextAttribute(h, b.a) if __name__ == '__main__': main() ttp://python.matrix.jp/projects/wxPython/found_ide/ [1] 授業単元:QRコード変換 [2] 問題文: 打ち込んだテキストデータをQRコードの画像に変換するプログラムを作成せよ. (QRコードの規格は公開されているので,それを組み合わせて作ればよい. エラー訂正レベルを下げ,文字数を固定するなどして簡単なものから順に実装していけば良い.) [3] 環境 [3.1] OS: Windows 7 [3.2] 言語とバージョン: Python 2.5 以上 [4] 期限: 7/7 宜しくお願いします。 perlでの use strict; 機能をpythonでも実装せよ どうやるの? 自分の経験では color = green if status != good: colour = red display(status, color) みたいなのを書いて、えらい目にあったことがある。 動的すぎるのも考えものだわ。 strict とブロックスコープ、あと無名関数は Perl のほうがいいね。 以下の宿題が出ました。 いわゆる石取りゲームhttp://ja.wikipedia.org/wiki/%E3%83%8B%E3%83%A0 と同じ種類の問題だということはわかるのですが、このゲームの法則と それをPythonで表現する方法がまるでわかりません。 どなたか、ご回答をいただければありがたいです。 [1] 授業単元:プログラミング入門 [2] 問題文: 2人のプレイヤーが以下のルールでゲームをする。 このゲームは、二人零和有限確定完全情報ゲームである。 任意の数字Nに対し、先手と後手のどちらが勝つかを判定するプログラムを 再帰を使用して作成せよ。 1 初期値Xが与えられる。 2 先手と後手は、交互にAかBのどちらかの方法を選び、Xを減少させていく。 A.Xから1を引く B.Xを2で割る 3 自分のターンで自分が減少させた結果、Xnが1を下回ってしまったプレイヤーがゲームに負ける。 [3] 環境 [3.1] バージョン: Python3 [3.2] 言語: Python [4] 期限:10月3日AM6:00 [5] その他の制限:特になし >>332 山の個数が分かった時点で必勝か、必敗かがわかる? と考えていいのかな。 >>333 山(N)が与えられた時点で、先手が勝ちか後手が勝ちかは決まるとのことです。 >>334 すみません。条件を書き忘れました。 この問題は数の範囲に小数点以下も含んでおります。 >任意の数字Nに対し 任意の数字Xに対し の間違いじゃない? 補足をさせてください。 例えば、N=5のとき、ありうる選択肢として以下の5パターンがありますが、 先手は<>の選択をすると負けてしまいますので、必ずイかウの勝利のパターンとなるように行動します。 したがって、N=5のときは先手が勝ちが決まっているということになります。 ア 先手Aで4、後手Aで3、先手<Aで2>、後手AでもBでも1、先手AでもBでも0.5<1 先手の負け イ 先手Aで4、後手Aで3、先手Bで1.5、後手AでもBでも(0.5,0.75)<1 後手の負け ウ 先手Aで4、後手Bで2、先手AでもBでも1、後手AでもBでも0.5<1 後手の負け エ 先手<Bで2.5>、後手Aで1.5、先手はAでもBでも(0.5,0.75)<1 先手の負け オ 先手<Bで2.5>、後手Bで1.25、先手はAでもBでも(0.25,0.6125)<1 先手の負け >>336 Xの間違いです。すみません。。 >>338 X=5でした。 テンパっておりまして…すみません。 332の問題、期限切れみたいだけど添削お願いしたい http://ideone.com/sWfE6 (1) 値を減少させる関数と勝敗判定の関数を書き出した (2) >>337 のパターン ア-オを assert 文で列挙 (3) 判定関数を再帰で実装 【 課題 】 再帰分割法を利用した迷路作成のプログラムを作ってください。 【 用語 】 再帰分割法 http://en.wikipedia.org/wiki/Maze_generation_algorithm#Recursive_division_method 【 期限 】 2012/11/16まで 【 Ver 】 OS:Windows8 Python2.x 【 補足 】 壁を#、道をスペースで表示してください。 よろしくお願いします。 そもそも「再帰分割法を利用した迷路作成」は 解く側から見て 「最初に経路の目星を付け易い」 という欠点があるよ 整数(1〜10程度でよい)を入力させ、魔方陣(縦横斜め全方向の和が等しい)の数列を表示せよ。 例にあるハイフンは調整のためであり、表示は無用とする。 入力例 1: 1 出力例 1: ---5---7---3 ---1---6---8 ---9---2---4 入力例 2: 2 出力例 2: --13--20--22---4---6 ---7--14--16--23---5 ---1---8--15--17--24 --25---2---9--11--18 --19--21---3--10--12 よろしくお願いします。 >347 入力が1のときには出力は3x3で 2のときには5x5だとすると 入力がnのときには出力は(2n+1)x(2n+1)でいいのかい? >>347 結果が複数ある場合は全部表示するの? それとも適当に見つかったものだけ表示すればいい? >>348 それで良いです。 余力があれば偶数のもおながいします。 >>349 すみません。間違いです。 でも答えが判ってると面白く無いので。 >>350 出来れば全部でおながいします。 >>351 とりあえずそれで良いです。 余力があれば対角線以外の斜め合計?も一致するパターンのもおながいします。 Python2でもPython3でも書いてあげたよ ttp://ideone.com/1waFEP ttp://ideone.com/VKfYb8 宿題スレは終了 終了終了終了終了終了終了終了終了終了終了終了終了 終了終了終了終了終了終了終了終了終了終了終了終了 終了終了終了終了終了終了終了終了終了終了終了終了 終了終了終了終了終了終了終了終了終了終了終了終了 1 宿題の丸投げという行為はカンニングと同等。学則による処分の対象 2 丸投げした質問者もそれを知って回答した回答者も大学の単位認定業務の 妨害、すなわち偽計業務妨害 3 宿題の問題は著作物であり、それをアップローダやスレに投稿する事は 公衆送信権の侵害。うpを唆しているテンプレは著作権侵害の教唆 違法行為が前提で成り立つスレなので、次スレは立てずにこのスレで終了 ┌─┐ │●│ └─┤ _ ∩ ( ゚∀゚)彡 ┌─┬⊂彡 │●│ おっぱい!おっぱい! └─┘ おっぱい!おっぱい! read.cgi ver 07.4.6 2024/03/23 Walang Kapalit ★ | Donguri System Team 5ちゃんねる