trick2015 results

68

Upload: mametter

Post on 09-Jan-2017

15.369 views

Category:

Entertainment & Humor


0 download

TRANSCRIPT

Page 1: TRICK2015 results
Page 2: TRICK2015 results

• 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

Page 3: TRICK2015 results

!@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<<m=58).lines{|l|s=[128]*n=20E2t=0; h.map!{|v|d=?!==l[t]?1 :(l[t]== ?#)?0*v= 6:03(v<1 ?[]:0..n -1).each {|z|s[z] +=2*

M.sin(($*[0] ||1).to_f*M.sin(y= 40*(z+m)*2**(t/12E0)/463)+ y)*(v-z*d/n)};t+=1;v-d};m+= n;g.flush<<(s.pack"C*"); puts(l)}}};M=

Math);S=%:

begin with an easy program.you should be able to writea program unless for you,program in ruby language istoo difficult. At the endof your journey towards theultimate program; you mustbe a part of a programminglanguage. You will end ifyou != program

“Best pangram” by @kinaba

This prints each printable ASCII character exactly once.

This contains each printable ASCII character exactly once.

“Most readable” by @shinh

Non-sense poem

“Most classic” by @mametter

Music-box quine

Page 4: TRICK2015 results

• 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/

Page 5: TRICK2015 results
Page 6: TRICK2015 results

• Write the most Transcendental, Imbroglio Ruby program現世利益のない、意味不明な Ruby プログラムを書く

• Illustrate some of the subtleties (and design issues) of RubyRubyのある種の神秘性 (と仕様バグ) を明らかにする

• Show the robustness and portability of Ruby interpretersRuby 処理系の意外な堅牢性と移植性を示す

• Stabilize the spec of Ruby by the presence of valuable but unmaintainable codeメンテナンス不能だが価値あるコードを世に放つことで Ruby の仕様を安定化する

Page 7: TRICK2015 results

• 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 2005TRICK

2013, 2015

Page 8: TRICK2015 results

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.

Page 9: TRICK2015 results

• 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.

Page 10: TRICK2015 results

Yusuke Endoh (@mametter)

Koichiro Eto (@eto)

Shinichiro Hamaji (@shinh)

Yutaka Hara (@yhara)

Yukihiro Matsumoto (@yukihiro_matz)

Sun Park (@sunleonid)

Hirofumi Watanabe (@eban)

Page 11: TRICK2015 results

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

Page 12: TRICK2015 results

• A textbook of

Transcendental

Programming

– 超絶技巧プログラミングの入門書

– ¥2,680 + tax

– Buy it in the branch shop!

Page 13: TRICK2015 results
Page 14: TRICK2015 results
Page 15: TRICK2015 results
Page 16: TRICK2015 results
Page 17: TRICK2015 results
Page 18: TRICK2015 results
Page 19: TRICK2015 results

• TRICK 2015 became an international contest?

– Thank you for all the submitters!

JP

US

BEPL TW

JP

cf. TRICK 2013

(I’m using 3D pie charts here to obfuscate the precise number of submissions.)

Page 20: TRICK2015 results

• 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

Page 21: TRICK2015 results

• 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/

Page 22: TRICK2015 results
Page 23: TRICK2015 results

『最も手品で賞』 eto award

Page 24: TRICK2015 results

eto award

