Lấy căn bậc hai của một chuỗi


14

Động lực

Trong thử thách này, nhiệm vụ của bạn là nhân hai chuỗi, điều này tự nhiên giới thiệu một cách để lấy căn bậc hai của chuỗi.

Làm thế nào nó hoạt động?

Đưa ra một chuỗi (ví dụ pub) điều đầu tiên bạn cần làm là xác định mã ASCII cho mỗi ký tự:

"pub" -> [112, 117, 98]

Tiếp theo, bạn ánh xạ các mã này vào phạm vi [0..94]bằng cách trừ 32từng giá trị:

[112, 117, 98] -> [80, 85, 66]

Bây giờ bạn cần tìm cho mỗi giá trị modulo gốc của nó 95(ví dụ: 40*40 % 95 = 80bạn cũng có thể chọn 55):

[80, 85, 66] -> [40, 35, 16]

Và cuối cùng, bạn sẽ ánh xạ nó trở lại phạm vi [32..126]và chuyển đổi nó thành một chuỗi:

[40, 35, 16] -> [72, 67, 48] -> "HC0"

Thật vậy, "HC0" ⊗ "HC0" = "pub"như bạn có thể xác minh với một giải pháp từ các thách thức khác ở đây .


Những người quen thuộc với số học mô-đun có thể nhận thấy rằng modulo căn bậc hai 95không phải lúc nào cũng tồn tại, ví dụ như không có root cho 2. Trong trường hợp như vậy, căn bậc hai của một chuỗi không được xác định và chương trình / hàm của bạn có thể bị sập, lặp không xác định, v.v.

Để thuận tiện cho bạn, đây là danh sách các ký tự có căn bậc hai (cái đầu tiên là khoảng trắng):

 !$%&)+03489:>CDGLMQVW]`bjlpqu

Quy tắc

  • Bạn sẽ viết một chương trình / hàm lấy một chuỗi (hoặc danh sách các ký tự) làm đối số và trả về bất kỳ căn bậc hai nào nếu nó tồn tại
  • Bạn có thể cho rằng đầu vào luôn có căn bậc hai
  • Đầu vào có thể bao gồm một chuỗi rỗng
  • Đầu vào sẽ nằm trong phạm vi có thể in ( [32..126])
  • Đầu ra được in ra bàn điều khiển hoặc bạn trả về một chuỗi nếu căn bậc hai tồn tại
  • Trong trường hợp căn bậc hai không tồn tại, hành vi của chương trình / hàm của bạn không được xác định
  • Nếu bạn chọn in gốc đến bảng điều khiển thì các dòng mới hoặc khoảng trắng đều ổn

Các trường hợp thử nghiệm

Lưu ý rằng đây không nhất thiết là giải pháp duy nhất:

''              -> ''
'pub'           -> 'HC0'
'pull!'         -> 'HC33!'
'M>>M'          -> '>MM>'
'49'            -> '4%'
'64'            -> undefined
'Hello, World!' -> undefined

Buộc một trạng thái lỗi trên các ký tự này mà không có căn bậc hai dường như không cần thiết, tôi khuyên bạn chỉ nên xác định hành vi không xác định.
ATaco

@ATaco Mình cập nhật thử thách.
ბიმო

Phải làm gì nếu chuỗi đã cho là bình phương của nhiều chuỗi?
tsh

@tsh Trả lại bất kỳ, tôi sẽ cập nhật thử thách.
ბიმო

1
@cquildannii Trên thực tế, nó phải là phạm vi 0-94(đó là phạm vi có thể in được), đó là một lỗi đánh máy - xin lỗi về điều đó.
ბიმო

Câu trả lời:


10

sh + coreutils, 58 byte

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

Hãy thử trực tuyến!

Căn bậc hai mô-đun thường không phải là duy nhất; chúng tôi có 2 hoặc 4 lựa chọn cho mỗi nhân vật ngoại trừ . Chúng ta không cần dịch , !, 4, lvì mỗi đã là một căn bậc hai của chính nó. Đối với các ký tự còn lại, chúng tôi chọn các hình ảnh không cần phải thoát cho trình bao hoặc tr.


6

Python 3, 57 56 byte

lambda s:s.translate({k*k%95+32:k+32for k in range(95)})

translatesử dụng ánh xạ từ "các lệnh Unicode sang các lệnh Unicode". Vì vậy, chúng tôi không cần chr/ ordchuyển đổi. Lưu ý: nó không bị sập khi char không có root.

Đã lưu 1 byte nhờ @ jonathan-allan

Giá trị của ánh xạ là gốc lớn nhất trong phạm vi 0..94 của khóa. Để có ít root nhất (như trong các ví dụ), hãy sử dụng:

lambda s:s.translate({k*k%95+32:k+32for k in range(95,0,-1)})

(61 byte)

>>> [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!']

Chào mừng bạn Đẹp bài đầu tiên. Bạn có thể loại bỏ khoảng trống giữa 32for.
Jonathan Allan

... Ngoài ra, đây là một liên kết đến một bộ kiểm tra phiên dịch trực tuyến.
Jonathan Allan


3

Japt , 16 15 byte

c@H+LDz%95+HÃbX

Hãy thử trực tuyến!

Đã lưu một byte bằng cách xem câu trả lời 05AB1E (sử dụng L = 100 thay vì 95). Bây giờ Japt là ngắn nhất, một sự xuất hiện khá hiếm :-D

Giải trình

 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

Thạch , 18 17 16 byte

95Ḷ²%95+32żØṖFyO

Hãy thử trực tuyến!(đi kèm với chân trang thử nghiệm)

Đã lưu 2 byte bằng cách viết lại hoàn chỉnh. Đây cũng là lần đầu tiên tôi tìm thấy sử dụng cho} .

Giải trình

Mã đầu tiên tính toán tất cả các ký tự vuông, sau đó ánh xạ chúng đến căn bậc hai tương ứng của chúng.

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Ọvề cơ bản là những gì câu trả lời Japt của tôi làm, mặc dù giải pháp của bạn ngắn hơn hai byte ...
Sản phẩm ETH

2

JavaScript, 82 byte

Phối hợp với @ETHproductions

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

Đầu vào và đầu ra ở dạng một mảng char.

Kiểm tra đoạn


2

05AB1E , 17 byte

vтLn95%žQykk33+ç?

Thuật toán này rất giống với câu trả lời của Jelly và Japt (Đã có thứ khác trước đó nhưng điều đó chỉ đưa tôi đến 19 byte)

Giải trình

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

Hãy thử trực tuyến!


1

Toán học, 60 byte

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

Chức năng ẩn danh. Lấy một chuỗi làm đầu vào và trả về một chuỗi là đầu ra. Lỗi về đầu vào không hợp lệ.



1

Toán học 82 byte

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

Sử dụng khả năng của Solve để làm số học mô-đun.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.