Bu sayı kötü mü?


34

Giriş

Sayı teorisinde, ikili gösteriminde 1 sayısı çift olduğunda bir sayı kötü olarak kabul edilir. Bugünün meydan okumasında, belirli bir sayının kötülük olup olmadığını tespit ediyor olacaksınız.

Meydan okuma

İşiniz, bu sayının kötümsüz olup olmadığına bakılmaksızın, girdi olarak çıktı veren (veya geri dönen) tek, negatif olmayan bir tamsayı kabul eden tam bir program veya işlev yazmaktır.

  • Sayı kötüyse herhangi bir gerçek değeri, sayı kötüyse herhangi bir sahte değeri yazdırabilirsiniz.
  • Kabul edilebilir herhangi bir formatta giriş ve çıkış yapabilirsiniz .
  • Standart boşluklara izin verilmez.
  • OEIS dizisi A001969 , tüm kötü numaraları içeren dizilimdir.
  • İşte ilk 10000 kötülük numarası listesi başvuru için, (ve daha fazla test durumlarda!)
  • Bu soru , yani ne kadar kısa olursa o kadar iyidir.
  • Golf dillerinde oldukça kısa cevaplarla ertelenmeyin. İstediğiniz herhangi bir dilde göndermenizi tavsiye ederim.
  • İşte bazı test durumları:

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

Afiş

Sayfanın en altında, bu soru için bir afiş içeren bir yığın pasajı bulunur. (Teşekkürler, @MartinEnder)

Cevabınızın göründüğünden emin olmak için, lütfen aşağıdaki Markdown şablonunu kullanarak cevabınızı bir başlık ile başlatın:

# Language Name, N bytes

Gönderinizin Nbüyüklüğü nerede ? Puanınızı artırmak varsa, olabilir onları içinden vurarak, başlığa eski hesapları tutmak. Örneğin:

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

Başlığınıza birden fazla sayı eklemek istiyorsanız (örneğin, puanınız iki dosyanın toplamı olduğundan veya tercüman bayrağı cezalarını ayrı ayrı listelemek istediğiniz için), gerçek puanın başlıktaki son sayı olduğundan emin olun :

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

Dil adını, daha sonra büyük afiş snippet'inde görünecek bir bağlantı da yapabilirsiniz:

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

DÜZENLEME: Bu soru kopyası olmadığına inanıyorum bu bu soruyu olanların sayısını saymak isteyen oysa, bu soru olanların sayısı bile olup olmadığını soruyor, çünkü. Eğer rağmen yapabilirsiniz basitçe bitleri sayarak bu soruyu başarmak vardır diğer yaklaşımlar da .


2
İlgili (Her ikili basamağa XOR girmek, modulo-2 toplamını almakla aynıdır).
Kevin Cruijssen


2
@BetaDecay ancak bu ters çalışmaz: yani tüm bu cevapları alamaz ve mod 2'yi kaldıramazsınız. Bu nedenle, bu zorluk bazı yeni yöntemleri davet eder.
Amfibolojik

13
Bunun 666 => Falsebir test olayı olduğuna inanıyorum .
kullanıcı2390246

3
Afiş benim için bozuldu
Jo King

Yanıtlar:


35

Z80 Düzeneği (8 bit), 2 bayt

Aşağıdaki kod yalnızca 255 değerine kadar olan değerlerle çalışır:

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


16 bit sürüm (tüm test durumlarında çalışır), 3 bayt

Bu, 65535'e kadar olan değerlerle çalışır.

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

Maceracı hissediyorsan, sen girdi depolayarak 1 bayt tıraş edebilir Ave Cşöyle

      ld BC, 777
C5    push BC
F1    pop AF

ve sonra çalışan

A9    xor C
C9    ret

Ancak bu, yükü arayan kişiye yükler, bu nedenle iki bayt ( push BCve pop AF) de sayılmalıdır.


Bunu sevdim ama bu nasıl çalışıyor? montaj için hafızam (6502 + kol) ors: 2 operand ile bit cinsidir
kuzey-bradley

2
@ kuzey-bradley Z80’de, oranımsatıcının ikinci işlecinin akümülatör A olduğu ima edilir . Bu durumda, komut A değişmez. A. içeriğini yansıtmak
cschultz2048

