【Ruby】Smileys Triangle

anarchy golf - Smileys Triangle

繰り返しも習ったところで、Rubyであなごるをやってみようの回。
例のごとく解答の一例が記載されてますので注意。



Scalaで同じ問題をやっているので、ひとまず流用する。
【Scala】Smileys Triangle【anarchy golf】 - seconの日記

と思ったが、ひとつ問題が発生。
Scalaでは文字列に0以下の数を掛けると文字列を消すことが出来たが、Rubyでは出来ない模様(0なら可能)。

irb(main):001:0> puts "a"*3
aaa
#a が3つ
irb(main):002:0> puts "a"*0

#何も表示されない
irb(main):003:0> puts "a"*(-1)
ArgumentError: negative argument
#error



少し形を変えてみる。
3行目までを最初に出力し、その後に")"を増やしていくやり方。

for i in 1..32;puts(if i<2;":\n:-\n:-)"else":-"+")"*(i*2-1)end)end

66bytes.


変数の範囲を調整すれば最初の ":-)" の部分が削れそうなので、削ってみることに。

for i in 0..32;puts(if i<1;":\n:-"else":-"+")"*(i*2-1)end)end

61bytes.


最小サイズは 33bytes らしいです。どう削っていけばいいのやら。


1/9 追記


三項演算子というヒントを頂いたので調べてみる。

条件演算子(?:) - 条件分岐 - Ruby入門

if ~ end の代わりに使えるといった感じだろうか。
早速入れ込んでみる。

for i in 0..32;puts(i<1?":\n:-":":-"+")"*(i*2-1))end

52bytes.
大きく短縮。


1/10 追記
for ~ の代わりに each を使って短縮できるそうで。
each を使うので、範囲オブジェクトを使用する。

(0..32).each{|i|puts(i<1?":\n:-":":-"+")"*(i*2-1))}

51bytes.
ちょっとだけ短縮。