Bir tamsayının 3 ile bölünebilir olup olmadığını belirleme


20

Amacınız, bir sayının koşul kullanmadan 3'e bölünebilir olup olmadığını belirlemektir. Giriş, 0 ile 255 arasında işaretsiz bir 8 bit sayı olacaktır. Yaratıcılık teşvik edildi!

SADECE kullanmanıza izin verilir

  • Eşitlik / eşitsizlik ( ==, !=, >, <, >=, <=)

  • Aritmetik ( +, -, x)

  • Mantıksal İşleçler ( !değil &&, || veya)

  • Bit Operatörler ( ~değil, &ve |ya da, ^XOR, <<, >>, >>>aritmetik mantık sol ve sağ kaymalar)

  • Sabitler (bu kadar küçük olsaydınız daha iyi olurdu)

  • Değişken ataması

Yanlışsa çıktı 0, 1doğruysa.

Standart atom kodu-golf kuralları geçerlidir. Herhangi bir sorunuz varsa lütfen yorumlarda bırakın. Burada örnek yöntemler . Bir belirteç, sabitler ve değişkenler hariç olmak üzere yukarıdakilerden herhangi biridir.


@GregHewgill Yazım hatası, 8 bit sayı olmalıdır.
qwr

2
Sadece yukarıdaki operatörleri kullanmamıza izin var mı? Aksi takdirde, modulo bu yolu çok kolaylaştıracaktır.
Jwosty

Ayrıca, tablo aramaya ne dersiniz?
Greg Hewgill

3
Ne demek istediğini koşulsuz açıklayabilir misin? IF deyimleriyle sınırlı mı yoksa döngüler gibi şeyler için de geçerli mi?
Ruslan

1
@Ruslan Yalnızca yukarıdakileri kullanmanıza izin verilir.
qwr

Yanıtlar:


31

C - 2 jeton

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

2 31 -1'e kadar çalışıyor gibi görünüyor .

zalgo("nhahtdh")Çarpımsal ters fikir için verilen krediler .


1
+1. Nasıl <=çalıştığına biraz şaşırdı ve 0xAAAAAAAB'ın tür olarak alındığını hatırladı unsigned int, böylece çarpmanın sonucu imzasız.
ǹ̷̰ĥ̷̳h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳

@ DigitalTrauma eşitsizliği operatörlerine izin verilmiyor, yasak değil
aditsu

@aditsu Hata! Bazen daha dikkatli okumam gerekiyor! +1 harika cevap!
Dijital Travma

@ aditsu, özür dilerim çaylak, bu tam olarak nasıl çalışıyor?
Kartik_Koro

2
@Kartik_Koro 0xAAAAAAAAB * 3 == 1 taşma nedeniyle, bu nedenle herhangi bir int x için, x * 0xAAAAAAAB * 3 == x. Ayrıca y * 3, farklı y için farklı değerlere sahiptir, bu nedenle y = x * 0xAAAAAAAB, y * 3 == x olacak şekilde tek y olmalıdır. X 3'ün katı ise y x / 3 olmalıdır, aksi takdirde taşma yoluyla çalışmalıdır. Kontrol etmenin basit bir yolu, y'yi x ile karşılaştırmaktır. Ayrıca bakınız en.wikipedia.org/wiki/Modular_multiplicative_inverse
aditsu

17

Python, 3 2 jeton

Kaba kuvvet çözümü, ama işe yarıyor.

0x9249249249249249249249249249249249249249249249249249249249249249>>x&1

Howard'a 1 jeton azaltımı için teşekkürler.


Vaov! Çözümünüz muhtemelen en kısa (3 jeton), ancak diğer cevapları da teşvik etmek istiyorum.
qwr

11
2 jeton çözüm de bulunmaktadır: 0x9......>>x&1.
Howard

6

C - 5 4 (?) Belirteçleri

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

İçin çalışır herhangi işaretsiz 32 bit numarası .

