Ist diese Zahl böse?

34

Einführung

In der Zahlentheorie wird eine Zahl als böse angesehen, wenn ihre binäre Darstellung eine gerade Zahl von Einsen enthält. In der heutigen Herausforderung werden Sie feststellen, ob eine bestimmte Zahl böse ist oder nicht.

Herausforderung

Ihre Aufgabe ist es, ein vollständiges Programm oder eine vollständige Funktion zu schreiben, die eine einzelne, nicht negative Ganzzahl als Eingabe akzeptiert und ausgibt (oder zurückgibt), unabhängig davon, ob diese Zahl böse ist oder nicht.

  • Sie können jeden Wahrheitswert ausgeben , wenn die Zahl böse ist, und jeden falschen Wert, wenn die Zahl nicht böse ist.
  • Sie können in jedem akzeptablen Format eingeben und ausgeben .
  • Standardlücken sind nicht zulässig.
  • OEIS-Sequenz A001969 ist die Sequenz, die alle bösen Zahlen enthält.
  • Hier ist eine Liste der ersten 10000 bösen Zahlen als Referenz (und weitere Testfälle!)
  • Diese Frage ist , also je kürzer, desto besser.
  • Lassen Sie sich nicht von extrem kurzen Antworten in Golfsprachen abschrecken. Ich ermutige Sie, in jeder Sprache einzureichen, die Sie mögen.
  • Hier sind einige Testfälle:

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

Das Leaderboard

Am Ende der Seite befindet sich ein Stapel-Snippet mit einer Rangliste für diese Frage. (Danke, @MartinEnder)

Um sicherzustellen, dass Ihre Antwort angezeigt wird, beginnen Sie Ihre Antwort mit einer Überschrift. Verwenden Sie dazu die folgende Markdown-Vorlage:

# Language Name, N bytes

Wo Nist die Größe Ihres Beitrags? Wenn Sie Ihren Score zu verbessern, Sie können alte Rechnungen in der Überschrift halten, indem man sich durch das Anschlagen. Zum Beispiel:

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

Wenn Sie mehrere Zahlen in Ihre Kopfzeile aufnehmen möchten (z. B. weil Ihre Punktzahl die Summe von zwei Dateien ist oder wenn Sie die Strafen für Interpreter-Flags separat auflisten möchten), stellen Sie sicher, dass die tatsächliche Punktzahl die letzte Zahl in der Kopfzeile ist:

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

Sie können den Namen der Sprache auch als Link festlegen, der dann im Leaderboard-Snippet angezeigt wird:

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

EDIT: Ich glaube, diese Frage ist kein Duplikat davon , denn während diese Frage die Anzahl von Einsen zählt, fragt diese Frage, ob die Anzahl von Einsen gerade ist. Obwohl Sie können diese Frage durch einfaches Zählen der Bits erreichen, gibt es auch andere Ansätze .

Amphibologisch
quelle
2
Verwandte (XOR-Verknüpfung jeder Binärziffer entspricht der Summierung von Modulo-2).
Kevin Cruijssen
2
@BetaDecay, aber das funktioniert nicht umgekehrt: Sie können nicht alle diese Antworten nehmen und den Mod 2 entfernen. Daher lädt diese Herausforderung einige neue Methoden ein.
Amphibological
13
Ich glaube, das 666 => Falsesollte ein Testfall sein.
user2390246
3
Die Rangliste ist für mich kaputt
Jo King

Antworten:

35

Z80-Assembly (8 Bit), 2 Byte

Der folgende Code funktioniert nur mit Werten bis 255:

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


16-Bit-Version (funktioniert in allen Testfällen), 3 Byte

Dies funktioniert mit Werten bis zu 65535.

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

Wenn Sie sich abenteuerlustig fühlen, können Sie 1 Byte sparen, indem Sie die Eingabe in Aund Cso speichern

      ld BC, 777
C5    push BC
F1    pop AF

und dann rennen

A9    xor C
C9    ret

Dies belastet den Aufrufer jedoch, so dass möglicherweise auch die beiden Bytes ( push BCund pop AF) gezählt werden müssen.

