Motywacja
W tym wyzwaniu Twoim zadaniem było pomnożenie dwóch łańcuchów, co naturalnie wprowadza sposób na pierwiastek kwadratowy z łańcucha.
Jak to działa?
Biorąc pod uwagę ciąg znaków (na przykład pub
) pierwszą rzeczą, którą musisz zrobić, jest określenie kodu ASCII dla każdego znaku:
"pub" -> [112, 117, 98]
Następnie zamapuj te kody do zakresu [0..94]
, odejmując 32
każdą wartość:
[112, 117, 98] -> [80, 85, 66]
Teraz musisz znaleźć dla każdej wartości jego moduł główny 95
(np. 40*40 % 95 = 80
Możesz również wybrać 55
):
[80, 85, 66] -> [40, 35, 16]
I w końcu zamapujesz go z powrotem na zakres [32..126]
i przekonwertujesz z powrotem na ciąg:
[40, 35, 16] -> [72, 67, 48] -> "HC0"
Rzeczywiście, "HC0" ⊗ "HC0" = "pub"
jak można to sprawdzić za pomocą rozwiązania z innego wyzwania tutaj .
Osoby zaznajomione z arytmetyką modułową prawdopodobnie zauważyły, że moduł pierwiastkowy z kwadratem 95
nie zawsze istnieje, na przykład nie ma pierwiastka 2
. W takim przypadku pierwiastek kwadratowy ciągu nie jest zdefiniowany, a Twój program / funkcja może ulec awarii, zapętlić się w nieskończoność itp.
Dla Twojej wygody, oto lista znaków, które mają pierwiastek kwadratowy (pierwszy to spacja):
!$%&)+03489:>CDGLMQVW]`bjlpqu
Zasady
- Napisz program / funkcję, która pobiera ciąg (lub listę znaków) jako argument i zwraca dowolny pierwiastek kwadratowy, jeśli istnieje
- Możesz założyć, że dane wejściowe zawsze mają pierwiastek kwadratowy
- Dane wejściowe mogą składać się z pustego ciągu
- Dane wejściowe będą w zakresie do wydrukowania (
[32..126]
) - Dane wyjściowe są drukowane w konsoli lub zwracany jest ciąg znaków, jeśli istnieje pierwiastek kwadratowy
- Jeśli pierwiastek kwadratowy nie istnieje, zachowanie Twojego programu / funkcji pozostaje niezdefiniowane
- Jeśli zdecydujesz się wydrukować katalog główny na konsoli, końcowe znaki nowego wiersza lub białe znaki są w porządku
Przypadki testowe
Pamiętaj, że niekoniecznie są to jedyne rozwiązania:
'' -> ''
'pub' -> 'HC0'
'pull!' -> 'HC33!'
'M>>M' -> '>MM>'
'49' -> '4%'
'64' -> undefined
'Hello, World!' -> undefined
0-94
(to jest zakres do wydruku), to literówka - przepraszam za to.Odpowiedzi:
sh + coreutils, 58 bajtów
Wypróbuj online!
Modułowy pierwiastek kwadratowy zazwyczaj nie jest unikalny; mamy 2 lub 4 opcje dla każdej postaci z wyjątkiem
. Nie trzeba tłumaczyć
,
!
,4
,l
ponieważ każdy z nich jest już samo w sobie pierwiastek kwadratowy. Dla pozostałych postaci wybieramy obrazy, które nie wymagają ucieczki dla powłoki lubtr
.źródło
Python 3,
5756 bajtówtranslate
używa odwzorowania z „Rzędnych Unicode na Rzędy Unicode”. Dlatego nie potrzebujemychr
/ord
konwersji. Uwaga: nie ulega awarii, gdy char nie ma roota.Zaoszczędzono 1 bajt dzięki @ jonathan-allan
Wartość odwzorowania jest największym rdzeniem w zakresie 0..94 klucza. Aby mieć najmniejszy root (jak w przykładach), użyj:
(61 bajtów)
źródło
32
ifor
.Python 2 , 80 bajtów
Wypróbuj online!
Zgłasza błąd IndexError, jeśli nie istnieje root.
źródło
Japt ,
1615 bajtówWypróbuj online!
Zapisano bajt, patrząc na odpowiedź 05AB1E (używając
L
= 100 zamiast95
). Teraz Japt jest najkrótszym, dość rzadkim zjawiskiem :-DWyjaśnienie
źródło
Mathematica, 94 bajty
Wypróbuj online!
źródło
Galaretka ,
181716 bajtówWypróbuj online!(dostarczany ze stopką pakietu testowego)
Zaoszczędzono 2 bajty, wykonując kompletne przepisanie.
Również po raz pierwszy znalazłem zastosowanie}
.Wyjaśnienie
Kod najpierw oblicza wszystkie znaki kwadratowe, a następnie odwzorowuje je na odpowiednie pierwiastki kwadratowe.
źródło
95Ḷ²%95+32iЀO+31Ọ
jest w zasadzie tym, co robi moja odpowiedź Japt, chociaż twoje rozwiązanie jest o dwa bajty krótsze ...JavaScript, 82 bajty
Współpracował z @ETHproductions
Dane wejściowe i wyjściowe mają postać tablicy char.
Testowy fragment kodu
Pokaż fragment kodu
źródło
05AB1E , 17 bajtów
Algorytm jest bardzo podobny do odpowiedzi Jelly i Japt (Miałem już coś innego, ale to tylko mnie do 19 bajtów)
Wyjaśnienie
Wypróbuj online!
źródło
Mathematica, 60 bajtów
Funkcja anonimowa. Pobiera ciąg jako dane wejściowe i zwraca ciąg jako dane wyjściowe. Błędy przy nieprawidłowym wprowadzeniu.
źródło
Perl 6 , 53 bajtów
Wypróbuj online!
źródło
Mathematica 82 bajtów
Wykorzystanie zdolności Solve do wykonywania arytmetyki modułowej.
źródło