एक स्ट्रिंग का वर्गमूल लें


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 I ने चुनौती को अपडेट किया।
ბიმო

यदि दिए गए तार कई तार के वर्ग हैं तो क्या करें?
tsh

@tsh कोई भी लौटाएं, मैं चुनौती को अपडेट करूंगा।

1
@curiousdannii वास्तव में यह रेंज 0-94(जो कि प्रिंट करने योग्य रेंज है) होनी चाहिए , यह एक टाइपो है - इसके बारे में क्षमा करें।
ბიმო

जवाबों:


10

श + कोरुटिल्स, 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रूपांतरण। नोट: जब कोई जड़ नहीं है तो यह दुर्घटना नहीं करता है।

@ जोनाथन-एलन को 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
जोनाथन एलन

... यह भी, यहाँ एक ऑनलाइन दुभाषिया परीक्षण सूट की एक कड़ी है।
जोनाथन एलन


3

जाप , 16 15 बाइट्स

c@H+LDz%95+HÃbX

इसे ऑनलाइन आज़माएं!

05AB1E उत्तर ( L= के बजाय 100 का उपयोग करके 95) को देखकर एक बाइट को बचाया । अब जैप सबसे छोटा है, एक काफी दुर्लभ घटना है :- डी

व्याख्या

 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Ọमूल रूप से मेरा जाप उत्तर क्या करता है, हालांकि आपका समाधान दो बाइट्स छोटा है ...
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))

इनपुट और आउटपुट एक चार सरणी के रूप में हैं।

टेस्ट स्निपेट


2

05AB1E , 17 बाइट्स

vтLn95%žQykk33+ç?

एल्गोरिथ्म जेली और जाप उत्तर के समान है (पहले कुछ और था लेकिन मुझे केवल 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

गणितज्ञ, 60 बाइट्स

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

अनाम फ़ंक्शन। एक स्ट्रिंग को इनपुट के रूप में लेता है और एक स्ट्रिंग को आउटपुट के रूप में देता है। अमान्य इनपुट पर त्रुटियां।



1

गणितज्ञ 82 बाइट्स

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

मॉड्यूलर अंकगणित करने के लिए हल करने की क्षमता का उपयोग करना।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.