プログラミングのお題スレ Part12
■ このスレッドは過去ログ倉庫に格納されています
あ、>>621 問題読み間違えてるわ コスト1で1増やすんじゃなくて1増減出来るのね… >>614 Perl5 use feature say; say sort{"$a$b"<=>"$b$a"} split for <DATA>; __DATA__ 3 2 1 1 2 21 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 実行 $ perl 12_614.pl 123 1212 10111121314151623456789 お題:分数を小数に直したときの循環部分の周期を求める 割り切れる場合は0とする 例: 1/3 => 1 10/2 => 0 988027/983 => 982 919/870473 => 54288 1223/1476221 => ? 99998360006603 / 9999901 => ? 123412345/999999999 => 9 も>>628 の例に追加 >>621 あ、ごめん1 3は1だね 3 1と書き間違えた >>632 循環部の周期じゃなくて、小数点以下の循環部の終わる位置を調べてる気がしてきた…修正が必要ですw >>628 >>630 Perl5 for (<DATA>) { ($X, $y) = split; $x = $m = $X % $y; my $n; do { $x = 10 * $x % $y; $n++ } while $x != $m; print "$X/$y => ", ($x ? $n : $x), "\n"; } __DATA__ 1 3 10 2 988027 983 919 870473 1223 1476221 99998360006603 9999901 123412345 999999999 実行 $ perl 12_628.pl 1/3 => 1 10/2 => 0 988027/983 => 982 919/870473 => 54288 1223/1476221 => 122816 99998360006603/9999901 => 1999980 123412345/999999999 => 9 >>633 そういわれると>>634 も自信がなくなってきたので念のため修正 >>628 >>630 Perl5 for (<DATA>) { ($X, $y) = split; $x = $m = $X % $y; my ($n, %h); $h{$x} = 1; do { $x = 10 * $x % $y; $n++ } until $h{$x}; print "$X/$y => ", ($x ? $n : $x), "\n"; } __DATA__ 1 3 10 2 988027 983 919 870473 1223 1476221 99998360006603 9999901 123412345 999999999 実行 $ perl 12_628.pl 1/3 => 1 10/2 => 0 988027/983 => 982 919/870473 => 54288 1223/1476221 => 122816 99998360006603/9999901 => 1999980 123412345/999999999 => 9 1234/555 => 3 >>632 だと4になる >>634 だと無限ループって怖くね? >>636 サンプルデータでは問題ないが 場合によっては無限ループの恐れアルかも >>638 ideoneに食わせたらTime limit exceededになる・・・なんでや https://ideone.com/2b6wUH >>638 いや変なところから巡回し始める数値があれば>>635 も無限ループ 以下修正版。しかし少し進んでからようやく巡回し始める数値ってあるんだろうか… for (<DATA>) { ($X, $y) = split; $x = $m = $X % $y; my ($n, %h); $h{$x} = 1; while(1) { $x = 10 * $x % $y; $n++; last if $h{$x}; $h{$x} = 1; } print "$X/$y => ", ($x ? $n : $x), "\n"; } __DATA__ 1 3 10 2 988027 983 919 870473 1223 1476221 99998360006603 9999901 123412345 999999999 >>639 しらんがなサイトのtimeout秒設定とちゃいますか いま使っているPC(CPU Core U1300 1.06Gz)では 一番遅い>>640 のソースで $ time perl 12_628.pl 1/3 => 1 10/2 => 0 988027/983 => 982 919/870473 => 54288 1223/1476221 => 122816 99998360006603/9999901 => 1999980 123412345/999999999 => 9 12.312 secs >>640 ideoneに食わせたら1234/555動いたが>>632 と同じで4になってる https://ideone.com/eojdE5 1234/555 = 2.2[234]234234... で3よな? >>642 うちのPCだと for (<DATA>) { ($X, $y) = split; $x = $m = $X % $y; my ($n, %h); $h{$x} = 1; while(1) { $x = 10 * $x % $y; $n++; last if $h{$x}; $h{$x} = 1; } print "$X/$y => ", ($x ? $n : $x), "\n"; } __DATA__ 1234 55 実行 $ time perl 12_628.pl 1234/55 => 3 0.281 secs Perlは5.20.3 32 bit, integerは64bit のもの。 5.16.3 32 bit, integer が32bitでも 1234/55 は => 3 になるよ >>643 5が1個足りてませんぜw 1234/55=22.4[36]3636... => 2 >>644 for (<DATA>) { ($X, $y) = split; $x = $m = $X % $y; my ($n, %h); $h{$x} = 1; while(1) { $x = 10 * $x % $y; $n++; last if $h{$x}; $h{$x} = 1; } print "$X/$y => ", ($x ? $n : $x), "\n"; } __DATA__ 1234 555 Perl 5.20.3 32 bit, integer 64bit $ perl.exe 12_628.pl 1234/555 => 4 0.266 secs Perl 5.16.3 32 bit, integer 32bit $ perl 12_628.pl 1234/555 => 4 >>645 じゃから、 1234/555 = 2.2[234]234234... だから答えは3にならんとあかんじゃろ >>645 bug に気がついた。循環する範囲だけの長さを求めていない >>583 私もよーく考えました、>>567 の推論で正しいと思い直しました。 「数字と数字を対応させる」のではなく「数字の中の因数5 と別の数字の中の因数 2 とを対応させる」んですね,週末になったらちゃんと書きます ごめんなさい… >>628 >>630 Perl5 for (<DATA>) { ($X, $y) = split; $x = $m = $X % $y; my ($n, %h); $h{$x} = $n++; while(1) { $x = 10 * $x % $y; last if $h{$x}; $h{$x} = $n++; } print "$X/$y => ", ($x ? $n-$h{$x} : $x), "\n"; } __DATA__ 1 3 10 2 988027 983 919 870473 1223 1476221 99998360006603 9999901 123412345 999999999 1234 555 実行 $ perl 12_628.pl 1/3 => 1 10/2 => 0 988027/983 => 982 919/870473 => 54288 1223/1476221 => 122816 99998360006603/9999901 => 1999980 123412345/999999999 => 9 1234/555 => 3 >>628 Ruby f = -> d { [2, 5].each{|e| d /= e while d % e == 0} return 0 if d == 1 r = 1; (1..d).find{|i| 1 == r = 10 * r % d} } %w[ 1/3 10/2 988027/983 919/870473 1223/1476221 99998360006603/9999901 123412345/999999999 1234/555 ].each{|e| n, d = e.split(?/).map(&:to_i); puts '%d/%d => %d' % [n, d, f[d / d.gcd(n)]]} # => 1/3 => 1 10/2 => 0 988027/983 => 982 919/870473 => 54288 1223/1476221 => 122816 99998360006603/9999901 => 1999980 123412345/999999999 => 9 1234/555 => 3 17941970723/5711177472= 3. 14155370 [ 07847337299484291004011020163934418881248871826338 51095286012502326945724442022732505973857434350098 中略 81545008587679202836020711912487386979243218306349 2795623634229099298422222099702245 ](周期=1584) であってる? >>613 Ruby 再帰 def cost(x, y) return [0] if x == 0 table = cost(x - 1, y) table << table.flat_map.with_index{|e, i| i == 0 ? [x] : [x / i, -(-x / i)].uniq.map{|v| e + v + y + (i * v - x).abs} }.min end [[1,3], [3, 1], [20, 2], [63, 2]].each{|e| puts 'X = %d, Y = %d => %d' % [*e, cost(*e).last]} # => (X, Y) = (1, 3) => 1 (X, Y) = (3, 1) => 3 (X, Y) = (20, 2) => 11 (X, Y) = (63, 2) => 17 >>614 f = ->str{str.split.sort{|a, b| a + b <=> b + a}.join} ['3 2 1', '1 2 21', '1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16'].each{|e| puts '%s => %s' % [e, f[e]]} # => 3 2 1 => 123 1 2 21 => 1212 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 => 10111121314151623456789 お題: 入力をHTMLのリストに変換しなさい。 入力: * aaa * bbb * ccc * aaa * bbb * ccc 出力: <ul><li>aaa</li><li>bbb</li><li>ccc</li></ul> <ul><li>aaa</li><li>bbb</li><li>ccc</li></ul> お題 非負整数の10進数表記を"マイナス10進数"表記に変換せよ 321 => 481 (400 - 80 + 1) 910 => 19090 (10000 - 9000 + 000 - 90 + 0) 909 => 909 0 => 0 11111 => 29291 123456789 => 284664829 >>659 Ruby puts '<ul>%s</ul>' % $<.read.split("\n\n").map{|s| s.scan(/(?<=^\* ).*/).join('</li><l> 入力: * aaa * bbb * ccc * aaa * bbb * ccc 出力: <ul><li>aaa</li><li>bbb</li><li>ccc</li></ul> <ul><li>aaa</li><li>bbb</li><li>ccc</li></ul> >>662 途切れたので訂正 puts '<ul>%s</ul>' % $<.read.split("\n\n").map{|s| s.scan(/(?<=^\* ).*/).('</li><li>')}.join("</ul>\n<ul>") >>663 連投ごめん 訂正 puts '<ul>%s</ul>' % $<.read.split("\n\n").map{|s| s.scan(/(?<=^\* ).*/).join('</li><li>')}.join("</ul>\n<ul>") >>660 Ruby f = -> n {return n if n < 10;a, b = n.divmod(100); c, d = b.divmod(10); 100 * f[a - (-c / 10)] + 10 * (-c % 10) + d} [321, 910, 909, 0, 11111, 123456789].each{|e| puts '%d => %d' % [e, f[e]]} # => 321 => 481 910 => 19090 909 => 909 0 => 0 11111 => 29291 123456789 => 284664829 >>659 Perl5 for (split /\n\n/, <<EOL) * aaa * bbb * ccc * aaa * bbb * ccc EOL { @a = map{"<li>$_</li>"} /\* (\w+)/g; print "<ul>", @a, "</ul>\n"; } 実行結果 $ perl 12_659.pl <ul><li>aaa</li><li>bbb</li><li>ccc</li></ul> <ul><li>aaa</li><li>bbb</li><li>ccc</li></ul> >>666 * 以降にスペース文字が含まれていても、もれなく扱うなら @a = map{"<li>$_</li>"} /\* (\w+)/g; ↓ @a = map{"<li>$_</li>"} /\* ([^\n]+)/g; >>668 俺も分からなかったんで調べたら例えば4桁のn進数 A3 A2 A1 A0 の場合 A0 * n^0 + A1 * n^1 + A2 * n^2 + A3 * n^3 となるわけだけど、単純にこのnが-10ならマイナス10進数ということらしい >>669 なるほど。そういうことか。ありがとう。 >>628 Kotlin https://paiza.io/projects/DwesufgOG64B8-KN_ErG5w C https://paiza.io/projects/HwczmyQnaji1IgHICqHrIg 最初 Kotlin で作って確認した後で paiza.io にコピペして実行したら 99998360006603 / 9999901 が タイムアウトしてしまい、じゃあ C で作るか(ついでに tsearch() 使ってみるか)と思ってやってみたが 相変わらず同じ計算でタイムアウトした。 まあしかしそれ以外の計算はなんとかなったので両方公開しとく。 アルゴリズムは割った余りを10倍するのを繰り返して同じ余りが出たらそこで循環と判定するというやつ。 >>659 javascript ` * aaa * bbb * ccc * aaa * bbb * ccc `.split`\n\n`.map(ol => `<ol><li>${ol.match(/(?<=\* ).*/g).join`</li><li>`}</li></ol>`).join`\n` 出力: <ol><li>aaa</li><li>bbb</li><li>ccc</li></ol> <ol><li>aaa</li><li>bbb</li><li>ccc</li></ol> // 本物のdocument fragment作っちゃう版 var fragment = ` * aaa * bbb * ccc * aaa * bbb * ccc `.trim().split`\n\n`.map(ol => ol .match(/(?<=\* ).*/g) .reduce((acc, li) => (acc.appendChild(document.createElement`li`).innerHTML = li, acc), document.createElement`ol`)) .reduce((acc, ol) => (acc.appendChild(ol), acc), document.createDocumentFragment()) document.querySelector('div#target').appendChild(fragment)など任意のエレメントにそのままappend可能。 >>628 C (その2) https://paiza.io/projects/21K5fAVsJlYtob_H0rZ9LA よく考えたら出来た。 循環になっている桁の最初の余りを取っておいて次に出るまでカウントすれば良いだけで余りを全て保存しておく必要ないんだな。 >>675 の言語は JavaScript( Windows Scripting Host用 )ね >>659 Ruby で作った。ただし、最終行に改行を追加した text = <<"EOT" * aaa * bbb * xxx * yyy EOT buf = ""; result = "" text.each_line do |line| # 1行ずつ処理する line.chomp! # 末尾の改行を削除する case when line.empty? # 空文字列 result += "<ul>" + buf + "</ul>" + "\n" # ul で囲む buf = "" when line.start_with?( "* " ) buf += "<li>" + line.slice!( 2..-1 ) + "</li>" # "* " 以後の部分を取り出す else raise end end puts result 2人以上(1ユーザーに対し、1PC以上)のジャンケンゲームを作れ。 ・勝ちグループにユーザーが居れば勝ちとする。 ・グー=g、チョキ=v、パー=wとする。 ・グー、チョキ、パー以外が入力されたら、あいこ扱い。 ・全員の手もその都度表示。 例 Rock, Paper, Scissors! ―じゃんけんぽん(またはあいこでしょ)の英語版 (Rock = g/G, Paper = w/W, Scissors = v/V) g [("You",'g'),("PC1",'v'),("PC2",'g')] You Win!! >>679 def janken(hand, opp_number) hands = opp_number.times.map{%w[g v w].sample}.unshift(hand) p hands.map.with_index{|h, i| [i == 0 ? 'You' : "PC#{i}", h]} return 'Draw' if hands.uniq.size != 2 hands = hands.uniq.join.sum == 0xDE ? %w[w g] : hands.uniq.sort ['You Win!', 'You Lose!'][hands.index(hand)] end puts janken(?g, 1) # => [["You", "g"], ["PC1", "v"]] You Win! puts janken(?v, 2) # => [["You", "v"], ["PC1", "v"]] Draw puts janken(?w, 3) # => [["You", "w"], ["PC1", "g"], ["PC2", "v"]] Draw puts janken(?g, 4) # => [["You", "g"], ["PC1", "g"], ["PC2", "g"], ["PC3", "v"], ["PC4", "v"]] You Win! >>680 Ruby コピペミス puts janken(?v, 2) -> puts janken(?v, 1) puts janken(?w, 3) -> puts janken(?w, 2) >>680 「・グー、チョキ、パー以外が入力されたら、あいこ扱い」を見落としていたので return 'Draw' if hands.uniq.size != 2 を return 'Draw' if hands.uniq.size != 2 || %w[g, v, w].none?(hand) に修正 puts janken('グーチョキパー', 5) # => [["You", "グーチョキパー"], ["PC1", "g"], ["PC2", "w"], ["PC3", "v"], ["PC4", "g"], ["PC5", " v"]] Draw >>680 あ、あいこはあいこと表示して終わっちゃうのね。。。 あいこの時はまたジャンケンし直しにして欲しい。 条件に入れればよかったかなぁ。。。 >>679 > ・グー=g、チョキ=v、パー=wとする。 グー=g、チョキ=c、パー=pか グー=m、チョキ=v、パー=wか どっちかに統一してほしい。 グー=g、チョキ=v、パー=wだとgが表音イニシャル、v, wが象形と統一性がない。 気になってご飯が喉を通らなくてプログラミングどころじゃない… >>683 Ruby def input(message, cond); begin; puts message; end while cond.call; end def janken hand_type = %w[g v w] input('Input the number of opponents.', proc{gets.to_i < 1}) opp_number, hand, hands = $_.to_i loop do input('Input your hand.', proc{gets; false}) hand = hand_type.index($_.chomp!) hands = opp_number.times.map{rand(3)}.unshift(hand) p hands.map.with_index{|h, i| i == 0 ? ['You', $_] : ["PC#{i}", hand_type[h]]} hand && hands.uniq.size == 2 ? break : puts('Draw') end puts %w[You\ Win! You\ Lose.][3 * hand / hands.uniq.sum / 2] end janken # => Input the number of opponents. 1 Input your hand. choki [["You", "choki"], ["PC1", "g"]] Draw Input your hand. w [["You", "w"], ["PC1", "v"]] You Lose. >>684 まずは瞑想でもして心を落ち着けると良い。 >>679 一応、自分自身でも投稿。 予想通り分岐使わないバージョン出て来た。 自分も挑戦してみようかな。 Haskell(リストに勝ち負け確定パターン(含まれてるかでグループパターン割り出し)があるか判別して、先頭要素(必ずユーザー)がパターンと同じか判定) https://ideone.com/9EmrYI Cとか死ねたし。(全体の勝ちグループ(各手をカウントしてグループパターン割り出し)の手を確定後、勝ちグループと同じ手に対応した文字を入力していたか判定) https://ideone.com/AmfTOy (能力不足の自分はあえてでは無いが)あえて条件分岐バージョンにすると言語や個人の個性出そう。 (CとHaskellでグループ分けや自分が勝ちグループ側かの判定が違うアルゴリズムになった) その場合、アルゴリズムの説明付きだと面白そう。 >>689 グーチョキパー以外をプレイヤーが出したときおかしな挙動しない? お題 順列を求めるのにシャッフルでデータをたくさん用意して 重複データを取り除くことで求めている人がいた 順列の数の何倍位のデータを用意すればいいか調べる >>679 PowerShell function Janken { $hands = @($args[0]) + (1..$args[1] | %{ Get-Random "g","v","w" }) ("[" + ($hands | % {"{0}`",'$_')" -f $(if ($i++ -eq 0) {"(`"You"} else {",(`"PC" + ($i-1)}) }) + "]") $groups = @($hands | Group-Object) $win = @{ "g" = "v"; "v" = "w"; "w" = "g" }[$args[0]] if ($groups.Count -ne 2 -or $win -eq $null) { return "Draw" } if (($groups | ? {$_.Name -eq $win}).Count -gt 0) { return "You Win!!" } return "You Lose!!" } PowerShell > Janken g 1 [("You",'g') ,("PC1",'v')] You Win!! PowerShell > Janken v 2 [("You",'v') ,("PC1",'v') ,("PC2",'g')] You Lose!! PowerShell > Janken w 3 [("You",'w') ,("PC1",'v') ,("PC2",'g') ,("PC3",'w')] Draw PowerShell > Janken a 1 [("You",'a') ,("PC1",'g')] Draw >>679 Kotlin https://paiza.io/projects/3zt5CUPdhrTFhXx2z7ayvw 入力は1行単位で最初の手が自分、スペース区切りでPCの手になる。 グー、チョキ、パーと元の文字列の対応は以下に対応。 グー: "g", "G", "グー", "ぐー" チョキ: "v", "V", "c", "C", "チョキ", "ちょき" パー: "w", "W", "p", "P", "パー", "ぱー" 勝敗の判定は「勝」、「負」、「相子」で出る。 >>697 ジャンケンゲームの肝?ってPCはランダムな値を使う所だと思うんですが・・・ あと、私が勝手にアイコといえばジャンケンやり直しって勝手に思い込んでて仕様に盛り込まなかったのがダメなんですが、 アイコと(アイコ扱いの)不正入力はジャンケンやり直しの形でお願いしたいです。 >>695 さんも、アイコと(アイコ扱いの)不正入力はジャンケンやり直しの形でお願いします。 お題 標準運指(http://taipingu.net/kotu02.html )によるタイピングを考える。 英小文字からなる文字列Sが与えられるので、Sを入力するのにかかる時間を求めなさい。 各文字の入力にかかる時間は以下の通りとする。 ・1文字目 ・ホームポジションから動かない -> 4 ・ホームポジションから動く -> 5 ・2文字目以降 ・1つ前の文字と反対の手の指 -> 1 ・1つ前の文字と同じ手の違う指 -> 2 ・1つ前の文字と同じ手の同じ指 -> 3 (例) aiueo => 9 (4+1+2+1+1) odai => 9 pppp => 14 asdfjkl => 15 fjdksla => 10 >>699 Ruby h = -> c {'qaz'[c] ? 1 : 'wsx'[c] ? 2 : 'edc'[c] ? 3 : 'rfvtgb'[c] ? 4 : 'yhnujm'[c] ? -4 : 'ik'[c] ? -3 : 'ol'[c] ? -2 : 'p'[c] ? -1 : raise('invalid key')} f = -> str{(str[/\A[adfghjkls]/] ? 4 : 5) + str.each_char.map{|c| h[c]}.each_cons(2).map{|a, b| a * b < 0 ? 1 : a != b ? 2 : 3}.sum} %w[aiueo odai pppp asdfjkl fjdksla].each{|s| puts '%s => %d' % [s, f[s]]} # => aiueo => 9 odai => 9 pppp => 14 asdfjkl => 15 fjdksla => 10 >>698 そういうインタラクティブなやつか。 じゃあまた暇があったら作ろう。 お題:Brainfuckのインタプリタを実装せよ 仕様 https://ja.wikipedia.org/wiki/Brainfuck >+++++++++[<++++++++>-]<.>+++++++[<++++>-]<+.+++++++..+++.[-]>++++++++[<++++>-]<.>+++++++++++[<+++++>-]<.>++++++++[<+++>-]<.+++.------.--------.[-]>++++++++[<++++>-]<+.[-]++++++++++. ⇒ Hello World! ++++++++[>++++++++<-]>++.<++++++[>++++++++<-]>.<----[>++++<-]>-.++++++++.+++++.--------.+++++++++++++++.<----[>++++<-]>--.++++++++. ⇒ ? >>702 Ruby やっつけ def parse_bra(code) Hash.new.tap{|h| while i = (code.index(/\[[^\[\]]*\]/)) h[i] = i + $&.size - 1; h[h[i]] = i; code = code.sub($&, ' ' * $&.size) end end end def step(stat) case stat[:code][stat[:pos]] when ?> then stat[:mar] = stat[:mar] == 9999 ? 0 : stat[:mar] + 1 when ?< then stat[:mar] = stat[:mar] == 0 ? 9999 : stat[:mar] - 1 when ?+ then stat[:mem][stat[:mar]] = stat[:mem][stat[:mar]] == 255 ? 0 : stat[:mem][stat[:mar]] + 1 when ?- then stat[:mem][stat[:mar]] = stat[:mem][stat[:mar]] == 0 ? 255 : stat[:mem][stat[:mar]] - 1 when ?. then putc stat[:mem][stat[:mar]] when ?, then stat[:mem][stat[:mar]] = $stdin.getc&.ord.to_i when ?[ then stat[:pos] = stat[:bra][stat[:pos]] if stat[:mem][stat[:mar]] == 0 when ?] then stat[:pos] = stat[:bra][stat[:pos]] if stat[:mem][stat[:mar]] != 0 end end def bf(code) stat = {pos: 0, mar: 0, code: code, mem: Array.new(10000, 0), bra: parse_bra(code)} (step(stat); stat[:pos] += 1) while stat[:pos] < code.size end bf('>+++++++++[<++++++++>-]/ 中略 /++++[<++++>-]<+.[-]++++++++++.') # => Hello World! bf('++++++++[>++++++++<-]>+/ 中略 /++++.<----[>++++<-]>--.++++++++.') # => Brainfuck >>702 C 昔書いたやつ https://ideone.com/r8gfF0 mandelbrotがideoneで2.9s >>660 Perl5 普通のloop版 use feature qw{current_sub say}; for (qw{321 910 909 0 11111 123456789}) { $a = $_; $s = 1; @d= (); do { $d = int $a / 10*$s; $m = $a % (10*$s); unshift @d, $m*$s; $s *= -1; $a = ($a - $m)/10; } while $a; say "$_ $d => ", @d; } >>660 Perl5 無名関数の末尾再帰版 use feature qw{say}; for (qw{321 910 909 0 11111 123456789}) { $s = 1; say "$_ $d => ", sub { $a = shift; $d = int $a / 10*$s; $m = $a % (10*$s); my $ms = $m*$s; $s *= -1; $a = ($a - $m)/10; (($a ? __SUB__->($a) : ()), $ms); }->($_); } >>707 ゴメン、普通のloop版の say "$_ $d => ", @d; は不要なdebug writeも出力するので say "$_ => ", @d; に訂正 結果はいずれも $ perl 12_660.pl 321 => 481 910 => 19090 909 => 909 0 => 0 11111 => 29291 123456789 => 284664829 >>707 再々投ゴメン 無名関数の末尾再帰版 × use feature qw{say}; ↓ ○ use feature qw{current_sub say}; >>679 >>698 HTML + JavaScript https://codepen.io/anon/pen/OaERvj 即実行できた方がいいかなと思ってブラウザで動く JavaScript にしてみた。 PC側は10台まで台数入力する。 表示は「グー」、「チョキ」、「パー」になっている。 判定は方法ほ Kotlin のやつとほとんど同じ。 但し勝敗や相子に関係なく再挑戦ボタンが出る。 >>702 c https://ideone.com/Plh1vx ・mandelbrotが4.24s ・セル配列をコンパクト化 ・一部のforとswitchをgotoで置き換え ・データポインタの範囲チェックは廃止 ・']'のとき無条件に'['へ戻ってたのを廃止 これで。以前からやろうとしてできてない。AI簡単そうだが。 3x3盤タイルゲーム for Windows ver2.00 14/7/5 更新 対戦するたびに学習して次第に強くなる「最善手探索+対戦学習型知能ゲーム」 <入門版> 4x4盤タイルゲーム for Windows ver2.00 14/7/5 更新 対戦するたびに学習して次第に強くなる「最善手探索+対戦学習型知能ゲーム」 <本格版> http://www2u.biglobe.ne.jp/ ~shunbook/omocha/index.htm 盤の状態は4×4のやつで3^16=43046721通りだから後退解析で全状態の最善手が簡単に解ける >>712 その "&&label" って初めてみたんだけどgcc拡張なんだな >>702 c https://ideone.com/ddpLYQ ・ mandelbrotが4.24s→3.42s ・いくつかの単純なループを自前の命令に置き換え >>715-716 まさかこれ使う日が来るとはね( ^ω^) お題: C言語のコメント/*〜*/, //〜 を除去するプログラムを実装せよ >>702 https://ideone.com/d0oDj0 ・ mandelbrotが4.24s→3.42s→3.24s ・ループの置き換えを若干増やす ・初期8命令を6命令へ、なんとなく整理 >>721 ここまで最適化するとはすごいな 今VCに移植してやってみてる VCはラベルのアドレスは取れないのでcase文内で処理してる でも文字がダラダラと表示されるのが嫌なので、putchar()の所を 一度バッファに溜めておいて最後にputs()で一気に出力するようにした >>720 やったことがある気がしたのですが、もうすっかり忘れてしまいました… ■ このスレッドは過去ログ倉庫に格納されています
read.cgi ver 07.5.5 2024/06/08 Walang Kapalit ★ | Donguri System Team 5ちゃんねる