1 名前:デフォルトの名無しさん mailto:sage [2018/09/28(金) 10:09:07.13 ID:phwOkayR.net] プログラミングのお題スレです。 【出題と回答例】 1 名前:デフォルトの名無しさん お題:お題本文 2 名前:デフォルトの名無しさん >>1 使用言語 回答本文 【ソースコードが長くなったら】 (オンラインでコードを実行できる) https://ideone.com/ codepad.org/ compileonline.com/ rextester.com/runcode https://runnable.com/ https://code.hackerearth.com/ melpon.org/wandbox https://paiza.io/ 宿題は宿題スレがあるのでそちらへ。 前スレ プログラミングのお題スレ Part10 https://mevius.5ch.net/test/read.cgi/tech/1514772904/ プログラミングのお題スレ Part11 https://mevius.5ch.net/test/read.cgi/tech/1524570314/
477 名前:デフォルトの名無しさん [2018/11/13(火) 12:04:16.15 ID:/6RlnNZj.net] >>434 C https://paiza.io/projects/Xq4YBZq4qJJLOZLsNTyWng ライブラリ使用。 コンパイラとライブラリの対応の問題だろうが、32bit環境ではできなかった。time_t型がlongか何かになっていて足りなかったからだろうと思う。 まともに動くかどうかは(またはコンパイルできるかどうかは)環境依存ということになる。
478 名前:デフォルトの名無しさん mailto:sage [2018/11/13(火) 14:23:32.25 ID:TStmpOw3.net] >>283 Squeak Smalltalk >>461 を参考に (joinを直せばPharoも可) | fn | fn := [:M :N | | digits xs ys primaries secondaries sorted | digits := (M * N) log ceiling. xs := (1 to: M) collect: [:idx | (1 to: N) asArray]. ys := (1 to: M) collect: [:idx | Array new: N withAll: idx]. primaries := xs + ys. secondaries := primaries \\ 2 * 2 - 1 * xs. sorted := ((1 to: M) gather: [:y | (1 to: N) collect: [:x | x@y]]) sort: [:pt | (primaries at: pt y) at: pt x] ascending, [:pt | (secondaries at: pt y) at: pt x] descending. sorted doWithIndex: [:pt :idx | (xs at: pt y) at: pt x put: (idx printStringPadded: digits)]. (xs collect: [:row | row joinSeparatedBy: ' ']) asStringWithCr ]. fn value: 3 value: 3. "=> '1 2 6 3 5 7 4 8 9' " fn value: 4 value: 2. "=> '1 2 3 5 4 6 7 8' " fn value: 3 value: 5. "=> '01 02 06 07 12 03 05 08 11 13 04 09 10 14 15' " fn value: 1 value: 8. "=> '1 2 3 4 5 6 7 8' "
479 名前:デフォルトの名無しさん mailto:sage [2018/11/13(火) 15:05:24.75 ID:x0SFJuPP.net] >>461 副キーは x+y の偶奇に応じて上下や左右が反転してればいいわけだから 単に (-1)^(x+y)*x とか (-1)^(x+y)*y で十分か
480 名前:デフォルトの名無しさん mailto:sage [2018/11/13(火) 16:16:43.59 ID:GUmX5rsv.net] >>340 Squeak/Pharo Smalltalk >>346 を参考に | fn | fn := [:N :exp :lastNDigs | | M series count nextVal initial cycle nextExp | M := 10 raisedTo: lastNDigs. series := OrderedCollection with: N \\ M. count := 0. [(series addIfNotPresent: (nextVal := series last * N \\ M); size) = (count := count + 1)] whileFalse. initial := series indexOf: nextVal. cycle := series size - initial + 1. nextExp := N. exp - 1 timesRepeat: [nextExp := (nextExp between: 1 and: series size) ifTrue: [series at: nextExp] ifFalse: [series at: nextExp - initial \\ cycle + initial]]. nextExp printStringPadded: lastNDigs ]. #(1 2 3 4 5 10 11 13 100 777) collect: [:N | N -> (fn value: N value: 3 value: 2)]. "=> {1->'01' . 2->'16' . 3->'87' . 4->'96' . 5->'25' . 10->'00' . 11->'11' . 13->'53' . 100->'00' . 777->'97'} " #(1 2 3 4 5 10 11 13 100 777) collect: [:N | N -> (fn value: N value: 3 value: 6)]. "=> {1->'000001' . 2->'000016' . 3->'484987' . 4->'084096' . 5->'203125' . 10->'000000' . 11->'906611' . 13->'549053' . 100->'000000' . 777->'977097'} " #(1 2 3 4 5 10 11 13 100 777) collect: [:N | N -> (fn value: N value: 4 value: 3)]. "=> {1->'001' . 2->'536' . 3->'387' . 4->'896' . 5->'125' . 10->'000' . 11->'611' . 13->'053' . 100->'000' . 777->'097'} "
481 名前:デフォルトの名無しさん mailto:sage [2018/11/13(火) 16:32:36.89 ID:3gkxjay9.net] >>283 何かの行列足せば出来るんじゃね
482 名前:デフォルトの名無しさん mailto:sage [2018/11/13(火) 17:15:46.99 ID:GUmX5rsv.net] >>359 Squeak Smalltalk ヒルベルトは組み込みなので… | fn | fn := [:n | | form m lines | form := Form extent: (m := 2 << n - 2) + 1 asPoint. (Pen newOnForm: form) place: 0@m; hilbert: n side: 2. lines := (m to: 0 by: -1) collect: [:y | (0 to: m) inject: '' into: [:acc :x | acc copyWith: ('□■' at: (form pixelValueAt: x@y) + 1)] ]. lines asStringWithCr ]. fn value: 1. "=> '■□■ ■□■ ■■■' " fn value: 3. "=> '■□■■■■■□■■■■■□■ ■□■□□□■□■□□□■□■ ■■■□■■■□■■■□■■■ □□□□■□□□□□■□□□□ ■■■□■■■□■■■□■■■ ■□■□□□■□■□□□■□■ ■□■■■■■□■■■■■□■ ■□□□□□□□□□□□□□■ ■■■□■■■■■■■□■■■ □□■□■□□□□□■□■□□ ■■■□■■■□■■■□■■■ ■□□□□□■□■□□□□□■ ■□■■■□■□■□■■■□■ ■□■□■□■□■□■□■□■ ■■■□■■■□■■■□■■■' "
483 名前:デフォルトの名無しさん [2018/11/13(火) 18:58:02.16 ID:6xZ1V9iJ.net] >>283 Ruby >>461 とは別のアプローチで def zigzag(h, w) min, max = [h, w].minmax sum, multi = h + w, h * w f = -> n {n < min ? n + 1 : n >= max - 1 ? sum - n - 1 : min} diagonal = (sum - 1).times.with_object([*1..multi]).map{|i, ary| ary.shift(f[i]).tap{|a| i.odd? && a.reverse!}} len = Math.log10(multi).floor + 1 h.times.map{|i| diagonal[i, w].map(&:pop)}.map{|e| e.map{|i| "%0#{len}d" % i}.join(' ')}.join($/) end [[3, 3], [4, 2], [3, 5], [1, 8]].each{|e| puts "%d %d =>\n%s\n\n" % [*e, zigzag(*e)]} # => 3 3 => 1 2 6 3 5 7 4 8 9 4 2 => 1 2 3 5 4 6 7 8 3 5 => 01 02 06 07 12 03 05 08 11 13 04 09 10 14 15 1 8 => 1 2 3 4 5 6 7 8
484 名前:デフォルトの名無しさん [2018/11/13(火) 19:36:47.61 ID:57oATazI.net] >>438 Python3 https://ideone.com/N66H4z => 1 2 4 7 8 11 13 14 16 19 21 22 25 26 28 31 32 35 37 38 41 42 44 47 49 50 52 55 56 59 61 62 64 67 69 70 73 74 76 79 81 82 84 87 88 91 93 94 97 98
485 名前:デフォルトの名無しさん mailto:sage [2018/11/13(火) 21:13:13.10 ID:VjbjD5Cz.net] お題 直方体の体積を求めよ。三辺の長さはそれぞれ自然数+単位(mm,cm,m,km)の形式で与えられる。 答えは自然数+単位(mm^3,cm^3,m^3,km^3)の形式で、数値部分がなるべく小さくなるように単位を選択せよ。 2cm 3cm 4cm => 24cm^3 5mm 5mm 40mm => 1cm^3 3m 100000000km 3mm => 900000000m^3
486 名前:デフォルトの名無しさん mailto:sage [2018/11/13(火) 21:46:22.87 ID:ZM1FA5dW.net] >>471 Ruby def to_mili(num, unit) case unit when 'mm' then num when 'cm' then num * 10 when 'm' then num * 1000 when 'km' then num * 1000000 end end def volume(sides) v_mili = sides.scan(/(\d+)([a-z]+)/i).map{|side, unit| to_mili(side.to_i, unit)}.reduce(:*) [[10**18, 'km^3'], [10**9, 'm^3'], [10**3, 'cm^3'], [1, 'mm^3']].each{|coe, unit| return [v_mili / coe, unit] if v_mili % coe == 0} end ['2cm 3cm 4cm', '5mm 5mm 40mm', '3m 100000000km 3mm'].each{|sides| puts '%s => %d%s' % [sides, *volume(sides)]} # => 2cm 3cm 4cm => 24cm^3 5mm 5mm 40mm => 1cm^3 3m 100000000km 3mm => 900000000m^3
487 名前:デフォルトの名無しさん [2018/11/13(火) 22:46:25.57 ID:jgdNCfY5.net] プログラミング無料で学んで就職できる? https://et-irodori.com/b/2202
488 名前:デフォルトの名無しさん mailto:sage [2018/11/13(火) 22:49:55.39 ID:YD+aXj03.net] 無料ではないな。 お前の将来の給料からスクールに金が行く。
489 名前:デフォルトの名無しさん [2018/11/14(水) 00:08:48.41 ID:pC5Ut3Ig.net] お題: 品物がN個あり,ぞれぞれ体積はa(1), ..., a(N)である。 すべての品物を複数のダンボール(容積C)に分けて詰めるとき,必要になるダンボールの最小数を求めよ。 例: C: 30 a: 8 5 10 6 4 5 8 5 9 6 9 => 3 C: 120 a: 33 61 58 41 50 21 60 64 => 4 C: 120 a: 33 61 58 41 50 21 60 64 23 45 67 78 89 => 7
490 名前: mailto:sage [2018/11/14(水) 00:21:42.53 ID:1oDeoExT.net] >>438 https://mevius.5ch.net/test/read.cgi/tech/1434079972/54 rucursive に書く人が一人ぐらいいてもいいか、と
491 名前:デフォルトの名無しさん mailto:sage [2018/11/14(水) 00:25:56.42 ID:BDJVwe3s.net] rucursiveならしょうがない
492 名前: mailto:sage [2018/11/14(水) 00:58:44.50 ID:1oDeoExT.net] >>477 typo, "recursive" ええと、>>476 に近いのは >>453 かもしれませんが、>>453 は bit 数を具体的に求めきっていますか?それとも >>476 のように真理値まで短縮してリターンしてますか? haskell はよくわからないので…
493 名前:デフォルトの名無しさん mailto:sage [2018/11/14(水) 01:04:38.44 ID:xfEiy+CV.net] >>475 全探索したら、3つ目の例の答えが6になったんだが合ってる? [21 33 60] [23 89] [41 78] [45 64] [50 67] [58 61]
494 名前:デフォルトの名無しさん mailto:sage [2018/11/14(水) 01:23:48.18 ID:smxkN2Ql.net] >>479 5はありえないから合ってるね
495 名前:デフォルトの名無しさん [2018/11/14(水) 05:43:59.41 ID:BYIKTG47.net] >>340 J f=:3 : 0 y 100&|@^ y^y )
496 名前:デフォルトの名無しさん mailto:sage [2018/11/14(水) 06:20:37.22 ID:W0CfAPru.net] >>481 どのバージョンのJで100|777^777なんてできるんだよ…
497 名前:デフォルトの名無しさん mailto:sage [2018/11/14(水) 06:24:21.52 ID:W0CfAPru.net] 書き方が嫌らしかった。 それ動かないんじゃないですかということ。
498 名前:デフォルトの名無しさん [2018/11/14(水) 06:38:51.58 ID:BYIKTG47.net] >>482 v6で動いたけどな
499 名前:デフォルトの名無しさん [2018/11/14(水) 07:48:55.58 ID:XWwMTSMS.net] >>478 むっちゃ愚直に10進数から2進数に変換してるだけです^^; www.it-license.com/cardinal_number/DecimalToBinary.html ただ、今回は1になってるビットが奇数かどうかだけなのでビット順は逆になっても構わないだろうと、 速い方でリストにしてます。 blist n = (n `mod` 2):blist (n `div` 2) だとビット順は逆さま。 blist n = (n `mod` 2) ++ blist (n `div` 2) とすると正しい順番ですが遅くなります。 あとは1と0だけのリストなので合計求めて sum.blist ―2進数に変換しながら1の合計を求める。 入力と関連付けて zip list 奇数だけをフィルタリングしてます。 filodd = filter (\(_,y) -> odd y)
500 名前:デフォルトの名無しさん [2018/11/14(水) 07:53:25.46 ID:BYIKTG47.net] >>481 の実行結果 f @>1 2 3 4 11 13 100 777x 1 16 87 96 11 53 0 97
501 名前:デフォルトの名無しさん mailto:sage [2018/11/14(水) 08:04:51.77 ID:W0CfAPru.net] >>481 最後の y の前に x: つければどのバージョンでも動くな 100 のとき 0 にならないからダメだけど
502 名前:デフォルトの名無しさん mailto:sage [2018/11/14(水) 08:08:08.67 ID:W0CfAPru.net] >>487 >100 のとき 0 にならないからダメだけど いやこっちは言いがかりだった。ちゃんと動く。
503 名前: mailto:sage [2018/11/14(水) 08:16:08.16 ID:1oDeoExT.net] >>485 解説ありがとうございます。 >blist n = (n `mod` 2) : blist (n `div` 2) この : は (cond atom list) の : なんですね、なんとかわかるようになりました
504 名前: mailto:sage [2018/11/14(水) 08:19:40.71 ID:1oDeoExT.net] >>489 ×(cond atom list) ○(cons atom list)
505 名前:デフォルトの名無しさん mailto:sage [2018/11/14(水) 08:34:57.16 ID:W0CfAPru.net] 言いがかりだったというか いちゃもんを付けてごめんなさい 100|777x^777x^777x これはngで 777(100&|@^) 777x^777x これはok とか勉強になりました (累乗の剰余の特別扱いか?)
506 名前:デフォルトの名無しさん [2018/11/14(水) 11:57:26.31 ID:bryEJhFF.net] >>283 Kotlin https://paiza.io/projects/PT0g18WlTHd6eyd_iXA5aQ
507 名前:デフォルトの名無しさん mailto:sage [2018/11/14(水) 14:12:11.78 ID:OQ399L2/.net] ナップサック問題はNP困難らしいけど>>475 は効率よく解けるのだろうか
508 名前:デフォルトの名無しさん [2018/11/14(水) 14:13:39.09 ID:bryEJhFF.net] >>493 順列と足し算の問題ではないのか? てか、今のところそれしか思い浮かばない。
509 名前:デフォルトの名無しさん mailto:sage [2018/11/14(水) 14:30:58.50 ID:BDJVwe3s.net] 現実は荷物が一日10万個くらいあるんだよなぁ
510 名前:デフォルトの名無しさん [2018/11/14(水) 14:57:13.49 ID:bryEJhFF.net] 正にコンピュータ向けの仕事
511 名前:デフォルトの名無しさん [2018/11/14(水) 15:18:37.83 ID:XWwMTSMS.net] 実際は大量購入した方が安くなるから、よく出るサイズを大量購入して、それ以下の重量は全部よく出るサイズにした方が安上がりだったりする。 (だからアマゾンの箱は無駄にでかい) まあこれはプログラミング上の問題だが。
512 名前:デフォルトの名無しさん mailto:sage [2018/11/14(水) 16:08:49.28 ID:T5a0sRYf.net] >>475 段ボール箱の容量の増減は割と簡単に出来る。
513 名前:デフォルトの名無しさん mailto:sage [2018/11/14(水) 18:30:10.19 ID:whO97NBY.net] >>283 octave https://ideone.com/8QGk1s
514 名前:デフォルトの名無しさん mailto:sage [2018/11/14(水) 19:00:13.88 ID:DmGPDAaP.net] >>438 C https://ideone.com/ecAVVC
515 名前:デフォルトの名無しさん mailto:sage [2018/11/14(水) 22:47:03.81 ID:whO97NBY.net] >>283 ruby https://ideone.com/OugAmn
516 名前:デフォルトの名無しさん mailto:sage [2018/11/15(木) 00:59:29.19 ID:Q7kJgHrD.net] >>283 python 3 https://ideone.com/moV2rT ゴミ
517 名前:デフォルトの名無しさん [2018/11/15(木) 02:07:53.71 ID:lbhTVho0.net] >>475 Kotlin このアルゴリズムで良いのかいまいちわからん。 箱の中に入れられる最大の品物を詰め込み続け入れられなくなったら次の箱を用意して同じことを繰り返すという方法。 結果を見ると一応出来ているようではあるが、これでうまく行く理由がはっきりわからない。 https://paiza.io/projects/rWdvvAZRxR1Qhr8B6PaM2Q 入力は1行の先頭に容積、その後スペース区切りで品物の体積。 結果は箱の数とそれぞれの箱に詰め込んだ品物。
518 名前:デフォルトの名無しさん mailto:sage [2018/11/15(木) 05:46:40.53 ID:uj0cmGI/.net] >>503 C: 7 a: 3 3 2 2 2 2 最適は[3,2,2]と[3,2,2]の2箱でないといけない
519 名前:デフォルトの名無しさん mailto:sage [2018/11/15(木) 07:10:16.88 ID:dYhTSjHD.net] >>503 それだと 6, 5, 3, 2, 2, 2のとき[6, 3], [5, 2, 2] [2] になるが[6, 2, 2] [5, 2, 3]が最小
520 名前:デフォルトの名無しさん mailto:sage [2018/11/15(木) 07:14:44.92 ID:dYhTSjHD.net] >>505 C=10を書き忘れた上に既に同じ指摘が書かれてた
521 名前:499 [2018/11/15(木) 09:09:38.39 ID:RDhHOc3n.net] >>504 >>505>>506 なるほど。じゃあダメだな。
522 名前:497 mailto:sage [2018/11/15(木) 18:39:12.67 ID:cWkAhR+7.net] >>283 ruby https://ideone.com/WmHR8h ・ほんのりリファクタ
523 名前:114 [2018/11/15(木) 23:46:11.08 ID:lNkjj0jr.net] >>475 Haskell 問題と同じ答えになったんだが、どうやら三番目は6個になるっぽい? じゃあダメか。。。 main = print $ map mapbox (slist list) slist xs = map (\(x,y) -> (x, qsort y)) xs mapbox (x,y) = (x,box 0 x [] y) box n _ [] [] = n box n _ ns [] = n + 1 box n c ns [x] | c >= sum (x:ns) = n + 1 box n c ns [x] | c < sum (x:ns) = n + 2 box n c ns (x:xs) | c == sum (x:ns) = box (n + 1) c [] xs box n c ns (x:xs) | c > sum (x:ns) = box n c (x:ns) xs box n c ns (x:xs) | c < sum (x:ns) && c > sum ((minimum xs):ns) = box n c ((last xs):ns) (x:(init xs)) box n c ns (x:xs) | c < sum (x:ns) && c < sum ((minimum xs):ns) = box (n + 1) c [] (x:xs) box n c ns (x:xs) | c < sum (x:ns) && c == sum ((minimum xs):ns) = box (n + 1) c [] (x:(init xs))
524 名前:114 [2018/11/15(木) 23:46:25.95 ID:lNkjj0jr.net] qsort [] = [] qsort (x:xs) = large ++ [x] ++ small where small = qsort [a|a <- xs,a <= x] large = qsort [a|a <- xs,a > x] list = [(30,[8,5,10,6,4,5,8,5,9,6,9]), (120,[33,61,58,41,50,21,60,64]), (120,[33,61,58,41,50,21,60,64,23,45,67,78,89])] 出力 [(30,3),(120,4),(120,7)]
525 名前:デフォルトの名無しさん mailto:sage [2018/11/15(木) 23:52:24.73 ID:Q7kJgHrD.net] >>283 python 3 def wall2(height, width): __maps = {x : [] for x in range(height)} __counts = {w: [x for x in range(height) for y in range(width) if x + y == w] for w in range(height + width)} __num = iter(range(1, 1 + height * width)) __for k,v in counts.items(): ____for vv in sorted(v, reverse= not k % 2):maps[vv].append(next(num)) __for v in range(height): ____print(" ".join(map(lambda x: "%0{}d".format(len(str(width * height))) % x, maps[v]))) __else: print() for x in [[3,3],[4,2],[3,5],[1,8]]: wall(*x) やまほどrange()を書かないといけない宿業
526 名前:114 [2018/11/16(金) 08:32:20.01 ID:00yShIqx.net] >>510 結果がはみ出てた。。。 [(30,3),(120,4),(120,7)] 大きい順に入れて、はみ出たら一番小さいのを入れてみる(入ったら入れて、はみ出たらアカウント)アルゴリズムにしたけど、 大きい順に入れて、はみ出たら入る最大の数字に出会うまで探索。探すものが無くなったらカウントってアルゴリズムに変えても結果は変わらず。 どうやって三番目が6個で済むんだろ。 出来た人、アルゴリズム教えて><
527 名前:デフォルトの名無しさん mailto:sage [2018/11/16(金) 10:37:27.50 ID:7Qu0EE2P.net] >>508 渦巻きスキャンも短い ozy4dm.hateblo.jp/entry/2018/04/26/145518
528 名前:デフォルトの名無しさん mailto:sage [2018/11/16(金) 11:04:51.39 ID:qaNu/as0.net] >>512 89 23| 67 45| 78 41| 60 21 33| 64 50| 61 58 全探索ではないけど 33 61 58 41 50 21 60 64 23 45 67 78 89 これを全ての順列作って前から順に120以内ぎりぎりのところで区切っていく ってやり方で出てくる このやり方もこれでは出来たけど最適解が必ず見つかるか分からない
529 名前:114 [2018/11/16(金) 11:42:51.07 ID:00yShIqx.net] >>514 ありがとう。 やってみたけど、こっちでは順列だと1個増えた。 (と言うか、自分もソートしてから渡してるので順列なんだよね。念のため小さい順にしたら増えた) うーん。。。 やってる事同じっぽいのに、なぜだ。。。
530 名前:114 [2018/11/16(金) 11:55:02.54 ID:00yShIqx.net] 自分は最後の一個入れようとして、入りきらなかったら入る分一個、はみ出た分一個で2個カウントしてるんだけど、そこが1個とカウントしてるとかだったり。。。 そう言う勘違いであってほしいな。。。 box n c ns [] [x] | c < sum (x:ns) = n + 2 -- x+nsで入りきらないので、nsで一個、xで一個。 じゃないと私じゃお手上げ\(^o^)/
531 名前:デフォルトの名無しさん mailto:sage [2018/11/16(金) 11:57:38.57 ID:qaNu/as0.net] 入るとか入らないとかじゃなくてこの並びが出てきたら左から順に区切って行くだけだよ 89 23 67 45 78 41 60 21 33 64 50 61 58
532 名前:デフォルトの名無しさん mailto:sage [2018/11/16(金) 12:22:55.60 ID:tOyusnlA.net] >>515 510のやり方で最小値は求まるのでコードが間違ってる
533 名前:114 [2018/11/16(金) 12:23:45.77 ID:00yShIqx.net] おおう。。。勘違い。 順列の意味勘違いしてた。 数学の順列か。分かった。 やってみる。 ありがとう。
534 名前:デフォルトの名無しさん mailto:sage [2018/11/16(金) 12:25:57.98 ID:tOyusnlA.net] >>514 必ず見つかる 最小になるパターンの内各箱の中を逆順にソートした数列を考えてみると自明
535 名前:114 [2018/11/16(金) 15:20:04.95 ID:00yShIqx.net] 多分これで出るはずだけど、家のPCが低スペックでメモリ不足で止まる。。。(ideoneでも止まる辺り、現実的じゃない) (小さいリストでは確かめて見たので、動いてるっぽい?) import Data.List main = print $ map (\(x,ys)->(x, bmin x ys)) list bmin x xs = minimum $ map (\lst -> box 0 x [] lst) $ permutations xs box c x [] [] = c box c x ns [] = c + 1 box c x ns (y:ys) | x < sum (y:ns) = box (c + 1) x [] (y:ys) box c x ns (y:ys) | x >= sum (y:ns) = box c x (y:ns) ys list = [(30,[8,5,
536 名前:10,6,4,5,8,5,9,6,9]), (120,[33,61,58,41,50,21,60,64]), (120,[33,61,58,41,50,21,60,64,23,45,67,78,89])] せっかく >>514 さんに順列と言うヒント貰っておいて活かしきれてない。。。ごめん。 [] [ここ壊れてます]
537 名前:114 [2018/11/16(金) 15:22:31.31 ID:00yShIqx.net] >>514 さんに折角、順列って言うヒント貰っておいて活かせなかった。 ごめん。
538 名前:デフォルトの名無しさん mailto:sage [2018/11/16(金) 15:27:37.42 ID:7Qu0EE2P.net] 箱に入れた量で大小関係を付けると6個で36通り
539 名前:デフォルトの名無しさん mailto:sage [2018/11/16(金) 15:40:46.44 ID:i0pW9pnK.net] >>475 https://ideone.com/gsuOUp 力技、順列力技ゆえN<=20程度しか求められない。 TSPのやつの変形(2^n*n)、 冗長な計算してるのだろうが、実装できない ついでに、min(乱択(5000回),貪欲解*2) 回答も書いてみた。 最初のと比較をしてみると、3000テストで42個、間違えた。 (ideone上は100テストで2つ間違っている) ※N,Cが小さければ、 この程度で、そのくらい当たりやすい問題なのだろう。 (逆に間違いを探すのが大変) 余談 これは『ビンパッキング問題』そのもの でかいNに対しては、ググればもっといい近似値の求め方がある。
540 名前:デフォルトの名無しさん mailto:sage [2018/11/16(金) 17:13:07.29 ID:36ZZe95D.net] ビンパッキングって焼きなまし法(近傍が分からない)のとビームサーチ、どっちが効率良いだろうか
541 名前:デフォルトの名無しさん mailto:sage [2018/11/16(金) 17:37:36.91 ID:t5p43h9A.net] お題:nの階乗の末尾の連続した0の個数を求める。(過去スレから)
542 名前:デフォルトの名無しさん mailto:sage [2018/11/16(金) 17:46:29.02 ID:TvsPH/qp.net] >>526 Ruby f = ->n{s = 0; while 0 < n /= 5; s += n; end; s} [0, 1, 2, 3, 4, 5, 10, 100, 1000000, 10000000000000000].each{|e| puts '%d => %d' % [e, f[e]]} # => 0 => 0 1 => 0 2 => 0 3 => 0 4 => 0 5 => 1 10 => 2 100 => 24 1000000 => 249998 10000000000000000 => 2499999999999996
543 名前:デフォルトの名無しさん mailto:sage [2018/11/16(金) 19:19:00.00 ID:KTZidSV2.net] お題 N段の三角形ピラミッドの一筆書きを構成せよ 例えば、2段の三角形ピラミッドは以下のような図形である △ △ △ 頂点の番号は上から順番に 1 2 3 4 5 6 …… と与えられる。 (入出力例) N=1 => 3 2 1 3 N=2 => 1 2 4 5 2 3 5 6 3 1 => 1 3 5 6 3 2 5 4 2 1 (解は複数あるが、そのうちの一つを出力すればよい)
544 名前:デフォルトの名無しさん mailto:sage [2018/11/16(金) 20:05:31.22 ID:JjlNk60X.net] >>528 Ruby def hitofude(n) return [1] if n == 0 x, y = n*(n + 1)/2, (n + 1)*(n + 2)/2 [ y, *hitofude(n - 1), *(1...n).flat_map{|i| [y - i, x - i]}, *(x + 1..y), ] end [2, 3, 4].each{|i| p hitofude(i)} # => [6, 3, 1, 2, 3, 5, 2, 4, 5, 6] [10, 6, 3, 1, 2, 3, 5, 2, 4, 5, 6, 9, 5, 8, 4, 7, 8, 9, 10] [15, 10, 6, 3, 1, 2, 3, 5, 2, 4, 5, 6, 9, 5, 8, 4, 7, 8, 9, 10, 14, 9, 13, 8, 12, 7, 11, 12, 13, 14, 15]
545 名前:デフォルトの名無しさん mailto:sage [2018/11/16(金) 21:39:18.95 ID:0oMzWKAu.net] >>528 C https://ideone.com/i2ui3M
546 名前:デフォルトの名無しさん [2018/11/17(土) 09:45:00.71 ID:u+BaxmkL.net] >>475 やった。 順列使わないで三番目が6個になった! Haskell main = mapM_ print $ map mapbox (slist list) slist xs = map (\(x,y) -> (x, qsort y)) xs mapbox (x,y) = (x,length (box x [] [] y)) box _ [] [] [] = [[]] box _ ns [] [] = [ns] box c ns ys [x] | c >= sum (x:ns) = box c (x:ns) [] (reverse ys) box c ns ys [x] | c < sum (x:ns) = [ns] ++ box c [] [] (reverse (x:ys)) box c ns ys (x:xs) | c >= sum (x:ns) = box c (x:ns) ys xs box c ns ys (x:xs) | c < sum (x:ns) && c >= sum ((last xs):ns) = box c ns (x:ys) xs box c ns ys (x:xs) | c < sum (x:ns) && c < sum ((last xs):ns) = [ns] ++ box c [] [] (reverse ys ++ (x:xs)) qsort [] = [] qsort (x:xs) = large ++ [x] ++ small where small = qsort [a|a <- xs,a <= x] large = qsort [a|a <- xs,a > x] list = [(30,[8,5,10,6,4,5,8,5,9,6,9]), (120,[33,61,58,41,50,21,60,64]), (120,[33,61,58,41,50,21,60,64,23,45,67,78,89])]
547 名前:デフォルトの名無しさん [2018/11/17(土) 09:45:32.76 ID:u+BaxmkL.net] qsort (x:xs) = large ++ [x] ++ small where small = qsort [a|a <- xs,a <= x] large = qsort [a|a <- xs,a > x] list = [(30,[8,5,10,6,4,5,8,5,9,6,9]), (120,[33,61,58,41,50,21,60,64]), (120,[33,61,58,41,50,21,60,64,23,45,67,78,89])]
548 名前:デフォルトの名無しさん [2018/11/17(土) 09:46:31.74 ID:u+BaxmkL.net] (120,[33,61,58,41,50,21,60,64,23,45,67,78,89])]
549 名前: mailto:sage [2018/11/17(土) 11:31:38.44 ID:ByrEztlA.net] >>500 やっと理解しました…すべての xor 演算を利用しているわけではないのですね…
550 名前:デフォルトの名無しさん [2018/11/17(土) 11:41:54.02 ID:u+BaxmkL.net] >>526 Haskell main = mapM_ print $ zip list $ map zlen list zlen x = (length.(filter (== '0')).show.product) [1..x] list = [0,1,2,3,4,5,10,100,1000,10000] Out (0,0) (1,0) (2,0) (3,0) (4,0) (5,1) (10,2) (100,30) (1000,472) (10000,5803)
551 名前:デフォルトの名無しさん mailto:sage [2018/11/17(土) 12:12:32.80 ID:PHz1iip2.net] >>535 よーわからんが末尾じゃなくてすべての0を数えてない?
552 名前:デフォルトの名無しさん [2018/11/17(土) 12:27:52.98 ID:z9owpr8+.net] >>526 ぺちぷ <?php function solve(int $n):int{ $a=0; for($i=5;$i<=$n;$i*=5)$a+=intdiv($n,$i); return $a; } foreach([1,5,10,1e2,1e6,1e16] as $i)printf("%d -> %d\n",$i,solve($i)); ?> 1 -> 0 5 -> 1 10 -> 2 100 -> 24 1000000 -> 249998 10000000000000000 -> 2499999999999996
553 名前:デフォルトの名無しさん [2018/11/17(土) 12:46:05.88 ID:u+BaxmkL.net] >>536 コリャうっかりw zlen 差替え。 zlen x = (length.(takeWhile (== '0')).reverse.show.product) [1..x]
554 名前:デフォルトの名無しさん [2018/11/17(土) 12:48:16.01 ID:u+BaxmkL.net] 実行結果 (0,0) (1,0) (2,0) (3,0) (4,0) (5,1) (10,2) (100,24) (1000,249) (10000,2499)
555 名前:デフォルトの名無しさん mailto:sage [2018/11/17(土) 15:08:29.22 ID:thhERN1M.net] >>526 Perl5 その1:単純にloop for $i (0,1,2,3,4,5,10,100,1000,10000,1000000) { ($s, $n) = ($i, 0); while ($s) { $s = int $s / 5; $n += $s; } print "$i $n\n"; } >>526 Perl5 その2: lambdaのtail recursion use feature current_sub; for $i (0,1,2,3,4,5,10,100,1000,10000,1000000) { $n = sub {my $j = shift; $j ? do {my $s = int $j / 5; $s + __SUB__->($s)} : 0; }->($i); print "$i $n\n"; } いずれも実行結果は $ perl 12_522.pl 0 0 1 0 2 0 3 0 4 0 5 1 10 2 100 24 1000 249 10000 2499 1000000 249998 = i/5のreductionよりもエレガントな解法をしばらく考えていたけど一旦断念して投稿します
556 名前:デフォルトの名無しさん [2018/11/17(土) 17:48:20.07 ID:corCuJCM.net] お題 月(01から12)、日(01から31)、時(00から59)、分(00から59)、秒(00から59)の10桁の日付データで 全部の桁が異なる場合を全て求める。だ
557 名前:デフォルトの名無しさん [2018/11/17(土) 17:53:02.90 ID:corCuJCM.net] すいません。最後の文字はゴミです無視してください
558 名前:デフォルトの名無しさん mailto:sage [2018/11/17(土) 18:44:23.27 ID:eb0sqdRj.net] >>541 時って00から23じゃないの?
559 名前:デフォルトの名無しさん [2018/11/17(土) 19:03:48.66 ID:corCuJCM.net] >>543 その通りです。すいません。 時(00から23)に訂正します。
560 名前:デフォルトの名無しさん mailto:sage [2018/11/17(土) 19:42:56.43 ID:qglse9qW.net] >>541 Ruby date = (3..9).flat_map do |mo| [*1..2].permutation.flat_map do |dd, dh| ([*3..5] - [mo]).permutation(2).flat_map do |dm, ds| ([*3..9] - [mo, dm, ds]).permutation.map do |d, h, m, s| [0, mo, dd, d, dh, h, dm, m, ds, s] if dh == 1 || h < 4 end end end end.compact p date.size # => 768 puts date.map(&:join) # => 0326174859 0326174958 0326184759 0326184957 0326194758 0326194857 0327164859 0327164958 0327184659 0327184956 ... 略
561 名前:デフォルトの名無しさん mailto:sage [2018/11/17(土) 20:18:24.56 ID:e9k3MEr9.net] 東西ローマ帝国勃興期か 胸が熱くなるな
562 名前:デフォルトの名無しさん [2018/11/17(土) 20:30:15.26 ID:z9owpr8+.net] >>540 ルジャンドルの定理がエレガントでは無いと申すか
563 名前:デフォルトの名無しさん [2018/11/17(土) 20:54:52.23 ID:u+BaxmkL.net] >>541 Haskell main = ((mapM_ putStrLn).only.(zip (ccheck date10))) date10 n2 n | n < 10 = '0':show n n2 n = show n only = (map (\(_, d) -> d)).filter (\(x,_) -> x == False) ccheck = map ((elem False).count) count xs = map (\c -> ((<2).length.(filter (== c))) xs) "1234567890" date10 = [concat [n2 month, "/", n2 day, " ", n2 hour, ":", n2 minut, ":", n2 sec] | month <- [0..12], day <- [0..31], hour <- [0..24], minut <- [0..60], sec <- [0..60]] パターン数字や最初付近が合ってるかはRubyの人(>>545 )ので確認したので多分合ってる。
564 名前:デフォルトの名無しさん [2018/11/17(土) 20:56:09.09 ID:u+BaxmkL.net] ccheck = map ((elem False).count) count xs = map (\c -> ((<2).length.(filter (== c))) xs) "1234567890" date10 = [concat [n2 month, "/", n2 day, " ", n2 hour, ":", n2 minut, ":", n2 sec] | month <- [0..12], day <- [0..31], hour <- [0..24], minut <- [0..60], sec <- [0..60]] >>545 の人ので答え合わせしたので、多分合ってる。
565 名前:デフォルトの名無しさん [2018/11/17(土) 20:57:39.57 ID:u+BaxmkL.net] date10 = [concat [n2 month, "/", n2 day, " ", n2 hour, ":", n2 minut, ":", n2 sec] | month <- [0..12], day <- [0..31], hour <- [0..24], minut <- [0..60], sec <- [0..60]] >>545 の結果で答え合わせ済み。
566 名前:デフォルトの名無しさん [2018/11/17(土) 20:58:20.76 ID:u+BaxmkL.net] >>545 の結果で答え合わせ済み。
567 名前:デフォルトの名無しさん mailto:sage [2018/11/17(土) 21:15:29.25 ID:qglse9qW.net] >>545 の全結果 過不足がないことは確認済み https://ideone.com/sNgmqP
568 名前:デフォルトの名無しさん mailto:sage [2018/11/17(土) 22:37:13.60 ID:BeWwS75G.net] >>541 Perl5 sub f {grep{!/(.)\1/} map{sprintf "%02d", $_} @_} sub g {map{$_=>1} split'', shift} for $M (1..10,12) { ($S) = f($M); $D = $M == 2 ? 28 : ($M =~ /(4|6|9)/ ? 30 : 31); for $d (f 1..$D) { %t = g "$S$d"; next if 4 != keys %t; for $h (f 1..23) { %t = g "$S$d$h"; next if 6 != keys %t; for $m (f 0..59) { %t = map{$_=>1} split'', "$S$d$h$m"; next if 8 != keys %t; for $s (f 0..59) { %t = map{$_=>1} split'', "$S$d$h$m$s"; next if 10 != keys %t; print "$S$d$h$m$s\n"; } } } } } 実行結果 $ perl 12_537.pl 0326174859 0326174958 0326175849 ... 中略 0928175436 0928175634 0928175643 計768個
569 名前:デフォルトの名無しさん [2018/11/17(土) 23:10:25.25 ID:u+BaxmkL.net] >>548 03/26 17:48:59 みたいに書式化してるんだけど、RubyもPerlも数字だけなのな。。。 その方が速いのは分かるけど。
570 名前:デフォルトの名無しさん mailto:sage [2018/11/17(土) 23:53:27.88 ID:BeWwS75G.net] >>547 数学的にルジャンドルの定理と同じ原理に帰結する解法であっても もっとエレガントなコードアーキテクチャ、たとえば桁の三角形の5と10を 再帰的に渡り歩いてshiftしながら足しこんでいくようなすごくシンプルで、 もっと短いコード実現を探してたという意味です。 つか5とか10とか100とか通過するたびに0が一桁二桁増えることに パターンがあるのに気がついてうまく使おうとしたけど、 それがルジャンドルの定理のひとつだとは知りゃせんでした。
571 名前:デフォルトの名無しさん mailto:sage [2018/11/18(日) 00:08:39.78 ID:2kF9kdFV.net] 25 125が出てこない辺り理屈わかってなさそう
572 名前:デフォルトの名無しさん mailto:sage [2018/11/18(日) 00:17:41.21 ID:XHHQeobW.net] >>555 5は*5ね 50+は…
573 名前:デフォルトの名無しさん [2018/11/18(日) 05:42:08.97 ID:HhgIFMcS.net] 分かっちゃ居たけど、聞いたこともない定理が出る辺り高卒にはエレガントな回答は無理ぽ。。。
574 名前:デフォルトの名無しさん mailto:sage [2018/11/18(日) 10:00:29.21 ID:5NL96rQC.net] >>558 codeIQで類似の問題を解いた当時は知らなかったけど、 普通に行き着いたけどな
575 名前:デフォルトの名無しさん mailto:sage [2018/11/18(日) 10:39:30.27 ID:Q5hV0WNe.net] >>541 ruby https://ideone.com/dCnEfd
576 名前:デフォルトの名無しさん [2018/11/18(日) 11:15:29.83 ID:HhgIFMcS.net] >>526 せっかくルジャンドルの定理を知ったので作り直してみた。 Haskell main = ((mapM_ print).(zip list).(map (zlen 0 1))) list zlen ans x n | 5 ^ x > n = ans zlen ans x n = zlen (n `div` (5 ^ x) + ans) (x + 1) n list = [0,1,2,3,4,5,10,100,1000,10000,12000,100000000]
577 名前:デフォルトの名無しさん mailto:sage [2018/11/18(日) 13:05:15.26 ID:oKOqkAfz.net] お題:同調圧力 要素0,1からなる3次以上の正方行列がある。 縦、横、対角線に0が1個だと1に変化する。この変化が繰り返される。 最後にすべての要素が1になる最小数の1の数と初期配置を求めよ。