इष्टतम वर्णमाला कदम


30

केवल अक्षरों से युक्त एक इनपुट स्ट्रिंग को देखते हुए, किसी भी अक्षर से शुरू होने वाले रैपिंग वर्णमाला के क्रम में सभी अक्षरों को देखने के लिए आवश्यक चरणों की न्यूनतम मात्रा के परिणामस्वरूप चरण-आकार वापस करें।

उदाहरण के लिए,, शब्द ले dog। यदि हम 1 के चरण-आकार का उपयोग करते हैं, तो हम इसके साथ समाप्त होते हैं:

defghijklmnopqrstuvwxyzabcdefg   Alphabet
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
defghijklmnopqrstuvwxyzabcdefg   Visited letters
d          o                 g   Needed letters

कुल 30 चरणों के लिए।

हालाँकि, यदि हम 11 के चरण-आकार का उपयोग करते हैं, तो हमें यह मिलता है:

defghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefg
^          ^          ^          ^          ^          ^
d          o          z          k          v          g   Visited letters
d          o                                           g   Needed letters

कुल 6 चरणों के लिए। यह चरणों की न्यूनतम राशि है, इसलिए इसके लिए वापसी परिणाम dogचरण-आकार है; 11

परीक्षण के मामलों:

"dog"      -> 11
"age"      -> 6
"apple"    -> 19
"alphabet" -> 9
"aaaaaaa"  -> 0 for 0 indexed, 26 for 1 indexed
"abcdefga" -> 1 or 9
"aba"      -> Any odd number except for 13
"ppcg"     -> 15
"codegolf" -> 15
"testcase" -> 9
"z"        -> Any number
"joking"   -> 19

नियम

  • इनपुट केवल अक्षरों से बना एक गैर-रिक्त स्ट्रिंग या वर्ण aहोगा z(आप अपरकेस या लोअरकेस के बीच चयन कर सकते हैं)
  • आउटपुट 0 अनुक्रमित (यानी रेंज 0-25) या 1 अनुक्रमित ( 1-26) हो सकता है
  • यदि कोई टाई है, तो आप किसी भी चरण-आकार या उन सभी को आउटपुट कर सकते हैं
  • यह , इसलिए प्रत्येक भाषा की जीत के लिए सबसे कम बाइट्स होती हैं!

क्या हमें खाली इनपुट को संभालने की आवश्यकता है?
pizzapants184

1
@ pizzapants184 नं। मैंने इस सवाल को अपडेट किया है कि इनपुट गैर-रिक्त होगा
Jo King

क्या हम वर्णों के एक सरणी के रूप में इनपुट ले सकते हैं?
झबरा

@ शैगी ज़रूर आप कर सकते हैं
जो किंग

क्या कोई कारण है जो संख्याओं के बजाय अक्षरों का उपयोग करता है?
गेहूं जादूगर

जवाबों:


6

चारकोल , 41 बाइट्स

≔EEβEθ∧μ⌕⭆β§β⁺⌕β§θ⊖μ×κξλ⎇⊕⌊ιΣι⌊ιθI⌕θ⌊Φθ⊕ι

इसे ऑनलाइन आज़माएं! लिंक कोड के वर्बोज़ संस्करण के लिए है। 0 अनुक्रमित। स्पष्टीकरण:

Eβ

26 स्टेप साइज पर लूप करें। (वास्तव में मैं यहां लोअरकेस वर्णमाला पर लूप करता हूं और इंडेक्स वेरिएबल का उपयोग करता हूं।)

Eθ∧μ

पहले के बाद इनपुट के प्रत्येक वर्ण पर लूप।

⭆β§β⁺⌕β§θ⊖μ×κξ

26 बार लूप करें और इनपुट के पिछले चरित्र के साथ शुरू (0-अनुक्रमित) दिए गए स्टेप साइज पर 26 कदम उठाते हुए वर्णों की स्ट्रिंग उत्पन्न करें।

⌕...λ

उस तार में इनपुट के वर्तमान वर्ण की स्थिति ज्ञात करें, या नहीं मिलने पर -1।

E...⎇⊕⌊ιΣι⌊ι

सभी पदों का योग लें, जब तक कि कोई नहीं मिला, जिस स्थिति में -1 का उपयोग करें।

≔...θ

रकम बचाओ।

⌊Φθ⊕ι

न्यूनतम गैर-ऋणात्मक राशि ज्ञात कीजिए।

I⌕θ...

उस योग के साथ पहला चरण आकार ज्ञात करें और इसे आउटपुट करें।



4

