Squeak の Smalltalk で書き下すとこんな感じ。
(($0 to: $z) as: String) select: [:each | each isAlphaNumeric or: [each = $_]]
これだけで終わらせるのもなんなので、Ruby の勉強を兼ねて、最短解までの短さは無理でも、比較的短めに、かつ、最短解よりは“何がしたいのか”をもう少し読んで分かりやすく表現することはかなわないものか…と、しばし、リファレンスに首っ引きになりながらもチャレンジ。 で、こんなん出ました。
(?0..?z).map{|e|e.chr=~/\w/&&$&}.to_s
ちっ。一文字、多い。w
追記:
丁稚な日々 に、eban さんの手による、さらに短い解が登場。[/\w/] で && $& を省略できるのですね。すばらしい。
(?0..?z).map{|e|e.chr[/\w/]}.to_s
追々記:
丁稚な日々 を読んでいて、なるほどこういう書き方もあるなぁ…と感じ入ったので。Squeak の Smalltalk ですと、こんなふう。
($0 to: $9), ($A to: $Z), #($_), ($a to: $z) as: String
String withAll: ($0 to: $9), ($A to: $Z), #($_), ($a to: $z)
文字コード表上の配置に依存しないし、一部の例外を排除するためだけの大がかり(?)なループを回す必要もなく、なにより素直ですよね。