Apakah angka ini jahat?

34

pengantar

Dalam teori bilangan, bilangan dianggap jahat jika ada bilangan genap 1 dalam representasi binernya. Dalam tantangan hari ini, Anda akan mengidentifikasi apakah angka yang diberikan itu jahat atau tidak.

Tantangan

Tugas Anda adalah menulis program atau fungsi lengkap yang menerima bilangan bulat tunggal, bukan negatif sebagai input dan output (atau mengembalikan) apakah angka itu jahat atau tidak.

  • Anda dapat menampilkan nilai kebenaran apa pun jika jumlahnya jahat, dan nilai salah apa pun jika jumlahnya tidak jahat.
  • Anda dapat input dan output dalam format apa pun yang dapat diterima .
  • Celah standar tidak diijinkan.
  • Urutan OEIS A001969 adalah urutan yang berisi semua angka jahat.
  • Berikut adalah daftar 10.000 nomor kejahatan pertama, untuk referensi (dan lebih banyak kasus uji!)
  • Pertanyaan ini adalah , jadi semakin pendek, semakin baik.
  • Jangan tertunda oleh jawaban yang sangat singkat dalam bahasa golf. Saya mendorong Anda untuk mengirimkan dalam bahasa apa pun yang Anda suka.
  • Berikut ini beberapa kasus uji:

    3 => True
    11 => False
    777 => True
    43 => True
    55 => False
    666 => False
    

Papan Peringkat

Di bagian bawah halaman ada cuplikan tumpukan yang berisi papan peringkat untuk pertanyaan ini. (Terima kasih, @MartinEnder)

Untuk memastikan bahwa jawaban Anda muncul, silakan mulai jawaban Anda dengan tajuk utama, menggunakan templat Penurunan harga berikut:

# Language Name, N bytes

di mana Nukuran kiriman Anda. Jika Anda meningkatkan skor Anda, Anda dapat menyimpan skor lama di headline, dengan mencoretnya. Contohnya:

# Ruby, <s>104</s> <s>101</s> 96 bytes

Jika Anda ingin memasukkan beberapa angka dalam tajuk Anda (mis. Karena skor Anda adalah jumlah dari dua file atau Anda ingin membuat daftar hukuman penterjemah secara terpisah), pastikan bahwa skor sebenarnya adalah angka terakhir di tajuk:

# Perl, 43 + 2 (-p flag) = 45 bytes

Anda juga dapat membuat tautan nama bahasa yang kemudian akan muncul di cuplikan papan peringkat:

# [><>](http://esolangs.org/wiki/Fish), 121 bytes

EDIT: Saya percaya pertanyaan ini bukan duplikat dari ini , karena sementara pertanyaan itu meminta untuk menghitung jumlah, pertanyaan ini menanyakan apakah jumlah itu genap. Meskipun Anda dapat menyelesaikan pertanyaan ini dengan hanya menghitung bit, ada beberapa pendekatan lain juga .

Amfibologis
sumber
2
Terkait (XOR-ing setiap digit biner sama dengan mengambil jumlah modulo-2).
Kevin Cruijssen
2
@BetaDecay tetapi itu tidak bekerja secara terbalik: yaitu Anda tidak dapat mengambil semua jawaban ini dan menghapus mod 2. Oleh karena itu, tantangan ini mengundang beberapa metode baru.
Amfibologis
13
Saya percaya itu 666 => Falseharus menjadi ujian.
user2390246
3
Leaderboard rusak untuk saya
Jo King

Jawaban:

35

Z80 Assembly (8-bit), 2 byte

Kode berikut hanya berfungsi dengan nilai hingga 255:

; Input is given in register A.
; P flag is set if A is evil.
B7     or A
C9     ret


Versi 16-bit (bekerja pada semua test case), 3 byte

Ini bekerja dengan nilai hingga 65535.

; Input is given in BC.
; Output is the same as above.
78     ld A,B
A9     xor C
C9     ret

Jika Anda merasa ingin bertualang, Anda dapat mencukur 1 byte dengan menyimpan input Adan Cseperti itu

      ld BC, 777
C5    push BC
F1    pop AF

dan kemudian berlari