1
Is Puyarınca izin codegolf.meta.stackexchange.com/a/8509/29560 ? F(Bayraklar) kaydında, bundan etkilenen sadece üç çift komut içeren tek bir bit . Ayrıca, bu cevap, A8 bitlik bir kayıt olduğundan yalnızca 8 bitlik değerler için rekabet ettiğini söyleyemez . Bu 777,
CJ Dennis

2
Lanet olası yerleşiklikler:P
Jo King,

1
@ cschultz2048 Aile eşleştirildi F, bu yüzden kabul etmem ABya BAda 16 bitlik bir değer olarak. BC16 bit, ancak daha sonra AXOR diğerini girmeden önce bunlardan birini yüklemek için fazladan bir talimat gerekir . Z80 cevaplarımın soruya bağlı olarak 255 veya 65535'e kadar çalıştığını her zaman söyledim. Belki de bir 16-bit sürümünü de ekleyebilirim? Böylece 8 bitlik değerler için 2 bayt, 16 bitlik değerler için 3 bayt.
CJ Dennis,

25

JavaScript (ES6), 18 bayt

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

Çevrimiçi deneyin!

açıklama

Bitsel mantık şöyle devam eder:

  • Tamsayılar için, ~-neşdeğerdir -(-n)-1, yani bunu yapmanın başka bir yolu n-1. Bu özel durumda, gerçekten kullanabilirdik n-1.
  • n & (n-1)en az önemli bit kümesi kaldırır 1 içinde n azaltma için n tüm izleyen döner 0 'içine s 1 s' ve siler 1 başka değişmeden her bırakırken, (taşıma yayılma ile) hemen izler.

    N = 24 örneği (ikili sistemde 11000):

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

Bu nedenle, n 'nin ikili gösteriminde 1 ' ler olduğu kadar tekrarlı aramalar yapıyoruz , sonuçları her seferinde tersine çeviriyoruz . Son çağrı her zaman 1 döndürür .!

Örnekler:

f(24) = !f(16) = !!f(0) = !!1 = true
f(7) = !f(6) = !!f(4) = !!!f(0) = !!!1 = false

Merhaba, kodun ne yaptığını anlıyorum, ancak bitsel işlemler hakkında birkaç makale okuduğumda, bir sayının 2'nin bir gücü olup olmadığını kontrol etmemize rağmen arkasındaki mantığı / mantığı çözemiyorum. Özyinelemeli bir fonksiyonun ne olduğunu biliyorum . Sadece neden bu şekilde kullanıldığını ve neden bilmeceye cevap vermek için çalıştığını anlamıyorum, yani özyinelemeyle! F (iki gücün) <==> şeytan sayısı arasındaki bağlantı. Zamanınız varsa, açıklama memnuniyetle karşılanacaktır :) teşekkürler!
Supafly

1
@supafly Bir açıklama ekledim. Ve BTW: PPCG'ye hoş geldiniz!
Arnauld,

İşlem şimdi çok açık. Yine de, fikir / akıl yürütme gerçekten sihirdir! Açıklama için teşekkür ederim!
Supafly

13

Python 2,25 bayt

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

Çevrimiçi deneyin!

bin(n)gibi bir sonuç verir '0b10101'. Bunu bir temel 13 tamsayısı olarak okurken,

, modulo 2'yi1 1 5 + 1 1 4 + 0 1 3 + ' ya düşürür. 1 1 2 + 0 1 1 + 1 1

11135+1134+0133+1132+0131+1130
1 + 1 + 0 + 1 + 0 + 1
115+114+013+112+011+110(mod2)
1+1+0+1+0+1(mod2).

Yani int(bin(n),13)%2, 1 + (içinde olanların sayısı bin(n)) modulo 2'ye eşittir .

Eğer nkötüyse, sonuç 1'dir; Aksi takdirde 0'dır.

Bu numarayı Noodle9'dan aldım .


Bu Python 2 olduğu, kodu ayrıca, kullanımdan kaldırılmış Repr ters tırnak sözdizimi ile kısaltılabilir: lambda n:int(`n`,13)%2. Çevrimiçi deneyin!
GarethPW

Evet, orada bir parça beyin osuruğu vardı ve int'in temel argümanının amacını unuttum. Tüh!
GarethPW

