プログラミングのお題スレ Part11
■ このスレッドは過去ログ倉庫に格納されています
>>506 お前のレスがあるまでケブンリッジジェネレータなのに気付かなかったわw 人間の認識力はそんなもんなんだろうな。ちょっと似てると同じと判断しまう。そうやって脳は省力化してエネルギーあまり使わないようにしてるのかも知れない。脳を動かすには糖分沢山必要だからな。 逆に言えばいちいち全部の文字を正確に認識してたらちょっと誤字脱字や書き損じがあっただけで意味がわからなってしまうぞ botの書き込みなんていちいち推敲モードで読まないからな >>518 あ、ホントだ、恥ずかしいww 校正というべきだったか あ、ごめん。テキストファイルじゃなくて標準入力からでもいい。 何処から入力するかはたいした問題ではない。 http://www.din.or.jp/ ~ohzaki/mail_regex.htm RFC通りのメールアドレス判定なんて不毛だってはっきりわかんだね 昔仕事で MUA 作った時に >>526 にある folding white space をぶち込んでくる送信元がいて苦労した記憶が… >>526 ここはお題スレだから不毛で良いんだよ。パズルを解くようなもんなんだから。 計算式まで示されちゃってるから出力形式に凝らないと厳しいかな・・・ お題: ある数値nが与えられた時に、次の条件を満たす2つの数値a,bを求め、表示するプログラムを作成しなさい。 ●aとbの最小公倍数がnとなる ●a<bかつaとbの差(b-a)が最小となる 例:n= 360→a= 36,b= 40 n=1000→a=125,b=200 例が間違ってたらゴメン >>533 n=1000だとa=200,b=250? 数学板じゃなくてもさすがに最小公倍数くらいは このスレならみんな知ってると思ってた >>541 公倍数は最小公倍数の倍数 公約数は最大公約数の約数 …当たり前のように思えて実際の証明は結構イメージしにくく、一回読んだだけではよくわからないのでした… お題:標準入力からhtmlが一行ずつ与えられるのでh1,h2などのhタグを階層化して出力しなさい。タグ内のテキストも一緒に出力し、タグ内にimgが含まれていたらそのaltを出力しなさい。 出力例: h1 5ちゃんねるにようこそ ....h2 クソスレ乙 ........h3 逝ってよし ....h2 オマエモナー 任意の文字列を含む有効なビットコインのアドレスを生成するプログラムを作成せよ。有効な形式のアドレスでなければブロックチェーンエクスプローラで検索しても認識されない。ビットコインアドレスの形式については下記サイトを参照。 https://qiita.com/pokochi/items/4d536a4a24067505abea 例:下記サイトの二番目にあるようなアドレス、 https://bitflyer.com/ja-jp/glossary/address >>533 C++(使ってるのはほとんどCですが) https://ideone.com/S4H5Mo 自分の考えてたアルゴリズムをCで記述してみました。 模範解答、とはとても言えない代物です。もっと改良の余地がありますし、バグも取りきれてないかもしれません。 それと>533出題時に考えてたアルゴリズム(手計算でやってましたが)を↓に記述してみました。 こちらは明確に誤った答が出されてしまいます。参考程度に orz https://ideone.com/HdfYPe ↓ お題:三捨四入せよ 負の丸め方向はどちらでも良い https://ideone.com/Z6fTGh やれるものならやってみろ。 などと挑発してみるとアホが大漁に釣れるかも知れない。 問題は釣れるのがアホなのでものすごく頑張った揚げ句たいしたものができない率が非常に高いことにある。 これでこんなこともできる https://chainflyer.b ;itflyer.jp/Address/1MayukoMuraokaXXXXXXXXXXXXXXX5f8QC >>543 io !(?<_><.?>)(.)\k<_>! <- '\1' >>561 >>562 それなんてエロゲ、じゃない、なんて言語? 情報オリンピックの問題って組合せ最適化ばかりなのかなぁ? ttps://www.ioi-jp.org/joi/problem_archive-light.html 鈴木貫太郎 灘中 中学入試 整数問題 https://youtu.be/okKan0C_--E 問1 4つの異なる数字、1, 3, 9, x から、 異なる数字を取り出して並べる、3桁の整数は24個あり、それらの平均値は555 である時、x は何の数字か? 問2 5桁の36の倍数で、2, 3, 5 のどれもが、 いずれかの桁に、1回以上現れる整数のうち、最小のものを求めよ 答え、問1 : 7、問2 : 13,572 灘中の問題は、以下の性質を使うものが多い 2 の倍数は、下1桁が偶数 4 の倍数は、下2桁が4の倍数 3 の倍数は、各桁の数字を足したものが、3の倍数 9 の倍数は、各桁の数字を足したものが、9の倍数 だから数字を因数分解して、これらに該当するかどうかで、問題を判別できる >>569 問1 を、Ruby で作った。 問2 は、難しくて作れない nums_3 = [1, 3, 9] nums_4 = nums_3 + [0] (0..9).each do |num| next if nums_3.include? num # 含まれていれば nums_4[-1] = num sum = 0 nums_4.permutation(3) { |a, b, c| sum += (a*100 + b*10 + c) } puts num if sum == 24 * 555 #=> 7 end じゃあ問2を酷いコードで >>569 Java java.util.stream.IntStream.range(10000, 100000).filter(i -> i % 36 == 0).mapToObj(Integer::toString).filter(s -> s.matches("(?=.*2)(?=.*3)(?=.*5).*")).findFirst().ifPresent(System.out::println); コンピュータを使ってブルートフォースで答えを探す方法はわかってもコンピュータを使わずに数学的に解く方法が思い浮かばない。 しかしそれを小学生が解いて入学するという現実。orz >>569 Squeak/Pharo Smalltalk "問1" ((0 to: 9) copyWithoutAll: #(1 3 9)) detect: [:n | | set | set := Set new. '139', n asString combinations: 3 atATimeDo: [:comb | comb permutationsDo: [:perm | perm first ~= $0 ifTrue: [set add: (perm as: String) asInteger] ] ]. set size = 24 and: [set average = 555] ] "=> 7 " "問2" ((10000 roundTo: 36) to: 99999 by: 36) detect: [:n | n asString includesAllOf: '235'] "=> 13572 " このスレprologニキっていないの? 手続き型以外の解法見たい あとJニキ最近見なくて寂しい >>569 問1 4種の数字から作られる24個の数字の平均が555 →合計が1110になる12組の数字にまとめられる→どの桁も合計が10になる2組の数字の組合せで構成される →1,3,9,xのうち1と9を除外した3と「足して10になる数」→x=7 問2 36の倍数→4の倍数かつ9の倍数 →5桁の数字は9の倍数なので各桁の数字の合計が9の倍数になる →5桁の数字には「2,3,5」が少なくとも1つ以上含まれているので、この時点で各桁の数字の合計は10より多くなる。 →各桁の数字の合計は9ではないので、18とする。残り2桁の数字の合計は8。この中で一番小さな数が作れるのは1,7。 →「1,2,3,5,7」の組み合わせの内、下2桁が4の倍数で最も小さい数は13572となる。 かなり乱暴に書くとこんな感じで解けば良いのかな? しかし、これをプログラムで表現しようとするのはかなり骨っぽい(数を1桁ずつ分解するのに余計な手間がかかりそう)。 それよりも総当たりで解いた方がコンピュータ的には手っ取り早い気がしますね。 >>578 最初の「合計が1110になる12組の数字にまとめられる」が何故なのかわからん。 >>579 作成される数字を順列とみなした時に 「ABCD ABDC ACBD ACDB ...」を逆順にした 「DCBA DCAB DBCA DBAC ...」という列を組み合わせたら…なんて考えてたんですが、後で見ると意味不明でした。申し訳ない。 問1について、それよりも単純な方法がありました。 xがどの桁で使用されてるかで場合分けし、それぞれを合計する x不使用:139 193 319 391 913 931 :2886 xが1の桁:13x 19x 31x 39x 91x 93x :2860 + 6x xが10の桁:1x3 1x9 3x1 3x9 9x1 9x3 :2626 + 60x xが100の桁:x13 x19 x31 x39 x91 x93 :286 + 600x 上記をすべて合計:8658 + 666x 24個の数字の平均が555だから合計は 555*24=13320 8658+666x=13320 666x=4662 x=7 若干手続きはコンピュータ向けと言えなくもないですが、やはりプログラミングするには手間ですね。 問1 24=4! なので4個の数字はすべて異なる 24通りを並べると各桁1, 3, 9, x が同じ回数出現する これらの平均が555なので 1, 3, 9, x の平均が5とわかる 1, 9の平均が5なので3, xの平均が5となる7が答え 問2 最小を求めるので10000の位が1になる数を考える (考えて、なければ他を考える) 各桁の合計が9の倍数から1, 2, 3, 5, 7とわかる この中で偶数は2だけなのでこれが1の位 1の位が4で割りきれないので10の位は奇数であれば4の倍数 つまり10の位が3, 5, 7のどれでも36の倍数になる 3, 5, 7を小さい順にならべて13572が答え 問1 x = 111 * (24 * 5 - 6 * (1 + 3 + 9) ) / (6 * 111) = 7 問2 5つの数を A, B, 2, 3, 5 とすると A + B + (2 + 3 + 5) = 0 mod 9 <=> A + B + 1 = 0 mod 9 かつ末尾2桁が4の倍数になる 従って一番左の桁は1で確定し {A, B} = {1, 7}も確定 2が末尾に来ることは確定していてかつそのとき任意の並びで4の倍数になるため13572が題意を満たす数 以上が東大理学部物理学科卒の考え方 両方合わせて40秒くらい やっぱ紙と鉛筆で解く問題だよね。 最初から解析的に解けない問題出して欲しい。 >>580 小学生が解く場合に途中で 8658+666x=13320 のような数学的表現で考えるのはありなのか? 回答者個人にそれができるかできないかの問題ではなく小学校が教えている範囲にそれが含まれるのかの問題ね。 もし含まれていないとしたら他の方法で解く事が可能という事になる。 >>583 「従って一番左の桁は1で確定し」 がわかりません >>584 だよね 36の倍数は、4, 9 の倍数で、それらの特徴を利用できるかどうかだけ 捨て問題だろ。 考えたり解いたりすると、2問で10分使うから、落ちるだけ。 即座に無視しないといけない。 新パターンの問題は、時間を使わせるから無視しろっていう、受験テクニック 灘中高は、100%塾の生徒しか受からない。 灘用の受験技術だから、その授業を受けていないと受からない 文系が東大工学部に入る、受験技術のマンガ「ドラゴン桜」と同じ。 賢い者ではなく、塾代という貧富の格差で決まる 大型資格もそう。 TAC, 大原などに行ってないと受からない 貧富の格差、貧富の遺伝 >>586 ものすごくかみ砕いて言うと A + B + 1 = 0 mod 9 (A, B ∈ {0, 1, ..., 9}) を満たす A, B に関して 任意のAに対して対応するBが少なくとも1つは存在することは自明なので A = 1 として 1XX32 という数を考えればこの数は36の倍数でありかつ 2, 3, 5 を各桁に含む (XXには A = 1 に対応する B の値の内の1つと 5 が入る) 解は10000以上1XX32以下の整数なので左端の桁は1であると確定する >>569 Rubyで問1。 def odai_11_569_1(a_ary, a_avg) (a_ary.size + 1) * (a_avg / 111) - a_ary.inject(:+) end w_ary = [1, 3, 9] w_avg = 555 p odai_11_569_1(w_ary, w_avg) 結果:7 >>569 Rubyで問2。 def odai_11_569_2(a_ary, a_base, a_col) a_ary.map!(&:to_s) w = 10**(a_col - 1) w = w / a_base - (w % a_base > 0 ? 0 : 1) w *= a_base loop do w += a_base next if (a_ary - w.to_s.split('')) != [] return w end end a_ary = [2, 3, 5] a_base = 36 a_col = 5 p odai_11_569_2(a_ary, a_base, a_col) # 結果:13572 rubyならさくっとワンライナーで p (10000-10000%-36).step(10**5,36).find{|i|(i.digits&[2,3,5])[2]} #=> 13572 >>569 Rubyで、問2 str_ary = %w(2 3 5) (10_000...100_000).select do |num| next unless num % 36 == 0 # 2, 3, 5 をすべて含む if str_ary.all? { |s| num.to_s.include? s } puts num #=> 13,572 break end end そろそろ新しいお題を。 既出なら申し訳ない。 お題: 再帰・スタックを使用しないマージソートを実装し、整数型のデータn個の配列をソートするプログラムを作成しなさい。 データの個数は不定とし、特定の条件を満たす個数の配列にのみ有効なプログラムは不可とします。 データの内容はランダムとします。乱数の生成法はお任せします。 出来ればソート完了後に配列(の一部)を表示する、正しくソート出来たかチェックする処理を追加してみて下さい。 追加お題: 上記のマージソート処理の際、作業領域を元のデータの半分の量しか確保せずにソートを実行するプログラムを作成しなさい。 1から100までの数字から4つを取り出したそれぞれに番号を振る速い方法ありますか? メモリもあまり使わずに 1 2 3 4 -> 1 1 2 3 5 -> 2 1 2 3 6 -> 3 96 97 98 99 -> 3921221 96 97 98 100 -> 3921222 96 97 99 100 -> 3921223 96 98 99 100 -> 3921224 97 98 99 100 -> 3921225 スタック不可だとスタック操作が隠蔽されてる高級言語はほぼ使用出来ない 無理やりCやC++でやるとしてもローカル変数や関数呼び出しを殆ど封印しなければならない これを良い問題と見るか悪い問題と見るかは分からないが俺はやる気が出ない >>599 組み合わせか 北大の湊 真一のZDD とか。 本も出てる お題:Hello, World!を出力せよ。ただし出力系の関数を使ってはならない。 >>601 すみません。>598の「スタック」はデータ構造としての利用のみを想定していて、他関数呼び出しの禁止などは意図してませんでした。 問題文が不明瞭ですみません。 >>600 ご期待に添えず申し訳ない。他のお題を思いついたら、また出題させていただきます。 お題: マップの広さと部屋の個数及び部屋間の繋がりが与えられた時、ダンジョンを作成せよ ・ダンジョンは部屋と通路からなる ・部屋は少なくとも3x4の大きさを持つ ・通路の幅は1 ・部屋同士は接しない ・マップ外に部屋や通路は無い 一応、想定としては標準出力に'#'と'.'で表示を考えてる 生成方法は自由だからゲーム的面白さのあるマップ作っても良い 解釈がいろいろあり過ぎて コードに対して仕様の説明文が必要になるぞ ■ このスレッドは過去ログ倉庫に格納されています
read.cgi ver 07.5.1 2024/04/28 Walang Kapalit ★ | Donguri System Team 5ちゃんねる