Wiele języków programowania zapewnia operatory do manipulowania cyframi binarnymi (base-2) liczb całkowitych. Oto jeden ze sposobów uogólnienia tych operatorów na inne bazy:
Niech x i y są numery jednocyfrowe w bazie pensjonatów . Zdefiniuj jednoargumentowy operatora ~
i operatorów binarnych &
, |
oraz ^
takie, które:
- ~ x = (B - 1) - x
- x i y = min (x, y)
- x | y = maks. (x, y)
- x ^ y = (x & ~ y) | (y & ~ x)
Zauważ, że jeśli B = 2, otrzymujemy znane bitowe operatory NOT, AND, OR i XOR.
Dla B = 10 otrzymujemy tabelę „dziesiętna XOR”:
^ │ 0 1 2 3 4 5 6 7 8 9
──┼────────────────────
0 │ 0 1 2 3 4 5 6 7 8 9
1 │ 1 1 2 3 4 5 6 7 8 8
2 │ 2 2 2 3 4 5 6 7 7 7
3 │ 3 3 3 3 4 5 6 6 6 6
4 │ 4 4 4 4 4 5 5 5 5 5
5 │ 5 5 5 5 5 4 4 4 4 4
6 │ 6 6 6 6 5 4 3 3 3 3
7 │ 7 7 7 6 5 4 3 2 2 2
8 │ 8 8 7 6 5 4 3 2 1 1
9 │ 9 8 7 6 5 4 3 2 1 0
W przypadku liczb wielocyfrowych zastosuj jednocyfrowego operatora cyfra po cyfrze. Na przykład 12345 ^ 24680 = 24655, ponieważ:
- 1 ^ 2 = 2
- 2 ^ 4 = 4
- 3 ^ 6 = 6
- 4 ^ 8 = 5
- 5 ^ 0 = 5
Jeśli operandy mają różne długości, wstaw krótszy z wiodącymi zerami.
Wyzwanie
Napisz, w jak najmniejszej liczbie bajtów, program lub funkcję, która przyjmuje jako dane wejściowe dwie liczby całkowite (których można założyć, że zawierają się w przedziale od 0 do 999 999 999 włącznie) i wypisuje „dziesiętną XOR” dwóch liczb, jak zdefiniowano powyżej.
Przypadki testowe
- 12345, 24680 → 24655
- 12345, 6789 → 16654
- 2019, 5779 → 5770
- 0, 999999999 → 999999999
- 0, 0 → 0
09
akceptowalny wynik dla wejścia90, 99
?A^B^B=A
a^b=b^a
ia^b^b=a
dla baz z nieparzystym dzielnikiem głównymOdpowiedzi:
Galaretka , 14 bajtów
Wypróbuj online!
Siatka wszystkich par jednocyfrowych
Monadyczny link przyjmujący jako argument listę dwóch liczb całkowitych i zwracający liczbę całkowitą.
Wyjaśnienie
Jeśli matryca cyfrowa jest akceptowalna we / wy:
Galaretka , 12 bajtów
Wypróbuj online!
źródło
Pyth , 31 bajtów
Wypróbuj online!
źródło
Python 2 , 71 bajtów
Wypróbuj online!
źródło
Naprzód (gforth) , 111 bajtów
Wypróbuj online!
Objaśnienie kodu
źródło
C # (interaktywny kompilator Visual C #) , 75 bajtów
Zaoszczędzono 6 bajtów dzięki @someone
Wypróbuj online!
źródło
Zip
, nie można go użyć, ponieważ automatycznie obcina dłuższą kolekcję do długości krótszejPHP ,
111109 bajtówWypróbuj online!
Testy: Wypróbuj online!
Jeśli nazywamy cyfry, chcemy XOR
$a
i$b
okazało się, że:$a
jest mniejsza niż 5,XOR = min(9-$a, max($a, $b))
$a
jest równy lub większy niż 5,XOR = min($a, max(9-$a, 9-$b))
Więc zaimplementowałem tę logikę plus hack do obsługi liczb o różnych długościach. Biorę każdą cyfrę od końca obu liczb wejściowych (z ujemnymi indeksami, takimi jak
input[-1]
,input[-2]
...) i obliczam XOR i umieszczam wynik w odwrotnej kolejności w ciągu, który ma zostać wydrukowany na końcu. Ponieważ biorę cyfry od końca liczb, wyniki XOR należy łączyć w odwrotnej kolejności. Gdy jedno z danych wejściowych jest dłuższe od drugiego, ujemny indeks przy krótszych danych wejściowych powoduje, że pusty ciąg znaków jest równy 0.źródło
Siatkówka ,
8559 bajtówWypróbuj online! Traktuje dane wejściowe jako osobne linie, ale link służy do testowania pakietu, który ponownie formatuje dane wejściowe oddzielone przecinkami. Wyjaśnienie:
Lewy pad z zerami obu linii do tej samej długości.
Posortuj każdą cyfrę według indeksu kolumny, a następnie usuń nowy wiersz. Powoduje to sparowanie cyfr razem w podobny sposób, jak w przypadku transpozycji.
Zastosuj osobno do każdej pary cyfr, łącząc wyniki razem.
Zduplikuj parę.
Odwróć drugą cyfrę pierwszej pary i pierwszą cyfrę drugiej, abyśmy mieli teraz
x ~y
jedną linię i~x y
drugą.Posortuj cyfry każdego wiersza w kolejności, aby pierwsza cyfra była teraz
x & ~y
lub~x & y
odpowiednio.Odwróć sortowanie linii.
I wyodrębnij pierwszą cyfrę, która jest pożądanym wynikiem.
źródło