前の記事で「twitter→ɹəʇʇɪʍʇのように英数字を180度回転して表示する」スクリプトをRubyで書いたのですが、実装が今ひとつでしたので、スクリプト自身に変換テーブルを持たせたシンプルな設計に書き直しました。Flippyという名前も付けました。

Gem化もしたので、gem install flippyで使うことができます。

flippy | RubyGems.org | your community gem host

melborne/flippy · GitHub

Flippyモジュールの使い方

FlippyモジュールはStringクラスにincludeするなどして使います。(flippyをrequireすればStringにincludeされるよう仕様を変更しました)。その場合、Stringに#flipおよび#unflipメソッドを追加します。flipは文字列を180度反転したような文字列をマッピングし、unflipはそれを元に戻します。

require 'flippy'
String.send(:include, Flippy)

flipped = "Ruby is a fantastic language!!".flip # => "¡¡əɓɐnɓuɐl ɔᴉʇsɐʇuɐɟ ɐ sᴉ ʎqnᴚ"

flipped.unflip # => "Ruby is a fantastic language!!"

flipped = "Please call me at (03)1234-5678".flip # => "8L95-ᔭεƧ⇂(ε0) ʇɐ əɯ llɐɔ əsɐəlԀ"

flipped.unflip # => "Please call me at (03)1234-5678"

改行にも対応しているので、プログラムコードを反転させることもできます。コードを文字列として書いて、flipして出力します。

require './flippy'

code =<<CODE
# encoding: UTF-8
class Employee
  attr_accessor :name, :title, :department
  def initialize(name, title, department)
    @name = name
    @title = title
    @department = department
  end
  
  def profile
    "%s is %s at %s dept." % [name, title, department]
  end
end

charlie = Employee.new('Charlie', :programmer, :Game)

puts charlie.profile
CODE

puts flipped = code.flip

結果は次の通り。

əlᴉɟoɹd˙əᴉlɹɐɥɔ sʇnd
                                                      
 (əɯɐ⅁: ‘ɹəɯɯɐɹɓoɹd: ‘'əᴉlɹɐɥƆ')ʍəu˙əəʎoldɯƎ = əᴉlɹɐɥɔ
                                                      
                                                   puə
                                                 puə  
[ʇuəɯʇɹɐdəp ‘əlʇᴉʇ ‘əɯɐu] % "˙ʇdəp s% ʇɐ s% sᴉ s%"    
                                         əlᴉɟoɹd ɟəp  
                                                      
                                                 puə  
                          ʇuəɯʇɹɐdəp = ʇuəɯʇɹɐdəp@    
                                    əlʇᴉʇ = əlʇᴉʇ@    
                                      əɯɐu = əɯɐu@    
             (ʇuəɯʇɹɐdəp ‘əlʇᴉʇ ‘əɯɐu)əzᴉlɐᴉʇᴉuᴉ ɟəp  
            ʇuəɯʇɹɐdəp: ‘əlʇᴉʇ: ‘əɯɐu: ɹossəɔɔɐ‾ɹʇʇɐ  
                                        əəʎoldɯƎ ssɐlɔ
                                      8-Ⅎ⊥Ո :ɓuᴉpoɔuə #

文字列は反転すると同時に右寄せされます。

今度はunflipでこの文字列を元に戻します。併せてその文字列をevalして正しく元に戻っているか確認します。

flipped = code.flip

puts unflipped = flipped.unflip

puts "evaluate".center(20, '-')
puts eval unflipped

出力です。

# encoding: UTF-8                                      
 class Employee                                        
   attr_accessor :name, :title, :department            
   def initialize(name, title, department)             
     @name = name                                      
     @title = title                                    
     @department = department                          
   end                                                 
                                                       
   def profile                                         
     "%s is %s at %s dept." % [name, title, department]
   end                                                 
 end                                                   
                                                       
 charlie = Employee.new('Charlie', :programmer, :Game) 
                                                       
 puts charlie.profile                                  
                                                        
------evaluate------
Charlie is programmer at Game dept.

いいですね!

変換テーブルはFlippy.tableで見ることができます。

puts Flippy.table

出力です。