eval(%w{require'zlib';eval(Zlib: :Inflate.inflate('eJzNVt9zm0gMft+/QsfRAVrCYFw7TnrcTWauD/fW5zBch 9jrQGIDweBQ//jfT9Kubey0TqYvvX1YtJJW+lba/exJ2PtUhqPhVTC8oHnwSS6 TmXkXvlsL8QQ hTOBP8OEvqJJ8YvcduIZSCPMLhCISABAFLs4GnAwjdt9g7bnK2HbG/8Tsuy+s v8L+YrxuF7EQ c2wcueAhsQN9Fz66MHBh6MJlzMZdV+fYz7lXyaWsFlKIm31bIxihf+xioWgvC yMtBKhRtr5PE TUk1o/Y88qFKxb6WqBoykaAdlsGXp3N5cKbJ+U6GozIsH1pGGLY3iDe4sGSPT 48mc+HuzkUJK AD0wLYB04DBYcENG4iP2bDpnXh2waiFj5AgCi+HTn1Xnc6yjLSaMkQ03x4Cgz 6GOB3QLyHAC7 oMD9Mocp+FuQbggxfAKWrY+Z4PQxDiFv88 qPv+TQcYa5 QY01CCytgT+Bf6 DleXXxd4NJ CDmH1E0 63B/UFKW8P XntuIb15R7qtpQ JHt7Ps7vr6 bzmdJb X0Juprmysn9s pk/Ghbc8v x7hfNHQLyxmnlg mVpUAbFtd 89ryv51GSVtF YYS2W zVdh/chU2U1/ bMgjACifD 8pp8nwC74Ti/K6 MQCAI+240 LS4fqU2GqBkt N8tKT yThdbzIXHja6 vuY0quKow Ri4nwzeTO b3dRrjvgftU8 GHEHq 02AqZT1QOyTl ceHah5Uzm FLcEQaddl 1edhdEaW++hy HLbMJ ytoB2f7Va3Od pT24EuThnjp9VHoWNHZUbw5hctLzvys5JpUVZZ XoOZ8+H4hnGR g0vq JHUhCvo3pOn1tU Y1mTfX6G9O1YGVmhPck3pFSGtvXDR5bVut5e CtH8R8sd5jcSwO UKD nBRf9ka6wxUG5g V/HaVKtN+MNWrAx 9hhCdGgtpMb7qOB exUiRY4efSdnUC 3jk kOainhRN7U1nzS IlxWImZQm+5w9U X6dFBRlkOao8e6 5vAoLrMfYUiaxD A3s 6AGRjfsj0ik9eL xLoORI4MXfp9Dv mLkvtKOoYyOgMd R7BJCBncL4C5Ii Gfg bJK0XpAB2MzgLd /85oJEyJUclfaa f4r KMMf8FSZAAtBDuh T4KjGp9N1a8rbXv A68bCc5rNJC7/gMCHzQZK+C2EJ52pKNEtifQ/rFhrSVmUOj/HYubQq1RZ+ztr97p9PBzwbbi1L6LXHz6IbLNabP8D7Sdt6A=='.unpack('m')[0]))###^^^^--- FOLLOW THE BALL ###trick2015}*"")

Page 25: TRICK2015 results

• A main program is zlib-compressed and

Base64-encoded.

eto award

eval(%w{require'zlib';eval(

Zlib::Inflate.inflate('<main code in zlib in base64>'.unpack('m')[0]

))

}*"")

Page 26: TRICK2015 results

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

Page 27: TRICK2015 results

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}

Page 28: TRICK2015 results

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

Page 29: TRICK2015 results

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

Page 30: TRICK2015 results

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-25Criminal 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.1next __LINE__

ruby -v

'ruby 2.2.3p173 (2015-08-18 revision 51636) [x86_64-darwin14]'

1.2next __LINE__

ruby entry.rb

end

Page 31: TRICK2015 results

• 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.1next __LINE__

ruby -v

Page 32: TRICK2015 results

『良い時機で賞』 mame award

Page 33: TRICK2015 results

mame award

0.times{%w{2422-02-10T21:45:38+09:002580-06-19T08:53:09+09:002233-01-20T02:06:42+09:002535-06-28T10:04:32+09:002771-09-09T13:46:24+09:002478-04-17T02:50:28+09:003016-03-29T14:48:18+09:002358-03-06T12:25:34+09:002170-05-15T06:46:08+09:002365-05-11T19:00:00+09:002147-02-15T16:32:03+09:002500-02-13T23:15:21+09:002833-09-11T08:23:32+09:002431-03-03T09:48:37+09:002888-05-08T19:48:05+09:002098-12-09T19:37:41+09:002184-06-23T03:23:35+09:002289-12-20T01:21:04+09:002420-12-18T11:41:48+09:002922-08-26T03:58:58+09:002958-10-25T17:14:29+09:002260-10-29T11:18:23+09:002538-10-08T16:59:30+09:002765-03-10T15:17:18+09:003048-12-18T20:46:47+09:002238-03-12T21:38:38+09:002341-10-04T21:21:57+09:002136-05-29T03:39:48+09:002967-11-11T13:35:58+09:002751-11-28T05:17:41+09:002463-06-05T08:36:01+09:002375-04-30T18:11:29+09:002069-06-26T10:44:16+09:002876-12-06T18:46:16+09:00

"Back to the future?"

}}

GC.start

require'time';s = []; ObjectSpace.each_object{|u|s<<u}eval s.map{|a|(((t=Time.iso8601(a))>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:002967-11-11T13:35:58+09:002751-11-28T05:17:41+09:00 2463-06-05T08:36:01+09:002375-04-30T18:11:29+09:002069-06-26T10:44:16+09:002876-12-06T18:46:16+09:00

"Back to the future?"

Page 34: TRICK2015 results

• 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

Page 35: TRICK2015 results

『 賞』 matz award

Page 36: TRICK2015 results

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 dR<<self)end;def-@;T[:-,self]end;alias == equal?;def call i;Scheme.t self,i enddef to_a;[T[:*,self]]end;def c o;Array===o ?Scheme.l(o):o end;def each&b;b.(a)d&&d.each(&b)end},[],e=Struct.new(:t,:u){def[]=k,v;t[k]=v end;def[]i;t.fetch(i){u[i]}end},e[_h={}],[];def Object.const_missing i;i end;refine(Fixnum){def[]iT[self,T[i],1];end};module A; def -@;T[:-,T[self]];end;def call *a;a.empty?? T[self]:Scheme.t(self ,a[0])end;end;refine(Array){def call aT[self,T===a&&a.o ? a:T[a],1] end}; refine(Symbol){include A;def *iT[self,T[:*,T[i]]]end; def-i; Symbol===i ? :"#{self}-#{i}":T[self,T[:-,T[i]]]end;};at_exit{R.drop(K[ 0]=$0==__FILE__ ?0: 2).each{|l|v l}}refine(String){include A;}; refine( Object){def method_missing i,*s;a,=s;s.empty?? i:T[i,T===a&&a.o ? a:T[ a]]end};class<<self;def t s,i;T[s,Array===i ?T[i[0]]:T===i&&i.o ? i: T[i],1]end;def e f,n;f.map{|i|v i,n}[-1]end;def r x,f,n;->*a{e x.d. d,I[f ? Hash[f.zip a]:{},n]};enddef l v;v.reverse.inject(()){|a, i|T[i,a]};end;def v x,n=C;case xwhen 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.dbreak e x.a.d,n if:ELSE==x. a.a || v(x.a.a,n); end;when :DEFINESymbol===(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 elsef,*r=x.map{|i|v i,n};f. call(*r) end when Symbol;n[x]elsex;end;end;end;%w(PAIR? o T===o NOT o 0.!.==o SET-CDR! p,op.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==() CONSa,b T[a,b] APPLY f,*n,s f.(*(n+(s||[]).map.to_a)) EOF-OBJECT? o o==() LENGTH ll.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))

Page 37: TRICK2015 results

• 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 dR<<self)end;def-@;T[:-,self]end;alias == equal?;def call i;Scheme.t self,i enddef to_a;[T[:*,self]]end;def c o;Array===o ?Scheme.l(o):o end;def each&b;b.(a)d&&d.each(&b)end},[],e=Struct.new(:t,:u){def[]=k,v;t[k]=v end;def[]i;t.fetch(i){u[i]}end},e[_h={}],[];def Object.const_missing i;i end;refine(Fixnum){def[]iT[self,T[i],1];end};module A; def -@;T[:-,T[self]];end;def call *a;a.empty?? T[self]:Scheme.t(self ,a[0])end;end;refine(Array){def call aT[self,T===a&&a.o ? a:T[a],1] end}; refine(Symbol){include A;def *iT[self,T[:*,T[i]]]end; def-i; Symbol===i ? :"#{self}-#{i}":T[self,T[:-,T[i]]]end;};at_exit{R.drop(K[ 0]=$0==__FILE__ ?0: 2).each{|l|v l}}refine(String){include A;}; refine( Object){def method_missing i,*s;a,=s;s.empty?? i:T[i,T===a&&a.o ? a:T[ a]]end};class<<self;def t s,i;T[s,Array===i ?T[i[0]]:T===i&&i.o ? i: T[i],1]end;def e f,n;f.map{|i|v i,n}[-1]end;def r x,f,n;->*a{e x.d. d,I[f ? Hash[f.zip a]:{},n]};enddef l v;v.reverse.inject(()){|a, i|T[i,a]};end;def v x,n=C;case xwhen 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.dbreak e x.a.d,n if:ELSE==x. a.a || v(x.a.a,n); end;when :DEFINESymbol===(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 elsef,*r=x.map{|i|v i,n};f. call(*r) end when Symbol;n[x]elsex;end;end;end;%w(PAIR? o T===o NOT o 0.!.==o SET-CDR! p,op.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==() CONSa,b T[a,b] APPLY f,*n,s f.(*(n+(s||[]).map.to_a)) EOF-OBJECT? o o==() LENGTH ll.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 dR<<self)end;def-@;T[:-,self]end;alias == equal?;def call i;Scheme.t self,i enddef to_a;[T[:*,self]]end;def c o;Array===o ?Scheme.l(o):o end;def each&b;b.(a)d&&d.each(&b)end},[],e=Struct.new(:t,:u){def[]=k,v;t[k]=v end;def[]i;t.fetch(i){u[i]}end},e[_h={}],[];def Object.const_missing i;i end;refine(Fixnum){def[]iT[self,T[i],1];end};module A; def -@;T[:-,T[self]];end;def call *a;a.empty?? T[self]:Scheme.t(self ,a[0])end;end;refine(Array){def call aT[self,T===a&&a.o ? a:T[a],1] end}; refine(Symbol){include A;def *iT[self,T[:*,T[i]]]end; def-i; Symbol===i ? :"#{self}-#{i}":T[self,T[:-,T[i]]]end;};at_exit{R.drop(K[ 0]=$0==__FILE__ ?0: 2).each{|l|v l}}refine(String){include A;}; refine( Object){def method_missing i,*s;a,=s;s.empty?? i:T[i,T===a&&a.o ? a:T[ a]]end};class<<self;def t s,i;T[s,Array===i ?T[i[0]]:T===i&&i.o ? i: T[i],1]end;def e f,n;f.map{|i|v i,n}[-1]end;def r x,f,n;->*a{e x.d. d,I[f ? Hash[f.zip a]:{},n]};enddef l v;v.reverse.inject(()){|a, i|T[i,a]};end;def v x,n=C;case xwhen 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.dbreak e x.a.d,n if:ELSE==x. a.a || v(x.a.a,n); end;when :DEFINESymbol===(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 elsef,*r=x.map{|i|v i,n};f. call(*r) end when Symbol;n[x]elsex;end;end;end;%w(PAIR? o T===o NOT o 0.!.==o SET-CDR! p,op.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==() CONSa,b T[a,b] APPLY f,*n,s f.(*(n+(s||[]).map.to_a)) EOF-OBJECT? o o==() LENGTH ll.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 interpreterA comment

ignored

Scheme-likeRuby DSL

NormalScheme code

As Ruby As Scheme

Page 38: TRICK2015 results

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

Page 39: TRICK2015 results

shinh award

lines = Array.newopen(__FILE__) do |fl|fl.each_line{|line|lines.push(line)

}m=15+15n=62$e = lines.map do|ln|sz = ln.size

;(sz<5?sz+m:sz+n).chr().swapcase

end.join$eeval "#$e"

end

Page 40: TRICK2015 results

• 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

Page 41: TRICK2015 results

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

Page 42: TRICK2015 results

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 lit( ?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 ] ]

Page 43: TRICK2015 results

• 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]

