Slide 1

Slide 1 text

No content

Slide 2

Slide 2 text

• A contest for “esoteric” Ruby programming – i.e., a Ruby version of IOCCC – TRICK 2015 is the second contest Transcendental /ˌtransɛnˈdɛnt(ə)l/ “relating to a spiritual realm” * 「霊的領域に関する」 「世俗を超越した」「超絶技巧」 Imbroglio /ɪmˈbrəʊlɪəʊ/ “an extremely confused, complicated, or embarrassing situation” * 「極めて混乱した、恥ずかしい事態」 * according to Oxford Dictionaries

Slide 3

Slide 3 text

!@THEqQUICKbBROWNfFXjJMPSvVLAZYDGgkyz&[%r{¥"}mosx, 4>6]|?'while(putc 3_0-~$.+=9/2^5;)<18*7and:`# eval$C=%q(at_exit{ open("/dev/dsp","wb"){|g|h=[0]*80 $><<"¥s"*18+"eval$C=%q(#$C);S=%:" (S<

Slide 4

Slide 4 text

• Announces the winners of TRICK 2015 – And demonstrates each winning entries • The winning entries will be published at: No k! http://github.com/tric /trick2015/

Slide 5

Slide 5 text

No content

Slide 6

Slide 6 text

• Write the most Transcendental, Imbroglio Ruby program 現世利益のない、意味不明な Ruby プログラムを書く • Illustrate some of the subtleties (and design issues) of Ruby Ruby のある種の神秘性 (と仕様バグ) を明らかにする • Show the robustness and portability of Ruby interpreters Ruby 処理系の意外な堅牢性と移植性を示す • Stabilize the spec of Ruby by the presence of valuable but unmaintainable code メンテナンス不能だが価値あるコードを世に放つことで Ruby の仕様を 安定化する

Slide 7

Slide 7 text

• IOCCC: International Obfuscated C Code Contest • UCC: Underhanded C Contest • OPC: Obfuscated Perl Contest • IORCC: International Obfuscated Ruby Code Contest 1990 1995 2000 2005 2010 2015 C Perl Ruby 1985 IOCCC 1984-present UCC 2005-present OPC 1996-2000 IORCC 2005 TRICK 2013, 2015

Slide 8

Slide 8 text

1. Your entry must be a complete Ruby program. 2. The size of your program must be <= 4096 bytes in length. The number of non-space characters must be <= 2048. The total size of your compressed submission must be less than ten megabyte in size. 3. You can submit multiple entries, and your team may consist of any number of members. 4. The entirety of your entry must be submitted under MIT License. 5. Your entry must bring the judges a surprise, excitement, and/or laughter.

Slide 9

Slide 9 text

• MRI 2.2 is recommended. – Other implementations like JRuby are also allowed. • You can use a gem library. – We expect such entries to be much more interesting. – Abusing gem to get around the size limit is discouraged. • The judges would prefer more stoic, more portable, and/or more funny entries. • You are encouraged to examine the previous winners of TRICK and IOCCC. • Do not include your identity in your program. – The judges will keep all entries anonymous during judgment.

Slide 10

Slide 10 text

Yusuke Endoh (@mametter) Koichiro Eto (@eto) Shinichiro Hamaji (@shinh) Yutaka Hara (@yhara) Yukihiro Matsumoto (@yukihiro_matz) Sun Park (@sunleonid) Hirofumi Watanabe (@eban)

Slide 11

Slide 11 text

eto – Media Artist. – Chairman at NicoNicoGakkai Beta. shinh – The admin of anarchy golf. – IOCCC winner. yhara – The author of Japanese esolang book. matz – The creator of Ruby. leonid – The 1st super Ruby golfer. eban – The 2nd super Ruby golfer. – The world’s No.1 IOCCC player. – Advocate for Transcendental programming. mame

Slide 12

Slide 12 text

• A textbook of Transcendental Programming – 超絶技巧プログラミングの 入門書 – ¥2,680 + tax – Buy it in the branch shop!

Slide 13

Slide 13 text

No content

Slide 14

Slide 14 text

No content

Slide 15

Slide 15 text

No content

Slide 16

Slide 16 text

No content

Slide 17

Slide 17 text

No content

Slide 18

Slide 18 text

No content

Slide 19

Slide 19 text

• TRICK 2015 became an international contest? – Thank you for all the submitters! JP US BE PL TW JP cf. TRICK 2013 (I’m using 3D pie charts here to obfuscate the precise number of submissions.)

Slide 20

Slide 20 text

• Evaluated each entry with score 1..10. • Selected 12 entries. – Top 5 awards: best entries by average score. – 7 Judges’ awards: entries of each judge’s best score • The judges are allowed to submit their works. – Of course, the author does not evaluate his own entry. – In TRICK 2013, the judges won 5 awards out of 10. – Good News: The judges could win just one award in this conest. 5th 4th

Slide 21

Slide 21 text

• From here, this talk has a lot of spoilers! – Exit now if you want to enjoy analyzing the winners. • The winning entries will be published at: No k! http://github.com/tric /trick2015/

Slide 22

Slide 22 text

No content

Slide 23

Slide 23 text

『最も手品で賞』 eto award

Slide 24

Slide 24 text

eto award eval(%w{require'zlib';eval(Zlib: :Inflate.inflate('eJzNVt9zm0gMf t+/QsfRAVrCYFw7TnrcTWauD/fW5zBch 9jrQGIDweBQ//jfT9Kubey0TqYvvX1Y tJJW+lba/exJ2PtUhqPhVTC8oHnwSS6 TmXkXvlsL8QQ hTOBP8OEvqJJ8YvcduIZSCPMLhCISA BAFLs4GnAwjdt9g7bnK2HbG/8Tsuy+s v8L+YrxuF7EQ c2wcueAhsQN9Fz66MHBh6MJlzMZdV+ fYz7lXyaWsFlKIm31bIxihf+xioWgvC yMtBKhRtr5PE TUk1o/Y88qFKxb6WqBoykaAdlsGXp3 N5cKbJ+U6GozIsH1pGGLY3iDe4sGSPT 48mc+HuzkUJK AD0wLYB04DBYcENG4iP2bDpnXh2wai Fj5AgCi+HTn1Xnc6yjLSaMkQ03x4Cgz 6GOB3QLyHAC7 oMD9Mocp+FuQbggxfAKWrY+Z4PQxDi Fv88 qPv+TQcYa5 QY01CCytgT+Bf6 DleXXxd4NJ CDm H1E0 63B/UFKW8P XntuIb15R7qtpQ JHt7Ps7vr6 bzm dJb X0Juprmysn9s pk/Ghbc8v x7hfNHQLyxmnlg mVpUAbFtd 89ryv51GSVtF YY S2W zVdh/chU2U1/ bMgjACifD 8pp8nwC74Ti/K6 MQCAI+240 LS4fqU2GqBkt N8 tKT yThdbzIXHja6 vuY0quKow Ri4nwzeTO b3dRrjvgftU8 GH EHq 02AqZT1QOyTl ceHah5Uzm FLcEQaddl 1edhdEaW++hy HL bMJ ytoB2f7Va3Od pT24EuThnjp9VHoWNHZUbw5hctLzvys5JpUVZZ XoOZ8+H4hnGR g0 vq JHUhCvo3pOn1tU Y1mTfX6G9O1YGVmhPck3pFSGtvXDR5bVut5e CtH8R8sd5jcSwO U KD nBRf9ka6wxUG5g V/HaVKtN+MNWrAx 9hhCdGgtpMb7qOB exUiRY4efSdnUC 3 jk kOainhRN7U1nzS IlxWImZQm+5w9U X6dFBRlkOao8e6 5vAoLrMfYUiaxD A 3s 6AGRjfsj0ik9eL xLoORI4MXfp9Dv mLkvtKOoYyOgMd R7BJCBncL4C5Ii G fg bJK0XpAB2MzgLd /85oJEyJUclfaa f 4r KMMf8FSZAAtBDuh T4KjGp9N1a8rbXv A 68bCc5rNJC7/gMCHzQZK+C2EJ52pKNEtifQ/rFhrSVmUOj/HYubQq1RZ+ztr97p9PBzwbbi1L6LXHz6 IbLNabP8D7Sdt6A=='.unpack('m')[0]))###^^^^--- FOLLOW THE BALL ###trick2015}*"")

Slide 25

Slide 25 text

• A main program is zlib-compressed and Base64-encoded. eto award eval(%w{ require'zlib'; eval( Zlib::Inflate.inflate( ''. unpack('m')[0] ) ) }*"")

Slide 26

Slide 26 text

『最もふぞろいで賞』 leonid award

Slide 27

Slide 27 text

leonid award p (?¥A-p + ?¥B-p + ?¥C-p + ?¥D-p + ?¥E-p + …snip… ?¥X-p + ?¥Y-p + ?¥Z-p).b .tr 'A-Z', ('_')/~0 BEGIN{class Object ; def -(o)self end;alias/ -end}

Slide 28

Slide 28 text

• is a one-character string literal • Do you know escape sequences and ? • @leonid’s comment – “Not sure how I would comment on it, since the code by itself is pretty straightforward on what it's supposed to do.” leonid award p "¥C-a" #=> "¥x01” p "¥C-b" #=> "¥x02” p "¥C-c" #=> "¥x03” p "¥M-a" #=> "¥xE1” p "¥M-b" #=> "¥xE2” p "¥M-c" #=> "¥xE3” ¥M-X ¥C-X ?X p ?A #=> "A" p ?¥n #=> "¥n"

Slide 29

Slide 29 text

『最高のドキュメント賞』 eban award

Slide 30

Slide 30 text

eban award Description from Ky. ---------- What if $1 and under junk games take over the world. It would makes you crazy. We must fight against the future and will soon launch a new fantastic action game named TRICK!!! Demo ---------- 2020-03-25 Criminal 1 :: There he is! Kill the traitor. Agent 1 :: Cover the man until 006 and 007 rescue us. Agent 2 :: Okay. Come here! Criminal 2 :: You must die if you bother us. How to Get Demo Started if not for path in ENV - The command shows ruby version like this: 1.1 next __LINE__ ruby -v 'ruby 2.2.3p173 (2015-08-18 revision 51636) [x86_64-darwin14]' 1.2 next __LINE__ ruby entry.rb end

Slide 31

Slide 31 text

• A polyglot of Ruby and Markdown! – Invalid code is skipped in various ways. – Similar to the Silver award of the previous contest, but this is more clever. eban award Description from Ky. ---------- What if $1 and under junk games take over the world. … Criminal 1 :: There he is! Kill the traitor. Agent 1 :: Cover the man until 006 and 007 rescue us. 1.1 next __LINE__ ruby -v

Slide 32

Slide 32 text

『良い時機で賞』 mame award

Slide 33

Slide 33 text

mame award 0.times{%w{ 2422-02-10T21:45:38+09:00 2580-06-19T08:53:09+09:00 2233-01-20T02:06:42+09:00 2535-06-28T10:04:32+09:00 2771-09-09T13:46:24+09:00 2478-04-17T02:50:28+09:00 3016-03-29T14:48:18+09:00 2358-03-06T12:25:34+09:00 2170-05-15T06:46:08+09:00 2365-05-11T19:00:00+09:00 2147-02-15T16:32:03+09:00 2500-02-13T23:15:21+09:00 2833-09-11T08:23:32+09:00 2431-03-03T09:48:37+09:00 2888-05-08T19:48:05+09:00 2098-12-09T19:37:41+09:00 2184-06-23T03:23:35+09:00 2289-12-20T01:21:04+09:00 2420-12-18T11:41:48+09:00 2922-08-26T03:58:58+09:00 2958-10-25T17:14:29+09:00 2260-10-29T11:18:23+09:00 2538-10-08T16:59:30+09:00 2765-03-10T15:17:18+09:00 3048-12-18T20:46:47+09:00 2238-03-12T21:38:38+09:00 2341-10-04T21:21:57+09:00 2136-05-29T03:39:48+09:00 2967-11-11T13:35:58+09:00 2751-11-28T05:17:41+09:00 2463-06-05T08:36:01+09:00 2375-04-30T18:11:29+09:00 2069-06-26T10:44:16+09:00 2876-12-06T18:46:16+09:00 "Back to the future?" }} GC.start require'time';s = []; ObjectSpace.each_object{|u|s<Time.now)? t.to_i: $')rescue nil}.compact.sort.uniq.map{|t|(t&0xff).chr}. join# Quoted from "Back to the Future Part III (1990)" 2136-05-29T03:39:48+09:00 2967-11-11T13:35:58+09:00 2751-11-28T05:17:41+09:00 2463-06-05T08:36:01+09:00 2375-04-30T18:11:29+09:00 2069-06-26T10:44:16+09:00 2876-12-06T18:46:16+09:00 "Back to the future?"

Slide 34

Slide 34 text

• A message is encoded as a time sequence 1. Sorts the time sequence 2. Converts each time to an integer as UNIX time 3. Prints the integers as ASCII characters • This program is a nice demonstration that Ruby doesn’t suffer from “the Year 2038 problem.” mame award

Slide 35

Slide 35 text

『 賞』 matz award

Slide 36

Slide 36 text

matz award '(#|'.b;module Scheme;T,R,I,C,K=Struct.new(:a,:d,:o){include Enumerable# |#)#| def initialize x,y=(),o=0.!;super c(x),c(y),o;K.empty?&&(R.delete a;R.delete d R<*a{e x.d. d,I[f ? Hash[f.zip a]:{},n]};end def l v;v.reverse.inject(()){|a, i|T[i,a]};end;def v x,n=C;case x when T;case x.a when :LAMBDA;r x,x.d.a,n when :LET; e={}; x.d. a.each{|i|e[i.a]=v i.d.a,n};e x.d.d,I[e,n];when :IF;v(v(x.d. a,n)?x.d.d.a: (y=x.d.d.d)?y. a : (),n);when :COND; while x=x.d break e x.a.d,n if:ELSE==x. a.a || v(x.a.a,n); end;when :DEFINE Symbol===(u=x.d.a) ?(n[u]= v x.d.d. a,n):(n[u.a]=r x,u.d,n);when :QUOTE;d=x.d.a;d==true ? :TRUE:(d== false)?:FALSE:d else f,*r=x.map{|i|v i,n};f. call(*r) end when Symbol;n[x]else x;end;end;end;%w(PAIR? o T===o NOT o 0.!.==o SET-CDR! p,o p.d=o LIST *s l(s) CAR p p.a NUMBER? o Numeric===o SET-CAR! p,o p.a=o ERROR *s fail(s*"¥s") READ * t="using(Scheme);"*1;begin;gets&&eval(¥ t<<($_!=$/?$_:x),TOPLEVEL_BINDING);rescue(Object);retry;end NULL? o o==() CONS a,b T[a,b] APPLY f,*n,s f.(*(n+(s||[]).map.to_a)) EOF-OBJECT? o o==() LENGTH l l.to_a.size SYMBOL? o Symbol===o EQ? a,b a.equal?b DISPLAY o puts(o) CDR p p.d * *s s.inject:* - *s s.inject:- MAP p,l l(l.map(&p)) STRING? o o.is_a?(String) MIN *s s.min).each_slice(3){|t|eval'_h[:"%s"]=->%s{%s}'%t}end;using Scheme# |# (DEFINE (FACT N) . ( (IF (EQ? N . (1)) . ( 1 [* N . ((FACT (- N . (1))))])))) (DISPLAY (FACT 6)) (DEFINE (FACT N) . ( (IF (EQ? N . (1)) . ( 1 [* N . ((FACT (- N . (1))))])))) (DISPLAY (FACT 6))

Slide 37

Slide 37 text

• A polyglot of Ruby and Scheme matz award '(#|'.b;module Scheme;T,R,I,C,K=Struct.new(:a,:d,:o){include Enumerable# |#)#| def initialize x,y=(),o=0.!;super c(x),c(y),o;K.empty?&&(R.delete a;R.delete d R<*a{e x.d. d,I[f ? Hash[f.zip a]:{},n]};end def l v;v.reverse.inject(()){|a, i|T[i,a]};end;def v x,n=C;case x when T;case x.a when :LAMBDA;r x,x.d.a,n when :LET; e={}; x.d. a.each{|i|e[i.a]=v i.d.a,n};e x.d.d,I[e,n];when :IF;v(v(x.d. a,n)?x.d.d.a: (y=x.d.d.d)?y. a : (),n);when :COND; while x=x.d break e x.a.d,n if:ELSE==x. a.a || v(x.a.a,n); end;when :DEFINE Symbol===(u=x.d.a) ?(n[u]= v x.d.d. a,n):(n[u.a]=r x,u.d,n);when :QUOTE;d=x.d.a;d==true ? :TRUE:(d== false)?:FALSE:d else f,*r=x.map{|i|v i,n};f. call(*r) end when Symbol;n[x]else x;end;end;end;%w(PAIR? o T===o NOT o 0.!.==o SET-CDR! p,o p.d=o LIST *s l(s) CAR p p.a NUMBER? o Numeric===o SET-CAR! p,o p.a=o ERROR *s fail(s*"¥s") READ * t="using(Scheme);"*1;begin;gets&&eval(¥ t<<($_!=$/?$_:x),TOPLEVEL_BINDING);rescue(Object);retry;end NULL? o o==() CONS a,b T[a,b] APPLY f,*n,s f.(*(n+(s||[]).map.to_a)) EOF-OBJECT? o o==() LENGTH l l.to_a.size SYMBOL? o Symbol===o EQ? a,b a.equal?b DISPLAY o puts(o) CDR p p.d * *s s.inject:* - *s s.inject:- MAP p,l l(l.map(&p)) STRING? o o.is_a?(String) MIN *s s.min).each_slice(3){|t|eval'_h[:"%s"]=->%s{%s}'%t}end;using Scheme# |# (DEFINE (FACT N) . ( (IF (EQ? N . (1)) . ( 1 [* N . ((FACT (- N . (1))))])))) (DISPLAY (FACT 6)) '(#|'.b;module Scheme;T,R,I,C,K=Struct.new(:a,:d,:o){include Enumerable# |#)#| def initialize x,y=(),o=0.!;super c(x),c(y),o;K.empty?&&(R.delete a;R.delete d R<*a{e x.d. d,I[f ? Hash[f.zip a]:{},n]};end def l v;v.reverse.inject(()){|a, i|T[i,a]};end;def v x,n=C;case x when T;case x.a when :LAMBDA;r x,x.d.a,n when :LET; e={}; x.d. a.each{|i|e[i.a]=v i.d.a,n};e x.d.d,I[e,n];when :IF;v(v(x.d. a,n)?x.d.d.a: (y=x.d.d.d)?y. a : (),n);when :COND; while x=x.d break e x.a.d,n if:ELSE==x. a.a || v(x.a.a,n); end;when :DEFINE Symbol===(u=x.d.a) ?(n[u]= v x.d.d. a,n):(n[u.a]=r x,u.d,n);when :QUOTE;d=x.d.a;d==true ? :TRUE:(d== false)?:FALSE:d else f,*r=x.map{|i|v i,n};f. call(*r) end when Symbol;n[x]else x;end;end;end;%w(PAIR? o T===o NOT o 0.!.==o SET-CDR! p,o p.d=o LIST *s l(s) CAR p p.a NUMBER? o Numeric===o SET-CAR! p,o p.a=o ERROR *s fail(s*"¥s") READ * t="using(Scheme);"*1;begin;gets&&eval(¥ t<<($_!=$/?$_:x),TOPLEVEL_BINDING);rescue(Object);retry;end NULL? o o==() CONS a,b T[a,b] APPLY f,*n,s f.(*(n+(s||[]).map.to_a)) EOF-OBJECT? o o==() LENGTH l l.to_a.size SYMBOL? o Symbol===o EQ? a,b a.equal?b DISPLAY o puts(o) CDR p p.d * *s s.inject:* - *s s.inject:- MAP p,l l(l.map(&p)) STRING? o o.is_a?(String) MIN *s s.min).each_slice(3){|t|eval'_h[:"%s"]=->%s{%s}'%t}end;using Scheme# |# (DEFINE (FACT N) . ( (IF (EQ? N . (1)) . ( 1 [* N . ((FACT (- N . (1))))])))) (DISPLAY (FACT 6)) DSL interpreter A comment ignored Scheme-like Ruby DSL Normal Scheme code As Ruby As Scheme

Slide 38

Slide 38 text

『最も壊れやすいで賞』 shinh award

Slide 39

Slide 39 text

shinh award lines = Array.new open(__FILE__) do |fl| fl.each_line{|line| lines.push(line) } m=15+15 n=62 $e = lines. map do|ln| sz = ln.size ; (sz<5?sz+m:sz+n). chr().swapcase end.join $e eval "#$e" end

Slide 40

Slide 40 text

• Another Ruby program is hidden in “line lengths” – Even changing the indent breaks this program! – BTW: We kind of knew the author was a committer since it works only on ruby trunk. shinh award lines = Array.new open(__FILE__) do |fl| fl.each_line{|line| lines.push(line) 18 23 22 21 puts"……" p +62 u +62 t +62 s +62

Slide 41

Slide 41 text

『一番綺麗な模様で賞』 yhara award

Slide 42

Slide 42 text

yhara award -> ( &_ ) { _ [ _ , ?e + ?v + ?a + ?l , q = ?e + ?v + ?a + ?l + ?( + ?d + ?[ + ?1 + ?9 + ?, + ?9 + ?9 + ?9 + ?] + ?* + ?" + ?" + ?) ] }[ &(s , *d = %I{ #{ ?s + ?e + ?n + ?d } -> ( &_ ) { _ [ _ , ?e + ?v + ?a + ?l , q = a= d[ 0, 19 ]; ;b =q .c ha rs .m ap {| _| b& &a << ?+ ;a << ?? +_ ;b |= 1} ;a += %q !] X} [X &( sX ,X *d X= X% I{ X# {X ?s X+ X? e X +X ?n X+ X? dX }X !. sp li t( ?X )+ d+ "} X) X[ X0 X] X] ". sp li t( ?X ); pu ts (a .m ap (& :t o_ s) .p ac k( "A 6" *a .s iz e) .u np ac k" A6 1" *1 9) #T RI CK } ) [ 0 ] ]

Slide 43

Slide 43 text

• Problem: no room to write “eval”! • Key idea to solve – Abuse of symbol array literal • Detailed solution – This margin is too narrow to explain. – Read Chapter 6 of mame’s book! • shinh discovered the same technique independently  yhara award p %I{ foo bar } #=> [:foo, :bar]

Slide 44

Slide 44 text

No content

Slide 45

Slide 45 text

『最も汎用的なソルバで賞』

Slide 46

Slide 46 text

• One liner _='s %sSATISFIABLE';puts eval$<.read.gs ub(/.*p.*?(¥d+).*?$|¥d+/m){$1?%w[?-+'=- '=~/#{'(-?)'* }-*=(?=]*$1:$&>?0?"¥¥#$&$ |":'$)(?='}+‘)/x?[_%p%i=0,[*$~].map{|x| x>?-?:v:eval(x+?1)*i-=1}*" "]:_%:UN'

Slide 47

Slide 47 text

• SAT solver in 194 bytes! Finds an assignment to satisfy a given Boolean formula* • Implementation trick – Converts a given formula to Regexp matching problem s.t. the matching is possible iff the formula is satisfiable. x and !y x=true, y=false x and !x UNSATISFIABLE input output * must be in conjunctive normal form

Slide 48

Slide 48 text

『最も汎用的でないソルバで賞』

Slide 49

Slide 49 text

class String;def[]*a;$*<

Slide 50

Slide 50 text

• All-solution Sudoku solver • A magic for mixing data and code • Nicely demonstrates a use case of Fiber – Elegant and hard to understand, at the same time! class String;def[]*a;$*<

Slide 51

Slide 51 text

『倍増するアンフィスバエナ賞』

Slide 52

Slide 52 text

;; ;; ;; ;; ;; ;; ;; ;; ;;eval$s =%q[i=1# eval(%q[ xxxxxxxx xx xxxx xx xx xxxx xx xx xxxx xx xx xxxx xx xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx xx xx xxxxxxxxxx xx xxxxxxxx j, t, p=0,[?;]," ev al$s=%qx [#$s]".split*"";i,j,t=i-j,i+j,(x [b=?¥s]*j.abs+t).map{|s|r=t.shix ft ||b;r.gsub!(?;){p.slice!0}if $x f| |=p>p=p.center(i*i+j*j,?;);r ,x s=[s,r]if(i*j<0);(b*i.abs+s).ljx ust(r.size).gsub(b){r[$`.size]|x |b}}unti l$ f;puts(t)# xx xx xxxxxxxx xx xxxxxxxxxx xx xx xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx xx xxxx xx xx xxxx xx xx xxxx xx xx xxxx xx xxxxxxxx x].gsub¥ /x.*|¥s/ ,"")#];; ;; ;; ;; ;; ;; ;; ;; ;;

Slide 53

Slide 53 text

• The author’s remarks: • Amphisbaena(アンフィスバエナ) – “A mythical serpent with a head at each end” * > geminum caput amphisbaenae, hoc est et a cauda, > tamquam parum esset uno ore fundi venenum. > aliis squamas esse, aliis picturas, omnibus exitiale virus. > > — GAIUS PLINIUS SECUNDUS, Naturalis Historia 8.85.1 * according to Oxford Dictionaries

Slide 54

Slide 54 text

• Cute string construction • @shinh’s comment: – “The code seems concise.” • @yhara’s favorite piece of code if $f ||= p > p = p.center(i*i+j*j,";") ;; ;; ;; ;; ;; ;; ;; ;; ;; ;;;; ;;;; ;; ;; ;; ;; ;; ;; ;;;;;;;; ;;;;;;;; ;; ;; ;; ;; ;; ;; ;; ;; ;;;;;;;; ;;;;;;;; ;; ;;;; ;; ;; ;;;; ;; ;;;;;;;; ;;;;;;;; ;; ;; ;; ;;

Slide 55

Slide 55 text

『最も読めない で賞』

Slide 56

Slide 56 text

• One liner with a lot of percents %%%while eval '_=%%r%%(.).. .¥1=%%=~[%%%%,,,,,%%%s ?=] *%%%%%%#"]*%%%%3x+1?%%'.% % %",%*p(_||=eval($**%%%))

Slide 57

Slide 57 text

• Collatz sequence calculator – if n is even, n = n / 2 – if n is odd, n = 3n+1 • Example: starting with n = 3 Collatz conjecture: Any n will eventually boil down to 1. • How is the program great? – It uses no integer arithmetic, no branch. ALU: Arithmetic Logic Unit 算術論理演算装置 10 3 5 16 8 4 2 1

Slide 58

Slide 58 text

• Example: How to branch if N is even or not – Note: This is more simplified than the original code. – Integer arithmetic is even more complicated. [ ", ", ", ", ]; …even… #"]; …odd… ", ×N [ ", ", ", ]; …even… #"]; …odd… String Comment String

Slide 59

Slide 59 text

『最高の円周率ポエムで賞』

Slide 60

Slide 60 text

big, temp = Array 100000000**0x04e2 srand big alias $curTerm $initTerm Numeric Interrupt big += big printout _pi_ finish if $never init ||= big $counter ||= 02 …snip…

Slide 61

Slide 61 text

• Piphilology(円周率覚え歌) – A sentence to memorize the first digits of π – A famous example • The program does the same by using Ruby tokens – Note: lexical tokens ≠ space-separated units Yes I have a number 3 1 4 1 6 . ≈ π big , temp = Array 100000000 ** 0x04e2 3 1 4 1 5 . 9 2 6

Slide 62

Slide 62 text

• Abuse “alias” of global variables – to access the same value from token of different length • “ ” is a storage! – It returns the previous seed. – It can be used as a latch. – An assignment always requires one-length token “=”. alias $curTerm $initTerm srand 1 p srand 2 #=> 1 p srand 3 #=> 2 p srand 4 #=> 3 srand

Slide 63

Slide 63 text

• 77 tokens are essential. • 165 tokens are just no-op fillers. • The blowup ratio: Enumerable Fixnum Bignum Math Complex Comparable TrueClass Dir Encoding Data An example of fillers 165+77 77 ≈ 3.14

Slide 64

Slide 64 text

• The winners who are here, come to the stage. – You have a right to earn applause • 受賞者でご臨席の方は、前に集まってください – 拍手喝采をどうぞ

Slide 65

Slide 65 text

• yhara award: “Most beautiful pattern”–Shinichiro Hamaji • shinh award: “Most fragile” – NAKAMURA Usaku • matz award: “Matz Lisp award” – Kazuki Tsujimoto • mame award: “Most timely” – Koichi Sasada • eban award: “Best document” – yoshi-taka • eto award: “Most illusionistic” – Don Yang • leonid award: “Most inconsistent” – Koichi Sasada

Slide 66

Slide 66 text

“Best piphilology” – kinaba “Most unreadable ALU” – Keisuke Nakano “Doubling amphisbaena award” – monae “Least general solver” – Benoit Daloze “Most general solver” – Keisuke Nakano 4th 5th

Slide 67

Slide 67 text

• Dishonor: the title of “insane” • Top five entries will be checked into the Ruby official repository in “sample” directory – Ruby 2.3.0 will have them (perhaps)

Slide 68

Slide 68 text

• The winning entries will be published soon at: • Thank you for all participants! • See you in the next TRICK 201X! No k! http://github.com/tric /trick2015/