【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 追記
三項演算子というヒントを頂いたので調べてみる。
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.
ちょっとだけ短縮。