Page 44: TRICK2015 results
Page 45: TRICK2015 results

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

Page 46: TRICK2015 results

• One liner

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

Page 47: TRICK2015 results

• 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

Page 48: TRICK2015 results

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

Page 49: TRICK2015 results

class String;def[]*a;$*<<a;b;end;end;_=0;z="C=Fiber;s=$*;a=*0..8;l=C.new{exit},*a.product(a).select{|r,c|s[r][c]==0}."[1,9,_, _,_,8, _,_,5]+"map{|r,c|C.ne"[_,_,2, _,5,_, _,8,9]+"w{o=s[r][c];l"[8,_,6, 7,4,_, _,_,_]+"oop{(1..9).map{|n|C.yield(s[r][c]=n)if a.none?{|k|"[_,_,_, _,_,4, _,9,2]+"s[r][k]==n||s"[_,2,3, _,7,_, 8,1,_]+"[k][c]==n||s["[5,6,_, 8,_,_, _,_,_]+"r-r%3+k%3][c-c%3+k/3]==n}};s[r][c]=o;C.yield}}},C."[_,_,_, _,2,7, 9,_,3]+"new{loop{puts"[9,3,_, _,8,_, 1,_,_]+" s.map{|r|r*'"[2,_,_, 5,_,_, _,4,8]+" '}<<'';C.yield}};c=l[i=1];loop{c=l[i+=c.resume ? 1:-1]}";eval z.tr ?¥n,''