cschultz2048
quelle
Ich mag das, aber wie funktioniert das? Mein Gedächtnis für Assembly (6502 + Arm) ist, dass ors bitweise mit 2 Operanden sind
Northern-Bradley
2
@ northern-bradley Auf dem Z80 wird impliziert, dass der zweite Operand der orMnemonik der Akkumulator A ist. In diesem Fall ändert sich der Befehl nicht A. Es wird nur das Statusregister (und insbesondere das Paritätsflag) aktualisiert spiegeln den Inhalt von A.
cschultz2048
1
Ist Pgemäß codegolf.meta.stackexchange.com/a/8509/29560 erlaubt ? Es ist ein einzelnes Bit im F(Flags) -Register, von dem nur drei Befehlspaare betroffen sind. Außerdem erwähnt diese Antwort nicht, dass sie nur um 8-Bit-Werte konkurriert, da Aes sich um ein 8-Bit-Register handelt. Dies bedeutet, dass es keine Antwort für 777oder einen anderen vorzeichenlosen Wert über 255 geben kann.
CJ Dennis
2
Verdammte Einbauten:P
Jo King
1
@ cschultz2048 Aist gepaart mit F, daher würde ich nicht akzeptieren ABoder BAals 16-Bit-Wert. BCist 16-Bit, aber dann benötigen Sie eine zusätzliche Anweisung, um eine davon zu laden, Abevor Sie die andere XOR-Verknüpfung ausführen. Ich habe gerade erwähnt, dass meine Z80-Antworten je nach Frage bis zu 255 oder 65535 funktionieren. Fügen Sie möglicherweise auch eine 16-Bit-Version hinzu? Also 2 Bytes für 8-Bit-Werte, 3 Bytes für 16-Bit-Werte.
CJ Dennis
25

JavaScript (ES6), 18 Byte

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

Probieren Sie es online!

Erläuterung

Die bitweise Logik sieht folgendermaßen aus:

  • Für ganze Zahlen ~-nist das gleichbedeutend damit -(-n)-1, dass nur eine andere Art zu tun ist n-1. In diesem speziellen Fall hätten wir tatsächlich verwenden können n-1.
  • n & (n-1)entfernt das am wenigsten signifikante Bit gesetzt 1 in n weil Erniedrigen n alle Hinter dreht 0 's in 1 s und löscht die 1 , die (durch Übertragsfortpflanzungs) unmittelbar folgt, während alles andere unverändert bleibt.

    Beispiel für n = 24 (11000 in binär):

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

Daher verarbeiten wir wie viele rekursive Aufrufe da es 1 ‚s in der Binärdarstellung von n , die mit jeder invertierende führen !. Der letzte Aufruf gibt immer 1 zurück .

Beispiele:

f(24) = !f(16) = !!f(0) = !!1 = true
f(7) = !f(6) = !!f(4) = !!!f(0) = !!!1 = false
Arnauld
quelle
Hallo, ich verstehe, was der Code bewirkt, aber ich kann die Logik / Argumentation dahinter nicht herausfinden, obwohl ich mehrere Artikel über bitweise Operationen gelesen und überprüft habe, ob eine Zahl eine Potenz von 2 ist usw. Ich weiß, was eine rekursive Funktion ist . Ich verstehe nur nicht, warum es so verwendet wurde und warum es funktioniert, um auf das Rätsel zu antworten, dh die Verbindung zwischen der Rekursion und! F (Potenz von zwei) <==> der bösen Zahl. Wenn Sie Zeit haben, wäre eine Erklärung willkommen :) Danke!
Supafly
1
@supafly Ich habe eine Erklärung hinzugefügt. Und übrigens: Willkommen bei PPCG!
Arnauld
Die Verarbeitung ist jetzt sehr klar. Trotzdem ist die Idee / Argumentation wirklich magisch! Vielen Dank für die Erklärung!
Supafly
13

Python 2 , 25 Bytes

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

Probieren Sie es online!

bin(n)gibt ein Ergebnis wie '0b10101'. Wenn wir dies als Ganzzahl zur Basis 13 lesen, erhalten wir

11135+1134+0133+1132+0131+1130
, wodurch Modulo 2 zu reduziert wird 1 + 1 + 0 + 1 + 0 + 1
115+114+013+112+011+110(mod2)
1+1+0+1+0+1(mod2).

