Beschreibung
Gib bei gegebener Zahl die Anzahl der 1
s in binärer Darstellung aus.
Eingang
Eine Zahl >= 0
in Basis 10, die die höchste Zahl, die Ihre Sprache verarbeiten kann, nicht überschreitet.
Ausgabe
Der Betrag von 1
s in binärer Darstellung.
Gewinnbedingung
Der kürzeste Code gewinnt.
Nicht erlaubt
- Bitweise Operatoren. Andere Operatoren wie Addition und Multiplikation sind zulässig.
- Eingebaute Basisumwandlungsfunktionen.
Beispiele
Input: Ouput:
56432 8
Input: Output:
45781254 11
Input: Output:
0 0
Antworten:
APL,
912 ZeichenDies setzt voraus, dass der Interpreter 32-Bit-Ganzzahlen verwendet und diese
⎕IO
auf 0 gesetzt sind (was bedeutet, dass monadisch⍳
mit 0 anstatt mit 1 beginnt). Ich habe die 32-Bit-Version von Dyalog APL verwendet .Erklärung von rechts nach links:
⍳32
erzeugt einen Vektor der ersten32
ganzen Zahlen (da⎕IO
0 ist, beginnt dieser Vektor mit 0).*
ist die Potenzfunktion. In diesem Fall generiert2
es die Potenz jedes Elements des Vektors, der als rechtes Argument angegeben wird.÷
ist die Division durch Funktion. Es gibt uns⎕
(ausgewertete Benutzereingaben) geteilt durch jedes Element des Vektors zu seiner Rechten (jede Zweierpotenz).⌊
Fußböden jedes Element des Arguments auf der rechten Seite.2|
gibt uns den Rest jedes Elements von zu seiner Rechten geteilt durch2
./
reduziert (faltet) sein rechtes Argument mit der Funktion nach links+
,.Nicht mehr ganz 9 Zeichen. :(
Alte, regelwidrige Version:
quelle
Built-in base conversion functions
Kontraktion?Brainbool , 2
Die vernünftigste Interpretation, meiner Meinung nach (und was den meisten Antworten verwenden) von „höchster Zahl Ihrer Sprache ist in der Lage zu handhaben “ ist „größte Zahl Ihrer Sprache nativ unterstützt“. Brainbool ist ein Brainfuck-Derivat, das Bits anstelle von Bytes verwendet und Eingaben und Ausgaben in Binärform (
0
und1
Zeichen) anstelle von Zeichencodes vornimmt. Die größte nativ unterstützt Zahl ist daher1
, und die kleinste ist0
, die Hamming - Gewichte haben1
und0
jeweils.Brainbool wurde laut Esolang im Jahr 2010 gegründet.
quelle
J, 13 Zeichen
(+ die Anzahl der Ziffern in der Nummer)
Verbrauch: ersetzen Sie das
n
im Programm durch die zu testende Nummer.Beispiele:
Es gibt wahrscheinlich eine Möglichkeit, dies neu zu ordnen, damit die Nummer am Anfang oder Ende platziert werden kann, aber dies ist mein erster J-Eintrag und mein Kopf tut jetzt leicht weh.
Erläuterung (hauptsächlich, damit ich es in Zukunft verstehe)
i.32
- Erstellt ein Array mit den Zahlen 1 bis 322^
- verwandelt die Liste in Zweierpotenzen 1 bis 4294967296n%
- teilt die eingegebene Nummer durch jedes Element in der Liste<.
- rundet alle Divisionsergebnisse auf die nächste Ganzzahl ab2|
- wie%2
in den meisten Sprachen - liefert 0 wenn gerade und 1 wenn ungerade+/
- summiert die Elemente in der Liste (die jetzt nur 1s oder 0s sind)quelle
Brainfuck, 53 Zeichen
Diesem fehlte eine obligatorische Brainfuck-Lösung, daher habe ich diese erstellt:
Übernimmt die Nummer aus Zelle 1 und fügt das Ergebnis in Zelle 6 ein.
Nicht registrierte und kommentierte Version:
quelle
Python 2.6, 41 Zeichen
Anmerkung: Meine andere Antwort verwendet Lambda und Rekursion und diese verwendet eine while-Schleife. Ich denke, sie sind unterschiedlich genug, um zwei Antworten zu rechtfertigen.
quelle
Ruby, 38 Zeichen
Eine andere Lösung mit Ruby und dem gleichen rekursiven Ansatz wie Steven.
quelle
GolfScript,
1716 ZeichenBearbeiten: Neue Version speichert 1 Zeichen, indem Listenoperation anstelle von Falz verwendet wird (ursprüngliche Version war
~{.2%\2/.}do]{+}*
, direkte Zählversion:)~0\{.2%@+\2/.}do;
.quelle
C 45
Hier ist nichts Besonderes für das Golfen in C: impliziter Rückgabetyp, impliziter ganzzahliger Typ für Parameter.
quelle
Python 2.6, 45 Zeichen
quelle
def
eines Lambdas um zwei Zeichen gekürzt werden .print b(input())
. Es ist akzeptabel, den Wert zurückzugeben und "input" als Argumente für Funktionen zu verwenden.Perl,
454336 ZeichenVielen Dank an Howard für 45-> 43 und an User606723 für 43-> 36.
quelle
$n=int($n/2)
die 2 kürzeren Zeichen verwenden.$n=<>;while($n){$_+=$n%2;$n/=2}print
Dies wird so lange wiederholt, bis $ n / 2 endlich nahe genug bei 0 angelangt ist, aber kümmert es uns? ;)Perl, 30 Zeichen
Basierend auf der PhiNotPi-Lösung , mit etwas mehr Golf. Führen Sie mit aus
perl -M5.010
, um die Perl 5.10-say
Funktion zu aktivieren .quelle
$=
spezielle Variable etwas Besonderes in Ihrem Programm oder ist es nur eine gewöhnliche Variable?$=
nur ganzzahlige Werte anint
.Common Lisp, 12 Zeichen
(unter der Annahme eines 1-Zeichen-Variablennamens - dh: 11 + Nummernlänge)
Es ist keine Basiskonvertierungsfunktion, daher sollte es funktionieren:
Beispiele:
(Mit GNU CLISP.)
quelle
C
61 60 5753 ZeichenDer Funktionskörper ist nur 38 Zeichen. Bearbeiten : Bitweiser Operator entfernt Bearbeiten :
printf
Aus der Schleife entfernen, wie in den Kommentaren vorgeschlagen Bearbeiten : Zur K & R-Deklaration wechseln; Auch dies ist nicht mehr C99-spezifischquelle
Gleichstrom - 26 Zeichen
Dies ist ziemlich lang, hauptsächlich wegen des Fehlens von Schleifenkonstrukten in
dc
.Addiert das Modulo 2 der Zahl und dividiert die Zahl durch bis, bis sie Null erreicht. Kann mit beliebig langen ganzen Zahlen umgehen.
Beispiel:
quelle
C, 66 Zeichen
Hinweis: Erfordert gcc oder gcc-kompatiblen Compiler (zB ICC, Clang).
__builtin_popcount
Kompiliert für einige CPUs zu einer einzigen Anweisung (zBPOPCNT
auf x86).quelle
__builtin_popcount
tatsächlich nur das Zählen von1
s selbst implementiert wird ? Wenn ja, obwohl es nicht streng nach den Regeln falsch ist, halte ich das ehrlich gesagt nicht für einen fairen Einstieg.printf
ohne vorheriges Include verwenden können.C++
JavaScript,
78 7271 ZeichenIch werde meine ursprüngliche Lösung posten, die ich mir ausgedacht habe, bevor ich auch die Frage stelle. Es gibt aber schon eine viel bessere JavaScript-Antwort :)
http://jsfiddle.net/Mk8zd/1/
Die Idee kommt von bestimmten "Gedankenlesekarten", die es Ihnen ermöglichen, die Nummer zu ermitteln, die jemand anderes im Sinn hat, indem Sie ihm Karten zeigen und sagen lassen, auf welchen Karten seine Nummer ersichtlich ist.
Es funktioniert, weil jede Zahl eine eindeutige Kombination von
1
s /0
s in der Binärdatei ist. Meine Lösung überprüft, auf welchen "Karten" die Nummer ersichtlich ist, um festzustellen, wie viele1
s sie hat. Es ist nur nicht sehr effizient, obwohl ...ich fand dieses Dokument gefunden, das die Gedankenlesetechnik beschreibt.
quelle
Haskell (60 Zeichen)
quelle
PHP, 57
Dies setzt voraus, dass
$n
der zu testende Wert enthalten ist.PHP, 55 (alternative Lösung)
Dies setzt wiederum voraus, dass
$n
der zu testende Wert vorliegt. Dies ist eine Alternative, da der Operator or verwendet wirdfloor
die Eingabe verwendet wird.Beide Lösungen funktionieren und verursachen keine Auffälligkeiten.
quelle
Ocaml, 45 Zeichen
Basierend auf der Lösung von @Leah Xue. Drei Leerzeichen könnten entfernt werden, und es ist etwas kürzer (~ 3 Zeichen), um die Funktion anstelle von if-then-else zu verwenden.
quelle
Mathematica 26
quelle
Scala, 86 Zeichen
Verwendung:
scala O 56432
quelle
D (70 Zeichen)
quelle
R, 53 Zeichen
o=function(n){h=n%/%2;n%%2+if(h)o(h)else 0};o(scan())
Beispiele:
Wenn die Eingabe der Nummer nicht Teil der Zeichenanzahl ist, sind es 43 Zeichen:
o=function(n){h=n%/%2;n%%2+if(h)o(h)else 0}
mit Testfällen
quelle
OCaml, 52 Zeichen
quelle
Planen
Ich habe die Regeln ein wenig überarbeitet, um die Herausforderung zu erweitern. Die Funktion kümmert sich nicht um die Basis der Zahl, da sie eine eigene Binärskala verwendet. Ich war inspiriert von der Art und Weise, wie analoge numerische Konvertierungen funktionieren. Ich benutze dafür einfach die Rekursion:
quelle
Ist das Lesen einer Zahl in eine Binärzahl oder das Drucken der Zahl aus einer Binärzahl nicht eine "eingebaute Basiskonvertierungsfunktion", die jede Antwort darüber ungültig macht, die
print
eine Ganzzahl ist? Wenn Sie das Lesen und Drucken einer Ganzzahl zulassen, wie es bei fast allen obigen Antworten der Fall ist , werde ich Behauptungen mit einer eingebautenpopcount
Funktion aufstellen :Haskell, 50
In diesem Sommer wurde
popCount
demData.Bits
Modul für GHC v7.2.1 / v7.4.1 eine Routine hinzugefügt (siehe Tickets zu Primop und Bindung ).Ich kann die obigen Python- und Perl-Scores mit ihren
GMPY
oderGMP::Mpz
Modulen für GMP leider nicht übertreffen , obwohl GMP auch eine Popcount-Funktion bietet .quelle
JavaScript,
49474542 BytesDemo: http://jsfiddle.net/hcYdx/4/
Edit 1: entfernen
q
und~~
zum Runden verwenden, 2 Zeichen speichern.Edit 2: Verwenden Sie den
|0
Rundungsoperator~~
, um Klammern (2 Zeichen) zu speichern.Bearbeiten 3: Vereinfachung
n>0
zun
und verbinden sich mitn=n/2|0
bis zu ganzem Zustand zu machen; Jetzt haben Statement-Platz verschwendet :(quelle
|0
ein bitweiser Operator?|
ist bitweiser Operator ... ist nicht erlaubt. Zeit zu tunMath.round
:-)Java 7, 36 Bytes
Ausgerechnet dafür hat Java natürlich ...
quelle
bitCount
unter der Haube funktioniert.TI-Basic (TI-84 Plus CE), 30 Byte
TI-Basic ist eine Token-Sprache. Alle Token
remainder(
bestehen aus einem Byte , der Rest aus zweiquelle
PHP, 36 Bytes
Angenommen,
$n
ist die zu testende Zahl, zeigt einen PHP-Hinweis für$o
und funktioniert nicht genau, wenn$n
0 ist (gibt nichts aus).PHP, 53 Bytes
Akzeptiert Befehlszeilen-Eingaben, zeigt keine PHP-Benachrichtigung an und gibt für 0 korrekt aus.
quelle