最終更新: 2023-02-08T02:07+0900
a = b = 0 # 初期化 a += b += a += 1 # 本題 p a #=> 1? 2?
右から順番に a に 1 を足して(a=1)、b に a を足して(b=1)、a に b を足して(a=2)、と考えると間違える。「自己代入」を読むと「この形式の代入は
」と書かれている。一番右の 式1 = 式1 op 式2
と評価されます。ただし、op が &&, || の場合には(略)a += 1
が評価される前に一番左の a +=
が a = a +
と分解されていて古い a の値が評価中の式の値として一時的に記憶されているのだと考えられる。a の値は 1 になる。ちなみに C++ では 2 にな
この前の ABC288-D が解けなか
最終更新: 2022-02-11T22:02+0900
先日解いていた「JOIG 2021/2022 本選競技課題」(テストケ
Hash#shift
を意味がある限り繰り返したあとで Hash#clear
を呼ぶようにしている(25 行目)。shift は破壊的なメソ
再現スクリプトはこんな感じ(これを見つけたから日記に書いている)。他所で再現するかは、どうでし
Many = 100 # 10 回では少ない。テキトーに大きく。 Some = 100 # ウチでは 30 回目までは到達しない。 # ウチの Ruby-2.5: ruby 2.5.5p157 (2019-03-15 revision 67260) [x64-mingw32] # ウチの Ruby-2.7: ruby 2.7.1p83 (2020-03-31 revision a0c7c23c9c) [x64-mingw32] Some.times{|some| warn "#{some} begin" hash = {} Many.times{ some.times{|j| k = Random.rand 0..Many hash[k] = 1 # maybe hang } 0 while hash.shift } warn "#{some} end" } warn :exit
Ruby-2.5 と Ruby-2.7 では "N begin" (N は 20 前後) を表示して止まる。2.5 より 2.7 の方が早く止まるという傾向はあるけど、具体的な回数にはバラツキがある。それはまあ乱数を使k
に代えて j
にしたり、シ
こういう Issue「Bug #17779: 特定の順序でHashのkeyを削除した場合に Hash#first が遅くなる - Ruby master - Ruby Issue Tracking System」を思い出したけど、全然関係はなさそう? 全然わからない。
AtCoder のコ
終了コ | 9 |
実行時間 | 10501 ms |
メモリ | 9112 KB |
標準エラ30 begin
で途切れている。完走しても 10 秒もかかるはずないから、ハングして実行を打ち切られたのだと思う。コLinux ip-***-***-***-*** 4.15.0-1041-aws #43-Ubuntu SMP Thu Jun 6 13:39:11 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux
*⁑。
Ruby-3.1 が「ウチの Ruby」に今日加わりました。大体ル
パラメ
改訂するにあた
# ウチではだいたい 20 から 30 回で "empty?: true" を最後にして止まる。 # ウチの Ruby-2.5: ruby 2.5.5p157 (2019-03-15 revision 67260) [x64-mingw32] # ウチの Ruby-2.7: ruby 2.7.1p83 (2020-03-31 revision a0c7c23c9c) [x64-mingw32] # ウチの Ruby-3.1: ruby 3.1.0p0 (2021-12-25 revision fb4df44d16) [x64-mingw-ucrt] H = {} 100.times{|n| while H.size < n k = Random.rand 0..1<<30 H[k] = 1 # たぶんここで止まる。 end warn "size: #{H.size} before shifting." H.shift until H.empty? raise if H.shift # no exception. だけど Hash が空になった後の shift が後でハングをひき起こす? warn "empty?: #{H.empty?}" } warn :exit
Hash を空にする方法として 0 while H.shift
を選ぶとその後の Hash#[]=
でハングするが、Hash を空にする方法として H.shift until H.empty?
を選ぶとハングしなかHash#empty?
が作用してハングを回避しているのではなく、Hash が空になHash#shift
がハングをひき起こしているようだHash#clear
にハングを回避する効果があるらしいのは、JOIG の問題への提出で確認済み(とはもう書いた)。
投稿して次に見たときにはすべてが終わ
こういう仕組みだ
メモ:entries_bound は使用中のビン(DELETEDにな
Bug #18578: Hash#shift を繰り返していると ruby が無応答になる。 - Ruby master - Ruby Issue Tracking Systemったビンを含む)の数に(ほぼ)対応していて、これをみてテ ーブルをリビルドしている(rebuild_table_if_necessary)。空のハ ッシ ュに対する Hash#shift はなぜか entries_bound を 0 にしているので、リビルドすべきタイミングを逃し、ビンがすべて使用中にな った状態で空きビンを探そうとするので無限ル ープに陥 っていた(find_table_bin_ind)。
最終更新: 2021-06-11T11:27+0900
以前書いた。「最初に右辺を評価して、それから左辺の評価と代入を左から順番に実行していく感じかな? 右辺の一時記憶が必要? 多重代入は遅くて時々評価順が難しい、というのが現在の評価。」「クイズです。a の結果を確認してから予想してカンマを付けたら予想通りの結果にな
そしてこの PR が多重代入について>Evaluate multiple assignment left hand side before right hand side by jeremyevans · Pull Request #4390 · ruby/ruby マ
3.1.0 から変わりそう? 評価順が変わ
従来は2が最初にあ
パフ
いやあ、あ
非効率だしバグらせやすいし、作り込む価値がないと言
自分はもうこの仕様について(穴にはま
最終更新: 2020-12-08T00:48+0900
4月に「多重代入は遅くて時々評価順が難しい」と書いたけど、さらに難しいケ
a = *0..5 #=> [0,1,2,3,4,5] b = *0..5 #=> [0,1,2,3,4,5] a[i=2] #=> 2 b[j=2] #=> 2 a[i+=1] = a[i] # a はどうなる? b[j+=1],= b[j] # b はどうなる? a #=> [0,1,2,3,4,5] b #=> [0,1,2,2,4,5]
a の結果を確認してから予想してカンマを付けたら予想通りの結果にな
ゴルフ
最終更新: 2021-01-19T03:44+0900
最近こういう記事を読んだ(20200912p01)。「【Python】平衡二分木が必要な時に代わりに何とかするテク【競プロ】 - Qiita」
その少し前に雰囲気で書こうとしたけど、バランスの取り方に対する理解が雑で完成しなか
Ruby の標準添付ライブラリにある SortedSet は内部構造がハRBTree ライブラリ (https://rubygems.org/gems/rbtree) が利用可能である場合、内部記憶としてハ
」ということが書いてあるけど、RBTree が利用可能だ
性能はま
注意すれば省メモリにはなるかもしれないけど、出し入れのたびに配列の全長のおよそ半分を右へ左へ動かしていたのでは、他に何も期待できない。
注意を要するのは rotate_l/rotate_r の実装。このとき(20200905p01.07)のように、不必要に膨大なメモリ要求が実行速度まで低下させかねない。
すばらしき(20200912p01.03) Array#fill メソ
内部構造は「社長から始めて決ま
その後の検索で「最小共通祖先 [いかたこのたこつぼ]」というペ
ち
苦労の 70 % くらいは sink と push の2メソ
以前にも似たようなことを書いている。「メソ
ソ
つまり、現在の向き(行きか帰りか)と次の添字がわかるならスタ
あ
メモリブロ
持
入れ子にな
最終更新: 2013-04-15T03:23+0900
どうせ Rubyマクロはコマンドの先頭を小文字にする必要があ
SCRIPTITEM_GLOBALMEMBERSフラグを落とすと $Editor.insTextだけのマクロは何十回でも問題なく実行できてるけど、それだけで安心してよいものか。Editorと書いたときのように(数字で始まるマクロコマンドを呼んだときも?)初回で確実に落ちるというだけならいいけど、何回も実行してるうちに運が悪ければ落ちるというのがあれば
最終更新: 2013-02-22T00:42+0900
日本語を含むフルパスを File.expand_pathすると、文字列そのものは変化しない(ように見える)のにフ
C:\>irb19 irb(main):001:0> File.directory? "C:/コピー" => true irb(main):002:0> File.directory? File.expand_path "C:/コピー" => false irb(main):003:0> "C:/コピー" == File.expand_path("C:/コピー") => true irb(main):004:0> RUBY_DESCRIPTION => "ruby 1.9.3dev (2011-09-23 revision 33323) [i386-mswin32_100]" irb(main):005:0> $: => ["C:/Program Files (x86)/ActiveScriptRuby-1.9/lib/ruby/site_ruby/1.9.1", "C:/Program Fi les (x86)/ActiveScriptRuby-1.9/lib/ruby/site_ruby/1.9.1/i386-msvcr100", "C:/Program Files (x86)/ActiveScriptRuby-1.9/lib/ruby/site_ruby", "C:/Program Files (x86)/ActiveScriptRuby-1 .9/lib/ruby/vendor_ruby/1.9.1", "C:/Program Files (x86)/ActiveScriptRuby-1.9/lib/ruby/vend or_ruby/1.9.1/i386-msvcr100", "C:/Program Files (x86)/ActiveScriptRuby-1.9/lib/ruby/vendor _ruby", "C:/Program Files (x86)/ActiveScriptRuby-1.9/lib/ruby/1.9.1", "C:/Program Files (x 86)/ActiveScriptRuby-1.9/lib/ruby/1.9.1/i386-mswin32_100"] irb(main):006:0>
ところで Rubyは Unicode文字を含む(Shift_JIS(※)に含まれない文字を含む)パスを扱えるようにな
2009年に書いた自分のスクリプトをきちんと動くようにしようと引
このバグだ。>Backport #5629: Windows環境で日本語を含むパスに対して、File.expand_path が存在しないパスを返すパタ
似たような問題がまだ requireに残
最終更新: 2013-03-03T06:08+0900
--- ruby-mp3info-master\lib\mp3info.rb~ Wed Feb 13 16:34:42 2013 +++ ruby-mp3info-master\lib\mp3info.rb Wed Feb 13 20:48:38 2013 @@ -272,7 +272,7 @@ next unless tag_value @tag[key] = tag_value.is_a?(Array) ? tag_value.first : tag_value - if %w{year tracknum}.include?(key) + if %w{year}.include?(key) @tag[key] = tag_value.to_i end # this is a special case with id3v2.2, which uses @@ -381,7 +381,7 @@ puts "@tag has changed" if $DEBUG # @tag1 has precedence over @tag - if @tag1 == @tag1_orig + if @tag1 == @tag1_orig && ! @tag1.empty? @tag.each do |k, v| @tag1[k] = v end @@ -418,7 +418,7 @@ ((@tag1_orig["year"] != 0) ? ("%04d" % @tag1_orig["year"].to_i) : "\0\0\0\0"), @tag1_orig["comments"]||"", 0, - @tag1_orig["tracknum"]||0, + @tag1_orig["tracknum"].to_i, @tag1_orig["genre"]||255 ].pack("Z30Z30Z30Z4Z28CCC") file.write(str)
Vistaの Windows Explorerでタグを書き換えると encoding_indexが 0(iso-8859-1)になるんだけど、これを信用して変換すると日本語文字が化けるので Windows-31Jにしてみた。
require "mp3info" ID3v2::TEXT_ENCODINGS[0] = "Windows-31J"
最終更新: 2011-10-01T04:28+0900
練習問題。それも Aだけ。Bは撃墜されました。
# small用 def last_output(n, k) snappers = [false] * n k.times{ # 電流をたどってひっくり返す。 0.upto(n-1){|i| snappers[i] = ! snappers[i] break if snappers[i] # previously OFF (=next snapper's IN was OFF) } } return snappers.all? end # large用 def last_output(n, k) # k1 = 2**n-1 # k1:最初に n個の snapperがすべて ONになる操作回数. # k = p*k1+(p-1) を満たす自然数pが存在するなら電球は ON. return (k+1)%(1<<n) == 0 end caseno = 0 $stdin.readline; # drop # of cases. $stdin.each_line{|ln| n,k = *ln.scan(/\d+/).map(&:to_i) break unless k caseno += 1 puts "Case ##{caseno}: #{last_output(n,k)?'ON':'OFF'}" }
最終更新: 2011-05-19T13:48+0900
7. In app code, never use force_encoding to convert BINARY data into a particular encoding. By the time you've reached app code, you have lost the information about which encoding is being used. Instead, find where the String came into Ruby, and fix it to set up the encoding based on the information it knows.
アプリケ
ときどきの雑記帖 迷走編ーシ ョンコ ードの場合、バイナリデ ータを特定のエンコ ーデ ィングに変換するために force_encoding を決して使わないこと。アプリケ ーシ ョンコ ードをいじ っているのであれば 使用されているエンコ ーデ ィングに関する情報をたたくさん持 っているはずである。 この場合、その文字列がどこからRubyにや ってきたかを突き止め、わか っている情報に 基づいてエンコ ーデ ィングを設定するように修正すること。
いまも
(文字列のエンコ
最終更新: 2011-04-16T21:35+0900
前にこうならんかな?
require 'hoge'
したときに hoge.rbなり hoge.soなりが taintedな $LOAD_PATH要素に基づいて発見されたときは SecurityError。見つからなければ taintedな要素はスル
1.9.2では(確かめたわけではないけど)汚染されたパスの展開がセキ$LOAD_PATH
の末尾にあ$SAFE=1
の状況下で require 'cgi'
が成功する。require '存在しないフ
はセキ
1.8.7では $SAFE=1
の状況下で汚染された文字列を引数にした File.expand_path
は 1.9.2と違い成功するものの、上のような場合でも require 'cgi'
に失敗する。これは require
が内部的に File.expand_path
を呼び出し――これは 1.9.2とは違いセキ$SAFE=1
のときにセキ
一貫性が欲しか
最終更新: 2011-03-15T00:15+0900
「HCF(n,d)=1」には用語の説明があると思
分数とはなんぞやだとか切断だとか小難しく考えてしま
require 'rational' p Rational(*(2..1_000_000).inject([0,1]){|answer,d| answer[0]/answer[1].to_f < (d*3-1)/7/d.to_f ? [(d*3-1)/7,d] : answer })
Project Euler Problem #71 « KeyZero Conversation
分数を初めてなら
分単位のお時間がかかります。(訳:一時間はかからないけど……)
何倍も速くなるので「Integer#prime_division」を使う代わりに 100万要素の配列を使
LIMIT = 1_000_000 pfs = Array.new(LIMIT+1){ [] } count = 0 2.upto(LIMIT){|d| # 0) LIMIT以下のすべての分母 d に対して、 print d,"\r" count += d-1 # 1) とりあえず d-1 通りの分子を計上し、 d.step(LIMIT, d){|_| pfs[_] << d } if pfs[d].empty? # 2) 8分の6など通分可能なものを差し引きする。 (1..(pfs[d].size)).each{|r| cms = pfs[d].combination(r).map{|pf| pf.inject(&:*) } count -= (-1)**(r%2+1) * cms.map{|cm| (d-1)/cm }.inject(&:+) } } p count
Ruby 1.9からバ
Enumerable::Enumerator.new(lambda{|&block| n=0; loop{ block.call n+=1 } }, :call).each{|x| p x }
それと、block.callの部分を yieldにできないのもわかりにくい。Procと blockと lambdaの微妙な違いによるものなのだろうか。
Rubyによる他所の Project Eulerの解答をみていてこういう書き方も知
1.upto(1/0.0){|n| p n }
あれ? Fixnumだ。Floatになるのは stepだ
1.step(1/0.0){|n| p n } # 1.0, 2.0, 3.0,...
明示的に Fixnumの増分: 1を指定しても n は Float. この違いはなんだろう。
cycleの使い道として zipを想定していたが拒否されてしま
irb> [1,2,3,4,5].zip([0]) => 1, 0], [2, nil], [3, nil], [4, nil], [5, nil irb> [1,2,3,4,5].zip([0].cycle) TypeError: can't convert Enumerable::Enumerator into Array from (irb):2:in `zip' from (irb):2 from :0 irb> RUBY_DESCRIPTION => "ruby 1.8.7 (2010-01-10 patchlevel 249) [i386-mswin32]"
最終更新: 2012-11-01T13:41+0900
説明が面倒なのと誰も知りたくないだろうから適当に、備忘のためだけに。
%{literal}
の literal
部分で \{
や \}
を使う人間がいるとは思わなかだのに Ruby1.9の rake.rbにこんなパタ
%r{[*?\[\{]}
%r{余分な開き括弧{。間違いはインタープリタを通す前から目立つように}
2のは Rubyインタ
最終更新: 2010-04-22T02:07+0900
や
そういう要求をするのも、それを額面通りに実施してしまうのも、ある意味感心するけど首を傾げてしまう。回答は適当に受け付けて、後でフ
回答形式が 一つ選べという問題だ