11

Japt -h!, 5 4 3 bayt

¤å^

Dene


açıklama

¤       :Convert to base-2 string
 å^     :Cumulatively reduce by XORing
        :Implicitly output the last element negated

@LuisfelipeDejesusMunoz, Kevin'in 05AB1E çözümünü taşıyor ve bunun için denemek isterseniz 5 baytta da çalışıyor.
Shaggy

¤¬x vbu kevin'in cevabı
Luis felipe De jesus Munoz

@ LouisfelipeDejesusMunoz, evet, işte bu.
Shaggy

8

C # (Visual C # Etkileşimli Derleyici) , 43 38 bayt


Golfed Çevrimiçi deneyin!

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

Ungolfed

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

Testlerle birlikte tam kod

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

Bültenleri

  • v1.1 - -5 bytes- Değiştirilen CountiçinSum
  • v1.0 - 43 bytes- İlk çözüm.

notlar

  • Yok

2
Kıkırdama için oylanan "ungolfed" versiyonun bana verdi.
Jack Brounstein

8

Bash (harici yardımcı program yok), 56 44 bayt

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

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

Bu $1, ilk komut satırı argümanı olarak iletilen sayının içinde bulunduğunu varsayar . Ayrıca bunun bir kabuk betiği olduğunu varsayar (böylece execkendisi yapabilir ).

Bir modadan sonra, exec $0(in $1) sayısı sıfıra gelinceye kadar, her yinelemede ikiye bölerek yeniden elde edilir. Ayrıca $2tuhaf bir sayı elde ettiğimiz sayıyı da (in ) toplar. Sonunda, toplam $2tuhaf değil ise orijinal sayı "kötü" idi .

Örnek başlatmalar:

$ ./script 3 && echo evil
evil

$ ./script 11 && echo evil

$ ./script 777 && echo evil
evil

$ ./script 43 && echo evil
evil

$ ./script 55 && echo evil

İçin 0:

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

Bir yandan fazladan biraz fazla olan doğru sonuç.


7

R , 37 26 bayt

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

Çevrimiçi deneyin!

Robert S.'in cevabına bir alternatif olarak , bu yerleşik bit bölmesini engeller, ancak daha az golf sahası olur ve JayCe ve digEmAll sayesinde biraz daha golfçü gelir.

2311


Neden log2 yerine 31 kodunu yazmıyorsun? Çevrimiçi deneyin!
digEmAll

@digEmAll Sırayla x'i tanımlamaya gerek yok
JayCe

2311%/%%%

Ayrıca intToBits, yalnızca 2 ^ 31-1'e kadar tam sayı değerlerini destekler;)
digEmAll



5

R , 99 98 44 34 28 bayt

-1 - Kevin Cruijssen! -54 ngm sayesinde! -10 Giuseppe'ye teşekkürler! -6 JayCe'ye teşekkürler!

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

Çevrimiçi deneyin!


Alternatif olarak, binaryLogic(39 bayt) paketini kullanarak :

!sum(binaryLogic::as.binary(scan()))%%2

2
R'yi çok iyi tanımıyorum, ama emin ==0olabilirim <1:)
Kevin Cruijssen



1
Bu da bence işe yarıyor: 32 bayt Fakat biraz açıklama gerektiriyor :)
digEmAll


5

C (gcc) , 36 bayt

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

Çevrimiçi deneyin!

K&R Yöntemi https://graphics.stanford.edu/~seander/bithacks.html#CountBitsSetKernighan

Optimizasyon seviyesi 0 ile derlenmeli