जेली , 28 26 23 बाइट्स

S;þḅ26ŒpṢƑƇIŻ€S:g/ƊÞḢg/

आउटपुट 0-अनुक्रमित है। इनपुट एक बाइटस्ट्रिंग है और किसी भी मामले में हो सकता है, लेकिन अपरकेस बहुत तेज़ है।

एकल-पत्र इनपुट को विशेष-आवरण वाला होना चाहिए और इसकी लागत 2 बाइट होगी। ._।

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

ध्यान दें कि यह एक जानवर-बल दृष्टिकोण है; चार या अधिक अक्षरों के साथ इनपुट टीआईओ पर समय निकालेंगे। परीक्षण सूट _39 "दक्षता" के लिए प्रस्तुत करता है।

यह काम किस प्रकार करता है

S;þḅ26ŒpṢƑƇIŻ€S:g/ƊÞḢg/  Main link. Argument: b (bytestring)

S                        Take the sum (s) of the code points in b.
 ;þ                      Concatenate table; for each k in [1, ..., s] and each c in
                         b, yield [k, c], grouping by c.
   ḅ26                   Unbase 26; map [k, c] to (26k + c).
      Œp                 Take the Cartesian product.
        ṢƑƇ              Comb by fixed sort; keep only increasing lists.
           I             Increments; take the forward differences of each list.
            Ż€           Prepend a 0 to each list.
                         I returns empty lists for single-letter input, so this is
                         required to keep g/ (reduce by GCD) from crashing.
                   Þ     Sort the lists by the link to the left.
              S:g/Ɗ      Divide the sum by the GCD.
                    Ḣ    Head; extract the first, smallest element.
                     g/  Compute the GCD.

4

जेली , 17 बाइट्स

ƓI%
26×þ%iþÇo!SỤḢ

इनपुट STDIN पर एक बाइटस्ट्रिंग है, आउटपुट 1-अनुक्रमित है।

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

यह काम किस प्रकार करता है

ƓI%            Helper link. Argument: m (26 when called)

Ɠ              Read a line from STDIN and eval it as Python code.
 I             Increments; take all forward differences.
  %            Take the differences modulo m.


26×þ%iþÇoSSỤḢ  Main link. No arguments.

26             Set the argument and the return value to 26.
  ×þ           Create the multiplication table of [1, ..., 26] by [1, ..., 26].
    %          Take all products modulo 26.
       Ç       Call the helper link with argument 26.
     iþ        Find the index of each integer to the right in each list to the left,
               grouping by the lists.
        o!     Replace zero indices (element not found) with 26!.
               This works for strings up to 25! = 15511210043330985984000000 chars,
               which exceeds Python's 9223372036854775807 character limit on x64.
          S    Take the sum of each column.
           Ụ   Sort the indices by their corresponding values.
            Ḣ  Head; extract the first index, which corresponds to the minimal value.

4

जावास्क्रिप्ट (Node.js) ,  123 121 116  114 बाइट्स

s=>(i=26,F=m=>i--?F((g=x=>s[p]?s[k++>>5]?j=1+g(x+i,p+=b[p]==x%26+97):m:0)(b[p=k=0]+7)>m?m:(r=i,j)):r)(b=Buffer(s))

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

टिप्पणी की गई

नायब : जब किसी दिए गए कदम के साथ वर्णमाला में एक पत्र से मेल करने की कोशिश कर , हम अधिक से अधिक सूचक अग्रिम करने के लिए की जरूरत है बार। असफल पुनरावृत्तियों के बाद , कम से कम एक अक्षर को दो बार जाना चाहिए था। इसलिए, अनुक्रम हमेशा के लिए दोहराता जा रहा है और हम जिस पत्र की तलाश कर रहे हैं, वह उसका हिस्सा नहीं है। यही कारण है कि हम पुनरावर्ती फ़ंक्शन , ताकि यह _ पुनरावृत्तियों के बाद छोड़ दे , जहां इनपुट स्ट्रिंग की लंबाई है।i2526g 32 × L Ls[k++ >> 5]g32×LL

