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]/]とか、何の役に立つか意味不明だったけど、えぐい使い方もあったもんだ。