TRICK2015 results

M
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
!@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=20E2
t=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 write
a program unless for you,
program in ruby language is
too difficult. At the end
of your journey towards the
ultimate program; you must
be a part of a programming
language. You will end if
you != 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
• 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/
TRICK2015 results
• 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 の仕様を
安定化する
• 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
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.
• 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.
Yusuke Endoh (@mametter)
Koichiro Eto (@eto)
Shinichiro Hamaji (@shinh)
Yutaka Hara (@yhara)
Yukihiro Matsumoto (@yukihiro_matz)
Sun Park (@sunleonid)
Hirofumi Watanabe (@eban)
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
• A textbook of
Transcendental
Programming
– 超絶技巧プログラミングの
入門書
– ¥2,680 + tax
– Buy it in the branch shop!
TRICK2015 results
TRICK2015 results
TRICK2015 results
TRICK2015 results
TRICK2015 results
TRICK2015 results
• 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.)
• 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
• 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/
TRICK2015 results
『最も手品で賞』 eto award
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}*"")
• 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]
)
)
}*"")
『最もふぞろいで賞』 leonid award
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}
• 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"
『最高のドキュメント賞』 eban award
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
• 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
『良い時機で賞』 mame award
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<<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: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?"
• 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
『 賞』 matz award
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<<self)end;def-@;T[:-,self]end;alias == equal?;def call i;Scheme.t self,i end
def 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[]i
T[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 a
T[self,T===a&&a.o ? a:T[a],1] end}; refine(Symbol){include A;def *i
T[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]};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))
• 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<<self)end;def-@;T[:-,self]end;alias == equal?;def call i;Scheme.t self,i end
def 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[]i
T[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 a
T[self,T===a&&a.o ? a:T[a],1] end}; refine(Symbol){include A;def *i
T[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]};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<<self)end;def-@;T[:-,self]end;alias == equal?;def call i;Scheme.t self,i end
def 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[]i
T[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 a
T[self,T===a&&a.o ? a:T[a],1] end}; refine(Symbol){include A;def *i
T[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]};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
『最も壊れやすいで賞』 shinh award
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
• 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
『一番綺麗な模様で賞』 yhara award
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 ] ]
• 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]
TRICK2015 results
『最も汎用的なソルバで賞』
• 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'
• 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
『最も汎用的でないソルバで賞』
class String;def[]*a;$*<<a;b;end;end;
_=0;z="C=Fiber;s=$*;a=*0..8;l=C.new{e
xit},*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.non
e?{|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{loo
p{puts"[9,3,_, _,8,_, 1,_,_]+" s.map{
|r|r*'"[2,_,_, 5,_,_, _,4,8]+" '}<<''
;C.yield}};c=l[i=1];loop{c=l[i+=c.res
ume ? 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{e
xit},*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.non
e?{|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{loo
p{puts"[9,3,_, _,8,_, 1,_,_]+" s.map{
|r|r*'"[2,_,_, 5,_,_, _,4,8]+" '}<<''
;C.yield}};c=l[i=1];loop{c=l[i+=c.res
ume ? 1:-1]}";eval z.tr ?¥n,''
• 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
『倍増するアンフィスバエナ賞』
;; ;; ;; ;;
;; ;; ;; ;;
;;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/ ,"")#];;
;; ;; ;; ;;
;; ;; ;; ;;
• 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
• 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,";")
;; ;;
;;
;;
;;
;;
;;
;;
;;
;;;;
;;;;
;;
;;
;; ;;
;; ;;
;;;;;;;;
;;;;;;;;
;; ;;
;; ;;
;; ;;
;; ;;
;;;;;;;;
;;;;;;;;
;; ;;;; ;;
;; ;;;; ;;
;;;;;;;;
;;;;;;;;
;; ;;
;; ;;
『最も読めない で賞』
• One liner with a lot of percents
%%%while eval '_=%%r%%(.)..
.¥1=%%=~[%%%%,,,,,%%%s ?=]
*%%%%%%#"]*%%%%3x+1?%%'.% %
%",%*p(_||=eval($**%%%))
• 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
• 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
『最高の円周率ポエムで賞』
big, temp = Array 100000000**0x04e2
srand big
alias $curTerm $initTerm
Numeric
Interrupt
big += big
printout _pi_ finish if $never
init ||= big
$counter ||= 02
…snip…
• 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
• 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
• 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
• The winners who are here, come to the stage.
– You have a right to earn applause
• 受賞者でご臨席の方は、前に集まってください
– 拍手喝采をどうぞ
• 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
“Best piphilology”
– kinaba
“Most unreadable ALU”
– Keisuke Nakano
“Doubling amphisbaena award”
– monae
“Least general solver” – Benoit Daloze
“Most general solver” – Keisuke Nakano
4th
5th
• 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)
• 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/
1 of 68

Recommended

TRICK2013 Results by
TRICK2013 ResultsTRICK2013 Results
TRICK2013 Resultsmametter
6.3K views57 slides
iSoligorsk #3 2013 by
iSoligorsk #3 2013iSoligorsk #3 2013
iSoligorsk #3 2013Friedrich Boeckh
911 views57 slides
Ruby is an Acceptable Lisp by
Ruby is an Acceptable LispRuby is an Acceptable Lisp
Ruby is an Acceptable LispAstrails
2.4K views85 slides
IJTC%202009%20JRuby by
IJTC%202009%20JRubyIJTC%202009%20JRuby
IJTC%202009%20JRubytutorialsruby
305 views31 slides
Concurrency in Python by
Concurrency in PythonConcurrency in Python
Concurrency in PythonMosky Liu
1.3K views108 slides
Minimal MVC in JavaScript by
Minimal MVC in JavaScriptMinimal MVC in JavaScript
Minimal MVC in JavaScriptMosky Liu
2.7K views88 slides

More Related Content

What's hot

An Introduction to Go by
An Introduction to GoAn Introduction to Go
An Introduction to GoCloudflare
797 views37 slides
Graph-Tool in Practice by
Graph-Tool in PracticeGraph-Tool in Practice
Graph-Tool in PracticeMosky Liu
8.2K views102 slides
JavaScript Survival Guide by
JavaScript Survival GuideJavaScript Survival Guide
JavaScript Survival GuideGiordano Scalzo
6K views143 slides
Mirah Talk for Boulder Ruby Group by
Mirah Talk for Boulder Ruby GroupMirah Talk for Boulder Ruby Group
Mirah Talk for Boulder Ruby Groupbaroquebobcat
694 views76 slides
Dtrace и немного магии by
Dtrace и немного магииDtrace и немного магии
Dtrace и немного магииDan Kruchinin
735 views73 slides
Meetup di Gruppo Game Jam Roma - Giorgio Pomettini - Codemotion Rome 2018 by
Meetup di Gruppo Game Jam Roma - Giorgio Pomettini - Codemotion Rome 2018Meetup di Gruppo Game Jam Roma - Giorgio Pomettini - Codemotion Rome 2018
Meetup di Gruppo Game Jam Roma - Giorgio Pomettini - Codemotion Rome 2018Codemotion
175 views134 slides

What's hot(20)

An Introduction to Go by Cloudflare
An Introduction to GoAn Introduction to Go
An Introduction to Go
Cloudflare797 views
Graph-Tool in Practice by Mosky Liu
Graph-Tool in PracticeGraph-Tool in Practice
Graph-Tool in Practice
Mosky Liu8.2K views
Mirah Talk for Boulder Ruby Group by baroquebobcat
Mirah Talk for Boulder Ruby GroupMirah Talk for Boulder Ruby Group
Mirah Talk for Boulder Ruby Group
baroquebobcat694 views
Dtrace и немного магии by Dan Kruchinin
Dtrace и немного магииDtrace и немного магии
Dtrace и немного магии
Dan Kruchinin735 views
Meetup di Gruppo Game Jam Roma - Giorgio Pomettini - Codemotion Rome 2018 by Codemotion
Meetup di Gruppo Game Jam Roma - Giorgio Pomettini - Codemotion Rome 2018Meetup di Gruppo Game Jam Roma - Giorgio Pomettini - Codemotion Rome 2018
Meetup di Gruppo Game Jam Roma - Giorgio Pomettini - Codemotion Rome 2018
Codemotion175 views
Elegant concurrency by Mosky Liu
Elegant concurrencyElegant concurrency
Elegant concurrency
Mosky Liu723 views
Migrating To Ruby1.9 by tomaspavelka
Migrating To Ruby1.9Migrating To Ruby1.9
Migrating To Ruby1.9
tomaspavelka372 views
Why TypeScript? by FITC
Why TypeScript?Why TypeScript?
Why TypeScript?
FITC3.9K views
Alfresco the clojure way by Carlo Sciolla
Alfresco the clojure wayAlfresco the clojure way
Alfresco the clojure way
Carlo Sciolla2.2K views
Shibuyajs Digest by takesako
Shibuyajs DigestShibuyajs Digest
Shibuyajs Digest
takesako100.5K views
Effective ES6 by Teppei Sato
Effective ES6Effective ES6
Effective ES6
Teppei Sato52.2K views
Learning Python from Data by Mosky Liu
Learning Python from DataLearning Python from Data
Learning Python from Data
Mosky Liu2.4K views
Cranking Floating Point Performance To 11 On The iPhone by Noel Llopis
Cranking Floating Point Performance To 11 On The iPhoneCranking Floating Point Performance To 11 On The iPhone
Cranking Floating Point Performance To 11 On The iPhone
Noel Llopis4K views
P6 OO vs Moose (&Moo) by lichtkind
P6 OO vs Moose (&Moo)P6 OO vs Moose (&Moo)
P6 OO vs Moose (&Moo)
lichtkind1.6K views
Introduction to Ruby, Rails, and Ruby on Rails by Simon Bagreev
Introduction to Ruby, Rails, and Ruby on RailsIntroduction to Ruby, Rails, and Ruby on Rails
Introduction to Ruby, Rails, and Ruby on Rails
Simon Bagreev629 views

Viewers also liked

Practical Testing of Ruby Core by
Practical Testing of Ruby CorePractical Testing of Ruby Core
Practical Testing of Ruby CoreHiroshi SHIBATA
16.6K views51 slides
Ruby で高速なプログラムを書く by
Ruby で高速なプログラムを書くRuby で高速なプログラムを書く
Ruby で高速なプログラムを書くmametter
34.2K views71 slides
The worst Ruby codes I’ve seen in my life - RubyKaigi 2015 by
The worst Ruby codes I’ve seen in my life - RubyKaigi 2015The worst Ruby codes I’ve seen in my life - RubyKaigi 2015
The worst Ruby codes I’ve seen in my life - RubyKaigi 2015Fernando Hamasaki de Amorim
16.3K views141 slides
Plugin-based software design with Ruby and RubyGems by
Plugin-based software design with Ruby and RubyGemsPlugin-based software design with Ruby and RubyGems
Plugin-based software design with Ruby and RubyGemsSadayuki Furuhashi
7.9K views78 slides
Rhebok, High Performance Rack Handler / Rubykaigi 2015 by
Rhebok, High Performance Rack Handler / Rubykaigi 2015Rhebok, High Performance Rack Handler / Rubykaigi 2015
Rhebok, High Performance Rack Handler / Rubykaigi 2015Masahiro Nagano
76.1K views67 slides

Viewers also liked(20)

Practical Testing of Ruby Core by Hiroshi SHIBATA
Practical Testing of Ruby CorePractical Testing of Ruby Core
Practical Testing of Ruby Core
Hiroshi SHIBATA16.6K views
Ruby で高速なプログラムを書く by mametter
Ruby で高速なプログラムを書くRuby で高速なプログラムを書く
Ruby で高速なプログラムを書く
mametter34.2K views
Plugin-based software design with Ruby and RubyGems by Sadayuki Furuhashi
Plugin-based software design with Ruby and RubyGemsPlugin-based software design with Ruby and RubyGems
Plugin-based software design with Ruby and RubyGems
Sadayuki Furuhashi7.9K views
Rhebok, High Performance Rack Handler / Rubykaigi 2015 by Masahiro Nagano
Rhebok, High Performance Rack Handler / Rubykaigi 2015Rhebok, High Performance Rack Handler / Rubykaigi 2015
Rhebok, High Performance Rack Handler / Rubykaigi 2015
Masahiro Nagano76.1K views
Photos Rares1mb by njsonja
Photos Rares1mbPhotos Rares1mb
Photos Rares1mb
njsonja175 views
Optcarrot: A Pure-Ruby NES Emulator by mametter
Optcarrot: A Pure-Ruby NES EmulatorOptcarrot: A Pure-Ruby NES Emulator
Optcarrot: A Pure-Ruby NES Emulator
mametter10.9K views
Quine・難解プログラミングについて by mametter
Quine・難解プログラミングについてQuine・難解プログラミングについて
Quine・難解プログラミングについて
mametter15.3K views
Do you trust that certificate? by zunda
Do you trust that certificate?Do you trust that certificate?
Do you trust that certificate?
zunda1.6K views
Techmix2014 温故知新 by Kazuya Numata
Techmix2014 温故知新Techmix2014 温故知新
Techmix2014 温故知新
Kazuya Numata7.2K views
Metaprogramming in Haskell by Hiromi Ishii
Metaprogramming in HaskellMetaprogramming in Haskell
Metaprogramming in Haskell
Hiromi Ishii4.2K views
Running Ruby on Solaris (RubyKaigi 2015, 12/Dec/2015) by ngotogenome
Running Ruby on Solaris (RubyKaigi 2015, 12/Dec/2015)Running Ruby on Solaris (RubyKaigi 2015, 12/Dec/2015)
Running Ruby on Solaris (RubyKaigi 2015, 12/Dec/2015)
ngotogenome11.9K views
RubyKaigi2015 making robots-with-mruby by yamanekko
RubyKaigi2015 making robots-with-mrubyRubyKaigi2015 making robots-with-mruby
RubyKaigi2015 making robots-with-mruby
yamanekko13K views
The OMR GC talk - Ruby Kaigi 2015 by craig lehmann
The OMR GC talk - Ruby Kaigi 2015The OMR GC talk - Ruby Kaigi 2015
The OMR GC talk - Ruby Kaigi 2015
craig lehmann13.4K views
Data Analytics Service Company and Its Ruby Usage by SATOSHI TAGOMORI
Data Analytics Service Company and Its Ruby UsageData Analytics Service Company and Its Ruby Usage
Data Analytics Service Company and Its Ruby Usage
SATOSHI TAGOMORI21K views
Experiments in Sharing Java VM Technology with CRuby by Matthew Gaudet
Experiments in Sharing Java VM Technology with CRubyExperiments in Sharing Java VM Technology with CRuby
Experiments in Sharing Java VM Technology with CRuby
Matthew Gaudet17.7K views
Logging for Production Systems in The Container Era by Sadayuki Furuhashi
Logging for Production Systems in The Container EraLogging for Production Systems in The Container Era
Logging for Production Systems in The Container Era
Sadayuki Furuhashi1.4K views
"fireap" - fast task runner on consul by IKEDA Kiyoshi
"fireap" - fast task runner on consul"fireap" - fast task runner on consul
"fireap" - fast task runner on consul
IKEDA Kiyoshi2.5K views

Similar to TRICK2015 results

TRICK 2018 results by
TRICK 2018 resultsTRICK 2018 results
TRICK 2018 resultsmametter
6.1K views85 slides
Ludo game using c++ with documentation by
Ludo game using c++ with documentation Ludo game using c++ with documentation
Ludo game using c++ with documentation Mauryasuraj98
6.1K views12 slides
Fighting fraud: finding duplicates at scale (Highload+ 2019) by
Fighting fraud: finding duplicates at scale (Highload+ 2019)Fighting fraud: finding duplicates at scale (Highload+ 2019)
Fighting fraud: finding duplicates at scale (Highload+ 2019)Alexey Grigorev
443 views122 slides
47966368 super-student by
47966368 super-student47966368 super-student
47966368 super-studentseptinuraini23
483 views341 slides
47966368 super-student by
47966368 super-student47966368 super-student
47966368 super-studentseptinuraini23
326 views341 slides
Hitchhikers guide to OpenSim calongne by
Hitchhikers guide to OpenSim calongneHitchhikers guide to OpenSim calongne
Hitchhikers guide to OpenSim calongneCynthia Calongne
326 views22 slides

Similar to TRICK2015 results(20)

TRICK 2018 results by mametter
TRICK 2018 resultsTRICK 2018 results
TRICK 2018 results
mametter6.1K views
Ludo game using c++ with documentation by Mauryasuraj98
Ludo game using c++ with documentation Ludo game using c++ with documentation
Ludo game using c++ with documentation
Mauryasuraj986.1K views
Fighting fraud: finding duplicates at scale (Highload+ 2019) by Alexey Grigorev
Fighting fraud: finding duplicates at scale (Highload+ 2019)Fighting fraud: finding duplicates at scale (Highload+ 2019)
Fighting fraud: finding duplicates at scale (Highload+ 2019)
Alexey Grigorev443 views
Hitchhikers guide to OpenSim calongne by Cynthia Calongne
Hitchhikers guide to OpenSim calongneHitchhikers guide to OpenSim calongne
Hitchhikers guide to OpenSim calongne
Cynthia Calongne326 views
I.fest 2018 event description by Nidhi Agrawal
I.fest 2018 event descriptionI.fest 2018 event description
I.fest 2018 event description
Nidhi Agrawal21 views
I own copyright, so I pwn you! by Dorothea Salo
I own copyright, so I pwn you!I own copyright, so I pwn you!
I own copyright, so I pwn you!
Dorothea Salo2.3K views
Dragon Ruby 孩子的游戏编程.pdf by Eric Guo
Dragon Ruby 孩子的游戏编程.pdfDragon Ruby 孩子的游戏编程.pdf
Dragon Ruby 孩子的游戏编程.pdf
Eric Guo28 views
Hunting The Shadows: In Depth Analysis of Escalated APT Attacks by F _
Hunting The Shadows: In Depth Analysis of Escalated APT AttacksHunting The Shadows: In Depth Analysis of Escalated APT Attacks
Hunting The Shadows: In Depth Analysis of Escalated APT Attacks
F _4.8K views
Python Workshop by kbhat95
Python WorkshopPython Workshop
Python Workshop
kbhat95429 views
Into the Void by Tim Lossen
Into the VoidInto the Void
Into the Void
Tim Lossen718 views
Into the Void (NoSQL matters 2012) by Wooga
Into the Void (NoSQL matters 2012)Into the Void (NoSQL matters 2012)
Into the Void (NoSQL matters 2012)
Wooga378 views
“Hello Flutter”の次におさえたい Flutterのポイント その4 by Kenichi Kambara
“Hello Flutter”の次におさえたい Flutterのポイント その4“Hello Flutter”の次におさえたい Flutterのポイント その4
“Hello Flutter”の次におさえたい Flutterのポイント その4
Kenichi Kambara1K views
Blockchain EXE #16 世界のブロックチェーン技術動向|石井 敦 クーガーCEO by blockchainexe
Blockchain EXE #16 世界のブロックチェーン技術動向|石井 敦 クーガーCEOBlockchain EXE #16 世界のブロックチェーン技術動向|石井 敦 クーガーCEO
Blockchain EXE #16 世界のブロックチェーン技術動向|石井 敦 クーガーCEO
blockchainexe670 views
Domo Arigato, Mr(uby) Roboto by yamanekko
Domo Arigato, Mr(uby) RobotoDomo Arigato, Mr(uby) Roboto
Domo Arigato, Mr(uby) Roboto
yamanekko938 views

More from mametter

error_highlight: User-friendly Error Diagnostics by
error_highlight: User-friendly Error Diagnosticserror_highlight: User-friendly Error Diagnostics
error_highlight: User-friendly Error Diagnosticsmametter
543 views39 slides
TRICK 2022 Results by
TRICK 2022 ResultsTRICK 2022 Results
TRICK 2022 Resultsmametter
2.7K views83 slides
クックパッド春の超絶技巧パンまつり 超絶技巧プログラミング編 資料 by
クックパッド春の超絶技巧パンまつり 超絶技巧プログラミング編 資料クックパッド春の超絶技巧パンまつり 超絶技巧プログラミング編 資料
クックパッド春の超絶技巧パンまつり 超絶技巧プログラミング編 資料mametter
312 views44 slides
Enjoy Ruby Programming in IDE and TypeProf by
Enjoy Ruby Programming in IDE and TypeProfEnjoy Ruby Programming in IDE and TypeProf
Enjoy Ruby Programming in IDE and TypeProfmametter
518 views29 slides
TypeProf for IDE: Enrich Development Experience without Annotations by
TypeProf for IDE: Enrich Development Experience without AnnotationsTypeProf for IDE: Enrich Development Experience without Annotations
TypeProf for IDE: Enrich Development Experience without Annotationsmametter
6.3K views45 slides
Ruby 3の型解析に向けた計画 by
Ruby 3の型解析に向けた計画Ruby 3の型解析に向けた計画
Ruby 3の型解析に向けた計画mametter
475 views37 slides

More from mametter(20)

error_highlight: User-friendly Error Diagnostics by mametter
error_highlight: User-friendly Error Diagnosticserror_highlight: User-friendly Error Diagnostics
error_highlight: User-friendly Error Diagnostics
mametter543 views
TRICK 2022 Results by mametter
TRICK 2022 ResultsTRICK 2022 Results
TRICK 2022 Results
mametter2.7K views
クックパッド春の超絶技巧パンまつり 超絶技巧プログラミング編 資料 by mametter
クックパッド春の超絶技巧パンまつり 超絶技巧プログラミング編 資料クックパッド春の超絶技巧パンまつり 超絶技巧プログラミング編 資料
クックパッド春の超絶技巧パンまつり 超絶技巧プログラミング編 資料
mametter312 views
Enjoy Ruby Programming in IDE and TypeProf by mametter
Enjoy Ruby Programming in IDE and TypeProfEnjoy Ruby Programming in IDE and TypeProf
Enjoy Ruby Programming in IDE and TypeProf
mametter518 views
TypeProf for IDE: Enrich Development Experience without Annotations by mametter
TypeProf for IDE: Enrich Development Experience without AnnotationsTypeProf for IDE: Enrich Development Experience without Annotations
TypeProf for IDE: Enrich Development Experience without Annotations
mametter6.3K views
Ruby 3の型解析に向けた計画 by mametter
Ruby 3の型解析に向けた計画Ruby 3の型解析に向けた計画
Ruby 3の型解析に向けた計画
mametter475 views
emruby: ブラウザで動くRuby by mametter
emruby: ブラウザで動くRubyemruby: ブラウザで動くRuby
emruby: ブラウザで動くRuby
mametter10.6K views
Type Profiler: Ambitious Type Inference for Ruby 3 by mametter
Type Profiler: Ambitious Type Inference for Ruby 3Type Profiler: Ambitious Type Inference for Ruby 3
Type Profiler: Ambitious Type Inference for Ruby 3
mametter3.3K views
型プロファイラ:抽象解釈に基づくRuby 3の静的解析 by mametter
型プロファイラ:抽象解釈に基づくRuby 3の静的解析型プロファイラ:抽象解釈に基づくRuby 3の静的解析
型プロファイラ:抽象解釈に基づくRuby 3の静的解析
mametter1K views
Ruby 3の型推論やってます by mametter
Ruby 3の型推論やってますRuby 3の型推論やってます
Ruby 3の型推論やってます
mametter819 views
マニアックなRuby 2.7新機能紹介 by mametter
マニアックなRuby 2.7新機能紹介マニアックなRuby 2.7新機能紹介
マニアックなRuby 2.7新機能紹介
mametter972 views
A Static Type Analyzer of Untyped Ruby Code for Ruby 3 by mametter
A Static Type Analyzer of Untyped Ruby Code for Ruby 3A Static Type Analyzer of Untyped Ruby Code for Ruby 3
A Static Type Analyzer of Untyped Ruby Code for Ruby 3
mametter758 views
A Plan towards Ruby 3 Types by mametter
A Plan towards Ruby 3 TypesA Plan towards Ruby 3 Types
A Plan towards Ruby 3 Types
mametter15.3K views
Ruby 3 の型解析に向けた計画 by mametter
Ruby 3 の型解析に向けた計画Ruby 3 の型解析に向けた計画
Ruby 3 の型解析に向けた計画
mametter9.5K views
A Type-level Ruby Interpreter for Testing and Understanding by mametter
A Type-level Ruby Interpreter for Testing and UnderstandingA Type-level Ruby Interpreter for Testing and Understanding
A Type-level Ruby Interpreter for Testing and Understanding
mametter12.7K views
本番環境で使える実行コード記録機能 by mametter
本番環境で使える実行コード記録機能本番環境で使える実行コード記録機能
本番環境で使える実行コード記録機能
mametter769 views
Transcendental Programming in Ruby by mametter
Transcendental Programming in RubyTranscendental Programming in Ruby
Transcendental Programming in Ruby
mametter1.6K views
Cookpad Hackarade #04: Create Your Own Interpreter by mametter
Cookpad Hackarade #04: Create Your Own InterpreterCookpad Hackarade #04: Create Your Own Interpreter
Cookpad Hackarade #04: Create Your Own Interpreter
mametter2.6K views
Ruby 3のキーワード引数について考える by mametter
Ruby 3のキーワード引数について考えるRuby 3のキーワード引数について考える
Ruby 3のキーワード引数について考える
mametter9.7K views
Type Profiler: An Analysis to guess type signatures by mametter
Type Profiler: An Analysis to guess type signaturesType Profiler: An Analysis to guess type signatures
Type Profiler: An Analysis to guess type signatures
mametter10.3K views

Recently uploaded

Perfect Wedding Hub Magazine Nov Edition by
Perfect Wedding Hub Magazine Nov EditionPerfect Wedding Hub Magazine Nov Edition
Perfect Wedding Hub Magazine Nov Editionrakhiraajan
10 views16 slides
Horror reddit story by
Horror reddit storyHorror reddit story
Horror reddit storytyronesmith1582
5 views1 slide
Retail Store Scavenger Hunt.pdf by
Retail Store Scavenger Hunt.pdfRetail Store Scavenger Hunt.pdf
Retail Store Scavenger Hunt.pdfRoxanneReed
43 views10 slides
Scratches in the Attic - Script.pdf by
Scratches in the Attic - Script.pdfScratches in the Attic - Script.pdf
Scratches in the Attic - Script.pdfColbyHoltman
5 views6 slides
https://pin.it/1TgD6Uq by
https://pin.it/1TgD6Uqhttps://pin.it/1TgD6Uq
https://pin.it/1TgD6Uqbestoto
5 views1 slide
IRL - Screenplay by
IRL - ScreenplayIRL - Screenplay
IRL - Screenplaymediastudiesf1n34rts
18 views9 slides

Recently uploaded(13)

Perfect Wedding Hub Magazine Nov Edition by rakhiraajan
Perfect Wedding Hub Magazine Nov EditionPerfect Wedding Hub Magazine Nov Edition
Perfect Wedding Hub Magazine Nov Edition
rakhiraajan10 views
Retail Store Scavenger Hunt.pdf by RoxanneReed
Retail Store Scavenger Hunt.pdfRetail Store Scavenger Hunt.pdf
Retail Store Scavenger Hunt.pdf
RoxanneReed43 views
Scratches in the Attic - Script.pdf by ColbyHoltman
Scratches in the Attic - Script.pdfScratches in the Attic - Script.pdf
Scratches in the Attic - Script.pdf
ColbyHoltman5 views
https://pin.it/1TgD6Uq by bestoto
https://pin.it/1TgD6Uqhttps://pin.it/1TgD6Uq
https://pin.it/1TgD6Uq
bestoto5 views
JADOO FLIX by Sagar.pptx by getseokey
JADOO FLIX by Sagar.pptxJADOO FLIX by Sagar.pptx
JADOO FLIX by Sagar.pptx
getseokey6 views
What Makes an Excellent Short Film by Hampton Luzak
What Makes an Excellent Short FilmWhat Makes an Excellent Short Film
What Makes an Excellent Short Film
Hampton Luzak5 views
Free eBook ~ 200 GREAT PUNS.pdf by OH TEIK BIN
Free eBook ~ 200 GREAT PUNS.pdfFree eBook ~ 200 GREAT PUNS.pdf
Free eBook ~ 200 GREAT PUNS.pdf
OH TEIK BIN19 views
BOOTS PUT FOR SANTA by Judy 1028
BOOTS PUT FOR SANTABOOTS PUT FOR SANTA
BOOTS PUT FOR SANTA
Judy 102810 views
Lyric Presentation.pdf by ally508153
Lyric Presentation.pdfLyric Presentation.pdf
Lyric Presentation.pdf
ally5081539 views
LETTERS TO SANTA CLAUS by Judy 1028
LETTERS TO SANTA CLAUSLETTERS TO SANTA CLAUS
LETTERS TO SANTA CLAUS
Judy 102811 views

TRICK2015 results

  • 2. • 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
  • 3. !@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=20E2 t=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 write a program unless for you, program in ruby language is too difficult. At the end of your journey towards the ultimate program; you must be a part of a programming language. You will end if you != 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
  • 4. • 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/
  • 6. • 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 の仕様を 安定化する
  • 7. • 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
  • 8. 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.
  • 9. • 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.
  • 10. Yusuke Endoh (@mametter) Koichiro Eto (@eto) Shinichiro Hamaji (@shinh) Yutaka Hara (@yhara) Yukihiro Matsumoto (@yukihiro_matz) Sun Park (@sunleonid) Hirofumi Watanabe (@eban)
  • 11. 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
  • 12. • A textbook of Transcendental Programming – 超絶技巧プログラミングの 入門書 – ¥2,680 + tax – Buy it in the branch shop!
  • 19. • 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.)
  • 20. • 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
  • 21. • 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/
  • 24. 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}*"")
  • 25. • 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] ) ) }*"")
  • 27. 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}
  • 28. • 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"
  • 30. 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
  • 31. • 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
  • 33. 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<<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: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?"
  • 34. • 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
  • 36. 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<<self)end;def-@;T[:-,self]end;alias == equal?;def call i;Scheme.t self,i end def 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[]i T[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 a T[self,T===a&&a.o ? a:T[a],1] end}; refine(Symbol){include A;def *i T[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]};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))
  • 37. • 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<<self)end;def-@;T[:-,self]end;alias == equal?;def call i;Scheme.t self,i end def 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[]i T[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 a T[self,T===a&&a.o ? a:T[a],1] end}; refine(Symbol){include A;def *i T[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]};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<<self)end;def-@;T[:-,self]end;alias == equal?;def call i;Scheme.t self,i end def 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[]i T[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 a T[self,T===a&&a.o ? a:T[a],1] end}; refine(Symbol){include A;def *i T[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]};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
  • 39. 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
  • 40. • 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
  • 42. 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 ] ]
  • 43. • 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]
  • 46. • 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'
  • 47. • 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
  • 49. class String;def[]*a;$*<<a;b;end;end; _=0;z="C=Fiber;s=$*;a=*0..8;l=C.new{e xit},*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.non e?{|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{loo p{puts"[9,3,_, _,8,_, 1,_,_]+" s.map{ |r|r*'"[2,_,_, 5,_,_, _,4,8]+" '}<<'' ;C.yield}};c=l[i=1];loop{c=l[i+=c.res ume ? 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{e xit},*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.non e?{|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{loo p{puts"[9,3,_, _,8,_, 1,_,_]+" s.map{ |r|r*'"[2,_,_, 5,_,_, _,4,8]+" '}<<'' ;C.yield}};c=l[i=1];loop{c=l[i+=c.res ume ? 1:-1]}";eval z.tr ?¥n,''
  • 50. • 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
  • 52. ;; ;; ;; ;; ;; ;; ;; ;; ;;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/ ,"")#];; ;; ;; ;; ;; ;; ;; ;; ;;
  • 53. • 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
  • 54. • 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,";") ;; ;; ;; ;; ;; ;; ;; ;; ;; ;;;; ;;;; ;; ;; ;; ;; ;; ;; ;;;;;;;; ;;;;;;;; ;; ;; ;; ;; ;; ;; ;; ;; ;;;;;;;; ;;;;;;;; ;; ;;;; ;; ;; ;;;; ;; ;;;;;;;; ;;;;;;;; ;; ;; ;; ;;
  • 56. • One liner with a lot of percents %%%while eval '_=%%r%%(.).. .¥1=%%=~[%%%%,,,,,%%%s ?=] *%%%%%%#"]*%%%%3x+1?%%'.% % %",%*p(_||=eval($**%%%))
  • 57. • 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
  • 58. • 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
  • 60. big, temp = Array 100000000**0x04e2 srand big alias $curTerm $initTerm Numeric Interrupt big += big printout _pi_ finish if $never init ||= big $counter ||= 02 …snip…
  • 61. • 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
  • 62. • 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
  • 63. • 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
  • 64. • The winners who are here, come to the stage. – You have a right to earn applause • 受賞者でご臨席の方は、前に集まってください – 拍手喝采をどうぞ
  • 65. • 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
  • 66. “Best piphilology” – kinaba “Most unreadable ALU” – Keisuke Nakano “Doubling amphisbaena award” – monae “Least general solver” – Benoit Daloze “Most general solver” – Keisuke Nakano 4th 5th
  • 67. • 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)
  • 68. • 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/