Mod 2 Çok terimli katsayılar


14

quintopia burada multinom katsayılarını hesaplamak için bir zorluk yayınladı (buradaki metnin bir kısmı oradan kopyalanıyor). Mod 2 katsayılarını hesaplamak için eğlenceli bir algoritma vardır.

Sayıların bir listesi verildiğinde, k 1 , k 2 , ..., k m , multinom katsayısının kalıntısını çıktılayın:

resim açıklamasını buraya girin

indirgenmiş mod 2. Bu verimli etmez algoritma aşağıdaki gibidir: her biri için k i , ikili genişleme hesaplamak k i olduğunu bulmak bir ij örneğin her birinin bir ij 1 ya da 0 olduğu ve

resim açıklamasını buraya girin

Herhangi bir j gibi var ise , bir RJ = a sj = 1 ≠ r s, o zaman ilgili mod 2 çokterimli katsayısı aksi mod 2 çokterimli katsayısı 1, 0 'dır.

Görev

M sayıları, k 1 , k 2 , ..., k m alan ve karşılık gelen multinom katsayısını veren veya döndüren bir program veya işlev yazın . Programınız isteğe bağlı olarak gerekirse m'yi ek bir argüman olarak alabilir .

  • Bu sayılar, örneğin çok gruplu katsayının gerçek hesaplaması kodlama işlemi tarafından değil, kodunuz tarafından gerçekleştirildiği sürece, listeler halinde gruplandırılmış veya tekli olarak kodlanmış veya başka herhangi bir şeyden hoşlanan herhangi bir biçimde girilebilir.

  • Multinom katsayısı tek ise çıktı herhangi bir doğruluk değeri ve multinom katsayısı eşitse herhangi bir falsey değeri olabilir.

  • Çok terimli katsayıyı hesaplamak için tasarlanmış yerleşik yapılara izin verilmez.

  • Standart boşluklar geçerlidir.

puanlama

Bu kod golf: Bayt en kısa çözüm kazanır.

Örnekler:

7, 16 ve 1000 multinom katsayısını bulmak için her birini ikiye katlıyoruz:

resim açıklamasını buraya girin

Hiçbir sütunda birden fazla 1 olmadığından, multinom katsayısı tuhaftır ve bu nedenle doğru bir şey çıkarmalıyız.

7, 16 ve 76 multinom katsayısını bulmak için her birini ikiye katlıyoruz:

resim açıklamasını buraya girin

Hem 76 hem de 7 ikili genleşmelerinde 4 olduğundan, multinom katsayısı eşittir ve bu nedenle bir falsey değeri üretiriz.

Test senaryoları:

Input: [2, 0, 1]
Output: Truthy

Input: [5,4,3,2,1]
Output: Falsey

Input: [1,2,4,8,16]
Output: Truthy

Input: [7,16,76]
Output: Falsey

Input: [7,16,1000]
Output: Truthy

Input: [545, 1044, 266, 2240]
Output: Truthy

Input: [1282, 2068, 137, 584]
Output: Falsey

Input: [274728976, 546308480, 67272744, 135004166, 16790592, 33636865]
Output: Truthy

Input: [134285315, 33849872, 553780288, 544928, 4202764, 345243648]
Output: Falsey

1
PPCG'ye Hoşgeldiniz! Güzel ilk gönderi!
Rɪᴋᴇʀ

==Eğer doğruluk ve falsey'in çevrilmesine izin verilirse, eşitlik için birçok dilin bir bayt kurtarabileceğini düşünüyorum.
Ørjan Johansen

@ ØrjanJohansen Kulağa hoş geliyor.
Hood

Yanıtlar:






2

Japt, 6 bayt

Başka bir pizzapant limanı184 ve Leaky Nun çözümleri.

x ¶Ur|

Dene


Teknik olarak, pizzapants184 benden 14 saniye önce cevap verdi ...
Leaky Nun

2

JavaScript (ES6), 37 35 34 bayt

@ Mr.Xcoder sayesinde 2 bayt kaydedildi @ETHproductions
sayesinde 1 bayt kaydedildi

