Schreiben Sie einige Anweisungen, die die Anzahl der Einsen in einer vorzeichenlosen 16-Bit-Ganzzahl zählen.
Wenn zum Beispiel die Eingabe ist 1337
, dann ist das Ergebnis, 6
weil es sich 1337
um eine 16-Bit-Binärzahl handelt 0000010100111001
, die sechs Einsen enthält.
Antworten:
80386 Maschinencode, 4 Bytes
Dies nimmt die ganze Zahl in
cx
und gibt die Anzahl in ausax
und ist äquivalent zu:Und hier ist eine
1110- Byte-Lösung ohne POPCNT:was äquivalent ist zu:
quelle
ax
undcx
miteax
undecx
ändert sie jedoch in 32-Bit. Der Bytecode ist für beide gleich.Python 2, 17 Bytes
Die
bin
integrierte Funktion gibt die Ganzzahl zurück, die in eine Binärzeichenfolge konvertiert wurde. Wir zählen dann die1
Ziffern:quelle
J (5 Zeichen)
J hat keine expliziten Typen. Dies macht das Richtige für alle ganzen Zahlen.
+/
die Summe@
von#:
die Basis zwei Darstellungquelle
C 21
Sie sagten "Schreiben Sie einige Anweisungen" (nicht "eine Funktion"), also habe ich angenommen, dass die Zahl in geliefert wird
x
und die Zahl von Einsen in zurückgegeben wirdn
. Wenn ich nicht initialisieren muss,n
kann ich 3 Bytes sparen.Dies ist eine Adaption des berühmten Ausdrucks
x&x-1
zum Testen, ob etwas eine Potenz von 2 ist (falsch, wenn es ist, wahr, wenn es nicht ist).Hier ist es in Aktion auf die Nummer 1337 aus der Frage. Beachten Sie, dass durch Subtrahieren von 1 das niedrigstwertige 1-Bit und alle Nullen nach rechts gekippt werden.
EDIT: Der Vollständigkeit halber hier der naive Algorithmus, der ein Byte länger (und einiges langsamer) ist.
quelle
{}
. Es ist eine so einfache Aufgabe, dass ich mich nicht wundern sollte, wenn jemand sie schon erfunden hat.for(n=0;x;x/=2)n+=x&1;
Gelee , nicht konkurrierend
Diese Antwort ist nicht konkurrierend, da die Sprache erstellt wurde, nachdem die Herausforderung veröffentlicht wurde.
2 Bytes:
Jelly ist eine neue Sprache von @Dennis mit J-ähnlicher Syntax.
Probieren Sie es hier aus .
quelle
Pyth, 4 Bytes
Das Programm verwendet die Nummer, deren Hamming-Gewicht sich auf STDIN befindet.
quelle
Julia,
292719 BytesDadurch wird eine anonyme Funktion erstellt, die ein einzelnes Argument akzeptiert
n
. Um es zu benutzen, weisen Sie es so etwas wief=n->...
und nennen Sie es sof(1337)
.digits()
Wenn die Funktion mit 2 Argumenten aufgerufen wird, gibt sie ein Array der Ziffern der Eingabe in der angegebenen Basis zurück. Sodigits(n, 2)
gibt die binären Ziffernn
. Nehmen Sie die Summe des Arrays und Sie haben die Anzahl der Einsen in der binären Darstellung vonn
.quelle
count_ones
CJam, 6 Bytes
Probieren Sie es hier online aus
quelle
Joe , 4 Bytes
Dies ist eine anonyme Funktion.
Ba
gibt die binäre Darstellung einer Zahl und/+
summiert sie.quelle
R, 24 Bytes
scan()
Liest die Eingabe von stdin.intToBits()
Nimmt eine Ganzzahl und gibt einen Vektor vom Typ zurückraw
, der die Nullen und Einsen der Binärdarstellung der Eingabe enthält.intToBits(scan())>0
gibt einen logischen Vektor zurück, wobei jedes Element ist,TRUE
wenn das entsprechende binäre Vektorelement eine 1 ist (da alle Elemente 0 oder 1 und 1> 0 sind), andernfallsFALSE
.In R können Sie einen logischen Vektor
TRUE
addieren , um die Anzahl der Elemente zu erhalten. Wenn Sie also den Vektor der logischen Elemente wie oben summieren, erhalten Sie das, was wir wollen.Beachten Sie, dass Eingaben nicht direkt
sum()
verarbeitetraw
werden können, daher die Problemumgehung mit logischen Elementen.quelle
sum(intToBits(scan()))
dasselbe?sum()
keine Eingabe des Typs möglichraw
ist, von dem das zurückgegeben wirdintToBits()
.Ruby, 18 Bytes
n.to_s(2).count'1'
quelle
n.to_s(2).count ?1
funktioniert auch, ist aber die gleiche LängeViertens
4849 BytesWenn eine tatsächliche Funktion benötigt wird, wird die zweite Zeile
und Sie nennen es "1337 c". Forths relativ wortreiche Kontrollwörter machen dies schwierig (tatsächlich machen sie eine Menge davon schwierig).
Bearbeiten: Meine vorherige Version hat negative Zahlen nicht richtig verarbeitet.
quelle
Mathematica,
2218 BytesVielen Dank an Alephalpha, der mich daran erinnert hat
DigitCount
.quelle
ES6 (
342221 Bytes):Dies ist eine einfache rekursive Funktion, die noch etwas gekürzt werden kann. Es dauert einfach ein bisschen und läuft selbst wieder:
Probiere es auf http://www.es6fiddle.net/imt5ilve/ aus (brauchst du das
var
wegen'use strict';
).Ich kann nicht glauben, dass ich Fisch geschlagen habe !!!
Das Alte:
ES5 (39 Byte):
Beide Funktionen können problemlos an ES5 angepasst werden:
Alte:
@ user1455003 hat mir eine wirklich gute Idee gegeben, die die kleinste ausgelöst hat:
Ich habe es an ES6 angepasst und es rekursiv gemacht, um viel zu verkürzen!
quelle
> <> (Fisch) , 24 Bytes + 2 = 26
Das Programm wiederholt nur Mod 2, subtrahiert und dividiert, bis die eingegebene Zahl Null wird, und gibt dann die Summe der Mod 2s aus.
Testen Sie mit der
-v
Flagge, zquelle
-v
Flaggenversion funktioniert immer noch.)PHP (38 Bytes):
Dies verwendet den gleichen Ansatz wie meine ES6-Antwort
Dies ist ein vollständiger Code, Sie müssen ihn nur in eine Datei einfügen und über den Browser mit dem Parameter darauf zugreifen
n=<number>
.PHP <4.2 (32 Bytes):
Das ist etwas kürzer:
Dies funktioniert nur dann zuverlässig auf PHP <4.2 , da die Richtlinie
register_globals
gesetzt wurdeOff
von PHP4.2 standardmäßig bis zu PHP5.4 (das durch dann entfernt wurde).Wenn Sie eine
php.ini
Datei mit erstellenregister_globals=On
, funktioniert dies.Um den Code zu verwenden, greifen Sie über einen Browser mit POST oder GET auf die Datei zu.
@ViniciusMonteiros Vorschlag (38/45 Bytes):
Er gab zwei wirklich gute Vorschläge, die die Funktion sehr interessant nutzen
array_sum
:38 Bytes:
45 Bytes:
Dies ist eine wirklich großartige Idee und kann ein wenig gekürzt werden, um 36 Bytes lang zu sein:
quelle
<?=substr_count(decbin(1337),"1");
(34 Bytes)<?=substr_count(decbin(1337),1);
. Das sind insgesamt 32 Bytes. Wenn Sie bedenken, dass es sich um einen ausreichend unterschiedlichen Code handelt, möchten Sie ihn nicht als Ihre eigene Antwort veröffentlichen? Ich werde es auf jeden Fall unterstützen!<?=substr_count(decbin($argv[1]),1);
(oder$_GET[n]
; 36 Bytes)C #, 45 Bytes
https://dotnetfiddle.net/kJDgOY
quelle
b-48
ist noch kürzer, AFAIKJapt, 3 Bytes (nicht konkurrenzfähig)
Probieren Sie es hier aus.
quelle
¢o1 l
würde auch funktionieren. Ein weiterer interessanter Ansatz ist-¢¬r-0
;¢¬
Teilt sich in ein Array von Binärziffern,r-0
reduziert sich durch Subtraktion ab 0 und-
negiert das Ergebnis, wodurch es positiv wird.¢¬x
.Bienenwachs ,
3127 BytesNicht konkurrierende Antwort. Bienenwachs ist neuer als diese Herausforderung.
Diese Lösung verwendet Brian Kherigans Methode, um gesetzte Bits von der Website „Bit Twiddling Hacks“ zu zählen.
Es wird nur eine Schleife durchlaufen, wobei die Anzahl der Bits erhöht wird, während durch
number=number&(number-1)
bis iteriert wirdnumber = 0
. Die Lösung durchläuft die Schleife nur so oft, wie Bits gesetzt sind.Ich könnte 4 Bytes weg rasieren, indem ich einige Anweisungen neu anordnete. Sowohl der Quellcode als auch die Erklärung wurden aktualisiert:
Erläuterung:
Klonen Sie mein GitHub-Repository mit dem Bienenwachs-Interpreter, den Sprachspezifikationen und Beispielen.
quelle
Java, 17 Bytes
Arbeitet für
byte
,short
,char
, undint
. Verwenden Sie als Lambda.Hier testen
Ohne Verwendung von integrierten Funktionen:
42 Bytes
Hier testen
quelle
Clip , 6
2 Wege:
Dies ist eine einfache Übersetzung der Anforderung: die Anzahl der Einsen in der Zahlendarstellung zur Basis 2.
Eine andere Methode, bei der die Summe der Ziffern der Basis-2-Darstellung verwendet wird.
quelle
Oktave, 18
Beispiel:
quelle
GML (Game Maker Language), 21 Byte
quelle
C # 39 Bytes
quelle
Perl, 21
quelle
PowerShell (51 Byte)
Erläuterung:
[convert]::ToString($s,2)
Erzeugt eine binäre Zeichenfolgendarstellung von$s
.[char[]]
Wirft es in ein Zeichen-Array und ermöglicht es uns, jedes Zeichen aufzuzählen.|%{"+$_"}
stellt jedem Zeichen ein + voran und"$()"
ruft implizit.ToString()
den resultierenden Unterausdruck auf, der|iex
die weitergeleitete Zeichenfolge summiert (dh "+1 +0 +1 +1 +0 +1 +0 +0" = 4)quelle
-join
Operator und ein implizites verwenden.ToString()
, um 45 Bytes mit[char[]][convert]::ToString($s,2)-join'+'|iex
... OR zu erreichen , als einen anderen Ansatz verwenden Sie den Inline--replace
Operator, um 43 Bytes mit([convert]::ToString($s,2)-replace0).length
Clojure, 42 Bytes
Lesen Sie von rechts nach links, konvertieren Sie in eine Binärzeichenfolge, konvertieren Sie in eine Zeichenfolge, filtern Sie nach
1
s und zählen Sie, wie viele Sie haben.BEARBEITET Mit Hilfe von Sieg
quelle
#(count(filter #{\1}(Integer/toString% 2)))
#(count(filter #{\1}(Integer/toString % 2)))
CompilerException java.lang.IllegalArgumentException: No matching method: toString_PERCENT_
Integer/toString
. Es hat aber vor einer Sekunde funktioniert.Haskell 42 Zeichen
deklariert die
f :: Integer -> Integer
Verwendung der Funktion vom interaktiven Interpreter als
f <number>
oder fügt die Zeilemain=print$f <number>
am Ende der Datei hinzu.quelle
rem n 2
s direkt summieren, anstatt eine Liste davon zu erstellen, und indem Siediv
anstelle vonquot
:t 0=0
t n=t(div n 2)+rem n 2
- nof
more verwenden.Matlab, 13 Bytes
de2bi
Erstellt einen Vektor aus Nullen und Einsen, der die Binärzahl darstellt, und gibtsum
nur die Summe aller Einträge zurück.quelle
𝔼𝕊𝕄𝕚𝕟, 4 Zeichen / 11 Bytes (nicht konkurrierend)
Try it here (Firefox only).
Erläuterung
Wandelt die Eingabe in eine Binärdatei um, teilt sie entlang der Zeichen und ruft die Summe des resultierenden Arrays ab.
quelle