A9    xor C
C9    ret

Namun, ini menempatkan beban pada penelepon, sehingga mungkin dua byte ( push BCdan pop AF) harus dihitung juga.

cschultz2048
sumber
saya suka ini tetapi bagaimana cara kerjanya? ingatan saya untuk perakitan (6502 + lengan) adalah bahwa ors bitwise dengan 2 operan
north-bradley
2
@ north-bradley Pada Z80, tersirat bahwa operan kedua ormnemonik adalah akumulator A. Dalam hal ini, perintah tidak berubah A. Hanya menyegarkan register status (dan khususnya, bendera paritas) ke mencerminkan isi A.
cschultz2048
1
Apakah Pdiizinkan sesuai codegolf.meta.stackexchange.com/a/8509/29560 ? Ini sedikit dalam Fregister (bendera) yang hanya memiliki tiga pasang instruksi yang terpengaruh olehnya. Juga, jawaban ini tidak menyebutkan bahwa hanya bersaing untuk nilai 8-bit, karena Amerupakan register 8-bit. Ini berarti tidak dapat memberikan jawaban untuk 777, atau nilai yang tidak ditandatangani lainnya di atas 255.
CJ Dennis
2
Damn built-in:P
Jo King
1
@ cschultz2048 Adipasangkan dengan F, jadi saya tidak akan menerima ABatau BAsebagai nilai 16-bit. BCadalah 16-bit, tetapi kemudian Anda memerlukan instruksi tambahan untuk memuat salah satu dari mereka Asebelum XORing yang lain. Saya selalu menyebutkan bahwa jawaban Z80 saya berfungsi hingga 255 atau 65535, tergantung pada pertanyaannya. Mungkin menambahkan versi 16-bit juga? Jadi 2 byte untuk nilai 8-bit, 3 byte untuk nilai 16-bit.
CJ Dennis
25

JavaScript (ES6), 18 byte

f=n=>n?!f(n&~-n):1

Cobalah online!

Penjelasan

Logika bitwise seperti ini:

  • Untuk bilangan bulat, ~-nsama dengan -(-n)-1, sehingga hanya cara lain untuk melakukannya n-1. Dalam kasus khusus itu, kita sebenarnya bisa menggunakannya n-1.
  • n & (n-1)menghapus bit paling tidak penting yang ditetapkan ke 1 dalam n karena pengurangan n mengubah semua trailing 0 's menjadi 1 's dan menghapus 1 yang segera mengikuti (dengan membawa propagasi), sementara meninggalkan yang lainnya tidak berubah.

    Contoh untuk n = 24 (11000 dalam biner):

      11000 (24)                  11000 (24)
    -     1                   AND 10111 (23)
    -------                   ---------
    = 10111 (23)              =   10000 (16)
       ^                           ^
       |                           |
       +--- this bit is cleared ---+
    

Oleh karena itu, kami memproses sebanyak panggilan rekursif karena ada 1 dalam representasi biner dari n , membalikkan hasilnya setiap kali !. Panggilan terakhir selalu kembali 1 .

Contoh:

f(24) = !f(16) = !!f(0) = !!1 = true
f(7) = !f(6) = !!f(4) = !!!f(0) = !!!1 = false
Arnauld
sumber
Halo, saya mengerti apa yang kode lakukan, tetapi saya tidak bisa mengetahui logika / alasan di baliknya, meskipun telah membaca beberapa artikel tentang operasi bitwise, memeriksa apakah angka adalah kekuatan 2, dll. Saya tahu apa fungsi rekursif adalah . Saya hanya tidak mengerti mengapa itu digunakan dengan cara ini dan mengapa ini bekerja untuk menjawab teka-teki, yaitu hubungan antara rekursi dan! F (kekuatan dua) <==> angka jahat. Jika Anda punya waktu, penjelasannya akan disambut :) terima kasih!
supafly
1
@supafly Saya telah menambahkan penjelasan. Dan BTW: selamat datang di PPCG!
Arnauld
Pemrosesannya sangat jelas sekarang. Tetap saja, ide / alasannya sungguh ajaib! Terima kasih atas penjelasannya!
supafly
13

Python 2 , 25 byte

