CodeJP 2016に参加しました #codejp
ここの記事が最近「CodeJP」参加ログにしか使われてない事実。
というわけでCodeJP 2016に参加しました。今回は完全参加者側として参加してます。
きっと、運営とか参加者様の方々が綺麗にまとめてくださると思うので主に会場でやったことと「こんな美味しそうなものを食えるぞ」アピール。 個人的にこの料理と温泉入りに来るのが目的になりつつありますね。
コードを書いてないダイジェスト
おー動いとる動いとる#codejp pic.twitter.com/IxcM15c0kN
— 所詮その程度筒天@団体一名様 (@tututen) August 6, 2016
お昼!#codejp pic.twitter.com/tqJNWLfY3Q
— 所詮その程度筒天@団体一名様 (@tututen) August 7, 2016
はじめに
今回主イベントで「コードゴルフ」がなかったので、もくもく会と称して「ずんどこきよし」のショートコーディングに主に取り組んでいました。
レギュレーションとか特に決めてないです。うちの中では、ランダムにずんどこ取得してとりあえず「ずんずんずんどこ」ってきたら「きよし!」って表示出来たらOKみたいな感じにしてます。
成果が主にこちら↓
JavaScript版
動作ページ
コード
!function(){n=1;for(s='1',l='';s.indexOf('100001')==-1;s+=Math.random()*2|0,l+=['ずん','どこ'][s[n++]|0]);alert(l+'き・よ・し!')}()#codejp
— 所詮その程度筒天@団体一名様 (@tututen) August 7, 2016
!function(){n=1;for(s='1',l='';s.indexOf('100001')==-1;s+=Math.random()*2|0,l+=['ずん','どこ'][s[n++]|0]);alert(l+'き・よ・し!')}()
解説にならない解説(箇条書き)
- 「ずん」と「どこ」を「0」と「1」とする
- ランダムで0と1を出力して文字列sとして連結する。0か1を判定して文字列lを連結しておく
- 連結してる文字列に「100001」のパターンが出てくるまでループを回す
- ループを抜けたら、文字列lと一緒に「き・よ・し!」をつけてalertで出力する
Python版
動作ページ
コード
import random as r;s=''.join([r.choice(['zun','doko'])for _ in range(100000)]);print s[:s.find('zun'*4+'doko')+16]+'KIYOSHI!'#codejp
— 所詮その程度筒天@団体一名様 (@tututen) August 7, 2016
import random as r;s=''.join([r.choice(['zun','doko'])for _ in range(100000)]);print s[:s.find('zun'*4+'doko')+16]+'KIYOSHI!'
解説にならない解説(箇条書き)
- 「zun」と「doko」を random.choice を使用して、100,000個の要素のリストを作成
- 空文字で連結し巨大な文字列を作る、その中で
'zun'*4+'doko' (zunzunzunzundoko)
となってる場所を探す - 場所を見つけたら
find位置+len('zunzunzunzundoko') → s.find('zun'*4+'doko')+16
の場所から切り捨てて、末尾に'KIYOSHI!'
をつけて出力
その他の「ずんどこ」(並びは順不同)
Swift (@sandinist さん 作)
PowerShell (@stknohg さん 作)
asm (yohgamiさん 作)
JavaScript (@albatrosaryさん 作)
感想
普段Pythonの方が書いてるのに、Pythonの1ライナーってなるだけでここまで苦労するとは思わんかった。JavaScript側は毎年培ったコードゴルフ力の賜物でしたね。次回までにPythonの1ライナー力を養っておきたい。
おまけ(まだまだ続くよJavaScript)
うちのコードを改造
@tututen 「!function(){ ... }()」で囲う必要orルールでしたっけ?「n=1;...;alert(l+'き・よ・し!')」でも動きますよね?
— jsakamoto (@jsakamoto) 2016年8月8日
@jsakamoto 何となく慣習でつけてしまってますねぇ…。前々回、前々々回はなんか必要だったのでつけてた感じです。特に今回レギュレーションないので動くならそれでもOKじゃないでしょうか!
— 所詮その程度筒天@団体一名様 (@tututen) 2016年8月8日
熟成は必要だと思いました。
— 所詮その程度筒天@団体一名様 (@tututen) 2016年8月8日
(指摘+追加アップデート)
for(s='1',l='';s.indexOf('100001')==-1;s+=n=Math.random()*2|0,l+=['ずん','どこ'][n]);alert(l+'き・よ・し!')#codejp
サーモン師匠のより短いコードを編み出せたのでドヤ顔で投稿しようとした寸前に、さらに短いコードが生み出されてた orz 私のコードはお蔵入り。 #codejp https://t.co/hxIg5kHBpB
— jsakamoto (@jsakamoto) 2016年8月8日
@tututen とはいえ少しだけコメすると「indexOf」の代わりに「endsWith」使って「for(s='1',l='';!s.endsWith('00001');...」でいけるかも?
— jsakamoto (@jsakamoto) 2016年8月8日
@jsakamoto おーなるほど、そんな関数があるんですね!
— 所詮その程度筒天@団体一名様 (@tututen) 2016年8月8日
ずんの数が4以上でいいならその判定でもうちょい短くなりますねー。4つと固定するなら、判定用文字列の先頭1が必要かなぁと思います。
@tututen あれ、手続き型で逐次処理されるから大丈夫かと思いましたが、なんかボケてるかな自分。てか、逆にもし自分正しければ「for(s='1';..」は「for(s='';...」でいいですね (番兵要らない)。
— jsakamoto (@jsakamoto) 2016年8月8日
@jsakamoto ただ、短くなるのは確実なのでいいっすね。短くしたというコードもみてみたいです!
— 所詮その程度筒天@団体一名様 (@tututen) 2016年8月8日
- この辺りから
「ずん」が4つ続いて「どこ」が来たら
という条件にこだわらず「ずん」が4つ以上続いて「どこ」が来たら
という方針でいいかとなりました。
@tututen 師匠の最終コードをベースに少しだけいじって「s=l='';for(;!s.endsWith('00001');s+=n=Math.random()*2|0,l+=['ずん','どこ'][n]);alert(l+'き・よ・し!')」まで短くなった。
— jsakamoto (@jsakamoto) 2016年8月8日
@jsakamoto 最初の初期化はfor中じゃだめっすかね?出来るなら1Byte削れるんですが
— 所詮その程度筒天@団体一名様 (@tututen) 2016年8月8日
s=l='';for(;
↓
for(s=l='';
@tututen そのとおりです。while と比較してたときのコードのまま忘れてたのに気がつきました。
— jsakamoto (@jsakamoto) 2016年8月8日
@jsakamoto なるほど、では現状バイト数一緒ですねー。関数宣言+再帰がそれで動くのを初めてしりました!
— 所詮その程度筒天@団体一名様 (@tututen) 2016年8月8日
@jsakamoto さんのコードを改造
サーモン師匠のより短いコードを編み出せたのでドヤ顔で投稿しようとした寸前に、さらに短いコードが生み出されてた orz 私のコードはお蔵入り。 #codejp https://t.co/hxIg5kHBpB
— jsakamoto (@jsakamoto) 2016年8月8日
@tututen 勝てなかったコードは「f=(s,l)=>s.endsWith('00001')?alert(l+'き・よ・し!'):(r=Math.random()*2|0,f(s+r,l+['ずん','どこ'][r]));f('','')」です。
— jsakamoto (@jsakamoto) 2016年8月8日
@jsakamoto 最短ではないすけど、ちょっと短くなりましたよ的な。
— 所詮その程度筒天@団体一名様 (@tututen) 2016年8月8日
f=(l,s)=>s.endsWith('00001')?alert(l+'き・よ・し!'):f(l+['ずん','どこ'][r=Math.random()*2|0],s+r);f('','')
@tututen ああ、そうか、「[r=Math.random()*2|0]」ですね。こういうインライン展開がなかなかパッと出てこない (歯ぎしり
— jsakamoto (@jsakamoto) 2016年8月8日