Mod 2 Koefisien multinomial


14

quintopia telah memposting di sini sebuah tantangan untuk menghitung koefisien multinomial (beberapa teks di sini disalin dari sana). Ada algoritma yang menyenangkan untuk menghitung koefisien multinomial mod 2.

Mengingat daftar nomor, k 1 , k 2 , ..., k m , output residu dari koefisien multinomial:

masukkan deskripsi gambar di sini

berkurang mod 2. Berikut algoritma hal ini efisien: untuk setiap k i , menghitung ekspansi biner k i , yaitu, menemukan sebuah ij sehingga setiap a ij adalah 1 atau 0 dan

masukkan deskripsi gambar di sini

Jika ada j sehingga a rj = a sj = 1 untuk r ≠ s, maka koefisien multinomial mod 2 yang terkait adalah 0, jika tidak, koefisien multinomial mod 2 adalah 1.

Tugas

Menulis sebuah program atau fungsi yang mengambil m nomor, k 1 , k 2 , ..., k m , dan output atau hasil koefisien multinomial yang sesuai. Program Anda secara opsional dapat menganggap m sebagai argumen tambahan jika perlu.

  • Angka-angka ini dapat dimasukkan dalam format apa pun yang disukai, misalnya dikelompokkan ke dalam daftar atau disandikan di unary, atau apa pun, selama perhitungan aktual dari koefisien multinomial dilakukan oleh kode Anda, dan bukan proses pengkodean.

  • Output dapat berupa nilai kebenaran jika koefisien multinomialnya ganjil dan nilai falsey apa pun jika koefisien multinomial genap.

  • Built-in yang dirancang untuk menghitung koefisien multinomial tidak diperbolehkan.

  • Celah standar berlaku.

Mencetak gol

Ini adalah kode golf: Solusi terpendek dalam byte yang menang.

Contoh:

Untuk menemukan koefisien multinomial 7, 16, dan 1000, kami biner mengembangkan masing-masing:

masukkan deskripsi gambar di sini

Karena tidak ada kolom yang memiliki lebih dari satu 1, koefisien multinomialnya aneh, dan karenanya kita harus menampilkan sesuatu yang benar.

Untuk menemukan koefisien multinomial dari 7, 16, dan 76, kami biner mengembangkan masing-masing:

masukkan deskripsi gambar di sini

Karena keduanya 76 dan 7 memiliki 4 dalam ekspansi biner mereka, koefisien multinomial genap dan jadi kami menghasilkan nilai falsey.

Kasus uji:

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
Selamat datang di PPCG! Posting pertama yang bagus!
R

Saya pikir beberapa bahasa dengan ==kesetaraan bisa menyelamatkan satu byte jika kebenaran dan falsey dibiarkan terbalik.
Ørjan Johansen

@ ØrjanJohansen Kedengarannya bagus.
Hood

Jawaban:






2

Japt, 6 byte

Port lain dari solusi pizzapants184 & Leaky Nun.

x ¶Ur|

Menguji


Secara teknis, pizzapants184 menjawab 14 detik lebih awal dari saya ...
Leaky Nun

2

JavaScript (ES6), 37 35 34 byte

Disimpan 2 byte berkat @ Mr.Xcoder
Disimpan 1 byte berkat @ETHproduksi

Membandingkan jumlah dengan bitwise OR (seperti pizzapants184 dan Leaky Nun lakukan) adalah 1 3 4 byte lebih pendek daripada pendekatan awal saya:

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

Uji kasus


Alt. versi, 38 byte

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

Uji kasus


Secara teknis, pizzapants184 menjawab 14 detik lebih awal dari saya ...
Leaky Nun

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

@ EHProduk Bagus! Ini berfungsi dengan baik di Node.js. Tetapi apakah Anda berhasil membuatnya bekerja di browser?
Arnauld

Bekerja dengan baik untuk saya di Firefox 57. Apakah Anda mendapatkan kesalahan atau tidak berfungsi dengan benar?
ETHproduksi

@ ETHproductions Sebenarnya, ya itu berhasil. Itu hanya terjadi gagal pada repl.it .
Arnauld

2

Haskell , 38 byte

(==).sum<*>foldl1 xoradalah fungsi anonim mengembalikan a Bool. Gunakan sebagai ((==).sum<*>foldl1 xor) [2,0,1].

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

Cobalah online!

  • Trik yang hampir sama oleh pizzapants184 dan Leaky Nun yang digunakan semua orang, kecuali bahwa dengan nama operator Haskell menghemat satu byte untuk menggunakan (bitwise) xoralih-alih (.|.)(bitwise atau).

  • (==).sum<*>foldl1 xoradalah versi point-free dari \l->sum l==foldl1 xor l.


2

Java 8, 53 byte

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

Port dari jawaban Jelly @ LeakyNun .

Penjelasan:

Coba di sini.

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

Perl 6 , 15 byte

{.sum==[+|] $_}

Menguji

Diperluas:

{  # bare block lambda with implicit parameter 「$_」

    .sum  # the sum of 「$_」 (implicit method call)

  ==

    [+|]  # reduce using &infix:«+|» (numeric binary or)

      $_  # the input
}

1

Merah , 78 byte

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]

Bagaimana itu bekerja:

Tidak Disatukan:

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?
]

Cobalah online!



0

Batch, 73 byte

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

Keluaran 1untuk kebenaran, tidak ada yang palsu. Port lain yang jelas dari algoritme pizzapants184 / Leaky Nun.


0

J , 10 byte

+/=+./&.#:

Namun port lain dari solusi pizzapants184 & Leaky Nun.

Bagaimana itu bekerja?

+/.&.#: - Mengonversi angka menjadi biner, menerapkan bitwise atau ke pangkat dua dan mengkonversi kembali dari biner ke desimal

+/ - kurangi input dengan penambahan

= - apakah di atas sama?

Cobalah online!

Alternatif langsung

J , 12 byte

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

Bagaimana itu bekerja?

+/@#: - Konversi setiap angka menjadi biner dan temukan jumlah masing-masing kekuatan 2

>./ - temukan yang maksimal

2>- apakah kurang dari 2? -> benar

Cobalah online!


Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.