lambda n:int(bin(n),13)%2

Cobalah online!

bin(n)memberikan hasil seperti '0b10101'. Membaca ini sebagai bilangan bulat basis-13, kita dapatkan

11135+1134+0133+1132+0131+1130
yang mengurangi modulo 2 menjadi
115+114+013+112+011+110(mod2)
1+1+0+1+0+1(mod2).

Jadi int(bin(n),13)%2sama dengan 1 + (jumlah yang ada di bin(n)) modulo 2.

Jika nitu jahat, maka hasilnya adalah 1; selain itu 0.

Saya mengambil trik ini dari Noodle9 .

Lynn
sumber
Karena ini adalah Python 2, kode dapat lebih dipersingkat dengan usang cetak ulang backtick sintaks: lambda n:int(`n`,13)%2. Cobalah online!
GarethPW
Ya, punya sedikit otak kentut di sana dan lupa tujuan argumen dasar int. Aduh!
GarethPW
11

Japt -h!, 5 4 3 byte

¤å^

Cobalah


Penjelasan

¤       :Convert to base-2 string
 å^     :Cumulatively reduce by XORing
        :Implicitly output the last element negated
Shaggy
sumber
@LuisfelipeDejesusMunoz, porting solusi 05AB1E Kevin juga bekerja pada 5 byte, jika Anda ingin mencobanya.
Shaggy
¤¬x vini jawaban Kevin
Luis felipe De jesus Munoz
@LuisfelipeDejesusMunoz, ya, itu dia.
Shaggy
8

C # (Visual C # Interactive Compiler) , 43 38 byte


Golf Cobalah secara online!

i=>Convert.ToString(i,2).Sum(c=>c)%2<1

Tidak disatukan

i => Convert.ToString( i, 2 ).Sum( c => c ) % 2 < 1

Kode lengkap dengan tes

Func<Int32, Boolean> f = i => Convert.ToString( i, 2 ).Sum( c => c ) % 2 < 1;

Int32[] testCases = { 3, 11, 777, 43, 55 };

foreach( Int32 testCase in testCases ) {
    Console.Write( $" Input: {testCase}\nOutput: {f(testCase)}" );
    Console.WriteLine("\n");
}

Console.ReadLine();

Rilis

  • v1.1 - -5 bytes- Diganti CountmenjadiSum
  • v1.0 - 43 bytes- Solusi awal.

Catatan

  • Tidak ada
auhmaan
sumber
2
Terpilih untuk cekikikan yang diberikan versi "tidak disenangi" Anda kepada saya.
Jack Brounstein
8

Bash (tidak ada utilitas eksternal), 56 44 byte

while(($1));do set $(($1/2)) $(($2+$1%2));done;!(($2%2))

(($1))&&exec $0 $[$1/2] $[$2+$1%2];!(($2%2))

Ini mengasumsikan bahwa nomor ditemukan dalam $1, yang telah dilewati sebagai argumen baris perintah pertama. Itu juga mengasumsikan bahwa ini adalah skrip shell (sehingga ia bisa execsendiri).

Itu berulang, setelah mode, menggunakan exec $0, sampai angka (dalam $1) mencapai nol, membaginya dengan dua di setiap iterasi. Itu juga menjumlahkan (dalam $2) berapa kali kita mendapatkan angka yang ganjil. Pada akhirnya, nomor aslinya adalah "jahat" jika jumlah $2dalam tidak aneh.

Contoh doa:

$ ./script 3 && echo evil
evil

$ ./script 11 && echo evil

$ ./script 777 && echo evil
evil

$ ./script 43 && echo evil
evil

$ ./script 55 && echo evil

Untuk 0:

