まえがき
Ruby を仕事で使う上で、「モルダー、あなた疲れてるのよ」を出力したり、出力しなかったりしたいことはままあります。
そこで今回は「モルダー、あなた疲れてるのよ」を出力したり、出力しなかったりします。
本文
コード
def mulder
%w[モルダー あなた 疲れてる のよ].shuffle.each_slice(2).map { |ws|
ws.map { |w|
w.chars.each_slice((w.size/2.0).ceil).map(&:join)
}.flatten.tap{ |_|
break [_[2], _[1], _[0], _[3]] if rand(2) == 0
}
}.flatten.insert(2, '、').join
end
loop.with_index(1) do |_, i|
print "#{i}: "
puts mulder.tap{ |_|
exit puts(_).to_i if _ == 'モルダー、あなた疲れてるのよ'
}
end
実行結果例
1: のよ、あなたモルダー疲れてる
2: のてる、疲れよモルダーあなた
3: のよ、疲れてるあなたモルダー
4: 疲れてる、あなたモルよのダー
5: 疲れダー、モルてるのよあなた
6: モルダー、疲れてるのよあなた
7: モルダー、あなた疲れよのてる
8: モルダー、あなたのてる疲れよ
9: のた、あなよ疲れダーモルてる
10: 疲れた、あなてるのよモルダー
11: のダー、モルよあなた疲れてる
12: あなた、疲れてるモルダーのよ
13: モルダー、疲れてるあなたのよ
14: あなた、疲れてるモルよのダー
15: あなた、モルダーのよ疲れてる
16: モルよ、のダーあなてる疲れた
17: モルダー、のよ疲れたあなてる
18: 疲れてる、モルダーのよあなた
19: 疲れてる、のよモルダーあなた
20: モルダー、あなた疲れよのてる
21: のよ、疲れてるあなダーモルた
22: のてる、疲れよモルダーあなた
23: のてる、疲れよあなダーモルた
24: 疲れてる、のよあなダーモルた
25: のよ、あなた疲れダーモルてる
26: のよ、モルダー疲れてるあなた
27: 疲れた、あなてるのダーモルよ
28: のよ、モルダーあなてる疲れた
29: 疲れダー、モルてるあなたのよ
30: のよ、モルダーあなた疲れてる
31: モルダー、疲れてるのよあなた
32: 疲れよ、のてるモルたあなダー
33: 疲れてる、モルダーのよあなた
34: 疲れた、あなてるのよモルダー
35: 疲れてる、モルダーあなたのよ
36: のダー、モルよ疲れてるあなた
37: モルてる、疲れダーのよあなた
38: 疲れダー、モルてるのたあなよ
39: のダー、モルよ疲れてるあなた
40: あなダー、モルたのよ疲れてる
41: 疲れてる、のよあなたモルダー
42: あなよ、のたモルダー疲れてる
43: あなよ、のたモルてる疲れダー
44: 疲れてる、あなたのダーモルよ
45: あなダー、モルたのよ疲れてる
46: モルダー、疲れてるあなよのた
47: あなてる、疲れたのダーモルよ
48: モルよ、のダーあなた疲れてる
49: 疲れた、あなてるのよモルダー
50: あなた、疲れてるモルよのダー
51: あなダー、モルた疲れよのてる
52: のた、あなよモルダー疲れてる
53: モルてる、疲れダーのよあなた
54: モルダー、あなた疲れてるのよ
ピックアップ
- 疲れてる、あなたモルよのダー
- 疲れダー、モルてるのよあなた
- あなダー、モルたのよ疲れてる
- モルてる、疲れダーのよあなた
- 疲れてる、のよあなたモルダー
- モルダー、疲れてるのよあなた
いいですか?色々なモルダーがあります。色々ありますので、よろしくお願いします。
コード内に出現した Ruby tips
- percent notation を使うと文字列の配列などをいい感じに生成できます
-
tap
はブロック内でbreak
した場合のみ返り値に副作用を起こすことが出来ます -
Kernel#puts
の返り値はnil
なので、to_i
すると 0 が得られます。これを悪用してexit
にputs("some str").to_i
を渡すと、文字列を出力しつつエラーなしで(exit code を 0 にして)終了することができます
無限ループをして文字列を出力しつつ、特定の文字列が出現した場合は終了するといったコードを書きたい場合、上記 exit
と loop
、tap
を組み合わせることで短いけど気持ち悪いトリッキーなコードが書けます。おめでとうございます。
おわりに
「モルダー、あなた疲れてるのよ」を出力したり、出力しなかったりすることができました。みなさんも、お使いください。