2017-05-08 6 views
0

を除いIは、数字(SO 11、22)を繰り返した値を除いて、26の範囲1に収まるn数かどうかをテストしたい:テスト、特定の値

(n=24).between?(1, 26) # => true, ok 
(n=1).between?(1, 26) # => true, ok 
(n=11).between?(1, 26) # => true (but I want this to return false) 

行うよりも、これを達成するためのより良い方法があります:

[*1..10, *12..21, *23..26].include?(n) 

答えて

4

が行うよりも、これを達成するためのより良い方法はあります:

[*1..10, *12..21, *23..26].include?(n) 

はい、もちろんです。あなたの複雑なチェックを簡単な部分から構成します。あなたは計算を回避し、すべて保存するためにいくつかのRAMを取引することができ、

def has_repeated_digits?(n) 
    n.to_s.chars.uniq != n.to_s.chars 

    # or, in newer rubies (2.4+) 
    n.digits.uniq != n.digits 
end 

または:最初の部分は、範囲、繰り返しの数字をチェックすると、このように実装することができ繰り返さ桁

n.between?(1, 26) && !has_repeated_digits?(n) 

を持つ別の拒否番号をチェックしますSetまたは何かのあなたの「無効な」番号。あなたはこれを変更することができますが、元の状態に触れる必要はありません。抽象化の美しさ。

+0

提案、感謝:あなたはあなただけにする必要がある、チェックする必要があります! – FloatingRock

0

ハッシュを作成します。スキップする数字でハッシュを埋めます。そしてexistanceキーを確認します

a = [11, 22] 
h = Hash[a.map {|x| [x, 1]}] 
n=24 

n.between?(1, 26) && !h.key?(n) 
+0

このようなハッシュでは、値を気にせず、キーが存在するだけで、 'Set'を使うほうが意味的に優れています。 –

+1

@SergioTulentsev:プロットツイスト:Rubyの['Set'](http://ruby-doc.org/stdlib-2.4.1/libdoc/set/rdoc/Set.html)はハッシュではありません。価値について気をつけてください。 :)私はあなたのポイントを得る。 –

+2

@ EricDuminil:そうです、私は知っています。私は "_semantically_ better"と答えました:) –

0

ビット短い:

a=(1..26).to_a - [11,22] 

その後、include?メソッドを使用します。

(それはすべてのオカレンスを削除することに注意してください)

2

範囲は、あなたの場合のように限られており、正確であれば、あなたは良いを行っています。もう少し良い方法は減算です。

([*1..26] - [11, 22]).include?(n=11) 

他の方法は間違いなく良いでしょうが、あなたの使用に必要以上に多くの計算をしません。コメントのように

、配列の建物は、あなたのアプリに定義されてconstantsまたはglobal variablesの概念を持っている場合、その後、あなたは次のような初期化中に定数を定義することができ、あまりにも高価です:

ARRAY_RANGE = [*1..26] - [11, 22] 

とチェックは間違いなく、それが読みやすくなります打破する

ARRAY_RANGE.include?(n=11) 
+1

アレイの参照はO(N)です。アレイの構築も無料ではありません。しかし、このような小さなアレイについては、おそらくそれほど重要ではありません。 –

+0

@SergioTulentsev正確に!範囲が定義されていて短すぎるため、無視できます。 –

+0

配列の代わりに 'Set'を使うとパフォーマンスが大幅に向上します。 O(1)ルックアップFTW :) –

1
24.between?(1, 26) && !(24%100%11).zero? # => true 
1.between?(1, 26) && !(1%100%11).zero? # => true 
11.between?(1, 26) && !(11%100%11).zero? # => false 
22.between?(1, 26) && !(22%100%11).zero? # => false 
+0

また、この例では、22もチェックに合格してはいけません。 –

+0

@SergioTulentsevそうではありません。 '22.?(1,26)&&!(22%100%11)。ゼロ? #=> false' – sawa

+0

ああ、確かに、私は愚かです。 –