$ ./script 0 && echo evil
./script: line 1: ((: %2: syntax error: operand expected (error token is "%2")
evil

Hasil yang benar, dengan sedikit tambahan di samping.

Kusalananda
sumber
7

R , 37 26 byte

!sum(scan()%/%2^(0:31))%%2

Cobalah online!

Sebagai alternatif dari jawaban Robert S. , ini menjauhkan dari sedikit built-in tapi berakhir kurang golf dan terima kasih kepada JayCe dan digEmAll akhirnya datang sedikit lebih golf.

Hanya berfungsi untuk bilangan bulat positif kurang dari .2311

Giuseppe
sumber
Mengapa hardcode 31 bukan log2? Cobalah online!
digEmAll
@digEmAll Yang pada gilirannya berarti tidak perlu mendefinisikan x
JayCe
@digEmSemua terima kasih! Saya tidak yakin tentang masalah presisi, meskipun saya kira bahwa melewati kita (mungkin) kehilangan presisi dalam dan operator sehingga akan menjadi titik diperdebatkan. 2311%/%%%
Giuseppe
Juga intToBits hanya mendukung nilai integer hingga 2 ^ 31-1;)
digEmAll
6

05AB1E , 4 byte

bSOÈ

Cobalah secara online atau verifikasi semua kasus uji .

Penjelasan:

b       # Convert to binary string
        #  i.e. 777 → 1100001001
 S      # Change it to a list of 0s and 1s
        #  i.e. 1100001001 → ['1','1','0','0','0','0','1','0','0','1']
  O     # Take the sum
        #  i.e. ['1','1','0','0','0','0','1','0','0','1'] → 4
   È    # Check if it's even (1 as truthy, 0 as falsey)
        #  i.e. 4 → 1
Kevin Cruijssen
sumber
5

R , 99 98 44 34 28 byte

-1 terima kasih kepada Kevin Cruijssen! -54 terima kasih untuk ngm! -10 Terima kasih kepada Giuseppe! -6 terima kasih kepada JayCe!

!sum(intToBits(scan())>0)%%2

Cobalah online!


Atau, menggunakan binaryLogicpaket (39 byte):

!sum(binaryLogic::as.binary(scan()))%%2
Robert S.
sumber
2
Saya tidak tahu R terlalu baik, tapi saya cukup yakin ==0bisa <1:)
Kevin Cruijssen
1
43 byte?
ngm
1
Bagus! 34 byte dimungkinkan
Giuseppe
1
Ini berfungsi juga saya pikir: 32 byte Tetapi membutuhkan sedikit penjelasan :)
digEmAll
1
mudah untuk mengubahnya menjadi program penuh untuk beberapa byte lagi
JayCe
5

C (gcc) , 36 byte

c;f(n){for(c=0;n;c++)n&=n-1;n=~c&1;}

Cobalah online!

Metode dari K&R https://graphics.stanford.edu/~seander/bithacks.html#CountBitsSetKernighan

Harus dikompilasi dengan level pengoptimalan 0

ay
sumber
Tidak dikompilasi pada gcc 5.4.0: error: expected constructor, destructor, or type conversion before '(' token(panah menunjuk ke fdalam pada nama fungsi). Bendera kompiler apa yang saya butuhkan?
villapx
1
Tidak bekerja dengan -O.
nwellnhof
2
"Mengembalikan 0 untuk kebenaran, 1 untuk falsey" Apakah ini legal? Tidak mencoba mendiskreditkan jawaban Anda, hanya ingin tahu, dan karena itu akan menyelamatkan saya satu byte. Catatan: Kata kebenaran dalam tautan pertanyaan ke jawaban ini . Dan komentar ini juga menyebutkan kebenaran.
Borka223
@nwellnhof @villapx Mengkompilasi dengan baik pada 7.3.0 saya - pastikan Anda tidak melewatkan -O0flag kompiler.
@ Borka223 hmmm setelah berbulan-bulan meneliti situs ini, saya mendapat kesan bahwa truthy dan falsey bisa apa saja, asalkan mereka konsisten dalam solusi Anda. Namun, jawaban yang Anda tautkan tampaknya bertentangan dengan itu. Saya melanjutkan dan menambahkan byte. Terima kasih
vazt
4

PHP, 37 36 byte

<?=1&~substr_count(decbin($argn),1);

Untuk menjalankannya:

echo '<input>' | php -nF <filename>

Atau Coba online!

Cetakan 1untuk benar, dan 0untuk salah.

-1 byte terima kasih kepada Benoit Esnard !