A(U+0041) => (U+15c4)
B(U+0042) => (U+15fa)
C(U+0043) => Ɔ(U+0186)
D(U+0044) => (U+15e1)
E(U+0045) => Ǝ(U+018e)
F(U+0046) => (U+2132)
G(U+0047) => (U+2141)
H(U+0048) => H(U+0048)
I(U+0049) => I(U+0049)
J(U+004a) => (U+148b)
K(U+004b) => (U+4e2c)
L(U+004c) => (U+2142)
M(U+004d) => W(U+0057)
N(U+004e) => N(U+004e)
O(U+004f) => O(U+004f)
P(U+0050) => Ԁ(U+0500)
Q(U+0051) => Ό(U+038c)
R(U+0052) => (U+1d1a)
S(U+0053) => S(U+0053)
T(U+0054) => (U+22a5)
U(U+0055) => Ո(U+0548)
V(U+0056) => Λ(U+039b)
W(U+0057) => M(U+004d)
X(U+0058) => X(U+0058)
Y(U+0059) => (U+2144)
Z(U+005a) => Z(U+005a)
a(U+0061) => ɐ(U+0250)
b(U+0062) => q(U+0071)
c(U+0063) => ɔ(U+0254)
d(U+0064) => p(U+0070)
e(U+0065) => ə(U+0259)
f(U+0066) => ɟ(U+025f)
g(U+0067) => ɓ(U+0253)
h(U+0068) => ɥ(U+0265)
i(U+0069) => (U+1d09)
j(U+006a) => ɾ(U+027e)
k(U+006b) => ʞ(U+029e)
l(U+006c) => l(U+006c)
m(U+006d) => ɯ(U+026f)
n(U+006e) => u(U+0075)
o(U+006f) => o(U+006f)
p(U+0070) => d(U+0064)
q(U+0071) => b(U+0062)
r(U+0072) => ɹ(U+0279)
s(U+0073) => s(U+0073)
t(U+0074) => ʇ(U+0287)
u(U+0075) => n(U+006e)
v(U+0076) => ʌ(U+028c)
w(U+0077) => ʍ(U+028d)
x(U+0078) => x(U+0078)
y(U+0079) => ʎ(U+028e)
z(U+007a) => z(U+007a)
0(U+0030) => 0(U+0030)
1(U+0031) => (U+21c2)
2(U+0032) => Ƨ(U+01a7)
3(U+0033) => ε(U+03b5)
4(U+0034) => (U+152d)
5(U+0035) => 5(U+0035)
6(U+0036) => 9(U+0039)
7(U+0037) => L(U+004c)
8(U+0038) => 8(U+0038)
9(U+0039) => 6(U+0036)
.(U+002e) => ˙(U+02d9)
,(U+002c) => (U+2018)
-(U+002d) => -(U+002d)
:(U+003a) => :(U+003a)
;(U+003b) => ؛(U+061b)
!(U+0021) => ¡(U+00a1)
?(U+003f) => ¿(U+00bf)
&(U+0026) => (U+214b)
((U+0028) => )(U+0029)
)(U+0029) => ((U+0028)
<(U+003c) => >(U+003e)
>(U+003e) => <(U+003c)
[(U+005b) => ](U+005d)
](U+005d) => [(U+005b)
_(U+005f) => (U+203e)
(U+203e) => _(U+005f)
{(U+007b) => }(U+007d)
}(U+007d) => {(U+007b)
(U+2234) => (U+2235)
(U+2235) => (U+2234)

これでRubyのコードを機械知れず安全に暗号化および復号化できるようになりましたね!?

対面に座った上司からのコードレビューもこれで簡単になりますね!?

flippyコマンド

flippyコマンドも用意しました。

% flippy Hello, world! 
¡plɹoʍ ‘olləH

-uオプションで反転文字を基に戻します。

% flippy -u ¡plɹoʍ ‘olləH
Hello, world!
% flippy -t
A(U+0041) => ᗄ(U+15c4)
B(U+0042) => ᗺ(U+15fa)
C(U+0043) => Ɔ(U+0186)
D(U+0044) => ᗡ(U+15e1)
E(U+0045) => Ǝ(U+018e)
F(U+0046) => Ⅎ(U+2132)
G(U+0047) => ⅁(U+2141)
H(U+0048) => H(U+0048)
I(U+0049) => I(U+0049)
J(U+004a) => ᒋ(U+148b)
K(U+004b) => 丬(U+4e2c)
L(U+004c) => ⅂(U+2142)
M(U+004d) => W(U+0057)
N(U+004e) => N(U+004e)
O(U+004f) => O(U+004f)
P(U+0050) => Ԁ(U+0500)
Q(U+0051) => Ό(U+038c)
R(U+0052) => ᴚ(U+1d1a)
S(U+0053) => S(U+0053)
T(U+0054) => ⊥(U+22a5)
U(U+0055) => Ո(U+0548)
V(U+0056) => Λ(U+039b)
W(U+0057) => M(U+004d)
X(U+0058) => X(U+0058)
          .
          .
          .

以上です。

¡ʎqnᴚ ɥʇᴉʍ ɓuᴉʞɔɐH ʎddɐH


関連記事:

“RubyのコードをFlipして暗号化する?” error

“flippy gemにKernel#stndを追加しましたので、お知らせします。” error

“flippy consoleで上下反転文字の不思議な感覚を味わってみませんか?” error


電子書籍でRuby始めてみませんか?

M’ELBORNE BOOKS

(追記:2013-01-29) FlippyのGem化に合わせて内容を加筆・修正しました。 (追記:2013-03-18) FlippyのUpdateに合わせて内容を修正しました。



blog comments powered by Disqus
ruby_pack8

100円〜で好評発売中!
M'ELBORNE BOOKS