Also int(bin(n),13)%2gleich 1 + (Anzahl der Einsen in bin(n)) Modulo 2.

Wenn nböse ist, ist das Ergebnis 1; sonst ist es 0.

Ich habe diesen Trick von Noodle9 aufgegriffen .

Lynn
quelle
Da dieser Python 2 ist , kann der Code weiter mit der veralteten repr Graviszeichen Syntax verkürzt werden: lambda n:int(`n`,13)%2. Probieren Sie es online!
GarethPW
Ja, ich hatte ein bisschen Hirnfurz und habe den Zweck von Ints Basisargument vergessen. Hoppla!
GarethPW
11

Japt -h!, 5 4 3 Bytes

¤å^

Versuch es


Erläuterung

¤       :Convert to base-2 string
 å^     :Cumulatively reduce by XORing
        :Implicitly output the last element negated
Zottelig
quelle
@LuisfelipeDejesusMunoz, die Portierung der 05AB1E-Lösung von Kevin funktioniert auch mit 5 Byte, wenn Sie dies versuchen möchten.
Shaggy
¤¬x vDies ist die Antwort von Kevin
Luis Felipe De Jesus Munoz
@ LuisfelipeDejesusMunoz, yup, das war's.
Shaggy
8

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


Golf Versuchen Sie es online!

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

Ungolfed

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

Vollständiger Code mit Tests

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

Releases

  • v1.1 - -5 bytes- Ersetzt CountdurchSum
  • v1.0 - 43 bytes- Anfangslösung.

Anmerkungen

  • Keiner
auhmaan
quelle
2
Upvoted for the chuckle gab mir deine "ungolfed" Version.
Jack Brounstein
8

Bash (keine externen Dienstprogramme), 56 44 Bytes

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

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

Dies setzt voraus, dass die Zahl in gefunden $1wurde und als erstes Befehlszeilenargument übergeben wurde. Es wird auch davon ausgegangen, dass dies ein Shell-Skript ist (so dass es sich execselbst kann ).

Es wiederholt sich auf eine Art und Weise, indem es verwendet exec $0, bis die Zahl (in $1) Null erreicht und sie in jeder Iteration durch zwei dividiert. Es summiert auch die Häufigkeit, mit $2der wir eine ungerade Zahl erhalten. Am Ende war die ursprüngliche Zahl "böse", wenn die Summe $2nicht ungerade ist.

Beispielaufrufe:

$ ./script 3 && echo evil
evil

$ ./script 11 && echo evil

$ ./script 777 && echo evil
evil

$ ./script 43 && echo evil
evil

$ ./script 55 && echo evil

Für 0:

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

Richtiges Ergebnis, mit ein bisschen mehr auf der Seite.

Kusalananda
quelle
7

R , 37 26 Bytes

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

Probieren Sie es online!

Eine Alternative zur Antwort von Robert S., die das eingebaute Bit-Splitting vermeidet , aber weniger Golf spielt und dank JayCe und digEmAll etwas mehr Golf spielt.

Funktioniert nur für positive Ganzzahlen unter .231-1

Giuseppe
quelle
Warum nicht 31 statt log2 fest codieren? Probieren Sie es online!
digEmAll
@digEmAll Was wiederum bedeutet, dass x
JayCe
@digEmAll danke! Ich war mir in Bezug auf Genauigkeitsprobleme nicht sicher, obwohl ich annehme, dass wir nach (wahrscheinlich) die Genauigkeit in den Operatoren und verlieren, so dass dies ein strittiger Punkt wäre. 231-1%/%%%
Giuseppe
Auch intToBits unterstützt nur ganzzahlige Werte bis zu 2 ^ 31-1;)
digEmAll
6

05AB1E , 4 Bytes

bSOÈ

Probieren Sie es online aus oder überprüfen Sie alle Testfälle .

Erläuterung:

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
quelle
5

R , 99 98 44 34 28 Bytes

-1 Danke an Kevin Cruijssen! -54 danke an ngm! -10 danke an Giuseppe! -6 danke an JayCe!

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

Probieren Sie es online!


Alternativ können Sie das binaryLogicPaket (39 Byte) verwenden:

!sum(binaryLogic::as.binary(scan()))%%2
Robert S.
quelle
2
Ich weiß nicht, R zu gut, aber ich bin mir ziemlich sicher, ==0kann <1:)
Kevin Cruijssen
1
43 Bytes?
ngm
1
Nett! 34 Bytes sind möglich
Giuseppe
1
Das funktioniert auch, denke ich: 32 Bytes, erfordert aber ein
paar
1
Es ist einfach, daraus ein volles Programm für ein paar Bytes zu machen
JayCe
5

C (gcc) , 36 Bytes

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

Probieren Sie es online!

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

Muss mit Optimierungsstufe 0 übersetzt werden

vazt
quelle
Kompiliert nicht auf gcc 5.4.0: error: expected constructor, destructor, or type conversion before '(' token(Pfeil zeigt auf den fim Funktionsnamen). Welche Compiler-Flag (s) brauche ich?
Villapx
1
Funktioniert nicht mit -O.
Nwellnhof
2
"Gibt 0 für wahr, 1 für falsch" Ist das legal? Versuchen Sie nicht, Ihre Antwort zu diskreditieren, nur neugierig, und weil es mir ein Byte ersparen würde. Hinweis: Das Wort "Wahr" in der Frage verweist auf diese Antwort . Und dieser Kommentar erwähnt auch Wahrhaftigkeit.
Borka223
@nwellnhof @villapx Kompiliert gut auf meinem 7.3.0 - stellen Sie nur sicher, dass Sie das -O0Compiler-Flag nicht verpassen .
@ Borka223 hmmm nach monatelanger durchsicht dieser website hatte ich den eindruck, dass wahrheit und falschheit alles mögliche sein könnten, solange sie in ihrer lösung konsistent sind. Die von Ihnen verknüpfte Antwort scheint dem jedoch zu widersprechen. Ich ging voran und fügte das Byte hinzu. Vielen Dank
vazt
4

PHP, 37-36 Bytes

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

Um es auszuführen:

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

Oder versuchen Sie es online!

Druckt 1für wahr und 0für falsch.

-1 Byte Danke an Benoit Esnard !

Davіd
quelle
1
Ich glaube , Sie ein Byte durch die Modulo - Operation zu entfernen sparen können: <?=1&~substr_count(decbin($argn),1);. Dieser gibt auch 0 für falsch aus.
Benoit Esnard
Danke @BenoitEsnard! Das ist sehr clever, ich habe meine Antwort aktualisiert :) Du lernst jeden Tag etwas Neues!
Davіd
4

Brachylog , 4 Bytes

ḃo-0

Probieren Sie es online!

Mit mehreren Testfällen (😈 ist böse und 👼 ist nicht.)

Verwendet etwas, was ich kürzlich über das -Prädikat herausgefunden habe: In seiner Dokumentation steht nur "der Unterschied der Elemente von [Eingabe]", aber was es tatsächlich tut, ist "Summe der geraden indizierten Elemente (beginnend mit dem 0.) der Eingabe abzüglich der Summe der ungeraden indizierte Elemente der Eingabe ".

Hier,

wandelt die Zahl in ein Array von Binärziffern um,

o sortiert sie, um alle Einsen zusammenzubringen.

Wenn es nun eine gerade Anzahl von Einsen gäbe, gäbe es eine gleiche Anzahl von Einsen in geraden und ungeraden Indizes. Das Nachher -würde also eine 0 ergeben. Aber wenn es eine ungerade Zahl von 1s gäbe, würde eine zusätzliche 1 herausragen, was dazu führt, dass der Unterschied entweder -1 oder 1 ist.

Schließlich behaupten wir also, der Unterschied sei 0und erhalten dementsprechend ein wahres oder falsches Ergebnis. Bei flexibleren Ausgabeanforderungen könnte dies für eine 3-Byte-Antwort beseitigt werden, wobei 0 als wahrheitsgemäße Ausgabe und -1 und 1 als beide falschen Ausgaben gelten.

Sundar - Setzen Sie Monica wieder ein
quelle
4

INTERCAL , 90 65 63 Bytes

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

Probieren Sie es online!

Ungolfed und erweitert (was es wert ist) mit Kommentaren im C-Stil.

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

