Bawiłem się kilkoma liczbami i znalazłem sekwencję, która oczywiście znajduje się w OEIS. Jest to A005823 : Liczby, których rozszerzenie potrójne nie zawiera 1 . To idzie:
a (2n) = 3 * a (n) +2
a (2n + 1) = 3 * a (n + 1)
a (1) = 0
a = 0,2,6,8,18,20,24,26,54 ....
Napisałem program CJam, który generuje pierwszą n tych liczb, konwertując indeks na binarny, zamieniając jedynki na 2 i konwertując z trójskładnikowej na dziesiętną.
Zauważyłem również, że dowolną liczbę parzystą można uzyskać, biorąc sumę dwóch liczb w sekwencji (czasami liczbę samą w sobie).
Wyzwanie:
Biorąc pod uwagę dowolną nieujemną liczbę parzystą jako dane wejściowe, wypisz wskaźniki dwóch liczb w sekwencji, które ją sumują. (Należy pamiętać, że czasami możliwe jest użycie wielu par.)
Zasady:
- Określ, czy korzystasz z indeksowania 0 czy 1.
- Jeśli wyprowadzasz wynik jako ciąg, umieść separator między dwoma indeksami.
- Możesz wyprowadzać dane jako liczbę zespoloną.
- Jeśli chcesz, możesz wypisać każdą prawidłową parę.
- Code Golf: wygrywa najkrótsza odpowiedź
Przypadki testowe
Używam indeksowania 0. Tutaj wymienię wszystkie możliwe dane wyjściowe dla każdego wejścia, ale wystarczy tylko jedno.
0: [0 0] 2: [1 0] 4: [1 1] 6: [2 0] 8: [2 1] [3 0] 10: [3 1] 12: [2 2] 14: [3 2] 16: [3 3] 18: [4 0] 30: [6 2] 32: [6 3] [7 2] 46: [7 5] 50: [7 6] 120: [10 10] 338: [19 18] 428: [30 23] [31 22] 712: [33 27] [35 25] [41 19] [43 17] [49 11] [51 9] [57 3] [59 1] 1016: [38 37] [39 36]Dzięki @Luis Mendo za pomoc dotyczącą przypadków testowych.
Powiązane: Czy jest w zestawie Cantor?
źródło
Odpowiedzi:
Łuska ,
211413 bajtów-7 bajtów, dzięki odpowiedzi JS @ Neila
-1 bajt zainspirowany odpowiedzią betaveros Parradoc
Wykorzystuje indeksowanie 0
Wypróbuj online!
Wyjaśnienie
Poprzednie 21 bajtowe rozwiązanie
Pierwszy raz widziałem zastosowanie
»
.Wypróbuj online!
Dłużej, ponieważ miałem do czynienia z niesie
źródło
JavaScript (ES6),
7571 bajtówObjaśnienie: Dzielenie danych wejściowych i elementów A005823 przez 2 nie zmienia problemu, jednak upraszcza to rozwiązanie, ponieważ reprezentacje trójskładnikowe używają teraz tylko zer i jedynek, a zatem nie ma potrzeby rozważania przeniesienia. Zapisuje również krok podczas konwersji z elementu na jego indeks (trójskładnik każdego elementu jest dwa razy dwójkowy jego indeksu). Przykłady:
źródło
Galaretka ,
26, 22, 21 bajtówWypróbuj online!
Jeden bajt zapisany dzięki @JonathanAllan!
Wyjaśnienie:
źródło
Œc
. I tak, Dennis wyjaśniłS=¥
mi problem .Python 2 , 51 bajtów
Wypróbuj online!
Zadanie można wykonać w następujący sposób:
Możemy dokonać podziału na (3), konwertując
0->0,1->1,2->1
dla jednej listy i0->0,1->0,2->1
dla drugiej. Oznacza to, że poprzez sprawdzenie, czy wartość przekracza próg 0 lub 1.Dwie wartości można znaleźć za pomocą odpowiednich funkcji rekurencyjnych:
Ta funkcja
f
łączy oba te elementy ze zrozumieniem listy. To czyni go nieefektywnym z powodu wykładniczego rozgałęzienia.Jeśli można by uzyskać liczby zespolone, moglibyśmy zapisać 10 bajtów za pomocą:
źródło
J,
3532 bajtówWypróbuj online!
Indeksowane 0, a dane wejściowe podawane są monadycznie. Zwraca wszystkie możliwe sumowania do wartości (traktuje
a b
ib a
jako różne możliwe sumowania).Przekształcenie matrycy boolowskiej w indeksy wymaga dużo kodu ...
Chciałbym również usunąć widelec po lewej stronie, więc nie muszę używać tylu nawiasów i
@
-at, ale nie mogę znaleźć dobrego sposobu na zrobienie tego (moje alternatywne podejście nie oszczędza żadnych bajtów ).Wyjaśnienie
W celu wyjaśnienia i zakazu gry weź pod uwagę następujące elementy głównej funkcji
valid_nums daje macierz boolowską, w której indeksy są indeksami zsumowanych wartości sekwencji. Jeśli istnieje jeden przy tych indeksach, oznacza to, że dwie liczby sumują się do wartości wejściowej.
indices_of_ones to idiom J, który podaje współrzędne tych w macierzy boolowskiej o dowolnej randze
Główna funkcja składa się po prostu jako
ważne liczby
indices_of_ones
,
-ravel działa w tym przypadku, łącząc każdy wiersz do następnego.Widzimy, że gdyby była to matryca boolowska, współrzędne jednych można znaleźć, interpretując wskaźniki matrycy zniszczonej jako liczby w podstawie kształtu tej macierzy, używając jak największej liczby wyrażeń przyimkowych, aby pomieszać biednego czytelnika .
źródło
MATL ,
22211917 bajtówWyjście jest oparte na 1. Program tworzy wszystkie pary rozwiązań. Wypróbuj online! Lub sprawdź wszystkie przypadki testowe .
Wyjaśnienie
źródło
Pyt , 37 bajtów
0-indeksowane
Na pewno nie grał w golfa tak dobrze, jak mógłby być.
Wypróbuj online!
źródło
hfqQ+@Jmi:.Bd\1\23QeT@JhTsmm,dkUQU
. Z całą pewnością możnahfqQ+@Jmi:.Bd\1\23QeT@JhTsmm,dkUQ
Pyth , 29 bajtów
Ten zwraca wszystkie możliwe pary indeksów.
Wypróbuj tutaj.
Pyth , 30 bajtów
Wypróbuj tutaj.
Zwraca to pary indeksów jako
[LowerIndex, HigherIndex]
.Jak to działa?
źródło
Paradoc (v0.2.10), 11 bajtów (CP-1252)
Wypróbuj online!
Algorytmicznie przypomina bardzo odpowiedź Neila ES6 . Na niższym poziomie, również uderzająco podobny do odpowiedzi Łuska H.PWiza . Cieszę się, że musimy wykorzystać wszystkie trzy przeciążenia
B
.Bierze liczbę całkowitą na stosie, pozostawia listę dwóch liczb całkowitych na stosie.
Wyjaśnienie:
źródło
Python 3 ,
122120 bajtów-2 bajty dzięki Mr. Xcoder!
0-indeksowane
Nie golfowany:
Wypróbuj online!
źródło
Mathematica, 94 bajty
1-indeksowany
źródło
JavaScript,
120101 bajtówWypróbuj online!
0-indeksowane.
Zwraca parę indeksów, w których jeden indeks jest najmniejszy z możliwych (na przykład w przypadku
428
zwrotu22,31
).źródło
Brain-Flak ,
220166 bajtów-54 bajty, patrząc na funkcję modulo na wiki, pozwalając na pewne zmiany strukturalne
Wypróbuj online!
0-indeksowane.
Wyjaśnienie
Podobnie jak wiele innych rozwiązań, oblicza to trójskładnikową ekspansję
n/2
i konwertuje ją na dwie liczby binarne.Krok 1: Podziel dane wejściowe przez 2
Krok 2: oblicz trójskładnikową ekspansję
Krok 3: Konwertuj na rozwiązanie
źródło
JavaScript (ES6), 70
72bajtów(Indeksowane 0 i najwyraźniej prawie takie samo rozwiązanie jak @Neil, nawet jeśli nie widziałem jego odpowiedzi)
I rozpoczął się z coraz tyłu indeksu z szeregu za pomocą odwrotnego procesu: stringify z podstawy 3, należy wymienić każdy
2
z1
, analizować z podstawą 2.Aby uzyskać dwie liczby, i to na każdą parzystą, mamy tylko połowę danych wejściowych - ale teraz
1
mogą wystąpić również cyfry. Zastępujemy go liczbą0
w jednym i2
drugą liczbą, co nie zmienia sumy dwóch przed krokiem zamiany i parsowania. Oto, co wymyśliłem (wykonując dwie zamiany,1
-> 0-lub-2 i2
->1
w jednym kroku):Oczywiście dwie zastępcze mapy (ciągi znaków) różnią się tylko jednym indeksem, więc powinniśmy być w stanie skrócić literał tablicy tylko poprzez zamianę
1
i2
zd == 2 ? 1 : x
. Lubd-1 || x
. Gdzie-1
to samo, co dwa jednoargumentowe operatory - ale wyglądają bardziej przerażająco :-)Próba uniknięcia literału tablicowego i nawiasu wokół niego
n/2
mnieale nie okazało się to owocne.
źródło
["001","011"]
wersji (no cóż, moje zmienne nazwy były różne).replace(/./g,d=>d>>1|x)
oszczędza 2 bajty.d="0"
ix=1
- cyfra powinna pozostać0
Pyth, 22 bajty
Wypróbuj online: demonstracja
Wyjaśnienie:
źródło