줄의 제곱근을 취하십시오 대해 루트 모듈로를

자극

에서 문제 귀하의 작업이 자연스럽게 캐릭터의 제곱근을 할 수있는 방법을 소개하고, 두 개의 문자열을 곱했다.

어떻게 작동합니까?

문자열 (예 :)이 주어지면 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 배열 형태입니다.

스 니펫 테스트