David
sumber
1
Saya pikir Anda dapat menyimpan satu byte dengan menghapus operasi modulo: <?=1&~substr_count(decbin($argn),1);. Yang ini juga mencetak 0 untuk false.
Benoit Esnard
Terima kasih @BenoitEsnard! Itu sangat pintar, saya telah memperbarui jawaban saya :) Anda belajar sesuatu yang baru setiap hari!
David
4

Brachylog , 4 byte

ḃo-0

Cobalah online!

Dengan beberapa test case (😈 jahat dan 👼 tidak.)

Menggunakan sesuatu yang saya temukan baru-baru ini tentang -predikat: dokumentasinya hanya mengatakan "perbedaan elemen [input]", tetapi apa yang sebenarnya dilakukannya adalah "jumlah elemen yang diindeks (mulai dari 0) input, dikurangi jumlah ganjil elemen input terindeks ".

Sini,

mengubah angka menjadi array angka biner,

o macam mereka untuk menyatukan semua 1s.

Sekarang, jika ada angka genap 1s, akan ada angka 1s yang sama dalam indeks genap dan indeks ganjil. Jadi -setelah itu akan memberikan 0. Tapi jika ada angka ganjil dari 1s, akan ada tambahan 1 mencuat, menghasilkan perbedaan antara -1 atau 1.

Jadi, akhirnya, kami menyatakan bahwa perbedaannya adalah 0, dan mendapatkan hasil yang benar atau salah sesuai dengan itu. Dengan persyaratan output yang lebih fleksibel , ini bisa dihilangkan untuk jawaban 3 byte, dengan 0 sebagai output yang sebenarnya dan -1 dan 1 sebagai keduanya output palsu.

sundar - Pasang kembali Monica
sumber
4

INTERCAL , 90 65 63 byte

DOWRITEIN:1
DO:2<-'#0$#65535'~?':1~:1'
DOREADOUT:2
PLEASEGIVEUP

Cobalah online!

Tidak digabungkan dan diperluas (sesuai nilainya) dengan komentar gaya C

DO WRITE IN :1 //Store user input in 1
DO :2<-:1~:1 //Select just the ones. So will convert binary 10101 to 111
DO :3<-:?2 //Run the unary xor over the result. Essentially, xor with the right bitshifted
           //(with wraparound) value).
DO :9<-#0$#65535 //Intermingle the 16 bit values of all 0's and all 1's, to create a
                 //32 bit number with 1's in the odd positions.
DO :4<-:9~:3 //It turns out that at this point, evil numbers will have no bits in odd
             //positions, and non-evil numbers will have precisely one bit in an odd
             //position. Therefore, the ~ will return 0 or 1 as appropriate.
PLEASE READ OUT :4 //Politely output
PLEASE GIVE UP //Polite and self explanatory

Saya harus membuat beberapa konsesi untuk membuatnya layak di INTERCAL. Yang pertama adalah, seperti semua program INTERCAL, input numerik harus dituliskan. Jadi, jika Anda ingin memasukkan, 707Anda akan memberikan SEVEN OH SEVEN.

Yang kedua adalah bahwa INTERCAL tidak benar-benar memiliki nilai kebenaran atau kepalsuan yang tepat. Sebagai gantinya, ini akan menampilkan Angka Romawi I(1) jika jumlahnya tidak jahat, atau 0 (biasanya diwakili -karena Angka Romawi biasanya tidak dapat mewakili 0).

Jika Anda ingin membaliknya sehingga angka jahat mengembalikan 1 dan angka non-jahat mengembalikan 0, Anda dapat mengubah baris 4 dan 5 dari versi yang tidak diklik sebagai berikut, meskipun itu menambah 3 byte.

DO:9<-#65535$#0
DO:4<-#1~:9~3
Ethan
sumber
3

Attache , 13 12 byte

Even@Sum@Bin

Cobalah online!