Bu kod, bölme işlemini çarpma işlemine dönüştürmek için bölücünün çarpımsal ters modülo 2 32'sini kullanır .

Düzenle

Çözümüm (2 dakika sonra gönderilen) aditsu'nun çözümüyle aynı ruha sahip. Bunun için ona kredi, ==1 jetonla çözümümü geliştirir.

Referans


1
Bu inanılmaz. Ünlü ters kare kök hilesinden sihirli sayılar biliyordum, ancak keyfi bir bölen için kullanılabileceğini bilmiyordum. Bu Bull: P
qwr

Evet, 0xAAAAAAAB = (2 ^ 33 + 1) / 3 ve 171 = (2 ^ 9 + 1) / 3. Hile yapan en küçük sabiti seçtim. Hmm, aslında 86 = (2 ^ 8 + 2) / 3 ile çalışıyor gibi görünüyor
aditsu

Sıçanlar, hatta 43 = (2 ^ 7 + 1) / 3 çalışıyor, nasıl özlediğimden emin değilim. Şimdi düzenlendi.
aditsu

4

C - 15 (?) Belirteçleri

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'den (mod 3) beri 4 n ≡ 1 (mod 3) var. Rakam toplama kuralı rakamları toplamakla sınırlı değildir, aynı zamanda sayıyı keyfi olarak rakam dizilerine ayırmamıza ve uyumu korurken hepsini toplamamıza izin verir.

Taban 10'daki bir örnek, bölen = 9:

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

Programdaki tüm ifadeler bu özelliği kullanır. Aslında , ifade temel-4'teki sayıyı en az anlamlı basamaktan kıran ve 2 parçayı toplayana n = (n & 0x3) + (n >> 2);kadar n < 4, ifadeyi çalıştıran bir döngüye basitleştirilebilir .


+1: ilginç bir şekilde bu, 512'ye kadar n (aslında n = 590) için çalışır, ancak neden olduğundan emin değilim.
Paul R

@PaulR: Taşıma nedeniyle daha büyük sayılar için çalışmaz (hesaplamada toplama kullandığımı unutmayın). Ayrıca tekrarlanan satırlara dikkat edin.
ǹ̷̰ĥ̷̳h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳

Evet, neden sadece 8 bit test ediyor gibi görünüyor, çünkü 9 bit değerleri için çalıştığından emin değilim?
Paul R

ilk eklemeden sonra 9 bitlik sayılar için en fazla 5 bit olur, n = (n & 0x3) + (n >> 2);
birinciden

1
oh bir hata yaptım. 5 bit sayı + 4 bit sayı, 6 bit sayı ile sonuçlanabilir. Ancak n <= 588, bu 6 bitlik sayının ilk 4 bitini ve alt 2 bitini ekleyerek yalnızca 4 bitlik bir toplam üretir. Tekrar eklemek 2-bit bir sayı ile sonuçlanır. 589 ve 590, son toplamda 3 bit ile sonuçlanır, ancak tesadüfen 3 ile bölünemezler, bu yüzden sonuç doğrudur
phuclv

2

Python (2 jeton?)

1&66166908135609254527754848576393090201868562666080322308261476575950359794249L>>x

Veya

1&0x9249249249249249249249249249249249249249249249249249249249249249L>>x

Veya

1&0b1001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001001>>x

2
Howard'ın yorumunun
kopyası

@aditsu ... Büyük beyinler benzer mi? Yemin ederim bunu göndermeden önce görmedim.
Junıʇǝɥʇuʎs

2

JavaScript - 3 simge

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

Bu, bir sayı üzerinde bitsel işleçlerin kullanılmasının onu JavaScript'te bir tam sayıya indirdiği gerçeğini kötüye kullanır.


: 4 jetonlar olmalı =, *, |,==
n̴̖̋h̷͉a̷̭̿h̸̡̅ẗ̵̨d̷̰ĥ̷̳

