Zainspirowany przez generowanie przyjaznych dla klawiatury numerów .
tło
Wiele klawiszy numerycznych ma następujący układ:
789
456
123
0
Definiujemy sąsiedztwo liczby jako zbiór komórek prostopadle do niego przylegających na pokazanym numpad, w tym także on sam. Na przykład sąsiedztwo 2 to, a sąsiedztwo {1,5,3,0,2}
0 to {1,2,0}
. Poniżej znajduje się lista sąsiedztwa każdego numeru, powyżej przypadków testowych.
Definiujemy przyjazną liczbę na klawiaturze numerycznej jako dodatnią liczbę całkowitą, gdzie zapisana dziesiętnie bez zer wiodących, każda cyfra oprócz pierwszej znajduje się w sąsiedztwie poprzedniej cyfry.
Na przykład,
- 7856 jest liczbą przyjazną dla klawiatury numerycznej, ponieważ 8 jest w sąsiedztwie 7, 5 jest w sąsiedztwie 8, a 6 w sąsiedztwie 5.
- 1201 jest liczbą przyjazną dla klawiatury numerycznej, ponieważ 2 jest w sąsiedztwie 1, 0 jest w sąsiedztwie 2, a 1 jest w sąsiedztwie 0.
- 82 nie jest jest liczbą przyjazną dla klawiatury numerycznej, ponieważ 2 nie znajduje się w pobliżu 8.
- 802 nie jest liczbą przyjazną dla klawiatury numerycznej, ponieważ 0 nie znajduje się w pobliżu 8 (dzielnice się nie zawijają).
Powiązana sekwencja OEIS . Zauważ, że ta powiązana sekwencja jest odrębna, ponieważ liczy się 0jako sąsiadująca z 7zamiast 1i 2.
Wyzwanie
Biorąc pod uwagę dodatnią liczbę całkowitą n
, zwróć n
-ty lub pierwszy n
przyjazny numerom numerycznym, gdzie pierwszy to 1. Możesz użyć indeksowania opartego na 0, gdzie 0-ty przyjazny numeryczny numer to 1.
Okolice
Okolice każdej cyfry są wymienione tutaj:
0:{0,1,2}
1:{0,1,2,4}
2:{0,1,2,3,5}
3:{2,3,6}
4:{1,4,5,7}
5:{2,4,5,6,8}
6:{3,5,6,9}
7:{4,7,8}
8:{5,7,8,9}
9:{6,8,9}
Przypadki testowe / sekwencja
To jest pierwsze 100 warunków
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 14, 20, 21, 22, 23, 25, 32, 33, 36, 41, 44, 45, 47, 52, 54, 55, 56, 58, 63, 65, 66, 69, 74, 77, 78, 85, 87, 88, 89, 96, 98, 99, 100, 101, 102, 110, 111, 112, 114, 120, 121, 122, 123, 125, 141, 144, 145, 147, 200, 201, 202, 210, 211, 212, 214, 220, 221, 222, 223, 225, 232, 233, 236, 252, 254, 255, 256, 258, 320, 321, 322, 323, 325, 332, 333, 336, 363, 365, 366, 369, 410, 411, 412, 414, 441, 444, 445, 447]
źródło
Odpowiedzi:
JavaScript (ES6),
104938988 bajtówZwraca N-ty ciąg sekwencji, indeksowany 1.
Próbny
Pokaż fragment kodu
źródło
k=(n,a=1)=>n?k(n-([...(x=a+[]).slice(0,-1)].reduce((a,c)=>a*!!~"012 0124 01235 236 1457 24568 3569 478 5789 689".split` `[c].indexOf(x[i++]),i=1)),a+1):a-1
może 151, może coś tam pomaga, mój test jest prawdopodobnie zbyt długiPerl 5 , 123 + 1 (-p) = 124 bajty
Wypróbuj online!
źródło
Galaretka ,
2724 bajtówZwraca N pierwsze warunki sekwencji.
Wypróbuj online!
To jest port mojej odpowiedzi JS .
źródło
05AB1E ,
2423 bajtyWypróbuj online!
Zwraca n-tą liczbę w sekwencji.
Objaśnienia:
Główną ideą jest to, że oprócz
0
klucza każda cyfra zmniejszona i przekonwertowana do bazy 3 ma następujące właściwości:Oczywiście potrzebujemy
if
instrukcji do obsługi0
klawisza numpad.źródło
MATL ,
2927 bajtówWysyła pierwsze
n
liczby przyjazne dla klawiatury numerycznej.Wypróbuj online!
Wyjaśnienie
Każda cyfra od
1
do9
jest kodowana jako liczba zespolona reprezentująca jej pozycję na klawiaturze numerycznej, z wykorzystaniem siatki kroku 2, gdzie część rzeczywista reprezentuje pozycję pionową, a część wyobrażona reprezentuje pozycję poziomą. Tak1
jest0+0j
,2
jest0+2j
,3
jest0+4j
,4
jest2+0j
, ...9
jest4+4j
.Cyfra
0
jest zakodowana jako0+1j
, tj. Tak jakby była umieszczona dokładnie pomiędzy1
i2
.Dla każdego numeru KN-przyjazny kandydujących, „dziesiętny” konwersja baza nanosi wyżej liczb zespolonych zamiast cyfr
0
,1
, ...,9
. Daje to tablicę, z której obliczane są bezwzględne kolejne różnice. Liczba kandydatów jest przyjazna dla klawiatury numerycznej wtedy i tylko wtedy, gdy wszystkie absolutne różnice są co najwyżej2
(tj. Krok siatki). W takim przypadku liczba pozostawia się na stosie.Kod wykorzystuje pętlę
do
...while
, która jest zamykana, gdy liczba liczb na stosie jest równa wartości wejściowejn
.Siatka jednostkowa byłaby bardziej naturalnym wyborem. Cyfry
1
,2
i0
będzie wtedy odpowiadać0+0j
,1+0j
a0.5+0j
respecrively. Ale golfistą jest użycie siatki kroku 2, ponieważ pomnożenie przez2
(funkcjaE
) i pchanie0+1j
(funkcjaJ
) jest o jeden bajt krótsze niż pchanie0+0.5j
(J2/
lub.5j
)źródło
Galaretka , 26 bajtów
Wypróbuj online!
-2 bajty dzięki cairdowi coinheringaahing
-2 bajty dzięki Erikowi Outgolfer
Wyjaśnienie
źródło
[]
za 2 bajtyPython 2 , 134 bajty
Wypróbuj online!
źródło
f
a następnie użyjesz go raz , możesz wstawić go i zapisać dwa bajty .Mathematica,
249234202 bajtyWypróbuj online!
dzięki użytkownik202729 za kompresję danych (-32 bajtów)
Moje wyniki:
źródło
IntegerDigits
:IntegerDigits/@{210,4210,53210,632,7541,86542,9653,874,9875,986}
i użyjFreeQ
,Tr
użyjDo
zamiastFor
, użyj notacji infiksowejAppendTo
i użyjDo
zamiastWhile
powtarzaćTr[1^s]
czasy, również wyeliminuj zmiennąp
. Nie udowodniłeś również, że algorytm jest poprawny, to znaczy, że wynikowa liczba jest zawsze mniejsza niż jej kwadrat podniesiony do kwadratu, co jest konieczne, aby odpowiedź była poprawna.PHP, 124 + 1 bajtów
Uruchom jako potok z
-nR
lub spróbuj online .źródło
Java 8,
192190 bajtówZwraca (indeksowaną 1)
n
liczbę w sekwencji.To było zaskakująco trudniejsze, niż myślałem… Prawdopodobnie po południu pierdnięcie w mózgu…
Wyjaśnienie:
Wypróbuj tutaj.
źródło