Zainspirowany tym wyzwaniem (dzięki za tytuł!
Jak to działa?
Biorąc pod uwagę dwa ciągi znaków (na przykład split
i isbn
), najpierw obetniesz dłuższy ciąg , aby miały jednakową długość, a następnie określisz jego kody ASCII :
split -> spli -> [115, 112, 108, 105]
isbn -> isbn -> [105, 115, 98, 110]
Następnym krokiem będzie zmapowanie ich do zakresu [0..94]
przez odjęcie 32
każdego kodu:
[115, 112, 108, 105] -> [83, 80, 76, 73]
[105, 115, 98, 110] -> [73, 83, 66, 78]
Teraz pomnożysz je modułowo 95
(aby pozostać w zakresie do wydrukowania):
[83, 80, 76, 73] ⊗ [73, 83, 66, 78] -> [74, 85, 76, 89]
Dodaj, 32
aby wrócić do zakresu [32..126]
:
[74, 85, 76, 89] -> [106, 117, 108, 121]
Ostatnim krokiem jest odwzorowanie ich z powrotem na znaki ASCII:
[106, 117, 108, 121] -> "july"
Zasady
- Napisasz program / funkcję, która implementuje opisane kroki na dwóch ciągach i albo wypisuje, albo zwraca wynikowy ciąg
- Format wejściowy jest elastyczny: możesz wziąć dwa ciągi, krotkę ciągów, listę ciągów itp.
- Dane wejściowe mogą składać się z jednego lub dwóch pustych ciągów
- Wprowadzane będą znaki z zakresu do wydrukowania (
[32..126]
) - Dane wyjściowe są drukowane w konsoli lub zwracany jest ciąg znaków
- Dane wyjściowe mogą mieć końcowe białe znaki
Przypadki testowe
"isbn", "split" -> "july"
"", "" -> ""
"", "I don't matter" -> ""
" ", "Me neither :(" -> " "
"but I do!", "!!!!!!!!!" -> "but I do!"
'quotes', '""""""' -> 'ck_iKg'
"wood", "hungry" -> "yarn"
"tray", "gzip" -> "jazz"
"industry", "bond" -> "drop"
"public", "toll" -> "fall"
"roll", "dublin" -> "ball"
"GX!", "GX!" -> "!!!"
"4 lll 4", "4 lll 4" -> "4 lll 4"
"M>>M", "M>>M" -> ">MM>"
Uwaga : cytaty są tylko dla czytelności, w szóstym przypadku testowym, którego użyłem '
zamiast "
.
abc, def -> [['a', 'b', 'c'], ['d', 'e', 'f']]
Odpowiedzi:
MATL , 12 bajtów
Wypróbuj online!
Wyjaśnienie
źródło
Galaretka ,
1512 bajtówWypróbuj online!
-3 dzięki Jonathanowi Allanowi .
źródło
ØṖ
, przy czymz⁶O_32P€‘ịØṖ
- najlepiej sprawdź dwukrotnie, czy arytmetyka działa.Python 3 ,
807471 bajtówDzięki @shooqie za grę w golfa z 3 bajtów!
Wypróbuj online!
źródło
(s, t)
jako krotkę:lambda t:''.join(map(lambda x,y:chr((ord(x)-32)*(ord(y)-32)%95+32),*t))
Python 2 ,
7570 bajtów-3 bajty dzięki sugestii Dennisa dotyczącej sugestii shooqie. -2 bajty dzięki sugestii Zacharýego.
Wypróbuj online!
źródło
lambda*t:''.join(chr(((ord(i)-32)*(ord(j)-32))%95+32)for i,j in zip(*t))
((ord(i)-32)*(ord(j)-32))%95+32
=>(ord(i)-32)*(ord(j)-32)%95+32
...map
. Spóźniłem się trochę.Haskell ,
6057 bajtówWypróbuj online!
Pierwszy wiersz to anonimowa funkcja, która przyjmuje dwa argumenty.
To prosta implementacja algorytmu:
zipWith
pobiera oba ciągi i stosuje daną funkcję do par znaków. Obsługuje obcinanie, a także działa na puste ciągi.fromEnum
itoEnum
są alternatywą dla znaków i ich wartości ASCIIord
ichr
do przełączania między nimi, które nie wymagają długiego importu.Edycja: -3 bajty dzięki Bruce Forte.
źródło
3
bajty, wyciągając-32
i zapisując nawiasy, patrz tutaj .C ++,
331291282270268 bajtów, wersja 2 =178176150148 bajtówOrginalna wersja :
-40 bajtów dzięki Bruce Forte
-39 bajtów dzięki Zacharýmu
Wersja 2, inspirowana odpowiedziami innych osób
Jeśli pierwsza wersja używa lambda, to dlatego, że chciałem przetestować funkcję std :: async C ++ 11, której właśnie się nauczyłem, więc zachowałem ją bez żadnych powodów ...
Bardziej czytelna wersja:
źródło
#include <string>
=>#include<string>
i#include <algorithm>
=>#include<algorithm>
?string
używać.Dyalog APL,
3634332524 bajtówWypróbuj online (TryAPL)!
Wypróbuj online (TIO)!
Dane wejściowe to lista ciągów znaków i końcowe znaki spacji.
Oto jak to działa:
źródło
tryapl.org
, więc oto TIO dla tych, którzy chcą go wypróbować.FSharp 275 bajtów
źródło
CJam , 23 bajty
Wypróbuj online!
źródło
C # (.NET Core) ,
100 9695 bajtówWypróbuj online!
-4 bajty dzięki @ Zacharý
-1 bajt, przesuwając przyrost
Wykorzystuje lambda i narusza fakt, że postacie są w zasadzie ints.
źródło
(l[i]-32)*(n[i]-32)%95+32
?Console
i możesz użyć curry, aby zapisać bajt. Kompiluj doAction<string, Action<string>>
podobnegol=>n=>
i nazywaj podobnego("word")("string")
Mathematica, 114 bajtów
wkład
źródło
Ułożone , 52 bajty
Wypróbuj online!
Funkcja, która pobiera dwa argumenty ze stosu.
Wyjaśnienie
Wygląd Spójrzmy prawdzie w pierwszej części, przy założeniu, że szczyt dwa przedmioty są
'split'
i'isbn'
:Ta część wykonuje kadrowanie.
Następnie:
Następnie ostatnia część:
źródło
R , 88 bajtów
funkcja anonimowa; pobiera dane wejściowe jako dwa ciągi; trzeci argument ma na celu upewnienie się, że jest to funkcja jednowierszowa i zaoszczędzić trochę bajtów.
Poniższy link TIO zwraca tablicę z wpisami nazwanymi przy pierwszym wejściu.
Wypróbuj wszystkie przypadki testowe!
źródło
Perl 5 , 65 bajtów
64 bajty kodu +
-p
flaga.Wypróbuj online!
źródło
D, 113 bajtów
To jest port rozwiązania C ++ HatsuPointerKun , nie zapomnij o ich głosowaniu!
Wypróbuj online!
źródło
05AB1E ,
1615 bajtówWypróbuj online!
-1 dla Emigny, wskazując
₃
pchnięcia95
.jest inny.
źródło
₃
zapisuje bajt. Szkoda, jeśli chodzi o pusty ciąg wejściowy. W przeciwnym razieø
zaoszczędziłoby jeszcze kilka.Java 8,
1271159795 bajtówWyjaśnienie:
Wypróbuj tutaj.
źródło
C #, 166 bajtów
Jestem pewien, że trzeba grać w golfa, ale nie mam teraz czasu.
Wypróbuj online!
Pełna / sformatowana wersja:
źródło
(((c-32)*(t.Substring(0,l)[i]-32))%95)+32)
może być((c-32)*(t.Substring(0,l)[i]-32)%95+32)
(może spieprzył tam pareny ... wygląda jak seplenienie!)Common Lisp, 99 bajtów
Wypróbuj online!
źródło
Japt , 24 bajty
Zwraca ciąg z końcowymi wartościami null-chars (
\u0000
), gdy pierwsze wejście jest dłuższe niż drugie.Wypróbuj online! z
-Q
flagą, aby wyświetlić sformatowane dane wyjściowe, w tym znaki zerowe.Uruchom wszystkie przypadki testowe, używając mojego WIP CodePen.
źródło
Python 2 ,
9573 bajtówWypróbuj online!
źródło
(((ord(x[i])-32)*(ord(y[i])-32))%95)+32
=>(ord(x[i])-32)*(ord(y[i])-32)%95+32
Węgiel drzewny , 30 bajtów
Wypróbuj online! Link jest do pełnej wersji kodu. Tak naprawdę napisałem to obliczenie,
(32 - ord(q)) * (32 - ord(h))
ponieważ unika ono kolejnych literałów numerycznych, ale wydaje mi się, że mógłbym właśnie napisać(ord(q) - ord(" ")) * (ord(h) - ord(" "))
.źródło
Perl 5 , 95 bajtów
Wypróbuj online!
Wyjaśnienie:
źródło
Pip , 19 bajtów
Bierze ciągi jako argumenty wiersza poleceń. Wypróbuj online!
Wyjaśnienie
źródło
Współczynnik , 45
Jest to cytat (lambda),
call
z dwoma ciągami na stosie, pozostawia nowy ciąg na stosie.Jednym słowem:
źródło
K (oK) , 26 bajtów
Rozwiązanie:
Wypróbuj online!
Przykład:
Wyjaśnienie:
Ocena jest przeprowadzana od prawej do lewej:
źródło
PHP, 112 bajtów
źródło
for($i=0;$i<strlen($a=$argv[1])&&$i<strlen($b=$argv[2]);)echo chr((ord($a[$i])-32)*(ord($b[$i++])-32)%95+32);
Nie jestem też całkowicie pewien, czy zastąpienie&&
go&
może być również możliwe w PHP, zmniejszając go o kolejny bajt do 108 .JavaScript (ES6), 89 bajtów
JavaScript i przekleństwo długich nazw funkcji ...
Korzystanie z curry i fakt, że
charCodeAt
powraca,NaN
gdy zostanie wywołany z nieprawidłową pozycją. Na wyjściu mogą znajdować się końcowe wartości zerowe.Test
źródło