class String;def[]*a;$*<<a;b;end;end;_=0;z="C=Fiber;s=$*;a=*0..8;l=C.new{exit},*a.product(a).select{|r,c|s[r][c]==0}."[1,9,_, _,_,8, _,_,5]+"map{|r,c|C.ne"[_,_,2, _,5,_, _,8,9]+"w{o=s[r][c];l"[8,_,6, 7,4,_, _,_,_]+"oop{(1..9).map{|n|C.yield(s[r][c]=n)if a.none?{|k|"[_,_,_, _,_,4, _,9,2]+"s[r][k]==n||s"[_,2,3, _,7,_, 8,1,_]+"[k][c]==n||s["[5,6,_, 8,_,_, _,_,_]+"r-r%3+k%3][c-c%3+k/3]==n}};s[r][c]=o;C.yield}}},C."[_,_,_, _,2,7, 9,_,3]+"new{loop{puts"[9,3,_, _,8,_, 1,_,_]+" s.map{|r|r*'"[2,_,_, 5,_,_, _,4,8]+" '}<<'';C.yield}};c=l[i=1];loop{c=l[i+=c.resume ? 1:-1]}";eval z.tr ?¥n,''

Page 50: TRICK2015 results

• 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;$*<<a;b;end

code="pri"[1, 2, 3]+"nt 1"code="print 1"

