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

不思議な"&"(Ruby)

こんなコードが可能なのだな。 (2..10).map(&"5".to_i.method(:to_s)) #=>["101", "12", "11", "10", "5", "5", "5", "5", "5"] やっていることは、"5" を 2~10 進数表記で表現するということですが…。意味はありません。もうひとつ。 (1..5).map(&"Ruby!".m…

Object#method とカリー化で関数型っぽく(Ruby)

Object#method はメソッドをオブジェクト化するものである。 Method は取り出しの対象であるメソッドがなければ作れませんが、Proc は準備なしに作れます。その点から Proc は使い捨てに向き、Method は何度も繰り返し生成する場合に向くと言えます。また内…

メソッドと Proc の相互変換(Ruby)

これらができたからとて、特にうれしいことはない感じです。メソッド→Proc。Object#method と Method#to_proc を使う。 m = 100.method(:to_s) p m #=>#<Method: Integer#to_s(*)> p m.call(2) #=>"1100100" pr = m.to_proc p pr #=>#<Proc:0x000055e967ad8300 (lambda)> p pr.call(16) #=>"64" Proc→メソッド。Proc は無</proc:0x000055e967ad8300></method:>…

最大値をもつものを集める(Ruby)

例えば都道府県名をローマ字化したものから、文字数の最大値と、その文字数をもつすべての県名を得たいとする。そのとき、こんなメソッドを作ってみるといいかも知れない。 module ExEnumerable refine Enumerable do def max_select pool = [] max_num = -F…

Enumerator::Lazy でエラトステネスの篩(Ruby)

Enumerator::Lazy は無限数列を扱うことができるが、それを使って「エラトステネスの篩」をちょっとおもしろく実装できることに気づいた。何はともあれコードである。lazy_prime.rb prime_seq = Enumerator.new do |y| sieve = 2.step.lazy loop do a = siev…

MP3ファイルの分割(ffmpeg, Ruby)

