LoginSignup
11
2

TRICK2022(超絶技巧Ruby意味不明コンテスト for RubyKaigi)で金賞を獲得されたプログラム(Quine)を動かしてみました ーー 高校生向けプログラミング講座「福岡県Rubyキャンプ」にて

Last updated at Posted at 2022-11-13

はじめに

TRICK2022(超絶技巧Ruby意味不明コンテスト for RubyKaigi)で金賞を獲得されたプログラム(Quine)を動かしてみます。

動かしてみたきっかけとなったのは、福岡県Ruby・コンテンツビジネス振興会議さんと福岡県さんが主催された「高校生向けプログラミング講座「福岡県Rubyキャンプ」」にて、コーチとして参加したことです。詳しくは後述します。

TRICK2022(超絶技巧Ruby意味不明コンテスト for RubyKaigi)で金賞を獲得されたプログラム(Quine)を動かす

さっそく動かしてみます。
Dockerを使ってみます。

CMD
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"

動きましたよ :tada::tada::tada::tada::tada:

スクリーンショット 2022-11-14 8.16.30.png

:qiitan::qiitan::qiitan::qiitan::qiitan::qiitan::qiitan::qiitan::qiitan::qiitan:

高校生向けプログラミング講座「福岡県Rubyキャンプ」

私は、コーチとして参加しました。
このキャンプを主導するような立場ではなく、協力者の一人としてコーチに、名乗るほどのものでもないのですが、名乗りを挙げてキャンプの一部分に参加しました。
私の主な役割は、高校生といっしょにRubyのプログラミングを楽しむことです。
今回がはじめての取り組みで、第一回開催とのことです。

日程は、2022年の11月5日(土)、6日(日)と11月12日(土)、13日(日)の四日間で行われました。
約30名の高校生が自らの意思で参加を決めたそうです。

豪華なカリキュラムでした。
なんとまつもとゆきひろさんと九州工業大学の田中和明先生の講演付きです。
私は11月12日(土)と13日(日)に参加して高校生2人とともにRubyでプログラミングすることを楽しみました。

スクリーンショット 2022-11-14 9.30.58.png

コーチの方の講演のときに、TRICK2022(超絶技巧Ruby意味不明コンテスト for RubyKaigi)で金賞を獲得されたプログラム(Quine)の話が少しでてきたそうです。高校生から自分たちでも動かしてみたい!、ソースコードをみてみたい! とのことでしたので動かすことを楽しみました。

ソースコードにも技巧が含まれていました!

entry.rb
                               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局の取材がありました。

パラシュート部隊の斉藤優さんが取材にいらっしゃいました。
「いつもTVで見ています」とおそれ多くも声をかけさせていただきました。
芸能人の方、特有のアレ ーー やはりオーラがでていました。

RubyElixir

私の記事では、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.

完全に私見です。
ElixirRubyから一番色濃く影響を受けているのは、 A PROGRAMMER'S BEST FRIEND だとおもっています。A PROGRAMMER'S BEST FRIEND は、Rubyの公式ページの先頭のところに書いてあります。
Elixirにのめり込むと自然と海外の方との交流が増えます。出会う人がみな親切でジェントルマンです。国内のコミュニティもそうです。みなマヂでいい人ばっかりです。

スクリーンショット 2022-11-14 11.53.20.png

おわりに

TRICK2022(超絶技巧Ruby意味不明コンテスト for RubyKaigi)で金賞を獲得されたプログラム(Quine)を動かしてみました。

きっかけとなりましたのは、「高校生向けプログラミング講座「福岡県Rubyキャンプ」」に一コーチとして参加したことです。
高校生たちのますますの活躍が楽しみです。

11
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
2