Diese Herausforderung ist einfach: Geben Sie eine Dezimalzahl ein, wandeln Sie sie in eine Binärzahl um und berechnen Sie die Summe der Teilzeichenfolgen der Binärzahl, deren Länge kürzer als die ursprüngliche Zahl ist. Hier ist ein Beispiel:
Input:
11
Binary:
11 -> 1011
Substrings:
101 = 5
011 = 3
10 = 2
01 = 1
11 = 3
1 = 1
0 = 0
1 = 1
1 = 1
Sum:
5+3+2+1+3+1+0+1+1=17
Output:
17
Ihr Programm sollte eine einzelne Dezimalzahl als Eingabe verwenden und die Summe der binären Teilzeichenfolgen ausgeben, wie oben gezeigt. Sie können davon ausgehen, dass die Eingabe in ihrer Binärdarstellung immer mehr als zwei Stellen hat und dass die Eingabe während der Ausführung Ihres Programms keine Fehler verursacht.
Das ist Code-Golf , der kürzeste Code in Bytes gewinnt!
Testfälle:
2 => 1
3 => 2
4 => 3
5 => 5
6 => 7
7 => 9
8 => 7
9 => 10
10 => 14
11 => 17
code-golf
base-conversion
binary
subsequence
GamrCorps
quelle
quelle
Antworten:
Gelee,
107 BytesProbieren Sie es online!
Wie es funktioniert
quelle
Pyth, 10
Probieren Sie es online aus oder führen Sie die Test Suite aus
Erläuterung:
quelle
CJam,
2721 BytesGrüße Dennis, der mir geholfen hat, 6 Bytes zu sparen!
Funktioniert nur mit der neuesten Version von CJam (verfügbar bei TIO). Probieren Sie es online !
Alte Version:
Probieren Sie es online aus .
quelle
Python 3, 111 Zeichen
EDIT : Erklärung:
Konvertieren Sie die Eingabezeichenfolge in eine Ganzzahl, dann die Ganzzahl in eine Binärzeichenfolge und entfernen Sie die ersten beiden Zeichen, da die
bin
Methode eine Zeichenfolge im Format von zurückgibt0b...
Nehmen Sie alle Teilzeichenfolgen der Binärzeichenfolge, konvertieren Sie sie mit in Dezimalzeichen
int(n, 2)
und addieren Sie sie.ist eine Liste aller Teilzeichenfolgen. Ungolfed-Version:
Hoffe das hilft.
quelle
CJam (22 Bytes)
Dies ist ein Byte länger als die derzeit beste CJam-Antwort, aber der Ansatz kann wahrscheinlich recht gewinnbringend an einige andere Sprachen angepasst werden.
Online-Demo
Analyse
Angenommen, die Frage wäre
ohne das bisschen
Dann ist es nicht allzu schwer zu zeigen , dass die höchstwertigen Bits mit einem Gesamtgewicht auftritt ,
1*(2^B-1)
woB
die Anzahl von Bits; Das zweitwichtigste Bit tritt mit dem Gesamtgewicht auf2*(2^(B-1)-1)
. bis zum Bth-höchstwertigen Bit, das mit dem Gesamtgewicht auftrittB*(2^1-1)
.Berücksichtigt man nun die Subtraktion der ursprünglichen Zahl
x
, so ergibt sich die SummePräparation
Die Umrechnung auf Basis 2 ergibt den ersten Teil der Hauptsumme plus
x
; zur Basis 1 gibt der zweite Teil plusx
; und zur Basis 0 ergibt geradex
, so subtrahiert man die Basis 1 von der Basis 2, so ergibt diex
Aufhebung und subtrahiert man die Basis 0, so ergibt sich das gewünschte Ergebnis.quelle
JavaScript (ES6), 78 Byte
Das Äußere
map
baut führende Teilzeichenfolgen dern
Binärdarstellung auf. Das innere extrahiert nachfolgende Teilzeichenfolgen der führenden Teilzeichenfolgen und deckt so alle möglichen Teilzeichenfolgen ab, einschließlich der ursprünglichen Binärdarstellung.Jede Teilzeichenfolge wird von binär zurück in dezimal konvertiert und von der ursprünglichen Eingabe subtrahiert, da dies etwas kürzer ist als das Addieren und Subtrahieren der ursprünglichen Eingabe.
quelle
Mathematica,
73-70BytesFunktion. Ganzzahl-> Ganzzahl
quelle
Retina , 64
Probieren Sie es online!
Eine übergeordnete Beschreibung der einzelnen Phasen: Konvertieren von Dezimalzahlen in Unärzahlen, Unärzahlen in Binärzahlen, Abrufen von Präfixen, Abrufen von Präfix-Suffixen, Ausgeben der ursprünglichen Zahl, Konvertieren von Binärzahlen in Unärzahlen, Zurückgeben der Anzahl. Sobald ich mit dem Golfen fertig bin, schreibe ich eine detailliertere Beschreibung. Viele dieser Stadien scheinen verdächtig ...
quelle
C 71 Bytes
Wir pflegen einen Akku
a
und eine Maskem
. Die Maske beginnt bei 1 und wird jedes Mal um die äußere Schleife ein bisschen länger. In der inneren Schleife wird eine Kopiei
der Eingabe nacheinander nach rechts verschoben, bis sie kürzer als die Maske ist. Dabei wird jedes Mal der maskierte Wert akkumuliert.Testprogramm
Ausgang testen
quelle
148 Bytes
Oder wenn ich Import "using static System.Math;" hinzufüge dann 138 mit
OOP-Sprachen wie C # werden ein solches Rennen nicht gewinnen, aber ich wollte es trotzdem versuchen. Hier ist eine schönere Version + Tester.
Das verschachtelte do-while addiert den rechtsverschobenen Wert von iTemp (nachdem es zugewiesen wurde), solange shift + 1 kleiner als pos ist. Die nächste Zeile berechnet den nächsten verschobenen Wert von iPrev
x1 und x2 berechnen die Maske, x3 wendet sie an und verschiebt sie dann nach links, da die letzte Ziffer immer weggelassen wird. Für 11 sieht es so aus:
quelle
PowerShell v2 +, 138 Bytes
Ooof. Diese Konvertierung von / nach Binär ist teuer.
Übernimmt die Eingabe
$a
und verwendet dann den .NET-Aufruf[convert]::ToString($a,2)
in eine Binärdarstellung um. Von dort durchlaufen wir zwei Schleifen - die erste zählt rückwärts vom Ende der Saite abwärts1
und die zweite zählt aufwärts abwärts0
. (Das erste ist, wie lange ein Teilstring entfernt werden soll, und das zweite ist der Index, an welcher Stelle im String der Teilstring gestartet werden soll.) Wir setzen einen Helfer$l
auf dem Weg, um diesen zur inneren Schleife durchzuleiten.Innerhalb der inneren Schleife verwenden wir einen anderen .NET-Aufruf
[convert]::ToInt32()
, um die entsprechende.substring()
from base2
in eine Ganzzahl umzuwandeln . Jeder von diesen wird dann in der Pipeline belassen. Wir kapseln das alles mit parens()
und-join
sie zusammen mit a+
, dann werfen das weg zuiex
(kurz fürInvoke-Expression
und ähnlich zueval
).Ich denke, dies erfordert technisch v2 oder neuer, um die .NET-Aufrufe richtig aufzurufen.
quelle