Numery powiernicze
Niech x
będzie liczbą całkowitą dowolnej podstawy, taką D
jak tablica jego cyfr. x
jest liczbą powierniczą, jeżeli dla wszystkich n
między 1
i na długości D
:
D[n+1] = D[n] + D[n-1] + ... + D[1] + n
Weźmy na przykład liczbę 349
z podstawy 10. Jeśli oznaczymy wskaźniki dla tego numeru, mamy następujące.
Index Digit
----- -----
1 3
2 4
3 9
Począwszy od pierwszej cyfry, mamy 1 + 3 = 4
, co daje następną cyfrę. Następnie z drugą cyfrą mamy 3 + 4 + 2 = 9
, co znowu daje następną cyfrę. Tak więc liczba ta jest liczbą zaufaną.
Biorąc pod uwagę liczbę całkowitą o podstawie między 1 a 62, oblicz wszystkie liczby ufające dla tej podstawy i wyślij ich listę, oddzieloną znakami nowej linii. Możesz założyć, że dla danej bazy istnieje skończona liczba liczb powierniczych.
Dla cyfr większych niż 9 użyj znaków alfanumerycznych A-Z
, a dla cyfr większych niż Z
użyj znaków alfanumerycznych a-z
. Nie musisz się martwić o cyfry poza nimi z
.
Nie muszą być wyprowadzane w określonej kolejności.
Przykładowe dane wejściowe:
16
Przykładowe dane wyjściowe:
0
1
2
3
4
5
6
7
8
9
A
B
C
D
E
F
12
23
34
45
56
67
78
89
9A
AB
BC
CD
DE
EF
125
237
349
45B
56D
67F
125B
237F
To jest kod golfowy, więc wygrywa najkrótszy kod. Powodzenia!
(Dzięki Zach za pomoc w formatowaniu i wskazanie kilku problemów.)
CD
nie ma go na liście? Ponieważ wymienione są wszystkie inne kombinacje, w których druga cyfra jest o jedną więcej niż pierwsza cyfra, nie rozumiem, dlaczegoCD
się nie kwalifikuje.Odpowiedzi:
Pyth, 38 bajtów
Wypróbuj online: demonstracja
Wyjaśnienie:
źródło
Python 2, 104 bajty
Wykorzystuje następujące spostrzeżenie: w wielu powiernikiem, cyfra
i
następuje2*i+1
, z wyjątkiem, że toi+1
zamiast do drugiej cyfry. Próbując wszystkich możliwych pierwszych cyfr i dodając więcej cyfr, aż staną się zbyt duże, możemy wygenerować wszystkie liczby ufające.Obliczamy znak odpowiadający liczbie
i
jakochr(48+i+(i>9)*7+i/36*6)
, która przesuwa go do liczby, wielkiej lub wielkiej litery dla przedziałów0-9, 10-35, 36-61
.Następnie zwiększamy
i
zai+=i+1
pomocą dwóch korekt. Aby uczynić to zamiasti+=1
po pierwszej cyfrze, dodajemyi
waruneks
posiadania więcej niż1
znaków. Musimy również unikać drukowania liczb rozpoczynających się od 0, jednocześnie pozwalając0
. Aby to zrobić, wykonujemy hack, który powodujei=0
błąd warunkui<n
w następnej pętli poprzez dodanien
do niego. Odbywa się to poprzez zastąpienie1
zn**0**i
, co prawym Associatesn**(0**i)
, która jest równan**(i==0)
lubn if i==0 else 1
.źródło
Python 3,
201200 bajtówWyjaśnienie
Kluczowym wglądem tutaj jest to, że biorąc pod uwagę sekwencję
x
(np. Powiedzmy[1,2,5]
), możesz uzyskać następny termin w sekwencji zsum(x)+len(x)
, co daje11
w tym przypadku (B
). Sprawdź, czy jest to mniej niżn
, a jeśli tak, dodaj rozszerzoną sekwencję do listy wszystkich takich sekwencji (zaszczepionych wszystkimi pojedynczymi cyframi).W ten sposób mapuję elementy sekwencji na postacie. Są one
''.join
edytowane razem, a następnie drukowane, oddzielane znakami nowej linii.źródło
print('\n'.join(''.join(map(lambda x:[str(x),chr(x+55),chr(x+61)][(x>9)+(x>35)],x))for x in X))
. Ponadto obecnie jest to 201 bajtów; nie 200.GS2, 44 bajty
Tworzy liczby w innej kolejności, ale opis problemu nie określa, więc idę po to! Oto wynik dla wejścia 16.
Oto mnemoniczne odpowiedniki bajtów:
źródło
CJam,
464240 bajtówWypróbuj online w interpretatorze CJam .
Jak to działa
Na końcu 0 i kilka pustych tablic pozostaje na stosie, więc interpreter drukuje
0
.źródło
gawk, 111 bajtów
Dla każdej cyfry początkowej od
1
dobase-1
niej obliczane są kolejne cyfry, a chociaż są one niższe niż podstawa, nadal mamy liczbę powierniczą. Obliczanie następnej cyfry podczas drukowania. Wreszcie drukuje0
.źródło