Ruby でモルダー、あなた疲れてるのよを出力する方法

  • 31
    いいね
  • 1
    コメント
この記事は最終更新日から1年以上が経過しています。

まえがき

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 が得られます。これを悪用して exitputs("some str").to_i を渡すと、文字列を出力しつつエラーなしで(exit code を 0 にして)終了することができます

無限ループをして文字列を出力しつつ、特定の文字列が出現した場合は終了するといったコードを書きたい場合、上記 exitlooptap を組み合わせることで短いけど気持ち悪いトリッキーなコードが書けます。おめでとうございます。

おわりに

「モルダー、あなた疲れてるのよ」を出力したり、出力しなかったりすることができました。みなさんも、お使いください。