(Old 13 bytes: Even@1&`~@Bin)

Ini adalah komposisi dari tiga fungsi:

  1. Bin
  2. Sum
  3. Even

Cek ini bahwa Sumdari Binekspansi ary dari input Even.

Conor O'Brien
sumber
: | saya tidak punya kata
ASCII-hanya
@ ASCII-hanya cukup ringkas, eh? c:
Conor O'Brien
3

dc , 18 16 byte

[2~rd1<M+]dsMx2%

Mengembalikan (ke tumpukan) 0 untuk kejahatan dan 1 untuk tidak jahat

Cobalah online!

Cukup mudah - secara rekursif menerapkan operator hasil bagi / sisa gabungan ~ke hasil bagi baru dan menambahkan semua sisanya bersama-sama, kemudian mod dengan 2 (setelah menghabiskan dua byte untuk beralih ke standar kebenaran / kepalsuan) .

Diedit untuk mencerminkan konsensus bahwa 0 untuk kebenaran dan 1 untuk falsy boleh-boleh saja, terutama dalam bahasa yang tidak memiliki if(boolean)konstruksi.

Sophia Lechner
sumber
3

Python 2, 29 byte

lambda n:~bin(n).count('1')&1

Cobalah online!

Mengembalikan 1 jika Benar, kalau tidak 0.

Mengonversi angka menjadi string biner seperti '0b11', menghitung jumlah 1s, mendapatkan komplemen hasil, dan mengembalikan bit komplemen terakhir (terima kasih, https://codegolf.stackexchange.com/users/53560/cdlane !) (1 ​​jika nomor aslinya genap, 0 jika ganjil).

Triggernometri
sumber
1
Tidak lebih sedikit byte tetapi lambda n:~bin(n).count('1')&1menggantikan divisi modular dengan sesuatu yang berpotensi lebih murah.
cdlane
3

x86-16, 3 byte

Daftar NASM:

 1                                  parity16:
 2 00000000 30E0                        xor al,ah
 3 00000002 C3                          ret

Fungsi integer 16-bit arg di AX (yang dihancurkan), mengembalikan nilai dalam PF.

Perangkat keras menghitung paritas hasilnya bagi kita, di Bendera Paritas x86 . Penelepon dapat menggunakan jp/ jnpke cabang, atau apa pun yang mereka suka.

Bekerja persis seperti jawaban Z80 / 8080 @ cschultz ; sebenarnya 8086 dirancang untuk membuat porting sumber mekanis dari 8080 menjadi mudah .

Perhatikan bahwa PF hanya diatur dari byte rendah dari hasil yang lebih luas, jadi test edi,editidak akan berfungsi untuk versi x86-64. Anda harus horizontal-xor ke 16 bit, atau popcnt eax, edi/ and al,1(di mana 0 benar).

Peter Cordes
sumber
3

C ++ (gcc) (-O0),  36  31 byte

int f(int i){i=!i||i%2-f(i/2);}

Cobalah online!


C ++ (dentang) , 35 byte

int f(int i){return!i||i%2-f(i/2);}

Cobalah online!


Ini adalah usaha pertama saya dalam kode golf, saya harap saya tidak melanggar aturan yang mungkin saya lewatkan.

Sunting:
- Disimpan 5 byte berkat @Jonathan Frech: digantikan !=oleh -dan returnoleh i=(pengganti terakhir tampaknya tidak bekerja dengan dentang sekalipun)
- Karena tampaknya ada perdebatan apakah saya harus menggunakan penyalahgunaan gcc -O0, saya pikir saya bisa berikan saja kedua versi

Annyo
sumber
Selamat datang di PPCG! Anda mungkin dapat menyimpan byte dengan golf !=ke -dan empat lainnya dengan golf returnke i=.
Jonathan Frech
@ JonathanFrech Sudah lama sejak saya melakukan C ++, apakah itu secara implisit mengembalikan ekspresi yang ditugaskan terakhir dalam suatu fungsi jika tidak ada pernyataan kembali? Saya kira itu hal gcc?
sundar - Reinstate Monica
1
Ini adalah penyalahgunaan perilaku khusus gcc yang tidak terdefinisi pada level optimisasi O0.
Jonathan Frech
Dengan beralih ke K&R C, Anda bisa mendapatkannya hingga 23 byte (sangat mengesankan!) Cobalah online!
ErikF
@ JonathanFrech: mengapa orang bersikeras menggunakan gcc -O0hack bodoh itu ? Ini tidak seperti panjang total boilerplate suatu bahasa sangat berarti ketika membandingkan implementasi. Selain itu, membuatnya lebih menarik untuk memilih antara returnvs panggilan-oleh-referensi (memperbarui *idi tempat). Saya lebih suka menulis jawaban C atau C ++, bukan jawaban un-dioptimalkan-gcc-only, karena un-dioptimalkan-gcc bukan bahasa yang sangat berguna.
Peter Cordes
3

SML , 32 Bytes

fun%0=1| %n=(n+ %(n div 2))mod 2

Penjelasan:

  • % adalah nama fungsi
  • menerima input balasan dan mengembalikan 1 jika jahat, 0 sebaliknya
  • n adalah input, return (n +% (n // 2))% 2

Dibuat oleh 2 Siswa Carnegie Mellon yang bosan

CarManuel
sumber
Selamat datang di PPCG, dan jawaban pertama yang bagus!
mbomb007
2

Keempat (gforth) , 53 byte

: f 1 swap begin 2 /mod -rot xor swap ?dup 0= until ;

Cobalah online!

Penjelasan

Mengambil xor-jumlah digit dari bentuk biner nomor tersebut. (berulang kali dibagi 2 dan xor sisanya dengan nilai "jumlah")

Penjelasan Kode

: f              \ begin a new word definition
  1 swap         \ place 1 on the stack below the input (n)
  begin          \ start an indefinite loop
    2 /mod       \ get the quotient and remainder of dividing n by 2
    -rot         \ move the sum and remainder to the top of the stack
    xor          \ xor the sum and remainder
    swap         \ move the quotient back to the top of the stack
    ?dup         \ duplicate if > 0
    0=           \ get "boolean" indicating if quotient is 0
  until          \ end the loop if it is, otherwise go back to the beginning
;                \ end the word definition
reffu
sumber
2

Java 8, 40 36 byte

n->n.toString(n,2).chars().sum()%2<1

-4 byte terima kasih kepada @Okx untuk sesuatu yang seharusnya tidak saya lupakan sendiri ..

Cobalah online.

Penjelasan:

n->                // Method with Integer parameter and boolean return-type
  n.toString(n,2)  //  Convert the integer to a binary String
   .chars()        //  Convert that to an IntStream of character-encodings
   .sum()          //  Sum everything together
    %2<1           //  And check if it's even

Perhatikan bahwa pengkodean karakter untuk 0dan 1adalah 48dan 49, tetapi menjumlahkannya dan mengambil modulo-2 masih memiliki hasil yang benar karena 48%2 = 0dan 49%2 = 1.

Kevin Cruijssen
sumber
1
n.toString(n,2)menghemat 4 byte.
Okx
@ OKK Tidak yakin bagaimana saya lupa tentang itu, lol .. Terima kasih! ;)
Kevin Cruijssen
Jika Anda diizinkan menggunakan 1 dan 0 alih-alih benar dan salah (tidak yakin untuk Java), Anda dapat mengubah ke: ~n.toString(n,2).chars().sum()%2untuk menyimpan satu byte.
Mario Ishac
1
@MarDev Sayangnya 0dan 1tidak benar / falsey di Jawa, hanya booleans/ Booleanssedang. Jika sebuah tantangan akan menyatakan dua output berbeda diizinkan, <1bisa saja telah dihapus untuk menghemat 2 byte. :)
Kevin Cruijssen
2

Perl 6 , 21 byte

*.base(2).comb(~1)%%2

Menguji

Diperluas:

*\        # WhateverCode lambda (this is the parameter)
.base(2)  # Str representing the binary
.comb(~1) # find the "1"s

%% 2      # is the count of "1"s divisible by 2?
Brad Gilbert b2gills
sumber
*.base(2)%9%%2
Jo King
Ah, itu tidak berfungsi untuk angka dengan lebih dari 9 bit ...
Jo King
1
{:3(.base(2))%%2}
nwellnhof
2

Retina 0.8.2 , 28 byte

.+
$*
+`(1+)\1
$+0
0

11

^$

Cobalah online! Tautan termasuk kasus uji. Penjelasan:

.+
$*

Konversikan ke unary.

+`(1+)\1
$+0

Konversi biner parsial (meninggalkan angka nol ekstra).

0

Hapus semua nol.

11

Modulo satu per dua.

^$

Uji apakah hasilnya nol.

Neil
sumber
2

x86 Assembly, 12 11 byte

F3 0F B8 44 24 04  popcnt      eax,dword ptr [esp+4] ; Load EAX with the number of ones in arg
F7 D0              not         eax ; One's complement negation of EAX
24 01              and         al,1 ; Isolate bottom bit of EAX
C3                 ret             

-1 byte terima kasih atas saran @ ceilingcat

Govind Parmar
sumber
@ceilingcat Tangkapan yang bagus!
Govind Parmar
1
Sarankan inc eaxalih-alih not eax. Mungkin juga ingin menyebutkan bahwa ini membutuhkan prosesor dengan dukungan untuk popcntinstruksi.
ceilingcat
1
Anda juga tidak harus mengambil arg dari stack. lihat konvensi pemanggilan yang diizinkan codegolf.stackexchange.com/a/161497/17360 ( codegolf.stackexchange.com/a/165020/17360 jawaban yang lebih mendalam Peter Cordes )
qwr
1
Perhatikan bahwa Anda dapat mengembalikan boolean di FLAGS stackoverflow.com/a/48382679/3163618
qwr
Tidakkah seharusnya 666 menjadi ujian?
Arcanist Lupus
2

Utilitas Bash + GNU, 33

dc -e2o?p|tr -d 0|wc -c|dc -e?2%p

Cobalah online!

Membaca input dari STDIN. Output 1 untuk Benar dan 0 untuk Salah.

  • dc mengkonversi input ke string biner
  • tr menghapus nol
  • wc menghitung yang tersisa (dan mengikuti baris baru, yang mengoreksi rasa logika
  • dc menghitung hitungan mod 2 dan menampilkan jawabannya
Trauma Digital
sumber
2

Python 2, 28 27 byte

f=lambda n:n<1or n&1^f(n/2)

Cobalah online!

Mengembalikan nilai kebenaran jika tepat salah satu dari the ones-bit is a 1dan the result of calling this function on n/2 is truthyitu benar (atau n==0). Ia bekerja karena n/2setara dengan bithift kanan dengan pembagian lantai (jadi hanya Python 2).

Versi alternatif, juga 28 27 byte

g=lambda n:n<1or g(n&n-1)^1

Cobalah online!

Berdasarkan metode K&R menghitung bit set yang dirujuk oleh vazt.

Kedua hal ini bisa dua byte lebih pendek jika output memungkinkan falsey berarti jahat.

Sunting: Berkat Amphibological karena telah menghemat satu byte!

Jack Brounstein
sumber
Anda dapat menghapus spasi antara 1dan oruntuk menyimpan +1 byte. Solusi bagus!
Amfibologis
Sobat, saya pikir saya sudah mencobanya. Tangkapan yang bagus!
Jack Brounstein
2

APL (Dyalog Unicode) , 10 byte SBCS

Fungsi diam-diam anonim. Dapat mengambil array bilangan bulat apa pun sebagai argumen.

≠⌿12∘⊥⍣¯1

Cobalah online!

2∘⊥⍣¯1 konversikan ke biner, gunakan sebanyak mungkin digit yang dibutuhkan oleh angka terbesar, pisahkan digit di sepanjang sumbu primer

1⍪ tambahkan yang di sepanjang sumbu utama

≠⌿ Pengurangan XOR sepanjang sumbu utama

Adm
sumber
2

J , 9 byte

Fungsi diam-diam anonim. Dapat mengambil array integer sebagai argumen.

1-2|1#.#:

Cobalah online!

1- satu minus (yaitu negasi logis dari)

2| mod-2 dari

1#. jumlah (lit. evaluasi base-1) dari

#: representasi biner

Adm
sumber
Yang bagus! pendekatan yang membosankan adalah 9 byte:2|1+1#.#:
Conor O'Brien
Ini hanya berfungsi karena 777 pada input membuat setiap angka direpresentasikan dalam 10 bit. Ganti dengan misalnya 480 dan output membalik.
FrownyFrog
@ ConorO'Brien Boring truf salah.
Adám
@FrownyFrog Diperbaiki.
Adám