$*=[[1, 2, 3]]

String#b≒ self

Page 51: TRICK2015 results

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

Page 52: TRICK2015 results

;; ;; ;; ;;;; ;; ;; ;;

;;eval$s =%q[i=1#eval(%q[ xxxxxxxx

xx xxxx xx xx xxxx xxxx xxxx xx xx xxxx xx

xxxxxxxx xxxxxxxxxxxxxxxx xxxxxxxx

xx xx xxxxxxxxxx xx xxxxxxxxj, 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.shixft ||b;r.gsub!(?;){p.slice!0}if $xf| |=p>p=p.center(i*i+j*j,?;);r ,x

s=[s,r]if(i*j<0);(b*i.abs+s).ljxust(r.size).gsub(b){r[$`.size]|x

|b}}unti l$ f;puts(t)# xx xxxxxxxxxx xx xxxxxxxxxx xx xx

xxxxxxxx xxxxxxxxxxxxxxxx xxxxxxxxxx xxxx xx xx xxxx xxxx xxxx xx xx xxxx xx

xxxxxxxx x].gsub¥/x.*|¥s/ ,"")#];;;; ;; ;; ;;;; ;; ;; ;;

Page 53: TRICK2015 results

• 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

Page 54: TRICK2015 results

• 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,";")

;; ;;;;

;;;;

;;;;

;;;;

;;;;;;;;

;;;;

;; ;;;; ;;

;;;;;;;;;;;;;;;;;; ;;;; ;;

;; ;;;; ;;

;;;;;;;;;;;;;;;;;; ;;;; ;;;; ;;;; ;;

;;;;;;;;;;;;;;;;;; ;;;; ;;

Page 55: TRICK2015 results

『最も読めない で賞』

Page 56: TRICK2015 results

• One liner with a lot of percents

%%%while eval '_=%%r%%(.)...¥1=%%=~[%%%%,,,,,%%%s ?=]*%%%%%%#"]*%%%%3x+1?%%'.% %%",%*p(_||=eval($**%%%))

Page 57: TRICK2015 results

• 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

算術論理演算装置

103 5 16 8 4 2 1

Page 58: TRICK2015 results

• 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

Page 59: TRICK2015 results

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

Page 60: TRICK2015 results

big, temp = Array 100000000**0x04e2srand bigalias $curTerm $initTerm

NumericInterrupt

big += bigprintout _pi_ finish if $neverinit ||= big$counter ||= 02

…snip…

Page 61: TRICK2015 results

• 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

Page 62: TRICK2015 results

• 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 1p srand 2 #=> 1p srand 3 #=> 2p srand 4 #=> 3

srand

Page 63: TRICK2015 results

• 77 tokens are essential.

• 165 tokens are just no-op fillers.

• The blowup ratio:

EnumerableFixnumBignumMathComplexComparableTrueClassDirEncodingData

An example of fillers

165+77

77≈ 3.14

Page 64: TRICK2015 results

• The winners who are here, come to the stage.

– You have a right to earn applause

• 受賞者でご臨席の方は、前に集まってください

– 拍手喝采をどうぞ

Page 65: TRICK2015 results

• 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

Page 66: TRICK2015 results

“Best piphilology”

– kinaba

“Most unreadable ALU”

– Keisuke Nakano

“Doubling amphisbaena award”

– monae

“Least general solver” – Benoit Daloze

“Most general solver” – Keisuke Nakano

4th

5th

Page 67: TRICK2015 results

• 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)

Page 68: TRICK2015 results

• 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/