To wyzwanie jest proste, biorąc pod uwagę liczbę dziesiętną, przekonwertować na liczbę binarną i obliczyć sumę podłańcuchów liczby binarnej, której długość jest mniejsza niż liczba pierwotna. Oto przykład:
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
Twój program powinien przyjmować jedną liczbę całkowitą dziesiętną jako dane wejściowe i wyjściowe sumę podciągów binarnych, jak pokazano powyżej. Możesz założyć, że wejście zawsze będzie miało więcej niż dwie cyfry w swojej reprezentacji binarnej i że na wejściu nie spowoduje żadnych błędów podczas wykonywania programu.
To jest code-golf , wygrywa najkrótszy kod w bajtach!
Przypadki testowe:
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
źródło
źródło
Odpowiedzi:
Galaretka,
107 bajtówWypróbuj online!
Jak to działa
źródło
Pyth, 10
Wypróbuj online lub uruchom pakiet testowy
Wyjaśnienie:
źródło
CJam,
2721 bajtówWołaj do Dennisa za pomoc w oszczędzeniu 6 bajtów!
Działa tylko z najnowszą wersją CJam (dostępną w TIO). Wypróbuj online !
Stara wersja:
Wypróbuj online .
źródło
Python 3, 111 znaków
EDYCJA : Objaśnienie:
Konwertuj ciąg wejściowy na int, a następnie int na ciąg binarny i usuń jego pierwsze dwa znaki, ponieważ
bin
metoda zwraca ciąg w formacie0b...
Weź wszystkie podciągi ciągu binarnego, przekonwertuj je na dziesiętne za pomocą
int(n, 2)
i zsumuj.to lista wszystkich podciągów. Wersja bez golfa:
Mam nadzieję że to pomoże.
źródło
CJam (22 bajty)
Jest to jeden bajt dłuższy niż obecna najlepsza odpowiedź CJam, ale podejście to prawdopodobnie można dość dobrze dostosować do niektórych innych języków.
Demo online
Analiza
Załóżmy, że pytanie było
bez odrobiny
Nietrudno więc wykazać, że najbardziej znaczący bit występuje przy całkowitej masie,
1*(2^B-1)
gdzieB
jest liczba bitów; drugi najbardziej znaczący bit występuje przy całkowitej masie2*(2^(B-1)-1)
; aż do B-najbardziej znaczącego bitu, który występuje przy całkowitej masieB*(2^1-1)
.Biorąc teraz pod uwagę odjęcie pierwotnej liczby
x
, otrzymujemy sumęSekcja
Konwersja do podstawy 2 daje pierwszą część sumy głównej plus
x
; podstawa 1 daje drugą część plusx
; a podstawa 0 daje właśniex
, więc odjęcie podstawy-1 od podstawy-2x
powoduje anulowanie s, a odjęcie podstawy-0 daje pożądany wynik.źródło
JavaScript (ES6), 78 bajtów
Zewnętrzne
map
tworzy wiodące podciągin
binarnej reprezentacji; wewnętrzna wyciąga końcowe podciągi wiodących podłoży, pokrywając w ten sposób wszystkie możliwe podłańcuchy, w tym oryginalną reprezentację binarną.Każdy podciąg jest konwertowany z binarnego z powrotem na dziesiętny i odejmowany od oryginalnego wejścia, ponieważ jest to nieco krótsze niż dodawanie ich razem i odejmowanie oryginalnego wejścia.
źródło
Mathematica,
7370 bajtówFunkcjonować. Liczba całkowita-> Liczba całkowita
źródło
Retina , 64
Wypróbuj online!
Opis wysokiego poziomu etap po etapie: konwertuj liczbę dziesiętną na unarską, unarną na binarną, uzyskaj prefiksy, uzyskaj sufiksy prefiksów, zrzuć oryginalny numer, konwertuj binarny na unarny, zwracaj liczbę. Bardziej szczegółowy opis napiszę, kiedy skończę grać w golfa, wiele z tych etapów wydaje się podejrzanych ...
źródło
C, 71 bajtów
Utrzymujemy akumulator
a
i maskęm
. Maska zaczyna się od 1 i za każdym razem staje się nieco dłuższa wokół zewnętrznej pętli. W wewnętrznej pętli kopiai
danych wejściowych jest sukcesywnie przesuwana w prawo, aż będzie krótsza niż maska, gromadząc za każdym razem zamaskowaną wartość.Program testowy
Wyjście testowe
źródło
C #, 148 bajtów
Lub jeśli dodam opcję Importuj „za pomocą statycznego System.Math;” następnie 138 z
Języki OOP, takie jak C #, nie wygrywają takiego wyścigu, ale i tak chciałem spróbować. Oto bardziej upiększona wersja + tester.
Zagnieżdżona funkcja „do while” dodaje przesuniętą w prawo wartość iTemp (po przypisaniu jej), o ile shift + 1 jest mniejszy niż poz. Następny wiersz oblicza następną przesuniętą wartość iPrev
x1 i x2 oblicz maskę, x3 stosuje ją, a następnie przesuwa w lewo, ponieważ ostatnia cyfra jest zawsze upuszczana. W przypadku 11 wygląda to tak:
źródło
PowerShell v2 +, 138 bajtów
O nie. Ta konwersja do / z pliku binarnego jest droga.
Pobiera dane wejściowe
$a
, a następnie używa wywołania .NET,[convert]::ToString($a,2)
aby przekształcić je w reprezentację binarną. Stamtąd przechodzimy przez dwie pętle - pierwsza odlicza wstecz od końca łańcucha do1
, a druga od góry0
. (Pierwsza to długość podciągu do wyciągnięcia, a druga to indeks miejsca w ciągu, aby rozpocząć podciąg.) Ustawiamy pomocnika$l
po drodze, aby przekazać go do wewnętrznej pętli.Wewnątrz wewnętrznej pętli używamy innego wywołania .NET
[convert]::ToInt32()
do konwersji odpowiedniej wartości.substring()
z bazy2
na liczbę całkowitą. Każdy z nich jest następnie pozostawiany w rurociągu. Łączymy to wszystko za pomocą parens()
i-join
ich razem z a+
, a następnie wrzucamy to doiex
(skrót odInvoke-Expression
i podobne doeval
).Myślę, że technicznie wymaga to wersji 2 lub nowszej, aby poprawnie wywoływać wywołania platformy .NET.
źródło