줄의 제곱근을 취하십시오


14

자극

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

어떻게 작동합니까?

문자열 (예 :)이 주어지면 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

제곱근없이 이러한 문자에 오류 상태를 강제하는 것은 불필요 해 보입니다. 정의되지 않은 동작을 권장합니다.
ATaco

@ATaco 나는 도전을 업데이트했다.
ბიმო

주어진 문자열이 여러 문자열의 제곱 인 경우 어떻게해야합니까?
tsh

@tsh 아무거나 돌려 보내면 도전 과제를 업데이트하겠습니다.
ბიმო

1
@curiousdannii 실제로 그것은 범위 0-94(인쇄 가능한 범위) 이어야합니다 . 오타입니다. 죄송합니다.
ბიმო

답변:


10

sh + coreutils, 58 바이트

tr '$%&)+0389:>CDGLMQVW]`bjpqu' 1u.#:BFO%+M/L2Aa,795d0@H=C

온라인으로 사용해보십시오!

모듈 식 제곱근은 일반적으로 고유하지 않습니다. 를 제외한 각 캐릭터마다 2 개 또는 4 개의 선택이 있습니다. 우리는 번역 할 필요가 없습니다 , !, 4, l각각 자신의 제곱근이 이미 때문이다. 나머지 문자의 경우 쉘 또는에서 이스케이프 할 필요가없는 이미지를 선택합니다 tr.


6

파이썬 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!']

어서 오십시오! 좋은 첫 번째 게시물. 32와 사이의 공백을 제거 할 수 있습니다 for.
Jonathan Allan

... 또한 여기 에는 온라인 통역사 테스트 스위트에 대한 링크가 있습니다.
Jonathan Allan


3

Japt , 16 15 바이트

c@H+LDz%95+HÃbX

온라인으로 사용해보십시오!

05AB1E 답변을보고 바이트를 저장했습니다 ( L대신 = 100 사용 95). 이제 Japt는 가장 짧고 아주 드문 일입니다. :-D

설명

 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


2

젤리 , 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.

95Ḷ²%95+32iЀO+31Ọ솔루션은 2 바이트 더 짧지 만 기본적으로 Japt 응답이 수행하는 작업입니다.
ETHproductions

2

자바 스크립트, 82 바이트

@ETHproductions와 협력

s=>s.map(x=>(g=z=>z*z%95==x.charCodeAt(0)-32?String.fromCharCode(z+32):g(z+1))(0))

입력과 출력은 char 배열 형태입니다.

스 니펫 테스트


2

05AB1E , 17 바이트

vтLn95%žQykk33+ç?

알고리즘은 Jelly 및 Japt 답변과 매우 유사합니다 (이전에 다른 것이 있었지만 19 바이트 만 가능했습니다)

설명

vтLn95%žQykk33+ç?
v                 # For each character of the input...
 тL                # Push [1..100]
   n               # Square every element of the list
    95%            # And take it modulo 95
       žQyk        # Push the index of the current character in the printable ascii range
           k       # Push the index of that in the list created earlier
            33+    # Add 33 to the result
               ç   # And convert it back to a character
                ?  # Print the character

온라인으로 사용해보십시오!


1

Mathematica, 60 바이트

FromCharacterCode[PowerMod[ToCharacterCode@#-32,1/2,95]+32]&

익명의 기능. 문자열을 입력으로 받아서 문자열을 출력으로 반환합니다. 유효하지 않은 입력 오류.



1

매스 매 티카 82 바이트

FromCharacterCode[Solve[x^2==#,Modulus->95][[1,1,2]]+32&/@(ToCharacterCode@#-32)]&

모듈 식 산술을 수행하는 Solve 기능 사용.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.