Gcc 5.4.0'da derleme yapmaz: error: expected constructor, destructor, or type conversion before '(' token(ok ffonksiyon isminde işaret ediyor ). Hangi derleyici bayrağına ihtiyacım var?
villapx

1
İle çalışmıyor -O.
nwellnhof

2
“Gerçeklik için 0, falsey için 1 döndürür” Bu yasal mı? Cevabınızı itibarsızlaştırmaya çalışmak değil, sadece merak ediyorum ve çünkü bu bir bayt kurtaracaktı. Not: Sorudaki truthy kelimesi bu cevaba bağlanır . Ve bu yorum aynı zamanda doğruluktan da bahseder.
Borka223

@nwellnhof @villapx Benim 7.3.0 benim iyi derler - sadece -O0derleyici bayrağı eksik olmadığından emin olun .

@ Borka223, bu siteyi aylar geçtikten sonra hmmm, sizin çözümünüzde tutarlı oldukları sürece, gerçeğin ve falsey'in bir şey olabileceği izlenimindeydim. Ancak, bağladığınız cevap kesinlikle bununla çelişiyor gibi görünüyor. Devam ettim ve baytı ekledim. Thanks
vazt


4

PHP, 37 36 bayt

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

Çalıştırmak için:

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

Veya çevrimiçi deneyin!

1Doğru ve 0yanlış için yazdırır .

Benoit Esnard'a -1 bayt teşekkürler !


1
Sana modülo operasyonu kaldırarak tek bayt kaydedebilirsiniz düşünüyorum: <?=1&~substr_count(decbin($argn),1);. Bu ayrıca false için 0 yazdırır.
Benoit Esnard

@BenoitEsnard! Bu çok zekice, cevabımı güncelledim :) Her gün yeni bir şeyler öğreniyorsun!
Davіd

4

Brachylog , 4 bayt

ḃo-0

Çevrimiçi deneyin!

Çoklu test durumlarında (😈 kötüdür ve 👼 değildir).

Tahmini hakkında son zamanlarda keşfettiğim bir şeyi kullanır -: belgeleri sadece "[girdi] öğelerinin farkı" der, ancak gerçekte yaptığı şey "eksi tuhafların toplamı" olan girişin eşit indeksli öğelerinin toplamıdır (0'dan başlayarak) -girilen girdi unsurları ".

İşte,

sayıyı bir ikili basamak dizisine dönüştürür,

o 1'leri bir araya getirmek için sıralar.

Şimdi, eğer çift sayısı 1 olsaydı, çift ve tek indekslerde eşit sayıda 1 olurdu. Böylece, -bundan sonra 0 verilecektir. Ancak, eğer tek sayıda 1 varsa, farkın -1 veya 1 olmasıyla sonuçlanan fazladan bir 1 çıkacaktır.

Sonunda, farkın olduğunu iddia ediyoruz 0ve buna göre doğru veya yanlış bir sonuç elde ediyoruz. İle daha esnek üretim şartları , bu iki Falsey çıkışları olarak truthy çıkış ve 1 ve 1 olarak 0 ile 3 bayt yanıt için çıkarılabilir.


4

INTERCAL , 90 65 63 bayt

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

Çevrimiçi deneyin!

C tarzı yorumlar ile Ungolfed ve genişletilmiş (buna değer).

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

INTERCAL'de bunu mümkün kılmak için birkaç taviz vermek zorunda kaldım. İlki, tüm INTERCAL programlarında olduğu gibi, sayısal girdilerin de yazılması gerektiğidir. Yani giriş yapmak 707istersen sağlarsın SEVEN OH SEVEN.

İkincisi, INTERCAL'in gerçekten doğru bir gerçeğe veya sahte değere sahip olmamasıdır. Bunun yerine, Ieğer sayı kötü değilse , Romen Rakamını (1) ya da bir 0 (normal -Romen Rakamları normalde 0'ı temsil edemediği için temsil edilir) olarak verir.

Bunları çevirmek isterseniz, kötü sayılar 1 ve geri sayılmayacak sayılar 0 döndürürse, 3 bayt eklemesine rağmen satırları 4 ve 5'i asılsız sürümden değiştirebilirsiniz.

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


3

dc , 18 16 bayt

[2~rd1<M+]dsMx2%

Kötülük için 0, kötülük için 1 döndürmez

Çevrimiçi deneyin!

Oldukça basittir - birleşik bölüm / kalan operatörünü ~tekrar tekrar yeni bölüme uygular ve kalanları bir araya getirir, daha sonra 2'ye kadar modlar (standart bir truthy / falsy'ye çevirmek için iki bayt harcadıktan sonra) .

Özellikle yapılı olmayan bir dilde, truthy için 0 ve falsy için 1 tamam olduğu konusunda fikir birliği sağlaması için düzenlenmiştir if(boolean).


3

Python 2,29 bayt

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

Çevrimiçi deneyin!

