Wyzwanie, jeśli zdecydujesz się je zaakceptować, polega na K >= 1
znalezieniu liczb całkowitych nieujemnych A
i B
spełnieniu co najmniej jednego z dwóch następujących warunków:
K = 2^A + 2^B
K = 2^A - 2^B
Jeśli takiego nie ma, A
a B
Twój program może zachowywać się w dowolny sposób. (Wyjaśnienie A
i B
może być równe.)
Przypadki testowe
Często istnieje wiele rozwiązań wielu, ale oto kilka:
K => A, B
1 => 1, 0
15 => 4, 0 ; 16 - 1 = 15
16 => 5, 4 ; 32 - 16 = 16; also 3, 3: 8 + 8 = 16
40 => 5, 3 ; 2^5 + 2^3 = 40
264 => 8, 3
17179867136 => 34, 11 ; 17179869184 - 2048 = 17179867136
Ostatni przypadek testowy, 17179867136
, należy uruchomić w niecałe 10 sekund na każdym stosunkowo nowoczesną maszynę. To jest golf golfowy, więc wygrywa najkrótszy program w bajtach. Możesz użyć pełnego programu lub funkcji.
16
zarówno5,4
i3,3
są ważne.A
,B
być ujemne? (np.-1, -1
dla 1)Odpowiedzi:
Galaretka ,
1110 bajtówZastosowanie sztuczki polegającej na kręceniu bitów z odpowiedzi Pythona autorstwa @xnor
Przetestuj w TryItOnline
Wszystkie przypadki testowe znajdują się również w TryItOnline
W jaki sposób?
źródło
Python 2, 43 bajty
Powiedz to
n==2^a ± 2^b
za>b
. Zatem największym współczynnikiem potęgi 2n
jest2^b
i możemy go znaleźć za pomocą sztuczki bitowej2^b = n&-n
. To pozwala nam obliczyć2^b + n
, która jest równa albo2^a + 2 * 2^b
albo tylko2^a
. Każdy z nich ma tę samą długość bitów coa
*. Tak więc, wyprowadzamy długości bitówn&-n
i(n&-n)+n
obliczone na podstawie długości ich reprezentacji binarnych. Python 3 jest o jeden bajt dłuższy dla parens wfor k in(n,0)]
.* Tyle że
2^a + 2^b
za==b+1
ma jedną dłuższą długość bitów, ale to dobrze, ponieważ możemy to interpretować jako2^(a+1)-2^b
.źródło
n=4
lub8
lub16
przyjemność.f(2**n)
zwrotów(n+1,n)
i2**(n+1)-2**n=2**n
tak nie ma problemu.bin()
Pythona?0b
, stąd-3
.JavaScript (ES6), 73 bajty
W przypadku odejmowania pierwsza liczba to liczba cyfr w reprezentacji binarnej, a druga liczba to liczba zer końcowych. W przypadku dodawania odejmujemy 1 od pierwszej liczby. Jeśli reprezentacją binarną są wszystkie 1, po których następują 0, to zakłada się przypadek dodania, w przeciwnym razie przyjmuje się przypadek odejmowania. 36-bajtowy port wersji @ xnor, który działa tylko dla B≤30 w JavaScript:
źródło
n=>[n,0].map(k=>((n&-n)+k).toString(2).length-1)
I obie wersje wracają[34,11]
na ostatnim przypadku testowym (używam FF 48).Perl,
524932 bajtyStare rozwiązanie (49 bajtów)
Obejmuje +1 dla
-p
Podaj dane wejściowe STDIN:
pow2.pl
Jednak użycie algorytmu xnor i dodanie skrętu daje 32 bajty:
Tylko kod:
Cierpi na tym poważny błąd zaokrąglania, ponieważ
13/9 = 1.444...
jest nieco powyżej1/log 2 = 1.44269...
(log
sam również ma błąd zaokrąglania, ale jest o tyle mniejszy, że możemy go zawrzeć w analizie 13/9). Ale ponieważ każdy2**big - 2** small
zostanie poprawiony2** big
przed dziennikiem, nie ma to znaczenia, a obliczenia dla2**big + 2 * 2**small
skrócenia zostają zmniejszone, więc jest również bezpieczny. A po drugiej stronie zakresu2**n+2**(n-1)
nie zwiększa się wystarczająco w zakresie[0,64]
(nie mogę poprawnie i tak obsługuje więcej niż zakres liczb całkowitych ze względu na użycie&
), aby doprowadzić do błędnego wyniku (multiplikator1.5
byłby jednak zbyt daleki dla dużych liczb).źródło
Brachylog , 23 bajty
Wypróbuj online!
Jest to znacznie szybsze niż wymagane, np . W TIO jest to nadal poniżej 10 sekund .
Wyjaśnienie
Jest to w zasadzie bezpośrednia transkrypcja formuły bez optymalizacji:
źródło
Python, 69 bajtów
Testy są na ideone
Ponieważ nieprawidłowe dane wejściowe mogą zrobić wszystko, wiemy, że jeśli dane wejściowe mają ustawione dokładnie 2 bity, jest to suma tych 2 mocy 2, a w przeciwnym razie (jeśli jest poprawna) będzie to ciąg pewnej liczby bitów (w tym możliwość tylko 1 bit) i będzie różnicą między następną najwyższą mocą 2 niż zestaw MSB i zestaw LSB.
źródło
JAVA 7,
142,140, 134 BYTESTo jest mój pierwszy post na PPCG! Naprawdę byłbym wdzięczny za opinie na temat wskazówek golfowych
Dzięki zamrożeniu za oszczędność 2 bajtów
UNGOLF
ideone
źródło
40=2**3+2**5
. Patrząc na to, nie rozumiem, dlaczego nie, może popełniłem błąd transkrypcji ...1
zamiast deklarować dla niego zmienną?for(int i=-1,j;[...]
Mathematica,
5754 bajtówZaoszczędzono 3 bajty dzięki LegionMammal978!
Właściwie drukuje wszystkie 1 odpowiednie pary {a, b}.
2Log@#+1
jest górną granicą największej,a
która może pojawić się podczas reprezentowania danych wejściowych#
(ścisła górna granica to Log [2 #] / Log [2] = 1,44 ... Log [#] + 1). Działa niemal natychmiast na wejściu testowym, aw mniej niż kwadrans (na moim nowym, ale gotowym komputerze) na wejściach 100-cyfrowych.1 Letting
a
początek w domyślnej wartości 1 zamiast 0 zapisuje dwa bajty; powoduje, że wyjście {0,0} jest pomijane, gdy wejście ma wartość 2, ale w takim przypadku znajduje wyjście {2,1}, co jest wystarczająco dobre.źródło
If[Abs[2^a-#]==2^b,Print@{a,b}]
Można go również zastąpić,Abs[2^a-#]==2^b&&Print@{a,b}
aby zaoszczędzić 3 bajty.)MATL ,
2322 bajtówWypróbuj online! Lub sprawdź wszystkie przypadki testowe .
Wyjaśnienie
źródło
Perl 6 , 41 bajtów
(Algorytm bezwstydnie skopiowany z odpowiedzi Perla 5 )
Wyjaśnienie:
Stosowanie:
źródło
PHP, 73 bajty
Mogłem skopiować rozwiązanie Pyhton 2 Jonathana dla 54 bajtów (+13 narzutu),
ale chciałem wymyślić coś innego.
zapisz do pliku, a następnie uruchom za pomocą
php
lubphp-cgi
.drukuje
a
ib
oddzielone znakiem podkreślenia, wszystko bez rozwiązania.charakterystyczne rozwiązanie, 96 bajtów
odbitki
a
ib
oddzielone znakiem podkreślenia; jedyny znak podkreślający brak rozwiązania.Mówi nawet o operacji dla 11 kolejnych bajtów:
wystarczy wymienić pierwszy znak podkreślenia w kodzie na
'-+'[!$m[2]]
.źródło
PHP, 117 bajtów
Rozszerzona wersja 4 walizki
krótka wersja połączenia Case 1 i 3 i robi różnicę w stosunku do Case 3, aw obu wersjach Case 4 nie daje wyników.
źródło