wassup?

プログラミング、ボドゲ、ボカロ

東京見物 (明治大学博物館,近代科学資料館,アビス謎解き)

東京見物の2日目のログ.

1日目はこちら.

wass80.hateblo.jp

明治大学博物館

いくつか展示があるが,その中でも有名なのが拷問器具の展示.

ギロチンや, f:id:wass80:20190315182000p:plain

アイアンメイデンがあった. f:id:wass80:20190315182036p:plain

下のほうの針はガバガバなので,人を中に縛って使うのか,それともそもそも実用に供されず,脅しのためにあるのか. f:id:wass80:20190315182211p:plain

別の展示ゾーンには自動織物のためのジャカード織り機のパンチカードがあった. この機械,本当によくできている. f:id:wass80:20190315182356p:plain

寄り道: 500円記念硬貨交換

銀行にいって手持ちの500円玉を記念硬貨に換えてもらった. バイメタルの硬貨かっこいい f:id:wass80:20190315182534p:plain

近代科学資料館

東京理科大学にある博物館.

計算尺が用途ごとに大量にあってよかった. f:id:wass80:20190315183004p:plain

ここの展示の見どころの1つは,タイガー計算機に触れる展示. f:id:wass80:20190315183041p:plain

タイガー計算機はこのように中身が歯車でできている. f:id:wass80:20190315183131p:plain

上の表示窓に足したい数値を入力し, 計算機右側の大きいレバーを1回転させると下の結果窓にその数値が足される仕組みである.

レバーを逆回転させると逆に数値が引かれる. よくできた仕組みである.

さらに,出力窓を左右にシフトする機構や,出力窓の数値を入力窓に戻す機構がすべて歯車でできており,非常に面白い.

一通りマスターして,複雑な割り算もできたところで満足した.

他にもタイプライターをジャムらせたり, f:id:wass80:20190315183606p:plain

大量の真空管を眺めることができた. f:id:wass80:20190315183643p:plain

ある日は,微分解析機の実演をやっているらしく,是非見たかった. f:id:wass80:20190315183655p:plain

3月末でリニューアルのため休館するらしい.

www.tus.ac.jp

下には秋山仁の数学体験館があった. こちらもしっかり遊び倒したが,写真撮影不可だったため,省略する.

アビス謎解き

すでに結構歩いたあとだったが,必ずやりたいことがまだだった.

メイドインアビスの新宿街歩き謎解きである.f:id:wass80:20190315183955p:plain

新宿のまちなかを歩いて謎解きをするものである.(1000円)

すでにこの時疲れ切っていたが,ナナチがlineで指示してくれるだけで異常なほどのやる気が湧いてきたので良かった.

流石に謎解きの様子の画像はだせないので, 点字タイルを張っている様子です.

f:id:wass80:20190315184611p:plain

楽しかった.

岡むら屋

前から気になっていた岡むら屋の牛めしをかっこんだ

これはスゴ盛り肉めしなので790円.美味しかった.ただ,ご飯大盛りにしないとバランスがちょっと悪い. f:id:wass80:20190315184642p:plain

飲酒プログラミングコンテストはやばい会だった

飲酒プログラミングコンテスト(通称,飲酒プロコン)という,最悪なイベントが行われた.

ルール

  • 参加者には問題を1問読む権利が与えられている.
  • ビールを1缶開けるごとに次の権利が両方共得られる
    • 1回提出する権利
    • 新しい問題を1問を読む権利

全完するためには問題数-1缶のビールを開ける必要がある. また,WAを出してしまった場合,再提出するためには新しいビールを開ける必要がある. しくじると大量のビールを飲む羽目となる.

様子

大量に用意されたビール.破滅への道. f:id:wass80:20190315163240p:plain

今回は先輩がビールの全額を出してくれたので感謝しかない(というかそうでもない限りやる気がでない)

大量に用意された焼き鳥が焼かれる様子.

f:id:wass80:20190315163400p:plain

業務スーパーの焼き鳥(プレーン)にアメリカンミックスソルトをかけるとうまい.

f:id:wass80:20190315163526p:plain

経過

このコンテストではビールを飲むタイミングと問題に取り掛かるタイミングを考えることが大事となる.

2時間のコンテストで,問題ごとの得点は300-400-500-600-700-2400であった.