1
Değişken atamanın bir jeton olduğunu düşünmüyorum.
Tyilo

1

C - 4 jeton

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

383'e kadar çalışır.

Önceki sürüm (daha büyük sabitler):

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

1535'e kadar çalışır


1

bash - ???

Bunu nasıl yapacağınızdan emin değilim.

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

Örneğin

$ 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 belirteç

Sabit - bölüm kaldırıldı.

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

Girdiyi alır, 0'dan küçük olana kadar 3 çıkarmaya devam eder, işaretçiyi yukarı doğru yönlendirir ('|'), sonra 3 ekler. Değer 0 ise, işaretçi sağa hareket eder (" 1. @" '1' çıktıları) sola hareket eder ("@. " '0' çıktısı verir). '@' programı sonlandırır.


1

Parti - 7 Jeton

bence

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

1Verilen sayının (stdin olarak) üçe bölünebilir olup olmadığını döndürür .


Döngülere izin veriliyor mu?
sergiol

1

Ruby, 6 (?) Jeton

Jetonları nasıl sayacağımı gerçekten bilmiyorum. OP, beni puanlayabilir misin?

Ben 6 olduğunu düşünüyorum ... 1, 0, 0, *,255 ,x

Bunun *tamsayı çarpımı olmadığını unutmayın .

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

OP'nin anlamında bir jeton, soruda listelenenlerden biri değil mi?
C5H8NNaO4

@ C5H8NNaO4 Ne olmuş yani? 0?
Charles

@ C5H8NNaO4 sabitler için belki 4 olabilir?
Charles

1

Python 0

Daha önce yayın gönderdim ama şartlı kullandım. Hiçbir koşul ve belirteç kullanmamak, yalnızca anahtar kelimeler kullanmak

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'lerin çoğunun 3'e ekli basamaklara sahip olduğu hileyi kullanır

Düzenle: Gereksiz lambda kaldırıldı

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])])()

Düzenleme: Daha fazla Golf (117 karakter) hala jeton yok

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 ')

132 char daha uzun python's getitem için doğrudan erişim öldürüldü

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


[]Bununla birlikte, diziye erişime izin verilmez.
ǹ̷̰ĥ̷̳h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳


Soru, wiki etiketindeki kuralı kullanmıyor. Sorunun izin verilen işlemlerle ilgili kısıtlaması var. Kelimeyi not edin only.
ǹ̷̰ĥ̷̳h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳

@ n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳ Python'un bunun için de doğal bir özelliği var
Dylan Madisetti

0

Python - 25 simge

İşleri başlatmak için, ilk yazımdaki bağlantıdaki cevaplardan birinin uygulanması olan uzun bir çözümüm var. ngirilir.

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)

oreşittir ||.


0

JavaScript - 3 Jeton

Tarayıcınızın konsolunda test edin:

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)

Nasıl bu kanıya vardın? Yaklaşık 37 jeton sayıyorum.
nyuszika7h

"Bir belirteç, sabitler ve değişkenler hariç, yukarıdakilerden herhangi biridir". 37'yi nasıl saydın?
William Barbosa

1
Ah anlıyorum. OP atom-kod-golf bilgi sayfasına katılmıyor gibi görünüyor .
nyuszika7h

Aslında, şimdi doğru olup olmadığımdan emin değilim. Atomik kod golf kemanına göre puanım 70+ olurdu.
William Barbosa

1
Sorun, jeton sayısı değil, hangi işlemleri kullandığınızla ilgilidir. Ben düşünüyorum, ayrıştırma, ayrıştırma, döngüler, diziler, vb izin verilir.
aditsu

0

JavaScript
jeton # hakkında emin değil

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

veya 0 için çıktının 1 olmasına izin verilirse;

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


2
Bu meydan okuma için hangi kuralların geçerli olduğundan emin değilim. İşlev çağrılarına ve uygun işlemlere izin veriliyor mu?
C5H8NNaO4

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.