ffmpeg と Ruby を使って、MP3ファイルを分割します。こんな感じ。 cut_mp3.rb file = DATA.gets.chomp ts = DATA.gets.split.map {|t| t.split(":").map(&:to_i)} Dir.chdir(File.dirname(file)) bname = File.basename(file, ".mp3") ts.map {_1 * 3600 + …

ruby 3.0.0preview1 をちょっと使ってみる

環境は Linux Mint 20 です。 Ractor まずは Ractor。 https://github.com/ruby/ruby/blob/master/doc/ractor.md https://github.com/ko1/ruby/blob/ractor/ractor.ja.md 下を見ていじくるとよい。 qiita.com とりあえずこれ。 Ractor.new do 5.times do put…

カーリルAPIで遊んでみる(Ruby)

「カーリル」は全国の図書館の蔵書検索サイトです。APIが用意されているので、Ruby でちょっと遊んでみました。まずはサイトから「アプリケーションキー」を取得して下さい。以下の appkey には、実際に取得したキーが入ります。 図書館の検索 わたしの住ん…

mod p の世界における割り算とは(Ruby)

qiita.com mod p における「逆元」を考えるとよいそう。Ruby で実装する(元は C++)。 def modinv(a, m) b, u, v = m, 1, 0 until b.zero? t = a / b a -= t * b a, b = b, a u -= t * v u, v = v, u end u %= m u += m if u < 0 u end

自然数の約数の個数(Ruby)

自然数の約数の個数は、素因数分解をして求める。Ruby なら、prime ライブラリを require して、Inetger#prime_divisionメソッドを使う。 require "prime" n = 360 puts n.prime_division.inject(1) {|acc, (a, b)| acc * (b + 1)} #=>24

Ruby2D で穴掘り迷路

見てのとおり、穴掘り迷路です。Gem 'ruby2d' を使いました。Ruby2D についてはこちら。コード。 dig_maze.rb require "ruby2d" L = 20 #迷路の大きさ W = L * 2 + 3 Block_w = 10 set width: W * Block_w, height: W * Block_w, fps_cap: 10 blocks = W.tim…

Gem 'Ruby 2D' で遊ぶ(2)

過去記事のプログラムを少し改変したものです。 コード。 ruby2d_sample2a.rb require 'ruby2d' require 'matrix' include Math Width = 500 C = 15 #円の数 R = 20 #円の半径 L = 70 #三角形の外接円の半径 set width: Width, height: Width circles = C.ti…

inject が Enumerator を返さない(Ruby)

例えば true/false の配列をビット列に変換したいとして、こうしたかった。 cond = [true, false, false, true, false, true] cond.inject(0).with_index {|(acc, c), i| c ? acc | 1 << i : acc} #=>TypeError (0 is not a symbol nor a string) injectはブ…

Ruby で同値(必要十分)関係

Ruby で「p と q が同値」あるいは「必要十分」、つまり の関係を表すにはどうしたらよいでしょうか。これはp == qのことでも、p.equal?(q) のことでもありません。ではなくて、 p が T ならば q も T、p が F ならば q も F ということです。T とか F は何…

AOJ 0141 Spiral Pattern (Ruby)

問題。 http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=0141&lang=ja「ぐるぐる模様」を出力します。簡単そうでかなりむずかしかったので、印象に残っています。 6番目の「ぐるぐる模様」 ###### # # # ## # # # # # # # # #### コード。 result…

AOJ 0192 Multistory Parking Lot (Ruby)

僕は競技プログラミングは大したことがないけれど、印象に残っている解答を載せてみようと思います。これは Aizu Online Judge (AOJ)の問題。 http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=0192&lang=ja コード。 class Car num = 1 define_…

AtCoder ABC128C (関数型Ruby?)

https://atcoder.jp/contests/abc128/tasks/abc128_cきれいに Ruby らしく解けたので、メモ。 n, m = gets.split.map(&:to_i) cond = m.times.map { k, *ss = gets.split.map(&:to_i) ss.inject(0) {|acc, s| acc | 1 << (s - 1)} }.zip(gets.split.map(&:to…

金貨と銅貨と空箱の「うそつき問題」(Ruby)

rsc.hatenablog.comまたまた rsc さんのブログから問題を拝借して、Ruby で解いてみました。 問題 コピペさせてもらいます。 A~Eの五つの箱があり、これらの箱は、金貨の入った箱、銅貨の入った箱、空箱の3種類の場合がある。 また、それぞれの箱にはラベル…

Rubyでファイルのツリー構造を出力する

qiita.com これを見て Ruby でもやってみたくなりました。 実行例 <kaki-utils> ├<lib> │ └<kaki> │ ├<utils> │ │ ├add_methods.rb │ │ ├all.rb │ │ ├check_fname_overlapping.rb │ │ ├es.rb │ │ ├imgsuffix.rb │ │ ├nest_loop.rb │ │ ├po.rb │ │ ├rec_decimal.rb │ │ ├retry.rb │ │ └safe_</utils></kaki></lib></kaki-utils>…

Julia でじゃんけんゲームを書いてみる

いつものじゃんけんゲームを Julia のお勉強として書いてみました。Julia のバージョンは 1.0.4 です。 janken.jl using Printf mutable struct Person name::String wincount::Int hand::Int end function judge(player1::Person, player2::Person) show_ha…

Julia で 8 queens 問題

obelisk.hatenablog.com ここで Go と Ruby でやっていることを、Julia でやってみました。結果はこんな感じ。 $ time julia eight_queens.jl -------------- n = 1 @....... ....@... .......@ .....@.. ..@..... ......@. .@...... ...@.... -------------…

Linux Mint に Julia をインストールする

julialang.org Linux Mint 19.3 に Julia をインストールしてみます。インストールはここを参考にしました。まず、Snap をインストールします。 $ sudo apt update $ sudo apt install snapdJulia をインストールします。 $ sudo snap install julia --class…

Ruby は「痒いところに手が届く」か

qiita.comいや、Python すばらしいですね。どこまで Ruby でできるか、試してみました。なお、使った Ruby のバージョンは 2.7.0 です。 3値以上の比較 1 == 2 == 3 # -> False 1 < 2 < 3 < 4 # -> True いやー、これは Ruby ではできないですね。なお、Ruby…

古い Ruby の define_method

AtCoder の過去問をやっていて、手元では通るコードがことごとく RE になる理由が全然わからなかった。いろいろ考えてみたが、コードはどう考えても正しい気がする。 ふと、自分は横着して何も考えずに Ruby 2.7.0 を使っていたが、AtCoder の Ruby は 2.3.3…

ブレゼンハムのアルゴリズム(Ruby)

ja.wikipedia.org「ブレゼンハムのアルゴリズム」とは画面に線分を描くアルゴリズムです。コードはここの Java 版を移植させていただきました。Ruby コードです。描画に Cairo を使っています。 require "cairo" class Draw W = 400 Side = 10 def initializ…