2021-01-01から1年間の記事一覧

Ruby の slice が便利になった

Python の [1, 2, 3, 4, 5, 6, 7, 8, 9, 10][1:10:3] #=>[2, 5, 8] って便利ですよね。Ruby でこれをやろうとすると、ちょっと工夫が必要でした。例えばこんな感じに。 1.step(9, 3).map { [*1..10][_1] } #=>[2, 5, 8] しかし、これはいまではこんな風に書…

Ruby でコラッツの問題

ja.wikipedia.org 「コラッツの問題」というのは、自然数 n を取り、 n が偶数なら2で割る n が奇数なら、3倍して1を足す という操作を繰り返したところ、どうなるかという問題。じつはこれは難問で、いまだに解決されていない。いまのところ、初期値が268あ…

いまどきの Ruby なフィボナッチ数列

Enumerator.produceを使います。 fib = Enumerator.produce([1, 1]) { |a, b| [b, a + b] }.lazy.map(&:first) #最初の10個 fib.first(10) #=>[1, 1, 2, 3, 5, 8, 13, 21, 34, 55] #数列の100以上3000未満の部分 fib.drop_while { _1 < 100 }.take_while { _…

Ruby 的に自然な FizzBuzz

まことに FizzBuzz の種は盡きまじ。 fizzbuzz = Enumerator.new {|y| (1..).each do |i| f = (i % 3).zero? b = (i % 5).zero? y << case when f && b then "FizzBuzz" when f then "Fizz" when b then "Buzz" else i.to_s end end } puts fizzbuzz.take(40…

関数を微分して gnuplot で出力(Ruby)

コード。 require "numo/gnuplot" dx = 0.0001 dif = ->(f, x) { (f.(x+dx)-f.(x))/dx }.curry f = ->(x) { x*x-2*x+1 } dif_f = dif.(f) xs = -5.step(5, 0.1).to_a ys1 = xs.map(&f) ys2 = xs.map(&dif_f) Numo.gnuplot do set terminal: :x11 unset :key …

ビット操作メソッド三題(Ruby)

Ruby を使っているとビット操作はあまり必要なのだが、競技プログラミングをやっていたりすると時にはビット操作したくなることもある。で、Ruby をあらためて見てみると(当り前だが)ビット操作も一通り揃っているわけだ。競プロで便利だなと思うのは例え…

RactorEnum の使用例(Ruby)

obelisk.hatenablog.com前回作った RactorEnum を作ってみます。迷路のスタート(S)から水を流し、お宝が水没するたびにお宝の座標と種類を(リアルタイムで)出力するというものです。 幅優先探索で、お宝に到達するたびにre.pipeに流し込みます。 require…

Ractor の Enumerable 化?(Ruby)

オブジェクトを順に Ractor に流し込んで、(無限連鎖の)Enumerable(親クラス)として取り出すというものです。 こんな感じです。 ractor_enum.rb class RactorEnum class End end def initialize @pipe = Ractor.new do loop do e = Ractor.receive if e.…