Użycie modułu w celu uproszczenia wprowadzania
To może być zbyt prosta wskazówka, więc jeśli tak, po prostu ją zastąpię lub usunę.
Powiedzmy, że chcesz wprowadzić dwa znaki „a” i „b” i zwrócić odpowiednio 1 i 2 dla każdego. Prawdopodobnie użyłbyś do tego warunkowych, ponieważ jest to najbardziej sensowne, a ja użyję bardziej skondensowanej formy dla tego konkretnego przykładu.
i:"a")+1+n
To sprawdza, czy dane wejściowe są większe niż „a” i dodaje 1. Ponieważ „a” zwróci 0 i „b” 1, da to 1 i 2. To całkiem nieźle się sprawdza, ale w przypadku naszego nakłady, możemy pójść jeszcze dalej.
i:3%n
W modzie 3, 97, który jest liczbowym odpowiednikiem „a”, staje się 1, a 98, który jest „b”, staje się 2. W przypadku dwóch różnych liczb gwarantowany jest mod, który daje unikalne wyniki dla obu. Dla więcej niż dwóch istnieje mod, który daje unikalne wyniki, ale nie mam umiejętności matematycznych, aby znaleźć najmniejszą w prosty sposób (np. Jeśli masz zestaw {100,101,102,103}, mod 104 dałby unikalne wyniki dla każda wartość w nim, ale niezbyt pomocna). Jednak w większości przypadków, gdy dane wejściowe są ograniczone do kilku znaków alfabetycznych, często można znaleźć mod, który działa.
Aby znaleźć najmniejszy moduł, który daje unikalne wyniki dla dwóch liczb, a i b, wykonaj następujące czynności. Weź wartość bezwzględną różnicy aib ( |a - b|
) i znajdź najmniejszą liczbę n, która jej nie dzieli. np. dla 97 i 98, |98 - 97| = 1
i tak 2 byłoby najmniejszym modem (ale dla naszego programu testowego daje to 1 dla 97 i 0 dla 98, więc mod 3 jest lepszy).