プログラミングのお題スレ Part14
■ このスレッドは過去ログ倉庫に格納されています
>>632 思考停止して全パターン出して最大値を取る。 あえて5個以下だとエラー。 対策するなら関数fで長さが5個以下か判定すれば良い。 昔、似た様な問題でリスト内包表記と再帰を組み合わせて、 スマートな方法を誰か書いてたの見たけど忘れた。 Haskell main = f [(-1),4,(-2),1,3,2] f xs = maximum [product [a,b,c,d,e]| a <- xs, b <- xs, c <- xs, d <- xs, e <- xs, a /= b, a /= c, a /= d, a /= e, b /= c, b/= d, b /= e, c /= d, c /= e, d /= e] >>637 おいおい、いくつの中から5個取り出すかわからないんだぞ。 100000個の中から5個取り出すと結構な時間がかかるだろ。 どんだけの組み合わせになるんだよ。 >>638 だから思考停止っって書いてるんよ^^; >>632 Listモジュールに関数あった。。。 Haskell import Data.List main = print $ f [(-1),4,(-2),1,3,2] f = maximum.map product.permutations 全部負なら、必ず答えも負になるんだから選ぶのは上から5個で良くないか つまり634で合ってると思う 0も問題無いな、どこにあっても網羅されてる >>600 perl5 ワンライナー perl -ne 'if(/^(.*?),(.*)$/){$d{$2}{$1}=1}END{for(sort keys%d){if(keys%{$d{$_}}>=2){print"$_ ".join(",",sort keys%{$d{$_}})."\n"}}}' 入力 A,2019/07/05 A,2019/07/10 A,2019/07/15 A,2019/07/20 B,2019/07/08 B,2019/07/10 B,2019/07/20 C,2019/07/15 C,2019/07/20 C,2019/07/25 出力 2019/07/10 A,B 2019/07/15 A,C 2019/07/20 A,B,C >>635 oh...全て負の場合は数値が大きい方(絶対値が小さい方)から5個だな >>637 試した限りじゃ上手く動いてる。 もっとスマートな書き方出来ないものか。。。 Haskell import Data.List main = (print.f) [9,(-5),3,2,1,8,(-4)] f xs |(odd.length) b && (length.filter (<0)) xs > 1 = promax ((map snd.f') a ++ (map snd.take (5 - (length.f') a)) b') ((map snd.take 5.abslst) xs) where a = (filter ((>=0).snd).take 5.abslst) xs a' = (filter ((>=0).snd).abslst) xs b = (filter ((< 0).snd).take 5.abslst) xs b' = (filter ((< 0).snd).abslst) xs f' xs |length a > length b = init xs f' _ = (take (5 - (length.init) b)) a' f xs = promax ((take 5.reverse.sort) xs) ((map snd.take 5.abslst) xs) promax xs ys |product xs > product ys = xs promax _ ys = ys abslst xs = reverse.sort $ zip (map abs xs) xs promax xs ys |product xs > product ys = xs promax _ ys = ys abslst xs = reverse.sort $ zip (map abs xs) xs >>632 Sqeueak Smalltalk | data stream selection set numNegs | data := #(9 -5 -3 2 1 8 -4). stream := ((data copyWithout: 0) sortBy: #abs descending) readStream. set := Set with: (selection := (stream next: 5) asArray). numNegs := selection count: #negative. (numNegs > 0 and: [numNegs odd]) ifTrue: [ | nextNeg nextPos lastPosIdx lastNegIdx | nextNeg := nextPos := nil. lastPosIdx := selection findLast: #positive. lastNegIdx := selection findLast: #negative. [(nextNeg isNil or: [nextPos isNil]) and: [stream atEnd not]] whileTrue: [ | next | next := stream next. (lastPosIdx > 0 and: [nextNeg isNil] and: [next negative]) ifTrue: [set add: (selection copyWithoutIndex: lastPosIdx), {nextNeg := next}]. (lastNegIdx > 0 and: [nextPos isNil] and: [next positive]) ifTrue: [set add: (selection copyWithoutIndex: lastNegIdx), {nextPos :=next}] ]. ]. set detectMax: [:xs | xs reduce: #*] "=> #(9 8 -5 -4 2) " Pharo Smalltalk版 → http://ws.stfx.eu/OK6PHG96QEY8 >>632 haskell import Data.List f xs = if length xs < 5 then undefined else (maximumBy(\ x y ->compare(product x)(product y))$zipWith(++)(reverse.inits.(take 5).reverse.sort$xs)(inits.(take 5).sort$xs)) f [9,-5,-3,2,1,8,-4] -- > [9,8,2,-5,-4] お題: Hello, World!が入力されるのでHelloとWorldを入れ替えて表示せよ あまりにも簡単すぎる問題は控えて欲しいな、たまになら休憩として良いけど。 printed("World, Hello!"); >>651 Perl5 簡単だけれども、解いてみた <>=~/(\w+)(\W+)(\w+)(\W+)/; print "$3$2$1$4\n"; 実行結果 ~ $ echo 'Hello, World!' | perl 14_651.pl World, Hello! ※英単語部は任意です お題:全単射を満足する最小桁数を求める 任意の整数域(-10000..10000とか)を引数とする単調増加/減少関数f(x)に対して、 その計算結果を有効数字n桁で丸めたものをy=round(f(x), n)とする。 xとyの関係が全単射になる(異なるxに対して、同じyにならない事) 最小のnを求めよ。 ttps://ja.wikipedia.org/wiki/%E5%85%A8%E5%8D%98%E5%B0%84 xの値域及びf(x)は回答者が適切と思われるものでよい。 fは2^N → Rでいいの? 2^Nは自然数の冪集合ね てか括弧内で全射が無視されてんのが謎 echo Hello, World! | perl -pe 's/ (\w+) , \N{SPACE} (\w+) ! /$2, $1!/x' World, Hello! >>656 f(x)=x/1e4+42 但し xは整数で x∈[-10000, 10000] とかの、もっと単純なヤツです(この例だとn=6)。 f(x)=10^x とかだと、n=1なのは自明だし、 f(x)=c 但し cは任意の実定数 とかだと解は存在しないので、これらは除外して下さい。 >>659 任意の整数域を定義域とする関数に、なんで整数渡してんの? お題 与えられた画像ファイルを 適当なサイズに縮小・拡大 しモノクローム画像に変換 しアスキーアートに変換す る ss = "Hello, World!".split(', ') print( f'{ss[1]}, {ss[0]}' ) # World!, Hello split のたぐいだと ! の位置がおかしなことになるんだよな >>663 おかしいかどうか知らんよ。 問題が細かな事を言っていないんだから。 >>664 悪い悪い、問題を読み直したら、単語の入れ替えだけで記号の位置はそのままというような感じだな。 >>664 はあ? > HelloとWorldを入れ替えて表示せよ 余計なことしちゃだめだろ お題と回答 >>5 : 6 10 32 36 44 >>9 : 15 34 35 79 >>11 =>>575 : 48 (78) 138-139 (140) 142 146 151 154 >>19 : >>50 , https://mevius.5ch.net/test/read.cgi/tech/1549160513/920 : 4 85 89 https://mevius.5ch.net/test/read.cgi/tech/1549160513/988 == >>164 : 59 61 167 169 189 192 201 202 >>90 : 95 96 >>99 : >>200 : 214 219 >>215 : 227 >>220 : 232 240 248 256 268 >>235 : 236 237 238 239 247 249 259 342 353 >>320 : 321 323 327 330 340 >>322 : 325 328 329 331 332 339 341 358 359 >>362 : 367 369 370 371 374 379 380 382 414 >>368 : 390 >>388 : 487 (488) 553 559 >>400 : 401 >>408 : >>417 : 418 419 421 426 432 433 436 438 442 446 451 452 456 471 474 480 482 489 492 495 498 528 530 540 >>479 : >>555 : 556 558 564 565 >>557 : 560 562 568 569 >>570 : 574 577 >>573 : 604 622 >>600 : 605 607 611 613 627 >>615 ,626 : >>632 : 637 640 645 649 650 >>651 : 654 657 662 >>656 : >>661 : >>669 安静にしてた方が良いと思うよ。 反発のない世界で触れ合うのは良いと思うけど、2ch/5ch みたいなところに出てくると、傷つくのは目に見えてる。 みるのが楽しければ、みるだけにとどめるとか。 w3m https://mevius.5ch.net/test/read.cgi/tech/1558168409/ \ |perl -ne 'if (/^1/m){++$body};if (/^ ? \d+コメント$/m){$body=0} ; print if ($body)'\ | ./select_word_and_ancher.pl お題 \ | less perl はこれ https://paste.fedoraproject.org/paste/6R ~aAhHAd3dYBSH0R8Dfhw 出力はこんなかんじだ お題のレスが見れて、それにアンカしたレスが続くのを1フィールドとして 全部のお題に大してループする https://i.imgur.com/WVCFus7.jpg 1 のテンプレを順守してればこのコードの漏れはなくなる >>667 お前個人の備忘録なんてホントにチラシの裏にでも書いとけよ >>651 のお題は > お題: Hello, World!が入力されるのでHelloとWorldを入れ替えて表示せよ なので、Hello, World!以外が入力されたら無視するかエラーを出すのが正しいのでは?w >>675 それは過剰な設計では? Hello, World! 以外が入力されたときにどう振舞うべきかについて >>651 には何らの記載がないので、何ら拘束されることがない 言い換えると、入力が Hello, World! 以外の場合には「どうふるまってもいい」と解釈するのが、論理学的に妥当…@だと思います @:論理式「偽→真」=真、「偽→偽」=真からの類推です >>677 > お題: Hello, World!が入力されるので とあるから入力されるまで待つ処理がない>>653 は失格 >>677 Lua a,b,c,d=io.read(5,2,5,1) print (c..b..a..d) >>679 アンカー間違えました >>651 Lua でした >>678 アホかお前 勝手にオリジナルルール作るなよ お題 #1234→◆gdyb21LQTc #abcd→◆4vxxTEcn7p #あいうえお→◆rXz1zlMT-L 左のトリップキーから右のトリップを返すアルゴリズムを探せ >>683 $ head text hash.sedscr ==> text <== #1234→◆gdyb21LQTc #abcd→◆4vxxTEcn7p #あいうえお→◆rXz1zlMT-L 左のトリップキーから右のトリップを返すアルゴリズムを探せ ==> hash.sedscr <== s/#1234/◆gdyb21LQTc/ s/#abcd/◆4vxxTEcn7p/ s/#あいうえお/◆rXz1zlMT-L/ $ cat text | sed -f hash.sedscr ◆gdyb21LQTc→◆gdyb21LQTc ◆4vxxTEcn7p→◆4vxxTEcn7p ◆rXz1zlMT-L→◆rXz1zlMT-L 左のトリップキーから右のトリップを返すアルゴリズムを探せ >>683 Java https://ideone.com/ulBeVb digestは一回、charsetは二回目で当たった >>678 Perl5(組合せ計算のモジュールはCPANにあるが言語処理系に標準で含まれるCOREモジュールではないので使わずに実装した) @a=sort{$b<=>$a} qw{9 -5 -3 2 1 8 0 -4 -1 4 -2 1 3 2}; @b=splice @a,0,5; splice @a,0,-4; @c=(@b, @a); # 大きい方から5個と小さい方から4個,計最長9個 sub combi { # 組合せ my @s; if (my $n = shift) { while ($n <= @_) { my $t = shift; push @s, map{[$t, @$_]} combi($n - 1, @_); } } else { @s = ([]); } @s } @d = combi(5, @c); # 126個 use List::Util 'product'; @e = sort{$$b[0]<=>$$a[0]} map{[product(@$_), $_]} @d; print "@{$e[0][1]} => $e[0][0]\n"; 実行結果 ~ $ perl 14_632.pl 9 8 4 -4 -5 => 5760 >>684 アンカー間違えた >>632 宛だった…Orz >>632 Perl5 (CPANのMath::Combinatoricsモジュール使用) use Math::Combinatorics; use List::Util 'product'; @a=sort{$b<=>$a} qw{9 -5 -3 2 1 8 0 -4 -1 4 -2 1 3 2}; @b=splice @a,0,5; splice @a,0,-4; @c=(@b, @a); @d=combine 5, @c; @e=sort{$$b[0]<=>$$a[0]} map{[product(@$_), $_]} @d; 実行結果 ~ $ perl 14_632_2.pl 9 4 8 -5 -4 => 5760 >>689 最後のstatement print "@{$e[0][1]} => $e[0][0]\n"; が抜けてた…Orz >>600 Ruby で、 require 'date' ary_A = %w(2019/07/05 2019/07/10 2019/07/15 2019/07/20) ary_B = %w(2019/07/08 2019/07/10 2019/07/20) ary_C = %w(2019/07/15 2019/07/20 2019/07/25) # 文字列の配列から、ハッシュを作る。Date#jd は、ユリウス日。整数型 def make_hash( ary, name ) ary.each_with_object( { } ) { | str, h | h[ Date.parse( str ).jd ] = [ str, name ] } end # ハッシュをマージする。h_1 を上書きする。slice で、位置1 から、1つだけ def merge_hash( h_1, h_2 ) h_1.merge!( h_2 ) { |key, v_1, v_2| v_1 + v_2.slice( 1, 1 ) } end hash_A = make_hash( ary_A, "A" ) hash_B = make_hash( ary_B, "B" ) hash_C = make_hash( ary_C, "C" ) merge_hash( hash_A, hash_B ) merge_hash( hash_A, hash_C ) hash_A.select { |k, v| v.length >= 3 }.sort.each { |elem| puts elem.last.join( ", " ) } お題 直線状の(配列を使った)ライフゲームがある。ルールは、 1. 両隣が生きていれば、暑苦しいので死ぬ 2. 両隣が死んでいれば、寂しいので死ぬ 3. 両隣の内、片方だけが生きていれば、生きる 4. 両端の2つについては、隣が生きていれば生きるし、隣が死んでいれば死ぬ 5. すべてのマスの状態の変更は、同時にすること 下の初期値(1 ターン目)から初めて、状態が変わらなくなるのは、何ターン目か? nターン目と、( n + 1 )ターン目が同じなら、nターン目を答える ただし、漏れは検証していないので、100ターンを超えたら、終了してくださいw * は生、. は死を表す .*...**.*.***.. >>695 Pharo/Squeak Smalltalk | map next turn | map := '.*...**.*.***..' asArray collect: [:x | (x = $*) asBit]. next := [map allButFirst, {0} + ({0}, map allButLast) collect: [:x | (x = 1) asBit]]. turn := 1. [map = (map := next value) or: [(turn := turn + 1) >= 100]] whileFalse. ^turn "=> 13 " プログラムしてないけど、そういう結果になると思う。 >>695 ruby 13ターンで全滅 life = ' .*...**.*.***.. ' puts "%4d %s" % [1, life] 100.times{|gene| life2 = ' ' * life.size (life.size-2).times{|i| life2[i+1] = ((life[i] == '*') ^ (life[i+2] == '*'))? '*' : '.' } # rule 1, 2, 3, 4 break if life == life2 puts "%4d %s" % [gene+2, life2] life = life2 # rule 5 } プログラム組むまでもなく3ターンで終わりなんだけど解釈間違ってんのかな >>695 Java https://ideone.com/8cforf 生きるってのが誕生も含める場合13ターン >>696 >>701 生きるってのが生存のみの場合3ターン >>697 ってことだな 生きるとは、新たに誕生する場合も、含めてください! 居ないときは両隣が生きていれば生まれる (生きているときは 1. に従い死ぬ) とかの方がいいんじゃない? お題: コマンド「stack」を実装しなさい stackの仕様 $ stack push hoge で文字列hogeをスタックにプッシュする $ stack pop hoge でスタックに積んだ文字列をポップする スタックが空の場合は何も表示しない ライフゲームだけど、生まれる話は聞いてないなぁ。 主が生まれる条件書いてねー気がする。 >>695 ,704 Perl5 sub f { @a = map{'*' eq $_} split '', '.*...**.*.***..'; for ($t = 2; $t <= 100; $t++) { @b = $_[0]->(); $t--, last if "@b" eq "@a"; @a = @b; } @a = map{$_ ? '*' : '.'} @b; } f(sub{$a[1], (map{$a[$_] and ($a[$_-1] xor $a[$_+1])} 1..$#a-1), $a[$#a-1]}); print "生存のみ $t: ", @a, "\n"; f(sub{$a[1], (map{$a[$_-1] xor $a[$_+1]} 1..$#a-1), $a[$#a-1]}); print "誕生あり $t: ", @a, "\n"; 実行結果 ~ $ perl 14_695.pl 生存のみ 3: .....**........ 誕生含む 13: ............... >>711 ゴメン実行結果貼り間違えた ~ $ perl 14_695.pl 生存のみ 3: .....**........ 誕生あり 13: ............... >>711 たびたびゴメン、微妙に間違えていた、この入力の場合答えは変わらないけど sub f { @a = map{'*' eq $_} split '', '.*...**.*.***..'; for ($t = 2; $t <= 100; $t++) { @b = $_[0]->(); $t--, last if "@b" eq "@a"; @a = @b; } @a = map{$_ ? '*' : '.'} @b; } f(sub{map{$a[$_] and ($a[$_-1] xor $a[$_+1])} 0..$#a}); print "生存のみ $t: ", @a, "\n"; f(sub{$a[1], (map{$a[$_-1] xor $a[$_+1]} 1..$#a-1), $a[$#a-1]}); print "誕生あり $t: ", @a, "\n"; ~ $ perl 14_695.pl 生存のみ 3: .....**........ 誕生あり 13: ............... >>695 ruby 13ターンで全滅 (>>701 bit演算化) life = '.*...**.*.***..' bord = life.tr('.*','01').to_i(2) mask = 2 ** life.size - 1 fmt = "%%0%db" % life.size 100.times{|gene| puts "%5d %s" % [gene+1, (fmt % bord).tr('01','.*')] bord2 = ((bord<<1)^(bord>>1 )) & mask # rule 1, 2, 3, 4 break if bord == bord2 bord = bord2 } >>706 >1. 両隣が生きていれば、暑苦しいので死ぬ これを変形して、 1a. 自マスが生きている場合、両隣が生きていれば、暑苦しいので死ぬ 1b. 自マスが死んでいる場合、両隣が生きていれば、生きる(新たに誕生する) 1c. ただし、両端の2つのマスについては、1a, 1b を適用せず、ルール4 で良い。 4. 両端の2つについては、隣が生きていれば生きるし、隣が死んでいれば死ぬ つまり、両端の2つについては、そのマスの両隣の内、 存在しないマスを死んでいるものとして扱うと、常に、1a, 1bには該当しない 興味があれば、この変形ルールでも、やってみてください! ただし、漏れは、どうなるのか知りませんがw >>707 確かに、ルール90 と同じです 【7ピンN枚の河内塔の最短手順問題】 初期状態では帽子はピン0 にあり、ピン6にすべて移す までの最小手順の回数を求める 例: N=3 5回 0->4 0->5 0->6 5->6 4->6 >>716 ruby 63ターン以降2周期ループ(62,63,62,63,,,) life = '.*...**.*.***..' bord = life.tr('.*','01').to_i(2) mask = 2 ** life.size - 1 fmt = "%%0%db" % life.size bords = {bord=>true} 100.times{|gene| puts "%5d %s" % [gene+1, (fmt % bord).tr('01','.*')] bord2 = (bord<<1 ^ bord>>1 | bord<<1 & bord>>1 & ~bord) & mask # rule >>706 , >>716 break if bords[bord2] bord = bord2 bords[bord] = true } >>718 循環しましたか? 循環を発見するには、すべてのターンを記録して照合しないといけないから、大変! >>720 3. 両隣の内、片方だけが生きていれば、生きる 元々、生きるには、誕生する事も含むから、3a, 3b は、必要ない ただ、 >>706 の提案で、1a, 1b の所だけを変えてみたのが、 >>716 https://ideone.com/VOwT7u C++版改。5ターンで止まった。 ライフゲームは、ダブルバッファリング以外で作れる気がしない。 #>>716 ruby # Rule を配列化。 (L C R) 3bit 0..7 の状態 >>659 なら [0,1,0,1,1,0,1,0] Rule = [0,1,0,1,1,1,1,0] # rule >>706 , >>716 life = '.*...**.*.***..' lifeBit = life.size bord = life.tr('.*','01').to_i(2) fmt = "%%0%db" % lifeBit bords = {bord=>true} 100.times{|gene| puts "%5d %s" % [gene+1, (fmt % bord).tr('01','.*')] bord <<= 1 bord2 = 0 lifeBit.times{|bit| bord2 |= Rule[bord & 7] << bit bord >>= 1 } bord = bord2 break if bords[bord] bords[bord] = true } >>716 Pharo/Squeak Smalltalk | map next seq start | map := '.*...**.*.***..' asArray collect: [:x | (x = $*) asBit]. seq := OrderedCollection with: map. next := [ | acc | acc := map + (map allButFirst, {0}) + ({0}, map allButLast). ((#(1 2) collect: [:x | acc collect: [:elem | (elem = x) asBit]]) * {map negated + 1. 1}) sum ]. [(start := seq indexOf: (map := next value)) > 0 or: [seq size >= 100]] whileFalse: [seq add: map]. (start = 0 or: [start = seq size]) ifTrue: [seq size] ifFalse: [start to: seq size] "=> (62 to: 63) " >>722 だけど間違ってたら、教えて。 今みんな何やってるのか把握してない。 >>716 Perl5、5で止まる。>>720 >>721の解釈違い?それともオレのBug? %s = qw(. 0 * 1); @a = map{$s{$_}} split '', '.*...**.*.***..'; $t = 1; %h = ("@a" => $t); printf "%2d: @a\n", $t; for ($t = 2; $t <= 100; $t++) { @b=($a[1] ? $a[0] : 0, (map{ ($a[$_-1] xor $a[$_+1]) ? $a[$_] : (($a[$_-1] and $a[$_+1]) ? ($a[$_]?0:1) : 0) } 1..$#a-1), $a[-2] ? $a[-1] : 0 ); printf "%2d: @b\n", $t; @a = @b; $t--, last if exists $h{"@a"}; $h{"@a"} = $t; } @c = map{$_ ? '*' : '.'} @a; printf "%d => @c\n", $t; 実行結果 ~ $ perl 14_716.pl 1: 0 1 0 0 0 1 1 0 1 0 1 1 1 0 0 2: 0 0 0 0 0 1 1 1 0 1 1 0 1 0 0 3: 0 0 0 0 0 1 0 1 1 1 1 1 0 0 0 4: 0 0 0 0 0 0 1 1 0 0 0 1 0 0 0 5: 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 6: 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 5 => . . . . . . * * . . . . . . . (- (expt 2 n) 1) ぐらいの手数増加がやばいやつか たった64枚で移し終えると世界が滅びるらしいぞw >>730 色々ググっている内に中国語で書かれたサイトで「河内塔」が見つかった。 中国語がよくわからないので何とも言えないがどうやらハノイの塔のようだ。 「河内塔(Tower of Hanoi)」と書いてある個所があり下の方にある画像は正にその説明になっている。 https://blog.csdn.net/jon_me/article/details/41986461 >>733 えーっと、そのこーどだけど、死んでるセルの隣に生きてるセルがいたら生まれてるんだけどあってる? ■ このスレッドは過去ログ倉庫に格納されています
read.cgi ver 07.5.5 2024/06/08 Walang Kapalit ★ | Donguri System Team 5ちゃんねる