はじめに
TRICK2022(超絶技巧Ruby意味不明コンテスト for RubyKaigi)で金賞を獲得されたプログラム(Quine)を動かしてみます。
動かしてみたきっかけとなったのは、福岡県Ruby・コンテンツビジネス振興会議さんと福岡県さんが主催された「高校生向けプログラミング講座「福岡県Rubyキャンプ」」にて、コーチとして参加したことです。詳しくは後述します。
先月、TRICK2022(超絶技巧Ruby意味不明コンテスト for RubyKaigi)で金賞をとってきたプログラム(Quine)です。
— ぺん! (@tompng) October 18, 2022
全てのフレームが、魚達がその場所から泳ぎを再開する実行可能なRubyのコードになっています。
魚・水草・泡でコードの一部が欠落していますが、誤り訂正により復元しています。 pic.twitter.com/vQsGG5o7Of
TRICK2022(超絶技巧Ruby意味不明コンテスト for RubyKaigi)で金賞を獲得されたプログラム(Quine)を動かす
さっそく動かしてみます。
Dockerを使ってみます。
git clone https://github.com/tric/trick2022.git
cd trick2022/01-tompng
docker pull ruby:3.1.0-alpine3.15
docker run --rm -v $PWD:/app ruby:3.1.0-alpine3.15 sh -c "cd /app && bundle install && bundle exec ruby entry.rb"
動きましたよ
高校生向けプログラミング講座「福岡県Rubyキャンプ」
私は、コーチとして参加しました。
このキャンプを主導するような立場ではなく、協力者の一人としてコーチに、名乗るほどのものでもないのですが、名乗りを挙げてキャンプの一部分に参加しました。
私の主な役割は、高校生といっしょにRubyのプログラミングを楽しむことです。
今回がはじめての取り組みで、第一回開催とのことです。
日程は、2022年の11月5日(土)、6日(日)と11月12日(土)、13日(日)の四日間で行われました。
約30名の高校生が自らの意思で参加を決めたそうです。
豪華なカリキュラムでした。
なんとまつもとゆきひろさんと九州工業大学の田中和明先生の講演付きです。
私は11月12日(土)と13日(日)に参加して高校生2人とともにRubyでプログラミングすることを楽しみました。
コーチの方の講演のときに、TRICK2022(超絶技巧Ruby意味不明コンテスト for RubyKaigi)で金賞を獲得されたプログラム(Quine)の話が少しでてきたそうです。高校生から自分たちでも動かしてみたい!、ソースコードをみてみたい! とのことでしたので動かすことを楽しみました。
ソースコードにも技巧が含まれていました!
eval((s=%~c=(0..35
).map{s[2*_1+1]}*'';class$Inte
ger;def$quXinclude(Math ;spXo(a)=self*
a.pow(87X=h=32.chr;g=PI/480;ls=(sp*31X,89)%89;
def$abX+'eval((s=%'+(n=? .next)+s*88.chr+[nXs()=[a
=self%X+'.split(',sp*25+'?'+88.chr+');(0..36).mapX89,89-
a].miX{s[2*_1].split}',sp*31+".join.tr('$',$/)))"]*$/)Xn;end
;reqX.split$/;trap(:INT){puts;exit};q=->t,i{a,y=((t+i*99)Xuire
'matrX%960). ivmod(80);[(a*(7+i)+i*23)%79+(y+a)/(5+i%4)%2,39Xix';1
5.tiX-y/2]};p=->t,u{a=->b,c{(0..5).sum{(u%2-1)*E**(t*(b+c*_1)*gXmes{
|i,*X.i+ i*u+=5+sin(u*u))}};x,z=a[5,3]. 5,3].rect;x+=y.Xv|z=
*?!Xi a[19,4];z+=w;r=(4+(x.abs+z.i).ab };t=(0..959).fX..?
W,?Xind{|t|(0..29).all?{x,y=q[t,_1];(x 2||h=ls[y][x]X[,*
?]..X[/[^!-}]/]}};h=($**h+h).chr;eval( []} ->(x,yX?};a
=(0X,a,b){x=x*36+39.5;y=19.5-y*18;b*=1 |i|((yX..1
34)X-b).ceil..y+b).map{|j|((x-i)/a+(y j)/ .times{X.ma
p{zXx,z=p[t,_1];l=u```=0;while``````(l<1)``; u+```=0 ;d=x-y;X.in
dex(Xl+=(d.abs+(z-w``)``.i).ab``s*1.``1 ;x``,z=y``,w;o[v``=``x.r d.imag/Xc[i+
15*Xd.abs*l*sin(2*``l-t``*g*80``-_1) l*(``1-l)/``6,a``=l*( -l)**2*0.X_1]
)};X7,a*2]&&o[v,z,``0.0``3,l**`` ``times``{|i``|(8+i).times{|Xw=*
MatXj|o[sin(i)/2+````` ```sin( `/2.0`````````)*j/200,j*0.0Xrix
[*(X5-1,0.02,0.1]``}} ``. q[t,``_1];m``[y][x]= };i=-X0..
44).X1;$><<(['%%','[H .map{|j|(0..79).map{|k|x=(Xmap{
|i,X -39.5)/35.8;y=( i+=1;m[j][k]?h:c[i]):ls[j]X*b|
v<<X[k];}*''}*$/<<0) 1)%9 te"`")#qv.jSaL{=;q(Q}4fXa.z
ip(Xjs(:#tK`Jm))FKO /A9(2'%iorvf7 eEa0uV xv+Q@qUU](L@&Py .1v'X0..
).suXydSEH{-GI|-5(,z G5evpq,[b50 D[ t {on,I?VStS`?G@LoqFCXm{|j
,k|Xj1.QnxKz!mH%o# )b2Seut,]! 48 lBieJGi 5jeNPD#b}H3X-(p
=(iXaVz#8*+US,hgF 5#6]y-` 4hy HN hF75WjD!0IxJ$sX+k)
.powX+UP"cNUE9- G< tHvV;Ib <-s U T ? vlE xylg=x#X(i+k
,88)XV9u$9lKb9 @C do7+-w >l { v9 { P l ga%]AK<e&'X+1)*
(j||(X4ifK/6S+ k} @@*a} 6rS xn"Q[M 8 `|g>$#BrjXb<<p;
0))}XtbDp'Kc t2 Dat9C s C rL+ g,j]Tf B< eMI+zzkWX;b}]
.lup.XtVP<ak IM E/+)B jwv uB (Twqed D* dyf_dT7Xsolve
(v);13Xn:8 #_ RiSTO, [Fk m O]O#"+ a_ cT_.X5.time
s{c[i+X e5 T`FBEC q*f 2 o@{a<eUG aW PX15*_1]
=z[a[_1]X z_@`nll 7F1 2 [=^uS0z^ 6X||w.shif
t]}};eval(Xfg K#R N bp-E_Xc)~.split(
?X);(0..36).map{s[2*_1].split}
.join.tr('$',$/)))
感心したこと
高校生向けプログラミング講座「福岡県Rubyキャンプ」の最後に、参加した高校生一人ひとりから感想を述べてもらうコーナーがありました。
おおよそ 2/3の高校生が、家で引き続きRubyをやってみよう! とおっしゃっていました。
将来が楽しみです。
パラシュート部隊の斉藤優さんが取材にいらっしゃる!
高校生向けプログラミング講座「福岡県Rubyキャンプ」の様子は、TV局の取材がありました。
合同庁舎で知っトクふくおかロケ pic.twitter.com/fPYcGiWcFs
— パラシュート部隊斉藤優 (@nisijinboy) November 13, 2022
パラシュート部隊の斉藤優さんが取材にいらっしゃいました。
「いつもTVで見ています」とおそれ多くも声をかけさせていただきました。
芸能人の方、特有のアレ ーー やはりオーラがでていました。
RubyとElixir
私の記事では、Elixirのことを必ず触れることにしています。
iex> "Elixir" |> String.graphemes() |> Enum.frequencies()
%{"E" => 1, "i" => 2, "l" => 1, "r" => 1, "x" => 1}
iex> "A PROGRAMMER'S BEST FRIEND" |> String.graphemes() |> Enum.frequencies()
%{
" " => 3,
"'" => 1,
"A" => 2,
"B" => 1,
"D" => 1,
"E" => 3,
"F" => 1,
"G" => 1,
"I" => 1,
"M" => 2,
"N" => 1,
"O" => 1,
"P" => 1,
"R" => 4,
"S" => 2,
"T" => 1
}
Elixirの作者José Valimさんは、Elixirを作る上で影響を受けた言語にRubyを挙げられています。
José Valim - Cognicast Episode 120
The main, the top three influences are Erlang, Ruby, and Clojure.
完全に私見です。
ElixirがRubyから一番色濃く影響を受けているのは、 A PROGRAMMER'S BEST FRIEND だとおもっています。A PROGRAMMER'S BEST FRIEND は、Rubyの公式ページの先頭のところに書いてあります。
Elixirにのめり込むと自然と海外の方との交流が増えます。出会う人がみな親切でジェントルマンです。国内のコミュニティもそうです。みなマヂでいい人ばっかりです。
おわりに
TRICK2022(超絶技巧Ruby意味不明コンテスト for RubyKaigi)で金賞を獲得されたプログラム(Quine)を動かしてみました。
きっかけとなりましたのは、「高校生向けプログラミング講座「福岡県Rubyキャンプ」」に一コーチとして参加したことです。
高校生たちのますますの活躍が楽しみです。