2016-03-16 12 views
5

私は次のように発生しました:Pythonのインデックスの比較の目的は何ですか?

r = random.randint(1,6) 
C = "o " 
s = '-----\n|' + C[r<1] + ' ' + C[r<3] + '|\n|' + C[r<5] 
print(s + C[r&1] + s[::-1]) 

IDLEで実行した場合、これはランダムな値でASCIIダイを出力します。

どのように動作しますか、具体的には、比較記号(<&)はインデックス内で何を達成しますか?

答えて

7

誰かがここでコードゴルフを行い、ハックトリックを使用してコードの使用量を最小限に抑えています。

  • <定期的な比較演算子です。 2つのオペランドに基づいてTrueまたはFalseを返します。 Python boolタイプはintのサブクラスであり、整数として解釈されるときTrue1,False0です。したがって、C[r<1]は、C[0]またはC[1]を選択します。

  • &ビット単位オペレータではなく、比較演算子です。 & 1は、数値が最後のビットにマスキングされ、数値が奇数か偶数かを効果的にテストします(最後のビットが設定されているかどうか)。したがって、rが奇数の場合はC[1]が使用され、そうでない場合はC[0]が使用されます。

    この内訳

  • Coとスペース文字
  • C[r<1]ピックoか、それである(決して1よりも小さくなっている天気をに基づいて空間のいずれかの文字列ですがrandom.randint(1,6)がこれを保証するので、は常にoです。これはコード内のバグや見落としのようです。
  • C[r<3]は、1と2のスペースを選択します。それ以外の場合はoです。
  • C[r<5]は、5または6の場合はo、それ以外の場合はスペースを選択します。
  • C[r&1]は、2,4および6の場合はoを、それ以外の場合はスペースを選択します。全てにおいて

、それは、ダイとしてrプラスワンを印刷します。 r = 1は2つのピップを与えますが、r = 6の結果はピップになります。 (関数内の文字列の建物を包む)

s = '-----\n|' + C[r<2] + ' ' + C[r<4] + '|\n|' + C[r<6] 
print(s + C[1-r&1] + s[::-1]) 

デモ:

>>> import random 
>>> def dice(r, C='o '): 
...  s = '-----\n|' + C[r<2] + ' ' + C[r<4] + '|\n|' + C[r<6] 
...  print(s + C[1-r&1] + s[::-1]) 
... 
>>> for i in range(1, 7): 
...  dice(i) 
... 
----- 
| | 
| o | 
| | 
----- 
----- 
|o | 
| | 
| o| 
----- 
----- 
|o | 
| o | 
| o| 
----- 
----- 
|o o| 
| | 
|o o| 
----- 
----- 
|o o| 
| o | 
|o o| 
----- 
----- 
|o o| 
|o o| 
|o o| 
----- 
+0

これが正確に何であるそのためのコードを修正

はすべてrテストをインクリメントし、奇数/偶数のテストを反転する必要が私は探していた。ありがとうございました –

関連する問題