ときどきの雑記帖 RE* (新南口)
Antarctica
新500円硬貨
ある朝のこと。
最寄り駅の券売機(というかICカードに「チャージ」するやつ)で 入れても戻される硬貨(後でわかったことだが新500円貨だったらしい)を ひたすら投入しなおしている御仁がいたんですね。
1台だけあるカードを飲み込ませなくてもチャージできる機械で それをやっていたので、 「早く空けてくんないかなあ」 と思いつつ後ろで待ってたらその御仁すぐに避けてくれた。
やれやれと思いつつカードを(カードケースごと) 所定の場所に置いて…とやっていたら 隣の機械でまた同じ事を始めた。
3回もやったら偶発的なもんじゃなくて なんか理由があるのは見当がつくだろうに ○○みたいなことやっても仕方ねえだろ と思ってたら駅員のいる窓口に行って かなり強い口調で 駅員に「(券売機が)この金入らないんだけど!」 と食って掛かり始めた。
こっちの用が済んで、ではと改札を通るところで 駅員の声が聞こえた。
「あー、こりゃあ新しい500円玉ですね。こいつはまだ(券売機では)使えません」
最長しりとり
以前ちょっと話題になったこの広告を出した会社。
全然分からないorz... pic.twitter.com/aTLv94zvNX
— ユウタ@フューチャー・スクウェア代表(社員募集中) (@Yuta_FS_2104) November 13, 2021
なんだこれ、ぜんぜんわからん。 pic.twitter.com/7PkUr6wbON
— ふるさと|インフラ学習ならEnvader(エンベーダー) (@furusatojuku) November 10, 2021
その後も
この前、電車広告で面白い暗号があった!
— れじ🐶👊@VR/NFT事業推進中 (@ejw_shimb) February 14, 2022
解読すると温かいメッセージが出てきたので、皆さんもチャレンジしてみてください pic.twitter.com/tcsp5rePcW
東急車輌URBAN HACKSの広告3月編?の回答を貼る。
— methone (めとね) (@IN_Lab) April 3, 2022
ナンプレ(2パターン)なので前回程のインパクトは無かったがシンプルに難しいやつ来たという感じだった。
プログラムで自動で解くことにしたけど,分岐が発生して思ったより処理が複雑になり認知症気味なので書くのに3日かかった。 pic.twitter.com/GFDXeSIoqa
のような問題を出していたんだけど、 最近出た「最新作」は 東急電鉄の駅の名前を使って しりとりしたときに最も長くつながる組み合わせは? というものだったのだけど、 乗っていた時間ではもちろん解けるはずもないので こうすればプログラムにできるかなあと考えるだけだった。
あとになってちょいと調べたら
- 駅名(50音順)一覧|東急電鉄
- 最長しりとりを求めるプログラムを今更ながらに作ってみた - Qiita
- 計算量ガン無視で与えられた語群の最長しりとりを求める話 - Qiita
- 最長しりとりを組合せ最適で解く - Qiita
- Pythonで最長駅名しりとりを探索してみた - Qiita
- ポケモンでしりとりしたら最長何匹まで続く? 数学の卒論がネットで話題に - ねとらぼ
なんか意外に手ごわい問題だった? (プログラムは結局書いていない😄)
レビュー
カスタマーレビュー: Swift PlaygroundsではじめるiPhoneアプリ開発入門
☆一つの評価なんだけど、 まあ著者が著者だからなあ と思いつつレビューを読んだら
R
色々(謎)あって、会社で使おうとしてるんだけど 4.1.2のときは ライブラリ(パッケージ)のインストールも 問題なくできたのに 4.2.0にすると proxyに引っかかって インストールできなくなってしまった。
最初は会社側の設定の問題かと思ったのだけど 4.2.0で試してダメだった直後に 並存させていた4.1.2では問題なく通る。
なぜ?🤔
proxyの設定すれば…という話なんだろうけど proxy.pac使ってると面倒そうなんだよなあ😓
-3**2
つづき。
Ruby
ということでRubyの話。
みんな大好きparse.yをみると
/*
* precedence table
*/
%nonassoc tLOWEST
%nonassoc tLBRACE_ARG
%nonassoc modifier_if modifier_unless modifier_while modifier_until keyword_in
%left keyword_or keyword_and
%right keyword_not
%nonassoc keyword_defined
%right '=' tOP_ASGN
%left modifier_rescue
%right '?' ':'
%nonassoc tDOT2 tDOT3 tBDOT2 tBDOT3
%left tOROP
%left tANDOP
%nonassoc tCMP tEQ tEQQ tNEQ tMATCH tNMATCH
%left '>' tGEQ '<' tLEQ
%left '|' '^'
%left '&'
%left tLSHFT tRSHFT
%left '+' '-'
%left '*' '/' '%'
%right tUMINUS_NUM tUMINUS
%right tPOW
%right '!' '~' tUPLUS
ブラケットはなかったりするんですな。
そして、tUMINUS
だけではなく
tUMINUS_NUM
なんてものが。
--dump=parsetree
というオプションを使って
解析木を確かめる。
まずはべき乗の方から。
$ ruby --dump=parsetree -e '-2**3'
###########################################################
## Do NOT use this node dump for any purpose other than ##
## debug and research. Compatibility is not guaranteed. ##
###########################################################
# @ NODE_SCOPE (line: 1, location: (1,0)-(1,5))
# +- nd_tbl: (empty)
# +- nd_args:
# | (null node)
# +- nd_body:
# @ NODE_OPCALL (line: 1, location: (1,0)-(1,5))*
# +- nd_mid: :-@
# +- nd_recv:
# | @ NODE_OPCALL (line: 1, location: (1,0)-(1,5))
# | +- nd_mid: :**
# | +- nd_recv:
# | | @ NODE_LIT (line: 1, location: (1,1)-(1,2))
# | | +- nd_lit: 2
# | +- nd_args:
# | @ NODE_LIST (line: 1, location: (1,4)-(1,5))
# | +- nd_alen: 1
# | +- nd_head:
# | | @ NODE_LIT (line: 1, location: (1,4)-(1,5))
# | | +- nd_lit: 3
# | +- nd_next:
# | (null node)
# +- nd_args:
# (null node)
次に’[]’。
$ ruby --dump=parsetree -e '-2[3]'
###########################################################
## Do NOT use this node dump for any purpose other than ##
## debug and research. Compatibility is not guaranteed. ##
###########################################################
# @ NODE_SCOPE (line: 1, location: (1,0)-(1,5))
# +- nd_tbl: (empty)
# +- nd_args:
# | (null node)
# +- nd_body:
# @ NODE_CALL (line: 1, location: (1,0)-(1,5))*
# +- nd_mid: :[]
# +- nd_recv:
# | @ NODE_LIT (line: 1, location: (1,1)-(1,2))
# | +- nd_lit: -2
# +- nd_args:
# @ NODE_LIST (line: 1, location: (1,3)-(1,4))
# +- nd_alen: 1
# +- nd_head:
# | @ NODE_LIT (line: 1, location: (1,3)-(1,4))
# | +- nd_lit: 3
# +- nd_next:
# (null node)
ここで、Rubyの構文規則で’[‘がどのようなルールで現れているか parse.yから抜き出してみると(アクション部は省略)。
ruby/parse.y at master · ruby/ruby
| primary_value '[' opt_call_args rbracket tOP_ASGN lex_ctxt command_rhs
ruby/parse.y at master · ruby/ruby
| primary_value '[' opt_call_args rbracket
ruby/parse.y at master · ruby/ruby
| primary_value '[' opt_call_args rbracket
| primary_value '[' opt_call_args rbracket tOP_ASGN lex_ctxt arg_rhs
ruby/parse.y at master · ruby/ruby
| primary_value '[' opt_call_args rbracket
ruby/parse.y at master · ruby/ruby
p_const '[' rbracket
ルールに直接’[‘という形ではなく現れるものもあって、それは
ruby/parse.y at master · ruby/ruby
| p_const p_lbracket p_args rbracket
| p_const p_lbracket p_find rbracket
| p_const p_lbracket p_kwargs rbracket
| p_const '[' rbracket
こういったものなんだけど、
ここで一つ前の構文要素に現れるp_const
は
ruby/parse.y at master · ruby/ruby
p_const : tCOLON3 cname
{
/*%%%*/
$$ = NEW_COLON3($2, &@$);
/*% %*/
/*% ripper: top_const_ref!($2) %*/
}
| p_const tCOLON2 cname
{
/*%%%*/
$$ = NEW_COLON2($1, $3, &@$);
/*% %*/
/*% ripper: const_path_ref!($1, $3) %*/
}
| tCONSTANT
{
/*%%%*/
$$ = gettable(p, $1, &@$);
/*% %*/
/*% ripper: var_ref!($1) %*/
}
;
なので、今回問題にしている -2[3]
のような表記とは関係ないのでスルー
(tCONSTANT
は123
456.7
のようなリテラル表記の数値ではなく
N
のような表記のもの)。
一方べき乗の方はというと
ruby/parse.y at master · ruby/ruby
arg : lhs '=' arg_rhs
...
| arg tPOW arg
{
$$ = call_bin_op(p, $1, idPow, $3, &@2, &@$);
}
| tUMINUS_NUM simple_numeric tPOW arg
{
$$ = call_uni_op(p, call_bin_op(p, $2, idPow, $4, &@2, &@$), idUMinus, &@1, &@$);
}
ちなみに1.6 (ruby/parse.y at ruby_1_6 · ruby/ruby 特に深い意味があってこのバージョンを選んだわけではない) だと
ruby/parse.y at ruby_1_6 · ruby/ruby
| arg tPOW arg
{
int need_negate = Qfalse;
if ($1 && nd_type($1) == NODE_LIT) {
switch (TYPE($1->nd_lit)) {
case T_FIXNUM:
case T_FLOAT:
case T_BIGNUM:
if (RTEST(rb_funcall($1->nd_lit,'<',1,INT2FIX(0)))) {
$1->nd_lit = rb_funcall($1->nd_lit,rb_intern("-@"),0,0);
need_negate = Qtrue;
}
default:
break;
}
}
$$ = call_op($1, tPOW, 1, $3);
if (need_negate) {
$$ = call_op($$, tUMINUS, 0, 0);
}
}
リテラルが負数だった場合 一度リテラルの符号をひっくり返してから べき乗を計算して、 その後で結果の符号をひっくり返す といったことをしていた。
まあなんというか
「演算子の優先順位」として比べるのは
面倒ですわね。
と。>**
と[]
Rubyの単項マイナスとべき乗の優先順位に関しては その昔にメーリングリストでも話題になっていたような 記憶がかすかにあるんだけど 探すのめんd(ry
Useless Use Of dd
以前、Useless Use Of 🐱 という話題があったけど これはdd。
But do you know what else can read and write files? Everything:
# Write myfile.iso to a USB drive cp myfile.iso /dev/sdb # Rip a cdrom to a .iso file cat /dev/cdrom > myfile.iso # Create a gzipped image gzip -9 < /dev/sdb > /tmp/myimage.gz
え、二番目の書き方ありなの?