Eine positive ganze Zahl kann durch Einfügen von a zwischen zwei Bits in ihrer binären Erweiterung verdünnt werden 0
. Dies bedeutet, dass eine n
-Bit-Zahl n-1
Verdünnungen aufweist, die nicht unbedingt alle verschieden sind.
Zum Beispiel sind für 12
(oder 1100
in binärer Form) die Verdünnungen
11000 = 24
^
11000 = 24
^
10100 = 20
^
Bei dieser Herausforderung nehmen wir die Summe aller Verdünnungen, ausschließlich der ursprünglichen Zahl. Nimmt 12
man die Summe der 24, 24, 20
Ergebnisse in sich 68
, so 68
sollte die Ausgabe für 12
.
Herausforderung
Bei einer positiven Ganzzahl n > 1
als Eingabe wird die verdünnte Summe wie oben erläutert ausgegeben / zurückgegeben.
Beispiele
in out
--- ---
2 4
3 5
7 24
12 68
333 5128
512 9216
Regeln
- Es kann davon ausgegangen werden, dass die Eingabe und Ausgabe in den systemeigenen Ganzzahltyp Ihrer Sprache passen.
- Die Ein- und Ausgabe kann in jedem beliebigen Format erfolgen .
- Es ist entweder ein vollständiges Programm oder eine Funktion zulässig. Bei einer Funktion können Sie die Ausgabe zurückgeben, anstatt sie zu drucken.
- Standardlücken sind verboten.
- Dies ist Codegolf, daher gelten alle üblichen Golfregeln, und der kürzeste Code (in Byte) gewinnt.
code-golf
arithmetic
number-theory
binary
AdmBorkBork
quelle
quelle
Antworten:
Python 2 ,
4339 BytesProbieren Sie es online!
Wie?
Jeder Aufruf der rekursiven Funktion berechnet eine einzelne Verdünnung. Die Position des eingefügten
0
istlog2(i)
. Die Funktion wird solange wiederholt, bisi
größer alsn
und die Einfügung links von der Zahl ist. Wenni>n
, wirdn/i
ausgewertet0
, was in Python ein falscher Wert ist.n*2
Verschiebt die gesamte Binärzahl um eine Stelle nach linksn%i
odern % 2**(position of insertion)
berechnet den Wert des Teils, der nicht nach links verschoben werden soll. Dieser Wert wird von der verschobenen Zahl abgezogen.Beispiel (n = 7)
quelle
Jelly , 11 Bytes
Probieren Sie es online!
Wie es funktioniert
quelle
MATL , 13 Bytes
Probieren Sie es bei MATL Online! Oder überprüfen Sie alle Testfälle .
Erläuterung
Betrachten Sie die Eingabe
12
als Beispiel.quelle
C
5856 BytesVielen Dank an @Dennis für das Speichern von zwei Bytes!
Probieren Sie es online!
C (gcc) , 50 Bytes
Die Rückgabe von
k=s;
ist undefiniertes Verhalten, funktioniert jedoch mit gcc, wenn Optimierungen deaktiviert sind. Hatn%k+n/k*(k+=k)
auch nicht spezifiziertes Verhalten , scheint aber gut mit gcc zu funktionieren.Probieren Sie es online!
quelle
s,k;f(n){for(s=0,k=2;k<=n;)s+=n%k+n/k*(k*=2);return s;}
(55 Bytes)n%k
odern/k*(k*=2)
.for(s=0,k=2;k<=n;)s+=n%k+n/k*(k*=2);return s;
ist völlig in Ordnung, undn%k
wird immer vorher ausgewertetn/k*(k*=2)
undn/k
wird auch vorher ausgewertetk*=2
. Danke für die Erklärung. (Ich werde jetzt einige meiner Kommentare löschen, um dasGelee ,
98 BytesProbieren Sie es online!
Umgekehrt
B¹ƤṖ+BḄS
: Präfixe abrufen, zuletzt ablegen, zur Eingabe hinzufügen und summieren.quelle
J ,
20 1514 BytesProbieren Sie es online aus.
15 Bytes
Probieren Sie es online!
quelle
Japt ,
1211 BytesVersuch es
Erläuterung
quelle
JavaScript (ES6),
41 bis40 ByteDank Mr.Xcoder 1 Byte gespeichert
Testfälle
Code-Snippet anzeigen
quelle
Netzhaut ,
535047 BytesProbieren Sie es online! Link enthält Testfälle. Bearbeiten: 3 Bytes dank @MartinEnder gespeichert. Erläuterung:
Konvertieren Sie von Dezimal in Binär, verwenden Sie jedoch O, um 0 darzustellen, da dies keine Ziffer ist, und _, um 1 darzustellen, da dies das Standard-Wiederholungszeichen in Retina 1 ist.
Fügen Sie zwischen jedem Ziffernpaar ein O ein und sammeln Sie die Ergebnisse als Liste.
Konvertiert von binär zu unär. (Diese Konvertierung erzeugt zusätzliche
O
s, aber das ist uns egal.)Summieren und in Dezimalzahl umwandeln.
quelle
%
. Wenn es komplizierter ist, brauchen Sie so etwas/[O_]+/_
.Pyth , 13 Bytes
Probieren Sie es hier aus!
Erläuterung
quelle
Gelee , 10 Bytes
Probieren Sie es online!
Derzeit nicht die kürzeste, aber es könnte sein, dass es einen Ausweg gibt
Bµ µḄ
...Erläuterung
Grundsätzlich funktioniert dies, indem jede Binärzahl mit einer magischen Zahl multipliziert wird. Ich kann es nicht erklären, ohne es zu visualisieren, also ist hier die Binärzahl, mit der wir arbeiten werden:
Wie durch die Herausforderung erklärt, ist die Ausgabe, die wir wollen, die Summe dieser Binärzahlen:
Wir müssen jedoch eigentlich keine Nullen einfügen: Jellys "unbinäres" Atom akzeptiert andere Zahlen als nur
0
und1
. Wenn wir es uns erlauben2
, wird dieses Muster einfacher:Wenn wir die Ziffern in jeder Spalte zusammenfassen, erhalten wir
Der Trick, den diese Antwort verwendet, besteht darin, dieses Muster zu generieren und jede Ziffer mit der entsprechenden Ziffer im Original zu multiplizieren, um die erforderlichen Spalten zu löschen. 12 wäre beispielsweise dargestellt als
quelle
Java 8, 55 Bytes
Port of Steadybox 'C antwortete und spielte dabei 3 Bytes.
Probieren Sie es online aus.
quelle
Husk ,
1312 Bytes-1 Byte dank @Mr. Xcoder!
Probieren Sie es online!
Erläuterung
quelle
05AB1E , 14 Bytes
Probieren Sie es online!
quelle
Pip ,
2118 BytesProbieren Sie es online!
Erläuterung
Rufen Sie unsere Eingangsnummer an
a
. Für jeden Binärindex,i
bei dem wir eine Null einfügen möchten, können wir die Bits links vom Einfügepunkt alsa // 2**i
(wobei//
Ganzzahldivision und**
Exponentiation ist), die Bits rechts vom Einfügepunkt alsa % 2**i
und daher die verdünnte Ganzzahl als berechnen2 * (a // 2**i) * 2**i + (a % 2**i)
. Ist(a // 2**i) * 2**i
aber gleicha - (a % 2**i)
, und so können wir zu einer kürzeren Formel umstellen:2 * (a - a % 2**i) + a % 2**i
=2 * a - a % 2**i
.quelle
R ,
14148 BytesProbieren Sie es online!
Entweder mache ich etwas wirklich Falsches oder R ist einfach schrecklich, wenn es um Manipulation geht.Porting Luis Mendo Ansatz ist einfach, zu korrigieren und Golfy.Aber wenn Sie wirklich nur mit Bit-Operationen herumspielen wollen, hat MickyT die folgenden 105 Bytes vorgeschlagen:
Probieren Sie es online!
quelle
Python 3,
928078 BytesProbieren Sie es online
Danke an Mr.XCoder und ovs für -12 Bytes bzw. -2 Bytes.
quelle
Batch,
9277 BytesBearbeiten: Wechselt zu derselben Formel, die alle anderen verwenden.
quelle
Jelly , 14 Bytes
Probieren Sie es online!
quelle
Perl 5 , 36 + 1 (
-p
) = 37 BytesProbieren Sie es online!
quelle
Attache , 57 Bytes
Probieren Sie es online!
Ich dachte, ich würde das Problem von einem Ansatz ohne Bitmanipulation aus angehen, da ein solcher Ansatz in Attache unpraktisch ist. Ich muss einige Teile dieses Ansatzes auf Alternativen untersuchen.
Erläuterung
Hier ist eine erweiterte Version:
Dies nimmt einfach die binäre Darstellung der Zahl, teilt sie an bestimmten Punkten, fügt dort Nullen ein, wandelt sie in Dezimalzahlen um und summiert sie zusammen.
quelle
J , 33 Bytes
Höchstwahrscheinlich gibt es viel Raum für weiteres Golfen.
Wie?
@#:
in binär umwandeln und<@}.\.
- Finden Sie alle Ausreichenden, lassen Sie die erste Ziffer aus jedem Kästchen fallen<\
- Finde alle Präfixe und boxe sie ein(,0;])"0
- Fügen Sie an jedes Präfix den Wert 0 und dann das entsprechende Suffix mit Enthauptung an;@
raze (Unbox)1#.[:}:#.@
- Umrechnung in Dezimal, Kürzel und SummeProbieren Sie es online!
quelle