AppleLines
これを見て、AppleLinesというのをやってみた。AppleLinesの動作は、こんな感じ。
% ruby apple.rb 0 apple************************* % ruby apple.rb 5 apple************************* *apple************************ **apple*********************** ***apple********************** ****apple********************* *****apple******************** % ruby apple.rb 30 apple************************* *apple************************ **apple*********************** ***apple********************** ****apple********************* *****apple******************** ******apple******************* *******apple****************** ********apple***************** *********apple**************** **********apple*************** ***********apple************** ************apple************* *************apple************ **************apple*********** ***************apple********** ****************apple********* *****************apple******** ******************apple******* *******************apple****** ********************apple***** *********************apple**** **********************apple*** ***********************apple** ************************apple* *************************apple e*************************appl le*************************app ple*************************ap pple*************************a apple*************************
最初に書いたのは以下。ややゴルフ的なところを意識しつつ。
s=$*[0].to_i;(s+1).times{|i| puts ((("*"*25)+"elppa")*100)[i,30].reverse}
なんとなく文字の流れ方から言って、インデックスがマイナス方向に動くとまずそうな気がしたので、ひっくり返した文字列を用意したけど、別にそんなことはなかった。
0.upto(gets.to_i){|i|puts (("apple"+"*"*25)*2)[-(i%30)-30,30]}
でオッケー。63バイトある。ゴルファーたちを見てみると、みんな50バイト台。むむむと思ったけど、入力数値の上限を60とか90に限定してて、一定値を超えた入力に対しては誤動作するコードが多い。それってYAGNI的アプローチ? ゴルフのマナーが分からん。
1つだけオオと思ったのは、
s=s[/.$/]+$`
という文字ローテーションマジックを使ってるやつ。
>> s = "string" => "string" >> s=s[/.$/]+$` => "gstrin" >> s=s[/.$/]+$` => "ngstri" >> s=s[/.$/]+$` => "ingstr" >> s=s[/.$/]+$` => "ringst" >> s=s[/.$/]+$` => "trings" >> s=s[/.$/]+$` => "string" >>
str[/[aiueo]/]とか、何の役に立つか意味不明だったけど、えぐい使い方もあったもんだ。