Toplamı bitsel OR ile karşılaştırmak ( pizzapants184 ve Leaky Nun gibi) ilk yaklaşımımdan 1 3 4 bayt daha kısa:

a=>(q=c=>eval(a.join(c)))`|`==q`+`

Test senaryoları


Alt. sürüm, 38 bayt

a=>!a.some((x,i)=>a.some(y=>i--&&x&y))

Test senaryoları


Teknik olarak, pizzapants184 benden 14 saniye önce cevap verdi ...
Leaky Nun

-1 bayt:a=>(q=c=>eval(a.join(c)))`|`==q`+`;
ETHproductions

@ETHproductions Güzel! Bu Node.js'de iyi çalışır. Ancak bir tarayıcıda çalışmasını başardınız mı?
Arnauld

Firefox 57'de benim için iyi çalışıyor. Bir hata mı alıyorsunuz veya sadece düzgün çalışmıyor mu?
ETHproductions

@ETHproductions Aslında, evet işe yarıyor. Sadece repl.it üzerinde başarısız olur .
Arnauld

2

Haskell , 38 bayt

(==).sum<*>foldl1 xora döndüren anonim bir işlevdir Bool. Olarak kullan ((==).sum<*>foldl1 xor) [2,0,1].

import Data.Bits
(==).sum<*>foldl1 xor

Çevrimiçi deneyin!

  • Herkesin kullandığı pizzapants184 ve Leaky Nun ile hemen hemen aynı hile, Haskell operatör adları xorile (.|.)(bitsel veya) yerine (bitsel) kullanmak için bir bayt kaydeder .

  • (==).sum<*>foldl1 xor, noktasının ücretsiz bir sürümüdür \l->sum l==foldl1 xor l.


2

Java 8, 53 bayt

a->{int i=0,j=0;for(int x:a){i+=x;j|=x;}return i==j;}

Port @LeakyNun 'in Jelly cevap .

Açıklama:

Burada deneyin.

a->{             // Method with integer-array parameter and boolean return-type
  int i=0,j=0;   //  Two integers, both starting at 0
  for(int x:a){  //  Loop over the array
    i+=x;        //   Add them to the first integer
    j|=x;}       //   And bitwise-OR it with the second integer
  return i==j;}  //  Return if both integers are the same after the loop




1

Kırmızı , 78 bayt

f: func[x][b: :to-binary t: 0 s: b 0 foreach n x[t: t + n s: s or b n]s = b t]

Nasıl çalışır:

Ungolfed:

Red []
f: func [x][         -  a function taking a block as an argument
    b: :to-binary    -  an alias for the to-binary function
    t: 0             -  set the sum of the numbers to 0
    s: b 0           -  set the "or" total to binary 0
    foreach n x[     -  for each number in the block
        t: t + n     -  add it to the sum
        s: s or b n  -  bitwise or of its binary representation with the total
    ]
    s = b t          - are the sum (binary) and the "or" total equal?
]

Çevrimiçi deneyin!



0

Toplu, 73 bayt

@set/as=o=0
@for %%i in (%*)do @set/as+=%%i,o^|=%%i
@if %s%==%o% echo 1

1Doğruluk için çıktılar , sahte için hiçbir şey. Bir başka pizzapant limanı184 / Leaky Nun'in algoritması.


0

J , 10 bayt

+/=+./&.#:

Bir başka pizzapant limanı184's & Leaky Nun'in çözümleri.

Nasıl çalışır?

+/.&.#: - sayıları ikiliye dönüştürün, bitsel olarak ya da ikisinin güçlerine uygulayın ve ikili sayıdan ondalığa dönüştürün

+/ - ekleyerek girişi azaltın

= - yukarıdakiler eşit mi?

Çevrimiçi deneyin!

Kolay alternatif

J , 12 bayt

2>[:>./+/@#:

Nasıl çalışır?

+/@#: - Her sayıyı ikiliye dönüştürün ve her gücün toplamını bulun 2

>./ - maksimum değeri bul

2>- 2'den az mı? -> doğruluk

Çevrimiçi deneyin!


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.