s => (                        // main function taking the string s
  i = 26,                     // i = current step, initialized to 26
  F = m =>                    // F = recursive function taking the current minimum m
    i-- ?                     // decrement i; if i was not equal to 0:
      F(                      //   do a recursive call to F:
        (g = x =>             //     g = recursive function taking a character ID x
          s[p] ?              //       if there's still at least one letter to match:
            s[k++ >> 5] ?     //         if we've done less than 32 * s.length iterations:
              j = 1 + g(      //           add 1 to the final result and add the result of
                x + i,        //             a recursive call to g with x = x + i
                p += b[p] ==  //             increment p if
                  x % 26 + 97 //             the current letter is matching
              )               //           end of recursive call to g
            :                 //         else (we've done too many iterations):
              m               //           stop recursion and yield the current minimum
          :                   //       else (all letters have been matched):
            0                 //         stop recursion and yield 0
        )(                    //     initial call to g with p = k = 0
          b[p = k = 0] + 7    //     and x = ID of 1st letter
        ) > m ?               //     if the result is not better than the current minimum:
          m                   //       leave m unchanged
        :                     //     else:
          (r = i, j)          //       update m to j and r to i
      )                       //   end of recursive call to F
    :                         // else (i = 0):
      r                       //   stop recursion and return the final result r
)(b = Buffer(s))              // initial call to F with m = b = list of ASCII codes of s

4

रूबी , 121 114 112 108 102 89 बाइट्स

->s{(r=0..25).min_by{|l|p,=s;s.sum{|c|t=r.find{|i|(p.ord-c.ord+i*l)%26<1}||1/0.0;p=c;t}}}

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

0 अनुक्रमित। वर्णों के एक सरणी के रूप में इनपुट लेता है।

केवल 12 बाइट के मूल्य वाले गोल्फ विचारों के लिए ASCII- के लिए धन्यवाद।


:( करीब (अजगर समाधान के आधार पर)
ASCII- केवल

100 , शायद थोड़ा और अधिक गोल्फ हो सकता है
एएससीआईआई-केवल


महान विचार, p,=*sचाल से -1 और बाइट , लेकिन मैं हार्डकॉन्ड पेनल्टी स्कोर के साथ समाधान की सैद्धांतिक मजबूती के बारे में इतना निश्चित नहीं हूं ... इसलिए, मैंने निरंतरता को अनंत में बदल दिया (हालांकि आपका मूल्य एक और 2 बाइट के लिए अनुमति देगा )।
किरिल एल।

केवल 2 बाइट्स, खराब नहीं
एएससीआईआई-केवल

3

पायथन 2 , 230 222 216 194 169 बाइट्स

def t(s,l,S=0):
 a=ord(s[0])
 for c in s[1:]:
	while a-ord(c)and S<len(s)*26:S+=1;a=(a-65+l)%26+65
 return S
def f(s):T=[t(s,l)for l in range(26)];return T.index(min(T))

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

-22 tsh से बाइट्स

जो राजा से -39 बाइट्स

स्पष्टीकरण के साथ पुराना संस्करण:

A=map(chr,range(65,91)).index
def t(s,l,S=0):
 a=A(s[0]) 
 for c in s[1:]:
	while a!=A(c)and S<len(s)*26:
	 S+=1;a+=l;a%=26
 return S
def f(s):T=[t(s,l)for l in range(26)];return T.index(min(T))

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

यह अक्षरों की एक प्रमुख संख्या वाली भाषा में छोटा होगा ( float('inf')अनंत छोरों से निपटने की आवश्यकता नहीं होगी )। वास्तव में, इस सबमिशन के लिए "आना" जैसे स्ट्रिंग्स को संभालने के लिए अभी भी आवश्यकता होगी। यह सबमिशन अब 26*len(s)ऊपरी सीमा के रूप में उपयोग होता है, जो अनंत छोरों को रोकता है।

यह सबमिशन 0-अनुक्रमित है (0 से 25 समावेशी मान लौटाता है)।

f एक (n अपरकेस) स्ट्रिंग लेता है और इष्टतम वर्णमाला स्टेपिंग लौटाता है

tएक सहायक फ़ंक्शन है जो स्ट्रिंग और एक वर्णमाला को ले जाता है और स्ट्रिंग को समाप्त करने के लिए आवश्यक हॉप्स की संख्या देता है (या 26*len(s)यदि असंभव है)।


2
उपयोग करें while a!=A(c)and S<len(s)*26:और आप निकाल सकते हैं if a==i:return float('inf'), क्योंकि len(s)*26किसी भी उत्तर की ऊपरी सीमा है।
tsh






2

05AB1E (विरासत) , 33 27 26 बाइट्स

Ç¥ε₂%U₂L<©ε®*₂%Xk'-žm:]øOWk

विरासत संस्करण का उपयोग करता है क्योंकि एक बग प्रतीत होता है जब आप नए 05AB1E संस्करण में नेस्टेड मैप के बाद परिणाम को संशोधित / उपयोग करना चाहते हैं।

0-अनुक्रमित आउटपुट।

इसे ऑनलाइन आज़माएं या सभी परीक्षण मामलों को सत्यापित करें

स्पष्टीकरण:

Ç                        # ASCII values of the (implicit) input
 ¥                       # Deltas (differences between each pair)
  ε                      # Map each delta to:
   ₂%                    #  Take modulo-26 of the delta
     U                   #  Pop and store it in variable `X`
      L<                #  Push a list in the range [0,25]
         ©               #  Store it in the register (without popping)
          ε              #  Map each `y` to:
           ®*            #   Multiply each `y` by the list [0,25] of the register
             ₂%          #   And take modulo-26
                         #   (We now have a list of size 26 in steps of `y` modulo-26)
               Xk        #   Get the index of `X` in this inner list (-1 if not found)
                 '-₄:   '#   Replace the minus sign with "1000"
                         #   (so -1 becomes 10001; others remain unchanged) 
]                        # Close both maps
 ø                       # Zip; swapping rows/columns
  O                      # Sum each
   W                     # Get the smallest one (without popping the list)
    k                    # Get the index of this smallest value in the list
                         # (and output the result implicitly)