True, 1 ise 0 döndürür.

Sayıyı '0b11' gibi bir ikili dizgeye dönüştürür, 1 sayısını sayar, sonucun tamamlayıcısını alır ve tamamlayıcının son bitini döndürür (teşekkürler, https://codegolf.stackexchange.com/users/53560/cdlane !) (1 ​​eğer orijinal numara çiftse, 0 tek ise).


1
Daha az bayt yok, ancak lambda n:~bin(n).count('1')&1modüler bölünmeyi potansiyel olarak daha ucuz bir şeyle değiştiriyor.
cdlane

3

x86-16, 3 bayt

NASM listesi:

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

AX'de (bitmiş) 16-bit tamsayı işlevi argümanı, PF'deki değeri döndürür.

Donanım, bizim için sonucun paritesini, x86'nın Parity Bayrağı'nda hesaplar . Arayan jp/ jnpdallanma veya ne isterse kullanabilir .

Tam olarak @ cschultz'ın Z80 / 8080 yanıtı gibi çalışır ; Aslında 8086, 8080'den mekanik kaynak taşımayı kolaylaştıracak şekilde tasarlandı .

PF'nin yalnızca geniş sonuçların düşük baytından ayarlandığını, bu nedenle test edi,edibir x86-64 sürümü için işe yaramayacağını unutmayın. Yatay olarak xor'a veya 16 bite kadar ya da popcnt eax, edi/ and al,1(0 değerinin truthy olduğu).


3

C ++ (gcc) (= 0),  36  31 bayt

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

Çevrimiçi deneyin!


C ++ (clang) , 35 bayt

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

Çevrimiçi deneyin!


Kod şifrelemede ilk girişim, umarım kaçırmış olabileceğim herhangi bir kuralı çiğnememişimdir.

Düzenleme:
-: yerini Kaydedilen 5 @Jonathan Frech sayesinde bayt !=tarafından -ve returntarafından i=(son yedek clang olsa çalışmak görünmüyor)
- Ben gcc O0 kötüye kullanması gerekip gerekmediğini bir tartışma var gibi görünüyor beri elimden düşünce Sadece iki versiyonu da ver


PPCG'ye Hoşgeldiniz! Sen golf bir byte kaydetmek mümkün olabilir !=için -ve golf başka dört returniçin i=.
Jonathan Frech

@JonathanFrech C ++ 'dan beri çok uzun zaman geçti, return ifadesi yoksa bir fonksiyonda son atanan ifadeyi örtük olarak döndürüyor mu? Sanırım bu bir gcc olayı mı?
sundar - Monica

1
O0 optimizasyon seviyesindeki gcc'ye özgü tanımsız davranış kötüye kullanımıdır.
Jonathan Frech

K & R C'ye geçerek 23 bayta indirebilirsin (çok etkileyici!) Çevrimiçi dene!
ErikF 22

@ JonathanFrech: insanlar neden bu aptal gcc -O0hack'ü kullanmakta ısrar ediyorlar ? Bir dilin toplam kazan plakasının uzunluğu, uygulamaları karşılaştırırken çok önemli değil. Ayrıca, returnreferansa göre arama ( *iyerinde güncelleme ) arasında seçim yapmayı daha ilginç kılar . En iyi duruma getirilmiş gcc çok kullanışlı bir dil olmadığından, yalnızca en iyi duruma getirilmemiş-gcc-sadece cevapları değil, C veya C ++ cevaplarını yazmayı tercih ederim.
Peter Cordes,

3

SML , 32 Bayt

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

Açıklama:

  • % işlev adı
  • repl'deki girdiyi alır ve kötüyse 1, aksi takdirde 0 döndürür
  • n giriş, döndürür (n +% (n // 2))% 2

2 sıkılmış Carnegie Mellon Öğrencileri tarafından yapılmıştır.


PPCG'ye hoş geldiniz ve ilk iyi cevap!
mbomb007

2

İleri (gforth) , 53 bayt

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

Çevrimiçi deneyin!

açıklama

Sayının ikili biçiminin hane sayısının xor toplamını alır. (art arda 2'ye bölünür ve geri kalanı "toplam" değeri ile xors)

Kod Açıklaması

: 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

2

Java 8, 40 36 bayt

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

@Okx'a , kendimi unutmamam gereken bir şey için -4 bayt ..

Çevrimiçi deneyin.

Açıklama:

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

Karakter için kodlama geldiğini hatırlatırız 0ve 1vardır 48ve 49fakat bunları toplayarak ve modülo-2 alarak hala doğru sonuçlar nedeniyle tutan 48%2 = 0ve 49%2 = 1.


1
n.toString(n,2)4 bayt kaydeder.
Okx

@Okx Bunu nasıl unuttuğumdan emin değilim, lol .. Teşekkürler! ;)
Kevin Cruijssen

Doğru ve yanlış yerine 1 ve 0 kullanmanıza izin verilirse (Java için emin değilsiniz): ~n.toString(n,2).chars().sum()%2ile bir bayt kaydetmek için:
Mario Ishac

1
@MarDev Maalesef 0ve 1değildir truthy / Falsey Java, sadece booleans/ Booleansbulunmaktadır. Eğer bir meydan okuma iki farklı çıktıya izin verilecekse, <12 baytı kurtarmak için kaldırılmış olabilir. :)
Kevin Cruijssen


2

Retina 0.8.2 , 28 bayt

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

11

^$

Çevrimiçi deneyin!Link, test durumlarını içerir. Açıklama:

.+
$*

Birliğe dönüştür.

+`(1+)\1
$+0

Kısmi ikili dönüşüm (fazladan sıfır bırakır).

0

Tüm sıfırları silin.

11

Modulo olanları iki ile.

^$

Sonucun sıfır olup olmadığını test edin.


2

x86 Meclisi, 12 11 bayt

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             

Ceilingcat'ın önerisi sayesinde -1 bayt


@ceilingcat Good catch!
Govind Parmar

1
Suggest inc eax instead of not eax. Also may want to mention that this requires a processor with support for the popcnt instruction.
ceilingcat

1
also you do not have to take arg from stack. see allowed calling conventions codegolf.stackexchange.com/a/161497/17360 (Peter Cordes's more in-depth answer codegolf.stackexchange.com/a/165020/17360)
qwr

1
Note that you may return a boolean in FLAGS stackoverflow.com/a/48382679/3163618
qwr

Shouldn't 666 be a test case?
Arcanist Lupus

2

Bash + GNU utilities, 33

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

Try it online!

Reads input from STDIN. Outputs 1 for True and 0 for False.

  • dc converts input to a binary string
  • tr removes zeros
  • wc counts remaining ones (and trailing newline, which corrects sense of logic
  • dc calculates count mod 2 and outputs the answer

2

Python 2, 28 27 bytes

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

Try it online!

Returns a truthy value if exactly one of the ones-bit is a 1 and the result of calling this function on n/2 is truthy is true (or n==0). It works because n/2 is equivalent to a right bitshift with floor division (so Python 2 only).

Alternate version, also 28 27 bytes

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

Try it online!

Based on the K&R method of counting set bits referenced by vazt.

Both of these could be two bytes shorter if the output allowed falsey to mean evil.

Edit: Thanks to Amphibological for saving a byte!


You can remove the spaces between the 1 and the or to save +1 byte. Nice solution!
Amphibological

Man, I thought I tried that. Good catch!
Jack Brounstein

2

APL (Dyalog Unicode), 10 bytesSBCS

Anonymous tacit function. Can take any array of integers as argument.

≠⌿12∘⊥⍣¯1

Try it online!

2∘⊥⍣¯1 convert to binary, using as many digits as needed by the largest number, separate digits along primary axis

1⍪ prepend ones along the primary axis

≠⌿ XOR reduction along the primary axis


2

J, 9 bytes

Anonymous tacit function. Can take any integer array as argument.

1-2|1#.#:

Try it online!

1- one minus (i.e. logical negation of)

2| the mod-2 of

1#. the sum (lit. the base-1 evaluation) of

#: the binary representation


Nice one! the boring approach is 9 bytes: 2|1+1#.#:
Conor O'Brien

This only seems to work because 777 in the input makes every number be represented in 10 bits. Replace it with e.g. 480 and the output flips.
FrownyFrog

@ConorO'Brien Boring trumps incorrect.
Adám

@FrownyFrog Fixed.
Adám
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.