開始直後,僕は何も考えていなかったので,とりあえず300の問題を開いた.半分の人々は700を開いたようだった.

ビールを飲みながら300の問題のコードをさくさくっと実装する. ビールもすぐに飲みきった. 300に提出をした. TLEだった.

なるほど.Rubyで投稿したのがダメだったのかもしれない. Rustで実装しよう. ビールをもう1本開ける必要があるので,すぐさま次のビールを手にとった. Rustでの実装もすぐに終わった. ビールはまだ残っている.

新しい問題を読む権利が存在することを思い出したので,500の問題を開いた. すでに酔いが回り始めていたので,ここで致命的な誤読を繰り返す.

ビールはのみおわったので,300のRust版を投稿する. TLE. なんで?????

わからんので,500の実装を始めた. ビールも頑張って空ける.焼き鳥もうまい. サンプルはあっている気がしたのでなんとなく提出した. WA.

誤読していた. 読み直すとめんどくさいだけで提出した実装を改変するだけでよかった. 4本目のビールを空けたと同時にAC.

すでにこの時点で僕はフラフラだった. 700を読んでいた人間は1人を除いて全員WAをはやしたらしい. 部屋には酒臭いにおいと焼き鳥の匂いが充満して居酒屋状態だった.

1問目のTLEの原因が全然わからないまま,終了時間が近づいていた. この時,僕は他の問題を読むためにビールを続けてさらに2本も開けていた. 終了時には,6本のビール缶が僕の周りに散らばっていた.

結果

順位表の一部.f:id:wass80:20190315165639p:plain

500を通しただけで8人中3位になってしまった. 1位,2位はWAを出さずにしっかりコードを通していた. 飲酒プログラミングコンテストではWAを1回でも生やすと,デバッグが致命的に困難を極めることがわかった.

コンテスト終わってから,700に失敗した人々がデバッグしていたが,解決した人は居なかった.お酒怖い.

酒がいかに人体に影響を与えるのか,他者の様子を観察できて面白いイベントだった.

東京見物 秋葉原 (ボカロカフェ,うそのたばこ店,他)

東京に行く機会のついでに,東京の行きたかったところに行ってきた.

アニオン 初音ミクコラボカフェ

f:id:wass80:20190315165942p:plain

平日だったので客は僕と知らない人1人しかいなかった.

スタジオにテーブルが置いてある感じで,ずっとボカロ曲が流れ続けていた.

テーブルにはメニューが有り,1品注文制だったので,パフェを頼んだ.(800円) f:id:wass80:20190315173049p:plain

店内にはグッズ売り場があった.冬ミクのデザインは毎年毎年可愛い. f:id:wass80:20190315173323p:plain

店の中央には,アルバムのジャケットが大量に置かれていた.どうやらここから選んで店内でかけてもらうことができるらしい. f:id:wass80:20190315173422p:plain

普段,ニコ動からボカロ曲を適当になれ流すだけで,あまりアルバムを購入しない. そのため,ジャケットの絵だけを見て,かけたい曲を探すのは困難を極めた.

わりとすぐにピノキオPさんの絵が目に入ったのでそれを流してもらった. f:id:wass80:20190315173849p:plain

流してもらうときにコミュニケーションが発生しないシステムが気に入ったのでアルバムをどんどん漁った. 特徴のある絵の人はすぐわかるので便利. これはとるらさんの絵で,ぽてさんの曲. f:id:wass80:20190315174117p:plain

こんな感じで曲をあさりながらパフェを食べるのは楽しかった.

bandainamco-am.co.jp 入場料に500円が必要.

チロルチョコ

秋葉原の道を歩きながら通りがかりに思い出した店.

 

アウトレットのチロルチョコが50個500円で売っていてお得感がある.

駿河ボドゲ

前までは秋葉原に来るとイエサブボドゲを見繕うのが常だった. 駿河屋のボドゲ店ができてからはそちらに足を運ぶようになった. 中古のボドゲがたくさんおいてあり, ボドゲを掘り出すのが楽しい. 新品のボドゲもちょっと安く売ってるので財布の紐が緩みがち.

おばけキャッチ2を買ってしまった. おばけキャッチと全く同型のゲームで,おばけキャッチと混ぜて遊ぶことができる. 混ぜると本当に難しく,楽しい. f:id:wass80:20190315174814p:plain 2300円ぐらいだった気がする.

