นำสแควร์รูทของสตริง


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

Python 3, 57 56 ไบต์

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

translateใช้การแมปจาก "Unicode ordinals กับ Unicode ordinals" ดังนั้นเราไม่ต้องการchr/ ordแปลง หมายเหตุ: มันจะไม่พังเมื่อถ่านไม่มีรูต

บันทึกแล้ว 1 ไบต์ขอบคุณ @ jonathan-allan

ค่าของการแมปเป็นรูตที่ยิ่งใหญ่ที่สุดในช่วง 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


3

Japt , 16 15 ไบต์

c@H+LDz%95+HÃbX

ลองออนไลน์!

บันทึกเป็นไบต์โดยดูที่คำตอบ 05AB1E (โดยใช้L= 100 แทน95) ตอนนี้ Japtive สั้นที่สุดแล้วเป็นเหตุการณ์ที่ไม่ค่อยเกิดขึ้น :-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Ọโดยพื้นฐานแล้วคำตอบ Japt ของฉันจะเป็นเช่นนั้นแม้ว่าโซลูชันของคุณจะสั้นกว่าสองไบต์ ...
ETHproductions

2

JavaScript, 82 ไบต์

ร่วมมือกับ @ETHproductions

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

อินพุตและเอาต์พุตอยู่ในรูปของ char array

ตัวอย่างการทดสอบ


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

Mathematica 82 Bytes

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

การใช้ความสามารถของ Solve ในการทำเลขคณิตแบบแยกส่วน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.