整数が3で割り切れるかどうかを判別


20

目標は、条件を使用せずに数値が3で割り切れるかどうかを判断することです。入力は、0から255までの符号なし8ビット数になります。

使用のみ許可されています

  • 平等/不平等(==!=><>=<=

  • 算術演算(+-x

  • 論理演算子(!not、&&and、|| or)

  • ビット演算子(~しない、&及び、|又は、^XOR、 、、<< 算術および論理左右シフト)>>>>>

  • 定数(これらを小さくした方が良いでしょう)

  • 変数の割り当て

0falseの1場合、trueの場合に出力します。

標準のアトミックコードゴルフ規則が適用されます。ご質問がある場合は、コメントに残してください。ここにメソッドの例。トークンは、定数と変数を除く上記のいずれかです。


@GregHewgill私のタイプミス、それは8ビット数でなければなりません。
qwr 14年

2
上記の演算子のみを使用できますか?そうでなければ、モジュロはこの方法をあまりにも簡単にします。
ジョスティ14年

また、テーブル検索はどうですか?
グレッグヒューギル14年

3
条件なしの意味を明確にできますか?IFステートメントに限定されていますか、それともループのようなものにも適用されますか?
ルスラン14年

1
@Ruslan上記の使用のみ許可されています。
qwr 14年

回答:


31

C-2トークン

int div3(int x) {
    return x * 0xAAAAAAAB <= x;
}

2つまで動作するようです 31 -1です。

クレジットzalgo("nhahtdh")乗法逆アイデア。


1
+1。<=動作の仕組みに少し困惑し、0xAAAAAAABがunsigned intタイプであると見なされ、乗算の結果が符号なしであることを思い出しました。
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳ 14年

@DigitalTrauma不等式演算子は禁止されていませんが許可されています
aditsu 14年

@aditsuおっと!私は時々もっと注意深く読む必要があります!+1すばらしい回答です!
デジタル外傷14年

@aditsu、すみません、noob、これはどのように正確に機能しますか?
Kartik_Koro 14年

2
@Kartik_Koro 0xAAAAAAAB * 3 == 1オーバーフローのため、任意のint x、x * 0xAAAAAAAB * 3 == x。また、y * 3はyごとに異なる値を持っているため、y = x * 0xAAAAAAABのみが​​y * 3 == xである必要があります。xが3の倍数である場合、yはx / 3である必要があります。そうでない場合、オーバーフローを通じて機能している必要があります。チェックする簡単な方法は、yとxを比較することです。en.wikipedia.org/wiki/Modular_multiplicative_inverse
aditsu 14年

17

Python、3 2トークン

ブルートフォースソリューションですが、動作します。

0x9249249249249249249249249249249249249249249249249249249249249249>>x&1

ハワードに1トークン削減を感謝します。


うわー!あなたのソリューションはおそらく最短(3トークン)ですが、他の回答も奨励したいと思います。
qwr 14年

11
2トークンソリューションもあります0x9......>>x&1
ハワード14年

6

C- 5 4(?)トークン

int div3_m2(uint32_t n) {
    return n == 3 * (n * 0xAAAAAAABull >> 33);
}

のために働く すべての符号なし32ビット数

このコードは、乗法の逆モジュロ2を使用します、除数 32して、除算演算を乗算演算に変換します。

編集

私のソリューション(2分後に投稿)は、aditsuのソリューションと同じ精神を持っています。彼の功績は==により、私のソリューションが1トークン改善さ感謝します。

参照


1
これが信じられない。私は有名な逆平方根のトリックからマジックナンバーを知っていましたが、それが任意の除数に使用できることを知りませんでした。これはBull:P
qwr 14年

はい、0xAAAAAAAB =(2 ^ 33 + 1)/ 3および171 =(2 ^ 9 + 1)/ 3。トリックを行う最小の定数を選択しました。うーん、実際には86 =(2 ^ 8 + 2)/ 3で動作するようです
aditsu 14年

ラット、43 =(2 ^ 7 + 1)/ 3も動作しますが、どのように見逃したかわかりません。今すぐ編集。
aditsu

4

C-15(?)トークン

int div3_m1(unsigned int n) {
    n = (n & 0xf) + (n >> 4);
    n = (n & 0x3) + (n >> 2);
    n = (n & 0x3) + (n >> 2);
    return n == 0 || n == 3;
}

4≡1(mod 3)なので、4 n ≡1(MOD 3)。数字の合計規則は数字の合計に限定されませんが、数字を数字のシーケンスに任意に分割し、一致を維持しながらすべてを合計することもできます。

基数10の例、除数= 9:

1234≡12 + 34≡1 + 2 + 3 + 4≡123 + 4≡1(mod 9)

プログラム内のすべてのステートメントは、このプロパティを使用します。実際には、ステートメントは最下位桁でbase-4の数値を分割し、2つの部分を加算するため、ステートメントをn = (n & 0x3) + (n >> 2);まで実行するループに単純化できn < 4ます。


+1:興味深いことに、これは最大512(実際にはn = 590)までnで機能しますが、その理由はよくわかりません。
ポールR 14年

@PaulR:キャリーのため、大きな数値では機能しません(計算に加算を使用していることに注意してください)。繰り返される行にも注意してください。
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳ 14年

はい、8ビットのみをテストしているように見えるので、なぜ9ビット値で機能するのかわかりませんか?
ポールR 14年

最初の加算後の9ビットの数値では最大で5ビットになり、最初の加算後n = (n & 0x3) + (n >> 2);は結果が3ビットに減り、繰り返しにより2ビットのみになりますstackoverflow.com/a/3421654/995714
phuclv

1
ああ、間違えた。5ビット数+ 4ビット数は、6ビット数になる可能性があります。ただし、n <= 588の場合、その6ビット数の上位4ビットと下位2ビットを加算すると、4ビットの合計のみが生成されます。再度追加すると、2ビットの数値になります。589と590の最後の和の3ビットに結果が、結果が正確であるように偶然それらが3で割り切れない
phuclv

2

Python(2トークン?)

1&66166908135609254527754848576393090201868562666080322308261476575950359794249L>>x

または

1&0x9249249249249249249249249249249249249249249249249249249249249249L>>x

または

1&0b1001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001>>x

2
ハワードさんのコメントの重複
aditsu

@aditsu ...偉大な心は同じように考える?これを投稿する前に私はそれを見なかったことを誓います。
ɐɔıʇǝɥʇuʎs

2

JavaScript-3トークン

function div3(n) {
    var a = n * 0.3333333333333333;
    return (a | 0) == a;
}

これは、数値にビット演算子を使用すると、JavaScriptで整数に切り捨てられるという事実を悪用します。


4つのトークンでなければなりません:=*|==
n̴̖̋h̷͉a̷̭̿h̸̡̅ẗ̵̨d̷̰ĥ̷̳

1
変数の割り当てがトークンとしてカウントされるとは思わない。
ティロ14年

1

C-4トークン

int div3(int x) {
    return ((x * 43) >> 7) * 3 == x;
}

383まで動作します。

以前のバージョン(より大きな定数):

int div3(int x) {
    return ((x * 171) >> 9) * 3 == x;
}

1535まで動作します


1

bash – ???

これを採点する方法がわからない。

seq 0 85 | awk '{print $1 * 3}' | grep -w [number] | wc -l

例えば

$ seq 0 85 | awk '{print $1 * 3}' | grep -w 11 | wc -l
0

$ seq 0 85 | awk '{print $1 * 3}' | grep -w 12 | wc -l
1

$seq 0 85 | awk '{print $1 * 3}' | grep -w 254 | wc -l
0

$seq 0 85 | awk '{print $1 * 3}' | grep -w 255 | wc -l
1

1

Befunge 93-5トークン

修正済み-除算が削除されました。

v      @._1.@
         \   
         0   
         +   
         3   
>&>3-:0\`|   
  ^      <   

入力を取得し、0未満になるまで3を減算し続け、ポインターを上に移動( '|')し、3を加算します。値が0の場合、ポインターは右に移動します(「1. @」は「1」を出力します)。 (「@。」は「0」を出力します)。「@」はプログラムを終了します。


1

バッチ-7トークン

おもう

@echo off
for /L %%a in (0,3,%1) do set a=%%a
if %a%==%1 echo 1

1指定された数値(標準入力)が3で割り切れるかどうかを返します。


ループは許可されていますか?
-sergiol

1

Ruby、6(?)トークン

トークンのカウント方法が本当にわかりません。OP、得点できますか?

私はそれが6だと思います... 100*255x

*は整数乗算ではないことに注意してください。

def div3(x)
  ([1,0,0]*255)[x]
end

OPの意味でのトークンは、上記の質問の1つにすぎませんか?
C5H8NNaO4 14年

@ C5H8NNaO4だから何?0?
チャールズ、14年

@ C5H8NNaO4定数の場合は4ですか?
チャールズ、14年

1

Python 0

Earilerを投稿しましたが、条件を使用しました。ここでは、条件とトークンを使用せず、キーワードのみを使用します

def g(x): return ([[lambda : g(sum(int(y) for y in list(str(x)))),lambda: 0][[False,True].index(x in[0,1,2,4,5,7,8])], lambda: 1][[False,True].index((lambda y: y in[3,6,9])(x))])()

3の倍数に3を加算する数字があるというトリックを使用します

編集:不要なラムダを削除

def g(x):return([[lambda: g(sum(int(y) for y in list(str(x)))),lambda:0][[False,True].index(x in[0,1,2,4,5,7,8])], lambda:1][[False,True].index(x in[3,6,9])])()

編集:さらにゴルフ(117文字)してもトークンはありません

exec"g=`x:(((`:g(sum(int(y)for y in str(x)),`:0)[x in[0,1,2,4,5,7,8]],`:1)[x in[3,6,9]])()".replace('`','lambda ')

Pythonの気の利いたgetitemの 132文字で長くなった直接アクセスを強制終了しました。

exec"g={0}x:((({0}:g(sum(int(y)for y in str(x))),{0}:0{1}0,1,2,4,5,7,8]),{0}:1{1}3,6,9]))()".format('lambda ',').__getitem__(x in[')

http://www.codeskulptor.org/#user34_uUl7SwOBJb_0.py


[]ただし、配列へのアクセスは許可されていません。
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳ 14年


さて、質問はタグwikiのルールを使用していません。質問には、許可される操作に制限があります。単語に注意してくださいonly
-n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳

@ n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳まあ、それはPythonにもネイティブ属性があるのは良いことです
ディラン・マディセッティ

0

Python-25トークン

物事を開始するには、最初の投稿のリンクにある回答の1つを実装するという長い解決策があります。n入力されます。

a = (n>>7)-((n&64)>>6)+((n&32)>>5)-((n&16)>>4)+((n&8)>>3)-((n&4)>>2)+((n&2)>>1)-(n&1)
print(a==0 or a==3)

or に等しい ||です。


0

JavaScript-3トークン

ブラウザのコンソールでテストします。

a = prompt().split('');
sum = 0;

do {
  sum = a.reduce(function(p, c) {
     return parseInt(p) + parseInt(c); 
  });

  a = sum.toString().split('');

} while(a.length > 1)

alert([3, 6, 9].indexOf(+sum) > -1)

どのようにしてその結論に達しましたか?約37個のトークンをカウントします。
nyuszika7h 14年

「トークンは、定数と変数を除く上記のいずれかです」。どうやって37を数えましたか?
ウィリアムバルボサ14年

1
ああなるほど。OPはatomic-code-golfの情報ページに同意しないようです。
nyuszika7h 14年

実際、今は自分が正しいかどうかわからない。アトミックコードのゴルフフィドルによると、私のスコアは70+です。
ウィリアムバルボサ14年

1
問題はトークンの数ではなく、使用している操作にあります。toString、parseInt、ループ、配列などは許可されていないと思います。
aditsu

0

JavaScript
がトークンについて不明です#

function mod3 (i) { return {'undefined':'100','0':'0'}[[0][i]][i.toString (3).split('').pop ()]}

または、0の出力を1にすることが許可されている場合。

function mod3 (i) { return '100'[i.toString (3).split('').pop ()]}


2
私は言わなければならない、私はこのルールに適用されるルールがわからない。関数呼び出しとプロパティアクセスは許可されていますか?
C5H8NNaO4 14年

0

Tcl、83バイト

proc T n {while \$n>9 {set n [expr [join [split $n ""] +]]};expr {$n in {0 3 6 9}}}

オンラインでお試しください!


失敗したアウトゴルフ:96バイト proc T n {set n [expr [join [split [expr [join [split $n ""] +]] ""] +]];expr {$n in {0 3 6 9}}} オンラインで試してみてください!
sergiol

別の失敗:** 87バイト** proc T n {expr {[expr [join [split [expr [join [split $n ""] +]] ""] +]] in {0 3 6 9}}} オンラインで試してみてください!
sergiol
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.