Ich musste ein paar Zugeständnisse machen, um dies in INTERCAL möglich zu machen. Das erste ist, wie bei allen INTERCAL-Programmen, dass die numerische Eingabe ausgeschrieben werden muss. Also, wenn Sie eingeben möchten, 707würden Sie zur Verfügung stellen SEVEN OH SEVEN.

Das zweite ist, dass INTERCAL nicht wirklich den richtigen Wert für Wahrheit oder Falschheit hat. Stattdessen wird die römische Ziffer I(1) ausgegeben, wenn die Zahl nicht böse ist, oder eine 0 (normalerweise dargestellt, -da römische Ziffern normalerweise nicht 0 darstellen können).

Wenn Sie diese umdrehen möchten, sodass böse Zahlen 1 und nicht böse Zahlen 0 zurückgeben, können Sie die Zeilen 4 und 5 von der ungolfed-Version wie folgt ändern, obwohl 3 Bytes hinzugefügt werden.

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

Attache , 13 12 Bytes

Even@Sum@Bin

Probieren Sie es online!

(Old 13 Bytes Even@1&`~@Bin)

Dies ist eine Komposition aus drei Funktionen:

  1. Bin
  2. Sum
  3. Even

Dies prüft, ob der Wert Sumder Bintatsächlichen Erweiterung der Eingabe ist Even.

Conor O'Brien
quelle
: | Ich habe keine Worte
ASCII
@ ASCII-nur ganz prägnant, oder? c:
Conor O'Brien
3

Gleichstrom , 18 16 Bytes

[2~rd1<M+]dsMx2%

Gibt (auf den Stapel) 0 für böse und 1 für nicht böse zurück

Probieren Sie es online!

Ziemlich einfach - Wendet den kombinierten Quotienten- / Restoperator rekursiv ~auf den neuen Quotienten an und addiert alle Reste. Anschließend werden die Modifikationen um 2 erhöht (nachdem zwei Bytes aufgewendet wurden, um zu einer Standardwahrheit / -fälschung zu wechseln) .

Bearbeitet, um den Konsens widerzuspiegeln, dass 0 für Wahrhaftigkeit und 1 für Falschheit in Ordnung ist, insbesondere in einer Sprache, die keine Art von if(boolean)Konstrukt hat.

Sophia Lechner
quelle
3

Python 2, 29 Bytes

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

Probieren Sie es online!

Gibt 1 zurück, wenn True, sonst 0.

Wandelt die Zahl in eine Binärzeichenfolge wie '0b11' um, zählt die Zahl von 1s, erhält das Komplement des Ergebnisses und gibt das letzte Bit des Komplements zurück (danke, https://codegolf.stackexchange.com/users/53560/cdlane !) (1, wenn die ursprüngliche Nummer gerade war, 0, wenn sie ungerade war).

Triggernometrie
quelle
1
Nicht weniger Bytes, sondern lambda n:~bin(n).count('1')&1ersetzt die modulare Aufteilung durch etwas möglicherweise billigeres.
cdlane
3

x86-16, 3 Bytes

NASM-Auflistung:

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

16-Bit-Integer-Funktion arg in AX (die zerstört wird), Rückgabewert in PF.

Die Hardware berechnet die Parität des Ergebnisses für uns im x86-Paritätsflag . Der Anrufer kann mit jp/ jnpverzweigen oder was immer er möchte.

Funktioniert genau wie die Z80 / 8080-Antwort von @ cschultz ; Tatsächlich wurde 8086 entwickelt, um das mechanische Portieren von Quellen aus 8080 zu vereinfachen .

Beachten Sie, dass PF nur aus dem unteren Byte der breiteren Ergebnisse festgelegt wird und daher test edi,edifür eine x86-64-Version nicht funktioniert. Sie müssten horizontal-xoder bis zu 16 Bit oder popcnt eax, edi/ and al,1(wobei 0 wahr ist).

Peter Cordes
quelle
3

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

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

Probieren Sie es online!


C ++ (clang) , 35 Bytes

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

Probieren Sie es online!


Hier ist mein erster Versuch, Code-Golf zu spielen. Ich hoffe, ich habe keine Regel gebrochen, die ich möglicherweise übersehen habe.

Edit:
- 5 Bytes gespart dank @Jonathan Frech: ersetzt !=durch -und returndurch i=(die letzte Ersetzung scheint jedoch nicht mit Clang zu funktionieren)
- Da es eine Debatte zu geben scheint, ob ich gcc -O0-Missbrauch verwenden sollte, dachte ich, ich könnte gib einfach beide versionen an

Annyo
quelle
Willkommen bei PPCG! Sie können ein Byte für Golf speichern können , !=auf -und weitere vier von Golf returnzu i=.
Jonathan Frech
@JonathanFrech Es ist lange her, dass ich C ++ verwendet habe. Gibt es implizit den zuletzt zugewiesenen Ausdruck in einer Funktion zurück, wenn es keine return-Anweisung gibt? Ich vermute, es ist eine GCC-Sache?
Sundar - Wiedereinsetzung von Monica
1
Es ist ein gcc-spezifischer undefinierter Verhaltensmissbrauch auf Optimierungsstufe O0.
Jonathan Frech
Wenn Sie zu K & R C wechseln, können Sie es auf 23 Byte reduzieren (sehr beeindruckend!). Probieren Sie es online aus!
ErikF
@ JonathanFrech: Warum bestehen die Leute darauf, diesen dummen gcc -O0Hack zu benutzen ? Es ist nicht so, dass die Länge des gesamten Boilerplates einer Sprache für den Vergleich von Implementierungen von großer Bedeutung ist. Außerdem ist es interessanter, zwischen returnCall-by-Reference (Aktualisierung *ivor Ort) zu wählen . Ich schreibe lieber C- oder C ++ - Antworten, keine unoptimierten GCC-Antworten, weil unoptimierte GCC-Antworten keine sehr nützliche Sprache sind.
Peter Cordes
3

SML , 32 Bytes

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

Erklärung:

  • % ist der Funktionsname
  • Nimmt die Eingabe in repl auf und gibt 1 zurück, wenn es böse ist, sonst 0
  • n wird eingegeben, gibt (n +% (n // 2))% 2 zurück

Gemacht von 2 gelangweilten Carnegie Mellon Studenten

CarManuel
quelle
Willkommen bei PPCG und gute erste Antwort!
mbomb007
2

Viertens (gviertens) , 53 Bytes

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

Probieren Sie es online!

Erläuterung

Nimmt die xor-Summe der Ziffern der Binärform der Zahl. (Wiederholt dividiert durch 2 und xor den Rest mit dem "Summen" -Wert)

Code Erklärung

: 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
quelle
2

Java 8, 40 36 Bytes

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

-4 Bytes danke an @Okx für etwas, das ich nicht vergessen hätte sollen ..

Probieren Sie es online aus.

Erläuterung:

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

Beachten Sie, dass die Zeichenkodierung für 0und 1sind 48und 49, aber sie summiert und unter Modulo-2 hält immer noch die richtigen Ergebnisse , weil 48%2 = 0und 49%2 = 1.

Kevin Cruijssen
quelle
1
n.toString(n,2)Spart 4 Bytes.
Okx
@Okx Nicht sicher, wie ich das vergessen habe, lol .. Danke! ;)
Kevin Cruijssen
Wenn Sie 1 und 0 anstelle von true und false verwenden dürfen (nicht sicher für Java), können Sie zu: wechseln ~n.toString(n,2).chars().sum()%2, um ein Byte zu speichern.
Mario Ishac
1
@MarDev Leider 0und 1nicht wahr / falsch in Java, nur booleans/ Booleanssind. Wenn bei einer Abfrage angegeben wird, dass zwei unterschiedliche Ausgaben zulässig sind, <1hätte die entfernt werden können, um tatsächlich 2 Bytes zu sparen. :)
Kevin Cruijssen
2

Perl 6 , 21 Bytes

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

Probier es aus

Erweitert:

*\        # 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
quelle
*.base(2)%9%%2
Jo King
Ah, das funktioniert nicht für Ziffern mit mehr als 9 Bits ...
Jo King
1
{:3(.base(2))%%2}
Nwellnhof
2

Retina 0.8.2 , 28 Bytes

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

11

^$

Probieren Sie es online! Link enthält Testfälle. Erläuterung:

.+
$*

In Unary konvertieren.

+`(1+)\1
$+0

Teilweise binäre Konvertierung (lässt zusätzliche Nullen).

0

Löschen Sie alle Nullen.

11

Modulo diejenigen von zwei.

^$

Testen Sie, ob das Ergebnis Null ist.

Neil
quelle
2

x86-Assembly, 12 11 Bytes

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 dank @ ceilingcats Vorschlag

Govind Parmar
quelle
@ceilingcat Guter Fang!
Govind Parmar
1
Schlagen Sie inc eaxstatt not eax. Vielleicht möchten Sie auch erwähnen, dass dies einen Prozessor mit Unterstützung für den popcntBefehl erfordert .
Ceilingcat
1
Außerdem müssen Sie arg nicht vom Stapel nehmen. siehe erlaubt Aufrufkonventionen codegolf.stackexchange.com/a/161497/17360 (Peter Cordes tiefer gehende Antwort codegolf.stackexchange.com/a/165020/17360 )
QWR
1
Beachten Sie, dass Sie in FLAGS stackoverflow.com/a/48382679/3163618
qwr
Sollte 666 nicht ein Testfall sein?
Arkanist Lupus
2

Bash + GNU-Dienstprogramme, 33

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

Probieren Sie es online!

Liest die Eingabe von STDIN. Ausgänge 1 für True und 0 für False.

  • dc wandelt die Eingabe in eine Binärzeichenfolge um
  • tr Entfernt Nullen
  • wc zählt die verbleibenden Zeilen (und die nachgestellte Zeile, die den Sinn für Logik korrigiert)
  • dc berechnet count mod 2 und gibt die antwort aus
Digitales Trauma
quelle
2

Python 2, 28 27 Bytes

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

Probieren Sie es online!

Gibt einen Wahrheitswert zurück, wenn genau einer von the ones-bit is a 1und the result of calling this function on n/2 is truthywahr ist (oder n==0). Es funktioniert, weil n/2es einer Bitverschiebung nach rechts mit Unterteilung entspricht (also nur Python 2).

Alternative Version, auch 28 27 Bytes

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

Probieren Sie es online!

Basierend auf der von vazt referenzierten K & R-Methode zum Zählen von gesetzten Bits.

Beides könnte zwei Bytes kürzer sein, wenn die Ausgabe zulässt, dass Falsey böse bedeutet.

Edit: Danke an Amphibological für das Speichern eines Bytes!

Jack Brounstein
quelle
Sie können die Leerzeichen zwischen 1und entfernen or, um +1 Byte zu sparen. Schöne lösung!
Amphibological
Mann, ich dachte, ich habe es versucht. Guter Fang!
Jack Brounstein
2

APL (Dyalog Unicode) , 10 Byte SBCS

Anonyme stillschweigende Funktion. Kann ein beliebiges Array von Ganzzahlen als Argument verwenden.

≠⌿12∘⊥⍣¯1

Probieren Sie es online!

2∘⊥⍣¯1 Konvertieren Sie in eine Binärdatei, indem Sie so viele Ziffern verwenden, wie für die größte Zahl erforderlich sind. Trennen Sie die Ziffern entlang der Primärachse

1⍪ stellen Sie diejenigen entlang der Hauptachse voran

≠⌿ XOR-Reduktion entlang der Primärachse

Adam
quelle
2

J 9 Bytes

Anonyme stillschweigende Funktion. Kann ein beliebiges Integer-Array als Argument verwenden.

1-2|1#.#:

Probieren Sie es online!

1- eins minus (dh logische Negation von)

2| der mod-2 von

1#. die Summe (lit. die Basis-1-Bewertung) von

#: die binäre Darstellung

Adam
quelle
Schön! Der langweilige Ansatz ist 9 Bytes:2|1+1#.#:
Conor O'Brien
Dies scheint nur zu funktionieren, weil 777 in der Eingabe bewirkt, dass jede Zahl in 10 Bits dargestellt wird. Ersetzen Sie es durch zB 480 und der Ausgang kippt um.
FrownyFrog
@ ConorO'Brien Langweilige Trümpfe falsch.
Adám
@FrownyFrog Behoben.
Adám