ときどきの雑記帖 RE* (新南口)
許されざるいのち
浪漫特快
小田急のロマンスカー、中国語表記では 「浪漫特快」となるらしい(何と読むのかはわからん)。
Windows terminal
起動時にタブを二つ(PowerShellとcmd.exe)を開くようにしたいのだけどどうすれば?
vscode
一応使えるようになっとかんと、と使い始めたはいいが キーバインドで詰まる詰まる。
○○をしよう→そのためのキーは?
となることが多いこと多いこと。
あと困っているのが ノートPCなのでfnキーを使う操作が多いのだけど (たとえばPageUp/PageDownなんかがfnキーとと矢印キーの 組み合わせだったり)、 自前のPCと会社で使うPCとで fnキーとコントロールキーの配置が 逆になっているので fnキーを押したつもりで コントロールキーを押していたり その逆だったり。
まあこれはVSCodeに限った話ではないのだけど 慣れの問題もあるのか VSCodeを使っているときに目立ってその押し間違いが 多い気がする。
TIOBE index
まあどこまで信用できる指標なのかってハナシはあるわけですが今月の
6月TIOBEプログラミング言語ランキング、C++がJavaを抜く可能性 | TECH+
1 Python 12.20%
20 Prolog 0.74%
という数字を見てふと気になった。 数年前の時点ですでに上位数個のプログラミング言語が占めるパーセンテージが かなり減っていたという印象があったのだけど、 一方で20位で0.74%ってのもずいぶん低い数字じゃない? という気が。 まあそれだけ「その他(others)」の割合が増えているということなのだろう。
んで、 検索結果 | TECH+ から辿れる一番古い記事 (TIOBE本家は金払わんと過去のランキングはわからんのだよね) と比較してみた。
TIOBEプログラミング言語人気、JavaとCが堅くトップ | TECH+ 乗っている一番下の順位が20位じゃなくて14位だけど
- 19.401% Java
- 15.837% C
- 9.633% C++
- 8.843% (Visual) Basic
- 8.779% PHP
- 5.062% C#
- 4.567% Python
- 4.117% Perl
- 3.624% Delphi
- 3.540% JavaScript
- 3.278% Ruby
- 1.259% D
- 0.988% PL/SQL
- 0.835% SAS
4位までの合計で50%超えているのでまあだいぶ違うよね。と。 一方ランキングの下の方の数字はあまり変わってない。 ただ、インデックス算出の方法が違っているはずなので そもそも数字を比べて意味があるのかということが(ry
infix to polish
つづき。
操車場アルゴリズムは前置記法(ポーランド記法)の生成にも使える。その場合は、入力トークン列を最後尾から先頭に向かって処理し、 出力キューを反転させ(つまり、出力キューは出力スタックとなる)、右括弧と左括弧の扱いを反転させればよい (つまり、左括弧については右括弧を見つけるまでスタックをポップし続ける)。
に従って前回のスクリプトをいじってみる。 英語版 Shunting yard algorithm - Wikipedia のみにある
And changing the associativity condition to right.
も反映してみた(つもり)。
class Lexer
def initialize(input)
@s = input.chars.reverse
end
def next
if @s.length > 0
@s.shift
else
nil
end
end
end
class Stack
def initialize
@values = []
end
def push(v)
@values.push(v)
end
def pop
@values.pop if @values.count>0
end
def top
@values[-1] if @values.count>0
end
end
def getprec(op)
if op=="^"
prec = 4
elsif %w[* /].include?(op)
prec = 3
elsif %w[+ -].include?(op)
prec = 2
else
prec = 1
end
end
def op?(token)
%w[^ * / + -].include?(token)
end
def rassoc?(op)
%w[^].include?(op)
end
def infix2polish(inputtext)
lexer = Lexer.new(inputtext)
stack = Stack.new
result = []
while token=lexer.next
if /[a-z]/.match(token)
result << token
elsif token==")"
stack.push(token)
elsif token=="("
while stack.top!=")"
result << stack.pop
end
stack.pop
elsif op?(token)
while getprec(token)<getprec(stack.top) || rassoc?(token) && getprec(token)==getprec(stack.top)
result << stack.pop
end
stack.push(token)
else
puts "error"
break
end
end
while stack.top
result << stack.pop
end
result.reverse
end
s = ARGV.shift
puts "input: #{s}"
puts "output: #{infix2polish(s).join(' ')}"
で、実行。
$ ruby infix2polish.rb 'a+b'
input: a+b
output: + a b
$ ruby infix2polish.rb 'a-b-c'
input: a-b-c
output: - - a b c
$ ruby infix2polish.rb 'a*b^c'
input: a*b^c
output: * a ^ b c
$ ruby infix2polish.rb '(a+b)/(c-d)'
input: (a+b)/(c-d)
output: / + a b - c d
% ruby infix2polish.rb 'a^b^c'
input: a^b^c
output: ^ a ^ b c
それっぽく変換されてますね。