Wyzwanie:
Rozważ funkcję, F(N) = 2^N + 1
gdzie N
dodatnia liczba całkowita jest mniejsza niż 31
. Sekwencja zdefiniowana przez tę funkcję to:
3, 5, 9, 17, 33, 65, 129, 257, 513, 1025, 2049, 4097, 8193, 16385, 32769, 65537, 131073, 262145, 524289, 1048577, 2097153, 4194305, 8388609, 16777217, 33554433, 67108865, 134217729, 268435457, 536870913, 1073741825
Dane wejściowe zostaną wygenerowane w następujący sposób:
- Weź 5 ciągłych liczb całkowitych z powyższej sekwencji.
- Zastąp jedną z nich inną, dodatnią liczbą całkowitą (która może, ale nie musi, być częścią powyższej sekwencji).
- Opcjonalnie zmień kolejność 5 wynikowych liczb.
Biorąc pod uwagę taką listę 5 liczb całkowitych, znajdź tę, która została zamieniona i dlatego nie jest częścią oryginalnych 5 ciągłych liczb całkowitych.
Przykład:
- Oryginalny podlistę:
5, 9, 17, 33, 65
. - Wymienić jeden:
5, 7, 17, 33, 65
. - Zmiana kolejności:
33, 17, 5, 7, 65
.
Oczekiwany wynik to 7
.
5 wartości na wejściu będzie zawsze wyraźnych i zawsze będzie istniało unikalne rozwiązanie. (Na przykład, nie mają do czynienia z wejściami jak 3, 9, 17, 33, 129
gdzie albo 3
czy 129
może zostały zamienione w.)
Przypadki testowe:
5,9,17,33,829
o/p: 829
9,5,17,829,33
o/p: 829
33, 17, 5, 7, 65
o/p: 7
5,9,177,33,65
o/p: 177
65,129,259,513,1025
o/p: 259
129,259,513,1025,65
o/p: 259
63,129,257,513,1025
o/p: 63
65,129,257,513,4097
o/p: 4097
5, 9, 2, 17, 33
o/p: 2
536870913, 67108865, 1073741825, 1, 268435457
o/p: 1
536870913,67108865,134217729,1,268435457
N = 30
jedną z wartości wejściowych.Odpowiedzi:
Galaretka, 15 bajtów
TryItOnline
Wszystkie przypadki testowe również w TryItOnline
Zwraca listę zawierającą jedną listę zawierającą nieparzystą.
W jaki sposób?
źródło
JavaScript (ES6), 62 bajty
Całkowicie nowy algorytm, ponieważ, jak wskazał @ edc65, poprzedni został uszkodzony. Objaśnienie: Najpierw zajmujemy się łatwym przypadkiem, szukając 2 lub liczby, która nie jest o jeden większa od potęgi 2. Jeśli nie znaleziono żadnej, to są dwa możliwe przypadki, w zależności od tego, czy dodatkowa wartość była poniżej czy powyżej oryginalny przebieg pięciu, więc sprawdzamy, czy najmniejsza i druga największa wartość należy do tego samego przebiegu pięciu, a jeśli tak, to winimy największą wartość, w przeciwnym razie najmniejszą wartość.
źródło
n-1&n-2
z wartością2
[3, 17, 33, 65, 257]
.--n&--n|!n
dobrze wygląda2
sprawa?Python, 84 bajty
Wszystkie przypadki testowe są w ideone
Dla poprawnych danych wejściowych zwraca zestaw zawierający tylko nieparzyste.
W przypadku nieprawidłowego wprowadzenia zostanie osiągnięty limit rekurencji i zostanie zgłoszony błąd.
źródło
Mathematica, 65 bajtów
Definiuje funkcję,
f
która powinna zostać wywołana z 5 argumentami, npZasadniczo funkcję można wywołać z dowolną (niezerową) liczbą argumentów, ale możesz uzyskać nieoczekiwane wyniki ...
Myślę, że po raz pierwszy udało mi się postawić całe rozwiązanie nietrywialnego wyzwania po lewej stronie
=
.Wyjaśnienie
To rozwiązanie naprawdę działa dla nas w zakresie możliwości dopasowywania wzorców Mathematica. Podstawową funkcją, której używamy, jest to, że Mathematica nie może po prostu zdefiniować prostych funkcji, takich jak,
f[x_] := (* some expression in x *)
ale możemy użyć dowolnie złożonych wzorców po lewej stronie, np.f[{a_, b_}, x_?OddQ] := ...
Dodałby definicję,f
która jest używana tylko wtedy, gdy jest wywoływana za pomocą dwuelementu lista i nieparzysta liczba całkowita. Dogodnie możemy już nadawać nazwy elementom dowolnie daleko w dół wyrażenia po lewej stronie (np. W ostatnim przykładzie moglibyśmy od razu odnieść się do dwóch elementów listy jakoa
ib
).Wzór, którego używamy w tym wyzwaniu jest
f[a___,x_,b___]
. Tua___
ib___
są sekwencje zero lub więcej argumentów ix
jest pojedynczym argumentem. Ponieważ po prawej stronie definicji jest po prostux
, potrzebujemy trochę magii, która zapewni, żex
zostanie użyta dla szukanego przez nas wejściaa___
ib___
są po prostu symbolami wieloznacznymi obejmującymi pozostałe elementy.Odbywa się to poprzez dołączenie warunku do wzorca za pomocą
/;
. Prawa strona/;
(wszystko do=
) musi wrócić,True
aby ten wzór pasował. Piękno polega na tym, że dopasowujący wzór Mathematica spróbuje każdego zadaniaa
,x
ib
aby wejść do nas, więc poszukiwanie właściwego elementu odbywa się za nami. Jest to zasadniczo deklaratywne rozwiązanie problemu.Jeśli chodzi o sam warunek:
Zauważ, że to wcale nie zależy
x
. Zamiast tego warunek ten zależy tylko od pozostałych czterech elementów. Jest to kolejna wygodna funkcja rozwiązania dopasowywania wzorców: ze względu na wzorce sekwencjia
ib
razem zawierają wszystkie inne dane wejściowe.Zatem ten warunek musi sprawdzić, czy pozostałe cztery elementy są ciągłymi elementami z naszej sekwencji z co najwyżej jedną przerwą. Podstawowym pomysłem na sprawdzenie tego jest to, że generujemy kolejne cztery elementy z minimum (via ) i sprawdzamy, czy te cztery elementy są podzbiorem tego. Jedynymi danymi wejściowymi, które mogą powodować problemy, są te, które zawierają
xi+1 = 2xi - 1
2
, ponieważ generuje to również prawidłowe elementy sekwencji, więc musimy sobie z tym poradzić osobno.Ostatnia część: przejdźmy do samego wyrażenia, ponieważ jest tu trochę zabawniejszego cukru syntaktycznego.
Ta notacja infix jest skrótem od
Min[a,b]
. Pamiętajmy jednak, żea
ib
to sekwencje, więc to rzeczywiście rozwija się do czterech elementówMin[i1, i2, i3, i4]
i daje nam najmniejszy pozostały element w wejściu.Jeśli wynikiem jest 2, zamieniamy ją na 0 (co wygeneruje wartości, które nie są w sekwencji). Przestrzeń jest niezbędna, ponieważ w przeciwnym razie Mathematica analizuje literał pływaka
.2
.Do tej wartości 4 razy stosujemy nienazwaną funkcję i zbieramy wyniki na liście.
To po prostu zwielokrotnia jego wkład przez 2 i zmniejsza go.
Na koniec sprawdzamy, czy lista zawierająca wszystkie elementy z
a
ib
stanowi jej podzbiór.źródło
Rakieta 198 bajtów
Wersja bez golfa:
Testowanie:
Wynik:
źródło
05AB1E ,
3230262420 bajtówWyjaśnienie
Wypróbuj online!
źródło
R, 97 bajtów
Okazało się to trudniejsze niż myślałem. Jestem pewien, że można to znacznie pograć w golfa.
Nie golfił i wyjaśnił
match()
Funkcja powróciNA
, jeśli każdy element wektora wejściowego nie jest w sekwencji, a co za tym idzie możemy tylko znaleźć indeks, gdzieNA
istnieje w wejście i powrót w ten sposób:x[is.na(m)]
To staje się nieco bardziej skomplikowane, jeśli dane wejściowe są częścią sekwencji, ale są niewłaściwie umieszczone. Ponieważ dane wejściowe zostały posortowane, odległość między każdą parą wskaźników powinna wynosić
1
. Możemy zatem znaleźć źle umieszczony element, badając1st
różnicę dopasowanych indeksówl=diff(m)
i wybierając indeks, dla któregol>1
. To by wystarczyło, gdyby nie fakt, że tak jestl
zawiera4
elementy, a nie5
. Jest to problem tylko wtedy, gdy ostatni element w posortowanym wejściu jest elementem sekwencji, ALE nie jest częścią podsekwencji (jak w ostatecznym przypadku testowym). W konsekwencji, jeśli4th
element>1
pobierze5th
wpis w posortowanym wejściu, poszukaj indeksu w4
wektorze -length:x[ifelse(l[4]>1,5,l>1)]
źródło
anyNA
która jest równoważnaany(is.na(x))
Haskell,
6664 bajtówPrzykład użycia:
g [65,129,257,513,4097]
->4097
.Pętle przez wszystkie ciągłe podlisty o długości 5 z
F(N)
, zachowują elementy, których nie ma na liście danych wejściowych,x
a wzorzec odpowiada elementom o długości 1 (->[s]
).Edycja: @xnor zapisał dwa bajty, usuwając górną granicę zewnętrznej pętli. Ponieważ istnieje gwarancja, że istnieje rozwiązanie, lenistwo Haskella zatrzymuje się na pierwszym znalezionym numerze.
źródło
Perl,
6459 bajtówObejmuje +2 za
-an
Podaj listę danych wejściowych w STDIN:
oddout.pl
:Jeśli nie przeszkadza ci zmienna ilość miejsca wokół wyniku, 58-bajtowy verson działa:
Obie wersje zapętlają się na zawsze, jeśli dane wejściowe nie mają rozwiązania.
To bardzo chory kod, ale nie mogę wymyślić nic eleganckiego ...
Sposób, w jaki używam (ab)
%a
to nowa sztuczka perlgolfa, o ile mi wiadomo.źródło
Python 2, 73 bajty
Iteruje przez zestawy
d
pięciu kolejnych elementów sekwencji, aż znajdzie taki, który zawiera wszystkie oprócz jednego elementu wejściowego, a następnie wypisuje różnicę, która jest wynikiem w zestawie singletonów.Zestawy
d
pięciu kolejnych elementów są budowane z niczego przez wielokrotne dodawanie nowego elementui+1
i usuwanie każdego starego elementu,i/32+1
który pojawia się przed bieżącym oknem 5. Oto, jak wygląda jego postęp.Na początku od inicjalizacji występuje zbłąkany 1, ale jest nieszkodliwy, ponieważ jest natychmiast usuwany. Mniejsze zestawy składające się z 5 elementów są również nieszkodliwe.
źródło
PHP,
877675 bajtówBiegnij z
php -r '<code>' <value1> <value2> <value3> <value4> <value5>
źródło
array_diff
. Ale mogę tam zapisać jeden bajt.end
zamiastmax
i twoja notatka nie jest już ważniejszaC #, 69 bajtów
int M(int[]a)=>a.Except(new int[30].Select((_,i)=>(1<<i+1)+1)).Sum();
źródło
Java 7,85 bajtów
Nie golfił
źródło
l
31? W pytaniu widzę tylko tablicę int jako dane wejściowe, ale nie dodatkową int? : SPHP, 76 bajtów
zaimplementowano pomysł Titusa w modzie 5
126 bajtów wcześniej
źródło
array_map(function($z){return 2**$z+1;},range($i,$i+4))
.$x[key($x)]
->end($x)
1-count($x=...)
tego warunku pozwoli ci pozbyć się przerwy:for(;1-count($x=...););echo end($x);
(-13)Pyth, 18 bajtów
Utwórz sekwencję, weź podlisty o długości 5, usuń każdą podlistę z Q, weź najkrótszy wynik, wyprowadzaj jej jedyny element.
źródło
[5, 9, 2, 17, 33]
Kotlin, 55 bajtów
fun f(a:IntArray)=a.find{it-1 !in(1..30).map{1 shl it}}
źródło