자극
에서 이 문제 귀하의 작업이 자연스럽게 캐릭터의 제곱근을 할 수있는 방법을 소개하고, 두 개의 문자열을 곱했다.
어떻게 작동합니까?
문자열 (예 :)이 주어지면 pub
가장 먼저해야 할 일은 각 문자 의 ASCII 코드 를 결정하는 것입니다 .
"pub" -> [112, 117, 98]
다음 으로 각 값 [0..94]
을 빼서 이러한 코드를 범위 에 매핑 32
합니다.
[112, 117, 98] -> [80, 85, 66]
이제 각 값에 대해 루트 모듈로를 찾아야합니다 95
(예 :을 40*40 % 95 = 80
선택할 수도 있음 55
).
[80, 85, 66] -> [40, 35, 16]
마지막으로 범위 [32..126]
로 다시 매핑 하고 문자열로 다시 변환합니다.
[40, 35, 16] -> [72, 67, 48] -> "HC0"
실제로 "HC0" ⊗ "HC0" = "pub"
다른 도전 과제의 솔루션으로 확인할 수 있습니다 .
모듈 식 산술에 익숙한 사람들은 아마도 제곱근 모듈로 95
가 항상 존재하지는 않는다는 것을 알았을 것 입니다 2
. 이 경우 문자열의 제곱근이 정의되지 않으며 프로그램 / 기능이 충돌하거나 무한정 반복 될 수 있습니다.
편의를 위해 다음은 제곱근을 가진 문자 목록입니다 (첫 번째 문자는 공백).
!$%&)+03489:>CDGLMQVW]`bjlpqu
규칙
- 당신은 인수로 문자열 (또는 문자의 목록을) 받아 반환하는 프로그램 / 함수를 작성합니다 모든 존재하는 경우 제곱근을
- 입력에 항상 제곱근이 있다고 가정 할 수 있습니다
- 입력은 빈 문자열로 구성 될 수 있습니다
- 입력이 인쇄 가능한 범위에 있습니다 (
[32..126]
) - 출력은 콘솔에 인쇄되거나 제곱근이 존재하면 문자열을 반환합니다
- 제곱근이 존재하지 않는 경우 프로그램 / 기능의 동작은 정의되지 않은 상태로 남습니다.
- 콘솔에 루트를 인쇄하도록 선택하면 줄 바꿈 문자 또는 공백이 좋습니다.
테스트 사례
이것들이 반드시 유일한 해결책은 아닙니다.
'' -> ''
'pub' -> 'HC0'
'pull!' -> 'HC33!'
'M>>M' -> '>MM>'
'49' -> '4%'
'64' -> undefined
'Hello, World!' -> undefined
답변
sh + coreutils, 58 바이트
tr '$%&)+0389:>CDGLMQVW]`bjpqu' 1u.#:BFO%+M/L2Aa,795d0@H=C
모듈 식 제곱근은 일반적으로 고유하지 않습니다. 를 제외한 각 캐릭터마다 2 개 또는 4 개의 선택이 있습니다. 우리는 번역 할 필요가 없습니다
,
!
, 4
, l
각각 자신의 제곱근이 이미 때문이다. 나머지 문자의 경우 쉘 또는에서 이스케이프 할 필요가없는 이미지를 선택합니다 tr
.
답변
파이썬 3, 57 56 바이트
lambda s:s.translate({k*k%95+32:k+32for k in range(95)})
translate
“유니 코드 서수에서 유니 코드 서 수로의 매핑”을 사용합니다. 따라서 chr
/ ord
변환이 필요하지 않습니다 . 참고 : char에 루트가 없으면 충돌하지 않습니다.
@ jonathan-allan 덕분에 1 바이트를 절약했습니다.
매핑 값은 키의 0..94 범위에서 가장 큰 근입니다. 가장 적은 루트를 가지려면 (예와 같이) 다음을 사용하십시오.
lambda s:s.translate({k*k%95+32:k+32for k in range(95,0,-1)})
(61 바이트)
>>> [s.translate({k*k%95+32:k+32for k in range(95,0,-1)}) for s in ['','pub','pull!','M>>M','49','64','Hello, World!']]
['', 'HC0', 'HC33!', '>MM>', '4%', '64', 'He33o,\x7f9or3d!']
답변
파이썬 2 , 80 바이트
lambda s:''.join([chr(i+32)for i in range(95)if i*i%95==ord(c)-32][0]for c in s)
루트가 없으면 IndexError를 발생시킵니다.
답변
Japt , 16 15 바이트
c@H+LDz%95+HÃbX
05AB1E 답변을보고 바이트를 저장했습니다 ( L
대신 = 100 사용 95
). 이제 Japt는 가장 짧고 아주 드문 일입니다. 😀
설명
c@ H+LÇ ² %95+HÃ bX
UcX{H+LoZ{Zp2 %95+H} bX} Ungolfed
Implicit: U = input string, H = 32, L = 100
UcX{ } Map each charcode X in the input to the following:
Lo Create the array [0, 1, ..., 98, 99]
Z{ } and map each item Z to
Zp2 Z ** 2
%95 mod 95
+H plus 32.
bX Find the first index of X in this array. This gives the
smallest square root (mod 95) of (X - 32).
H+ Add 32 to map this back into the printable range.
Implicit: output result of last expression
답변
수학, 94 바이트
(R[x_]:=Min@Select[Range@45,Mod[#^2,95]==x&];FromCharacterCode[R/@(ToCharacterCode@#-32)+32])&
답변
젤리 , 18 17 16 바이트
95Ḷ²%95+32żØṖFyO
온라인으로 사용해보십시오!(테스트 스위트 바닥 글 제공)
완전히 다시 작성하여 2 바이트를 절약했습니다. 또한 처음으로 사용을 찾았습니다 }
.
설명
코드는 먼저 모든 제곱 문자를 계산 한 다음 각 제곱근에 매핑합니다.
95Ḷ²%95+32żØṖFyO Main link. Argument: S (string)
95 Take 95.
Ḷ Get the array [0, 1, ..., 94].
² Square each to get [0, 1, ..., 8836].
%95 Get each square modulo 95 to get [0, 1, ..., 1].
+32 Add 32 to get [32, 33, ..., 33].
ØṖ Get the list of printables [" ", "!", ..., "~"].
ż Interleave with printables to get [[32, " "], ..., [33, "~"]].
F Flatten the mapping to [32, " ", ..., 33, "~"].
O Get the code point of each character in input.
y Map the code points to the correct output characters using the map.
답변
자바 스크립트, 82 바이트
@ETHproductions와 협력
s=>s.map(x=>(g=z=>z*z%95==x.charCodeAt(0)-32?String.fromCharCode(z+32):g(z+1))(0))
입력과 출력은 char 배열 형태입니다.