Można powiedzieć, że funkcja (lub program), która pobiera dane wejściowe i dostarcza dane wyjściowe, ma cykl, jeśli wielokrotne wywoływanie funkcji na swoim wyjściu ostatecznie osiągnie pierwotny numer. Na przykład weź następującą funkcję:
Input: n 1 2 3 4 5 6
Output: f(n) 5 7 1 3 4 9
Jeśli zaczniemy n=1
, f(n)=5
, f(f(n))=f(5)=4
, f(f(f(n)))=f(4)=3
, f(f(f(f(n))))=f(3)=1
.
To jest napisane (1 5 4 3)
. Ponieważ w tej pętli znajdują się 4 unikalne liczby, jest to cykl o długości 4.
Twoim zadaniem jest napisanie programu lub funkcji, która ma cykle o każdej możliwej długości. Oznacza to, że musi istnieć cykl o długości 1, o długości 2 i tak dalej.
Ponadto, twoja funkcja / program musi być od dodatnich liczb całkowitych do dodatnich liczb całkowitych i musi być bijectywny , co oznacza, że musi być dokładnie jedna wartość wejściowa dla każdej możliwej wartości wyjściowej, ponad wszystkimi liczbami całkowitymi dodatnimi. Innymi słowy, funkcja / program musi obliczyć permutację dodatnich liczb całkowitych.
Szczegóły: Dowolny standardowy system wejścia / wyjścia jest dozwolony, w tym STDIN, STDOUT, argument funkcji, return itp. Zabronione są standardowe luki.
Nie musisz martwić się o ograniczenia swoich typów danych - powyższe właściwości muszą posiadać tylko przy założeniu, że int
albo float
może posiadać dowolną wartość, na przykład.
Nie ma ograniczeń w zachowaniu funkcji na wejściach, które nie są dodatnimi liczbami całkowitymi, a te wejścia / wyjścia zostaną zignorowane.
Punktacja to golf w bajtach, wygrywa najkrótszy kod.
źródło
Odpowiedzi:
Pyth,
118 bajtówO wiele bardziej nudne niż moja poprzednia odpowiedź.
Każda liczba zawierająca 0 cyfr jest odwzorowywana na siebie. Każdy inny numer odwzorowuje na liczbę, której cyfry są obrócone o 1. Więc na przykład:
źródło
Python 2,
565554 bajtówOto pierwsze 21 wyników:
Wzór jest oczywisty, jeśli podzielimy listę na mniejsze części:
źródło
Pyth, 25 bajtów
Jest to taka sama sekwencja jak @ Sp3000, ale z zamkniętą formą. Formularz zamknięty to:
źródło
Python3, 40 bajtów
Każda liczba zawierająca 0 cyfr jest odwzorowywana na siebie. Każdy inny numer odwzorowuje na liczbę, której cyfry są obrócone o 1. Więc na przykład:
źródło
Rubin, 22 + 1 = 23
Z flagą wiersza polecenia
-p
uruchomPodany jako wejście ciąg znaków reprezentujący liczbę (bez końca nowej linii), utrzymuje pierwszą cyfrę na stałym poziomie, a następnie obraca resztę w lewo, a więc
1234
staje się1342
.Można go zmniejszyć do 21 znaków za pomocą
$_=$1+$'+$2if/(.)(.)/
, ale drukuje ostrzeżenie.źródło
Rubin, 16 + 1 = 17
Z flagą wiersza polecenia
-p
uruchomJest to bardziej skomplikowana funkcja niż moja inna odpowiedź, ale zdarza się, że jest bardziej golfowa (i tolerancyjna dla nowych linii). Pobiera ostatnią niezerową cyfrę wejścia plus wszelkie zera końcowe i przenosi ją na początek liczby. Tak się
9010300
staje3009010
. Dowolna liczba z n niezerowymi cyframi będzie częścią cyklu o długości n.Wejście to ciąg znaków w dowolnej bazie poprzez STDIN, wyjście to ciąg znaków w tej bazie.
źródło
Python, 43
Odwrotnością funkcji SP3000 jest realizowany rekurencyjnie.
Funkcja jest jednym cyklem, po którym następuje dwa cykle, po których następuje trzy cykl, ...
Operacja
n%k+1
działa jakk
-cykl na liczbach1..k
. Aby znaleźć odpowiednik
sposób użycia, przesuń wszystko w dół ok=1
, następniek=2
itdn<=k
. Aż do .źródło
Pyth, 15 bajtów
Najkrótsza jak dotąd odpowiedź, która wykorzystuje operacje numeryczne zamiast operacji na łańcuchach.
Wpływ tej funkcji na reprezentację binarną polega na przedłużeniu bloku z prawej strony 1s do następnego 0; lub jeśli nie ma 0, aby zresetować go do jednego 1:
Pyth, 26 bajtów, zabawny wariant
Wykonuje powyższą operację jednocześnie dla wszystkich bloków 1s, nie tylko skrajnie po prawej stronie - nadal używając tylko operacji bitowych i arytmetycznych.
źródło
Swift 1.2, 66 bajtów
źródło
Brachylog , 5 bajtów
Wypróbuj online!
Port odpowiedzi Pyth @ orlp. Wychodzi prosto i schludnie:
Początkowo chciałem przenieść rozwiązanie @ Sp3000 do języka Python, ale zajęło to aż 23 bajty :
Wypróbuj online!
źródło
JavaScript (ES6), 43 bajty
źródło
Matlab (189)
Funkcja:
Odwzorowuje dowolną liczbę całkowitą według jej liczb pierwszych, jeśli liczba jest równa zero lub jest podzielona na 2 lub 1, liczba jest odwzorowywana na siebie, w przeciwnym razie wybieramy największy czynnik pierwszy z tej liczby, a następnie zwiększamy pozostałe różne czynniki pierwsze o najbliższą wartość większy współczynnik pierwszy, aż osiągniemy liczbę,
biggest_prime^n
któran
jest sumą wszystkich wykładników wszystkich czynników, po osiągnięciu tej liczby, zwracamy sięmax_prime*2^(n-1)
i odtwarzamy ten sam cykl ponownie.źródło
Matlab (137)
2
dopóki nie natkniemy się na wykładnik,2
którego można podzielić przez sumę wykładników innych czynników pierwszych. następnie przechodzimy do początku cyklu dzieląc przez2^(sum of exponents of other primes)
. pozostałe liczby są zmapowane do siebie.źródło