うそのたばこ店

秋葉原から東にしばらく歩いて,うそのたばこ店に向かった.

道なりに歩いているとたばこ店が見えた. しかしこのたばこ店はトラップで,これはほんもののたばこ店だった. f:id:wass80:20190315175102p:plain

もうちょっとだけ歩くとほんもののうそのたばこ店を見つけた. f:id:wass80:20190315175229p:plain

うそのたばこ店は,たばこは取り扱っていない.そのかわりに,たばことほぼ同じサイズのものを取り扱っている.

取り扱っているものはトランプである.

f:id:wass80:20190315175403p:plain

各種多様なトランプが売られておりかなり興味が惹かれた.

f:id:wass80:20190315175607p:plain

奥にはカフェがある. ちょっと寒かったのでアイリッシュコーヒーを頼んだ.(800円) 甘めと普通が選べたの甘めにした. 美味しかった. f:id:wass80:20190315175010p:plain

左に並んでいるのは300円で買えるミニサイズのバイシクル. 紙質はおもちゃなので実用に堪えはしないが,話のネタにはなっていい買い物だった.

この日は3時間程度で秋葉原を満喫した良い1日だった.

2日目→

wass80.hateblo.jp

15枚のデックでロイヤルテキサスホールデム

テキサスホールデムの変種に、ロイヤルホールデム(royal hold'em)があります。

これはAKQJTの5枚4スート、合計20枚のショートデックを使います。

あとは、普通のホールデムと同様にゲームを行います。

ランダムハンドの役出現確率は下のようになります。

5枚 5枚% 7枚 7枚%
royal 4 0.025 420 0.54
4oak 80 0.50 2800 3.6
full 480 3.0 29280 37.8
straight 1020 6.6 27740 35.8
3oak 1920 12.3 0 0
2pair 4320 27.9 17280 22.3
1pair 7680 50.0 0 0

7枚だと3oakが必ずfullになるので、出現頻度がfull>straightになるようです。

クレイジーロイヤルホールデム

デックは「sAhAdAcAsKhKdKcKsQhQdQsJhJsT」+Jokerの合計15枚です。

ホールデムをする場合バーンカード3枚含めるとmax 3人。バーンをしなければmax 5人です。

Jokerは任意のスートのAとして扱います。

デックはAが5枚、Kが4枚、Qが3枚、Jが2枚、Tが1枚で覚えてください。

役の強さは通常の順番でも良いですが、 頻度順の場合以下の順で役の強さが定義されます。

5枚 5枚% 7枚 7枚%
5oak 1 0.0034 45 0.70
royal 2 0.067 81 1.2
flush 5 0.16 189 2.9
4oak 61 2.0 750 11.7
straight 118 3.9 1316 20.5
full 173 5.8 2049 47.4
3oak 563 18.7 0 0
2pair 878 29.2 1005 15.6
1pair 1202 40.0 0 0

7枚引くとほぼ半分がfullになります。

flushは、royalになっていない形のため、Jokerを含む1pairかつflush形だけです。

このゲームの良さは、自分のハンドの情報がデックに対してあまりにも大きい所です。 例えばTを持っていれば他人にstraightを完成されることはありません。

楽しく遊べるショートデックポーカーの最小形の1つだと思われます。

ブラックバイスクル

ブラックバイスクル

本当のコントラクトブリッジの始め方・遊び方

4人集まったときにするトランプゲーム、何してますか? ハーツですか?スペードですか?

そういう4人が集まることができるなら、コントラクトブリッジの名前は聞いたことがあると思います。

ただ、ネット上にはコントラクトブリッジの情報が本当に少ない!

ブリッジをやったことがない4人でも始められる情報をまとめました。私はコントラクトブリッジを初めて1ヶ月の初心者なので、間違いがあったら指摘をお願いします。

Let's play bridge

f:id:wass80:20181226062056p:plain

http://www.jas.org.sg/aboutus/bridge/letsplaybridge.pdf

ミニブリッジの遊び方と、コントラクトブリッジの遊び方が書かれています。 このPDFに従えば、とりあえずブリッジを遊ぶことが出来ます。

f:id:wass80:20181226062356p:plain

このカラム。このビッディングの言葉がコントラクトブリッジを複雑にし、そして面白くしている所です。

交流ラウンジでのビッドから

コントラクトブリッジの遊び方がわかったら、ビッディングシステムについて知りたくなるはずです。

日本語で最も丁寧にまとまっているサイトはここだと思われます。

hp.vector.co.jp

SAYC summary

特に、このSAYCビットサマリーは日本語で最もまとまっているものに思います。 とりあえずこれを印刷してプレイすることも出来ます。 ただ、あくまでサマリーであり、ゲームの目的と専門用語がわかるまでは使いこなすことは出来ません。説明を読んでいることが前提ですね。

ブリッジ教室

ダミープレイの基本とビッドの基本が書かれています。 こちらは逆引き的には便利です。

コントラクトブリッジ教室

京都大学コントラクトブリッジクラブwiki

2/1 FGの例として便利です。

オープニングビッド - 京都大学コントラクトブリッジクラブwiki

こちらのPDFも説明が丁寧です

HANAのワンポイントレッスン

ビッディングシステムで心折れないために

正直最初は心が折れます。当然でしょう。サマリーと見せられた紙がA4で裏表5枚もあったら、誰でもドン引きします。しかもそのサマリーに書かれていないケースもたくさん発生するとなるとやばいですね。

ビッドには「ナチュラル」と「アーティフィシャル」の2つがあります。 初めは「ナチュラル」なビッドの意味を考えることができれば70%の状況に対応できるはずです。 そのために覚えるべきことは実は割と少ないです。 丁寧に整理していきましょう。

その上でビッドを言語化するのが大事です。例えば

「オープナー」のスートを「レイズ」したから「強さを主張していない」

というふうに整理されていくはずです。

ダミープレイで心折れないために

いや、普通の人間だと26枚のカード見せられていきなりかっこよくプレイできるはずないんですよ。 間違って当然です。 個人的に、ブリッジは間違って当然のゲームと思っています。 間違うことを恐れないで、それから学習すればいいと思います。

あと、プレイを言語化できるとだいぶ楽になります。プレイされたか確認すべきカードが明示的になるので。

ディフェンスで暇にならないために

まあもともと暇じゃないんですが。 一応シグナルというのがあります。 カードのプレイングによって絵札の有無とか枚数とかを伝えるやつです。 きっちり使えるとかっこいいので調べてみてください。

情報に困ったら

英語でググりましょう。Wikipediaも丁寧です。

1人でも遊びたい

FunBridgeが良いです。(50ボード無料。以降定期的に無料ボードが得られる)

Play bridge online for free with Funbridge

f:id:wass80:20181226073057p:plain

3人のCPUとブリッジが出来ます。

プレイ後に、同じボードをプレイした人と得点の比べ合いが出来ます。 つまり、デュプリケートブリッジが手軽に楽しめます。 プレイの練習や、ビッドの慣れには十分使えるのでおすすめです。 実はチュートリアルもあり、英語が読めるなら悪くない奴です。

人をブリッジに誘いたい

ビッディングボックスが超便利です。

Bridge bidding sequence.jpg
By KoeppiK - 投稿者自身による作品, CC 表示-継承 3.0, Link

ボドゲコンポーネントに興味を持ってもらえることがありますよね? そのノリで誘うといいと思います。 ただこれ、4400円とちょっとお高いんですよね‥ 写真の真ん中にあるボードとトランプを4セット買うと、合計でボドゲ2、3つ分の値段がします。高い

ボドゲ『ハイパーロボット』の(気の狂った)バリアントルール

ボドゲが好きなwass80です。

デジタルゲームでは難しいが、ボードゲームだと手軽にできることは何でしょうか。それはルールを改変することです。

今回はプログラマの間でそこそこ知名度のある『ハイパーロボット』において、サークルで生まれたバリアントルールを紹介します。

ハイパーロボットとは

  • 壁の書かれたボード
  • 4色のロボット
  • ロボットの内の1色の書かれたゴール地点
  • 砂時計(30秒?) を準備します。

f:id:wass80:20181225142704j:plain

  • ゴールの色のロボットがそのゴールに到達するのに何手かかるかを暗算します。
  • 1手とは任意のロボットを上下左右に動かすことです。壁かロボットにぶつかるまで途中で止まる事はできません。
  • 下の状態だと(おそらく)4手ということになります。

f:id:wass80:20181225142809j:plain

  • 求めたらその手数を宣言し、砂時計をひっくり返します。
  • 砂時計が落ちるまで、他の人も宣言が出来ます。
  • 砂時計が落ちたら、最も少ない宣言をより早くした人がその証明をします。
  • 証明に成功で1点です。失敗した場合、同じ手数で次に早く宣言した人、居なければ次に小さい手数を宣言した人に証明する権利が移ります。
  • 以上を繰り返し、最も得点の高い人が優勝です。

マルチロボット

  • ゴールを4色分出るまでめくり続けます。
  • 目的を「全部のゴールにすべてのロボットが同時に存在する」に変更します。

f:id:wass80:20181225143252j:plain

手数がかなり増えます。数えるだけでしんどい。 だいぶハードになるので、普通のロボットに飽きた人におすすめです。

天竺ロボット

  • 8枚のボードすべてを並べます。
  • 中央のボードのないところは通行不可です。
  • ボードの接続部分にあるもともと外側の壁だった部分は無視します。
  • ゴールとなる場所が複数ある場合は、ロボットの現在位置から任意の空間で遠い方をゴールとします。どちらもゴールとしても良いでしょう。
  • 本来内側の灰色の部分は写真とは逆で、外向きにするほうが楽しいマップになります。
  • 虹色のゴールはゴールの役割をやめ、ワープにすると良いです。ワープを踏むと0手で必ず反対側のワープに移動し、慣性を保存するように移動を続けます。

f:id:wass80:20181225143457j:plain

これはロボットの動きがめっちゃ伸びるので楽しいですね。 右回りか左回りか、どっちが早いかの直感がまず勝負どころになります。

ミニロボット

  • 1枚のボードだけ並べます

f:id:wass80:20181225143648j:plain

案外出来ます。

トーラスロボット

  • ロボットが外側の壁にぶつかった時、そこで止まらず反対側の壁から出現します。
  • ループして止まれない場合はその動きは不正です。

ワープするときに1行ずれたりしてめっちゃむずいです。

ミニトーラスロボットもおすすめです。

天竺マルチロボット

f:id:wass80:20181225143919j:plain

なんでこれサークルの人々サクサクプレイできるの?

マイクロロボット

マイクロロボット

SpreadSheetでトランザクションを管理してポーカー大会をした

この記事はSpreadsheets/Excel Advent Calendar 2018の最終日の記事です。

adventar.org

tl;dr

  • Google Spreadsheetにポーカーチップのやり取りを書く。
  • Google Apps Scriptでポーカーチップの変化とランキングをかっこよく出す。

f:id:wass80:20181222230118p:plain

ポーカー

ポーカーをご存知ですか?トランプゲームのやつです。日本で広く知られているのは5枚配られ、1回交換して、強い役を作って楽しむゲームです。または、1枚配ってのインディアン・ポーカーのほうが有名かもしれません。

海外において主流なのはテキサスホールデムポーカーです。 世界で最も賞金の高い大会としても知られています。 積み上がっているお札がやばい。 www.youtube.com

ポーカー大会

というわけでサークルでポーカー大会をすることにしました。 1日でやっても良かったのですが、2時間程度のテーブルを14日開催する形式にしました。

チップのやり取りの管理のために、Spreadsheetの力を借りました。 別の手の抜き方として、Firebaseを使うことも考えましたが、 やり取りの入力をするのが自分だけであることからOverkillな感じがしました。参加者も20人程度だったので大丈夫でしょう。

見た目

セキリュティーやプライバシーのためにサイトそのものの公開はしませんが、見た目はこんな感じです。

f:id:wass80:20181222231134p:plain

Spreadsheetそのものよりは遥かにかっこいいですね。 僕がSpreadsheetをいじることでこのサイトが自動で更新されます。

その下には個別のゲームの結果がずらずらと並びます。 f:id:wass80:20181222231316p:plain

トランザクションを手で書く

新しいシートを作り、トランザクションを手で書きます。 f:id:wass80:20181222231520p:plain

全体シートに1行追加して、シート名を書きます。 f:id:wass80:20181222231632p:plain

関数で頑張っているので、更新はこれで終わりです。 DBとしては正規化が効いていなくて最悪な感じもしますが、使い捨て&楽なので良しとします。

Apps script側

あまり真面目に解説はしません。デプロイなどの仕方は他の記事を見てください。割と力技です。自分だけが入力する以上、汚染されたデータが一切存在しないと考え、セキリュティーについては考えていません。

注意点としては、doGetで処理をするとレスポンスに時間がかかります。 そのため、データを取得するところは別の関数(getData)にして非同期に呼び出しましょう。

//コード.gs抜粋
function doGet() {
  return HtmlService
      .createTemplateFromFile('index')
      .evaluate();
}

function getData() {
  const db = getDB();
  const tbl = getTable(db, "Stack");
  const res = {};
  res.stack = [];
  for (var i = 1; i < tbl.length; i++){
    res.stack.push({user:tbl[i][0], stack:tbl[i][1]});
  }
  
  const tnms = tbl[0].slice(2, -1);
  res.tnms = []
  for (var i = 0; i < tnms.length; i++){
    var tnm = getTable(db, tnms[i]);
    res.tnms.push({name: tnms[i], desc: tnm[0][0], result: tnm.slice(2)});
  }
  Logger.log(res);
  return res;
}
//index.html抜粋
<script>
// The code in this function runs when the page is loaded.
$(function() {
  google.script.run.withSuccessHandler(show).getData();
});

function show(data) {
  const list = $('#ranking');
  const stack = data.stack.sort((a, b)=>b.stack - a.stack);
  for (var i = 0; i < stack.length; i++) {
    const c = Math.max(0, Math.floor((stack[i].stack - 1000) / 100));
    list.append(`<tr><td>${i + 1}`+
                    `<td>${stack[i].user}`+
                    `<td>${stack[i].stack}`+
                    `<td>${c}:${(new Array(1 + c)).join("🍫")}`);
  }
  const tlist = $("#tlist");
  for (let tnm of data.tnms) {
    let table = `<h3>${tnm.desc} (${tnm.name})</h3><table><tr><th>Rank<th>Name<th>Pay<th>Get`;
    const result = tnm.result;//.sort((a,b)=>b[2]-a[2]);
    for (var i = 0; i < result.length; i++) {
      table += `<tr><td>${i + 1}`+
                    `<td>${result[i][0]}`+
                    `<td>${result[i][1]}`+
                    `<td>${result[i][2]}`;
    }
    table += `</table>`
    tlist.append(table);
  }
}
</script>

この部分と、getDataの実装をすれば終わりでした。 とても手軽ですね。 最初に出てきたわけのわからないグラフも、Spreadsheetで作ったグラフを埋め込むだけです。楽ちん。

運営してみて

一番めんどくさいところはやはりトランザクションの入力です。 でもこれはそもそもどうしようもない手間です。 これ以上楽するためにはポーカーチップにチップ埋め込むしかないでしょう。

トランザクションの出入りが釣り合わないときに上にSum関数を書くだけでValidation出来たのはSpreadsheet様様という感じでした。

f:id:wass80:20181222233026p:plain

Slack

Apps Scriptなので、毎日スクリプトを走らせることが出来ます。 ついでにサークルのSlackに今日現在のランキングを流していました。 f:id:wass80:20181223000113p:plain

ところで、

ランキングに書かれていた🍫は、インセンティブでした。最終日がバレンタインデーだったわけです。 「max(0, floor((stack - 1000) / 100))チョコをwass80からプレゼント🍫」 という文言を終わり際になって用意しておきました。(初期stack = 1000)

最適戦略は全チップを他人に譲り渡してその人とチョコを分け合うことになります。もし起こったら悲しかったですが、そうはならなかったです。

これのために初めて人にチョコを包む経験をしました。 中身はフルタの安いけど美味しいチョコレートです。 人によっては外側の袋のほうが高い感じになります。 それでも、袋に包むとめっちゃ良いものに見えるのでおすすめです。 f:id:wass80:20181222233139p:plain

僕は19位/20人という結果に終わりました。精進が必要です。

次回予告

最近はコントラクトブリッジにハマっているので、次はデュプリケートブリッジの大会をしたいですね。 f:id:wass80:20181223020314p:plain

プライムポーカー 100枚セットA

プライムポーカー 100枚セットA