【Scala】Smileys Triangle【anarchy golf】

この記事には解答の一例が載っていますので閲覧は自己責任でお願いします。

コードゴルフのお話です。

今回の問題はこちら
5.Smileys Triangle (http://golf.shinh.org/p.rb?Smileys+Triangle)

Problem
smile a lot!

笑顔がたくさん!!!


Sanple Outputを見れば分かる通り、")"がだんだん増えていくプログラムを作ります。
たくさんという割には34行じゃないとダメらしいです。大は小を兼ねない。


さて、プログラムを組む前にポイントを整理してみます

  • 同じような文字列が繰り返されている

繰り返し、ということなのでfor文を利用していきましょう

  • ")"は3行目から出現し、以降2個ずつ増える

最初10分")"の増える量が1個ずつだと思い込んでました。問題はちゃんと見ましょう。
この部分は変数と掛けて調整していきたいところです

  • ":"と"-"は出現してから1個ずつで固定

")"とは対照的にこの部分は増えません。ということは、")"部分と切り離す必要があります。"-"は1行目には出てこないあたりにも注意ですね。


では、これらに気をつけながら組んでいきます




for(i<-1 to 34)println(if(i<2)":"else":-"+")"(i*2-5))

1行目は":"を出力し、2行目以降は":+"に")"を付け加えていっています。
String型に0以下を掛けると文字が消せることは以前学んだので、(http://secon.hatenablog.com/entry/2013/11/27/065910)
iが2の時は0以下になるようにしています。

これで54byteです。


ちょっと考えて、これはifを使わないでもいけるのでは?と思ったのでやってみました




for(i<-1 to 34)println(":"+"-"*((i+1)%i)+")"*(i*2-5))

なんだか括弧がもっさりしてしまって思ってたよりも減りませんでした。
53byteです。


現時点での最高記録は44byteらしいです。もう根本から違う気がする・・・

上に書いた2つももうちょっと工夫すれば減らせそうな気もしますね。