2

पायथन 3 , 191 178 162 बाइट्स

आपके सभी सुझावों के लिए सभी को धन्यवाद! यह बहुत अधिक गोल्फ की तरह लग रहा है।

*w,=map(ord,input())
a=[]
for i in range(26):
 n=1;p=w[0]
 for c in w:
  while n<len(w)*26and p!=c:
   n+=1;p+=i;
   if p>122:p-=26
 a+=[n]
print(a.index(min(a)))

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

और मेरा मूल कोड अगर किसी की दिलचस्पी है।

शब्द को ASCII मानों की सूची में बदल देता है, फिर चरण आकार 0 से 25 के माध्यम से पुनरावृत्ति करता है, यह जांचने के लिए कि सूची को समाप्त करने के लिए कितने चरण हैं (अनंत छोरों को रोकने के लिए एक छत है)।

सूची में चरणों की संख्या जोड़ दी गई है

पाश के लिए बड़ा करने के बाद, में सबसे छोटा मान के सूचकांक एक छपा है। यह लूप, QED के उस पुनरावृत्ति के लिए i (स्टेप साइज) के मान के बराबर है ।


1
नमस्ते और PPCG में आपका स्वागत है! शुरुआत के लिए, आपकी पोस्ट की गई बाइट गिनती टीआईओ पर मेल नहीं खाती है :) अब, त्वरित संकेतों के एक जोड़े के लिए: range(26)पर्याप्त है - आपको शुरुआत निर्दिष्ट करने की आवश्यकता नहीं है, क्योंकि 0 डिफ़ॉल्ट है; a.append(n)हो सकता है a+=[n]; पहली पंक्ति नक्शे के रूप में छोटी होगी w=list(map(ord,input())), (वास्तव में आपके वर्तमान एल्गोरिदम के साथ, Py2 में आप list(...)रैपिंग भी छोड़ सकते हैं ); जितना संभव हो सके अतिरिक्त रिक्ति / लाइन विराम से बचें (जैसे, ओनलीनेर्स में न्यूलाइन्स की कोई आवश्यकता नहीं है if p>122:p-=26) :
किरिल एल।

1
इसके अलावा, यह n>99संदेहास्पद लग रहा है, कि क्या एक अनियंत्रित स्थिरांक अनन्त लूप से बाहर है? तब यह संभवत: 26 * लेन (डब्ल्यू) जैसा होना चाहिए, जैसा कि आप कभी नहीं जानते हैं कि इनपुट कितना बड़ा होगा।
किरिल एल।

1
BTW, आप अभी भी list(...)Py3 में से छुटकारा पा सकते हैं और एक अतिरिक्त का भी if: 165 बाइट्स । इसके अलावा, इस टिप्स विषय पर एक नज़र डालें , मुझे यकीन है कि आप वहां से सलाह का उपयोग करके अपने कौशल में सुधार करेंगे!
किरिल एल।

1
मैं एक अजगर विशेषज्ञ नहीं हूं, लेकिन मुझे लगता है कि आप कर सकते हैं while p!=c and n>len(w)*26:और उस से छुटकारा पा सकते हैं अगर -8 बाइट्स के लिए बयान।
स्पितिमास्टर

2
हालांकि यह भयानक लग रहा है और सब कुछ के खिलाफ चला जाता है अजगर है, आप बदल सकते हैं n+=1और एक p+=iपर अलग लाइनों पर कर सकते हैं n+=1;p+=i
nedla2004
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.