मैं तुम्हें एनटी क्रमोन्नति देता हूं, तुम मुझे एन दे दो


20

इनपुट: अपरकेस अक्षरों का एक क्रम (ASCII [65; 90]) जो कि एन वें * अपने चरित्रों के बहुरूपियों का शाब्दिक क्रमांकन है।

* क्रमपरिवर्तन 0 या 1 से ऊपर की ओर हैं

आउटपुट: बेस -10 पूर्णांक एन


Rulez

  • डुप्लिकेट हो सकता है (कि यह चुनौती इस एक से कैसे अलग है )
  • पात्रों को उनके ASCII मूल्य द्वारा आदेश दिया जाता है
  • 1 से कम या उसके बराबर लंबाई के इनपुट के मामले में, इनपुट पहला क्रमपरिवर्तन है और परिणाम क्रमशः 0या 1है
  • पहला क्रमचय वह है जिसमें सबसे बाएं वर्ण का निम्नतम मान होता है, सबसे सही वर्ण का उच्चतम मान होता है, और प्रथम और अंतिम वर्ण के बीच के वर्णों का अनुक्रम उसके वर्णों की बहु-क्रम (पुनरावर्ती परिभाषा) का पहला क्रमचय होता है !
  • सबसे छोटी प्रविष्टि जीतती है

उदाहरण

  • इनपुट AABआउटपुट उत्पन्न करता है0
  • इनपुट ABAआउटपुट उत्पन्न करता है1
  • इनपुट BAAआउटपुट उत्पन्न करता है2

  • इनपुट ZZZआउटपुट उत्पन्न करता है0
  • इनपुट DCBAआउटपुट उत्पन्न करता है23

संपादित करें

अतिरिक्त कुडोस जो एक समाधान के साथ आ सकता है जो सभी क्रमपरिवर्तन का उत्पादन नहीं करता है और फिर इनपुट की खोज करता है। यह कुछ चुनौती है।


नमस्कार और साइट पर आपका स्वागत है। यह प्रश्न वर्तमान में स्पष्ट नहीं है। मैं वास्तव में निश्चित नहीं हूं कि क्रमपरिवर्तन का आदेश कैसे दिया जाता है। क्या उन्हें शाब्दिक रूप से आदेश दिया गया है? इसे आपके प्रश्न में परिभाषित किया जाना चाहिए।
गेहूं जादूगर

1
हमारे पास एक सैंडबॉक्स भी है ताकि आप हमारी मुख्य साइट पर पोस्ट करने से पहले इस तरह की प्रतिक्रिया प्राप्त कर सकें। पहले वहां पोस्ट करना अनिवार्य नहीं है, लेकिन कई बार यह बहुत मददगार होता है।
गेहूं जादूगर

आपने 'अपरकेस' कहा, zzzऔर dcbaयह अपरकेस नहीं है।
मैथ्यू रोह

@SIGSEGV ने सही किया
kyrill

क्या आउटपुट-इंडेक्स 0-आधारित के बजाय 1-आधारित हो सकता है?
लुइस मेंडो

जवाबों:




4

पायथन, 302 287 बाइट्स

डेड पॉसम ने पहले ही एक छोटा पायथोनिक समाधान पोस्ट किया है, इसलिए मैंने अतिरिक्त कुडोस के लिए जाने का फैसला किया। यह समाधान सभी क्रमपरिवर्तन उत्पन्न नहीं करता है। यह तेजी से एक बड़े स्ट्रिंग के क्रमचय सूचकांक की गणना कर सकता है; यह एक खाली स्ट्रिंग को भी सही ढंग से संभालता है।

from math import factorial as f
from itertools import groupby as g
def p(t,b=''):
 if len(t)<2:return 0
 z,b=0,b or sorted(t)
 for i,c in enumerate(b):
  w=b[:i]+b[i+1:]
  if c==t[0]:return z+p(t[1:],w)
  if i<1 or c!=b[i-1]:
   n=f(len(w))
   for _,v in g(w):n//=f(len(list(v)))
   z+=n

परीक्षण कोड:

def lexico_permute_string(s):
    ''' Generate all permutations of `s` in lexicographic order '''
    a = sorted(s)
    n = len(a) - 1
    while True:
        yield ''.join(a)
        for j in range(n-1, -1, -1):
            if a[j] < a[j + 1]:
                break
        else:
            return
        v = a[j]
        for k in range(n, j, -1):
            if v < a[k]:
                break
        a[j], a[k] = a[k], a[j]
        a[j+1:] = a[j+1:][::-1]

def test_all(base):
    for i, s in enumerate(lexico_permute_string(base)):
        rank = p(s)
        assert rank == i, (i, s, rank)
        print('{:2} {} {:2}'.format(i, s, rank))
    print(repr(base), 'ok\n')

for base in ('AAB', 'abbbbc'):
    test_all(base)

def test(s):
    print('{!r}\n{}\n'.format(s, p(s)))

for s in ('ZZZ', 'DCBA', 'a quick brown fox jumps over the lazy dog'):
    test(s)

उत्पादन

 0 AAB  0
 1 ABA  1
 2 BAA  2
'AAB' ok

 0 abbbbc  0
 1 abbbcb  1
 2 abbcbb  2
 3 abcbbb  3
 4 acbbbb  4
 5 babbbc  5
 6 babbcb  6
 7 babcbb  7
 8 bacbbb  8
 9 bbabbc  9
10 bbabcb 10
11 bbacbb 11
12 bbbabc 12
13 bbbacb 13
14 bbbbac 14
15 bbbbca 15
16 bbbcab 16
17 bbbcba 17
18 bbcabb 18
19 bbcbab 19
20 bbcbba 20
21 bcabbb 21
22 bcbabb 22
23 bcbbab 23
24 bcbbba 24
25 cabbbb 25
26 cbabbb 26
27 cbbabb 27
28 cbbbab 28
29 cbbbba 29
'abbbbc' ok

'ZZZ'
0

'DCBA'
23

'a quick brown fox jumps over the lazy dog'
436629906477779191275460617121351796379337

गैर-गोल्फ संस्करण:

''' Determine the rank (lexicographic index) of a permutation 
    The permutation may contain repeated items

    Written by PM 2Ring 2017.04.03
'''

from math import factorial as fac
from itertools import groupby

def lexico_permute_string(s):
    ''' Generate all permutations of `s` in lexicographic order '''
    a = sorted(s)
    n = len(a) - 1
    while True:
        yield ''.join(a)
        for j in range(n-1, -1, -1):
            if a[j] < a[j + 1]:
                break
        else:
            return
        v = a[j]
        for k in range(n, j, -1):
            if v < a[k]:
                break
        a[j], a[k] = a[k], a[j]
        a[j+1:] = a[j+1:][::-1]

def perm_count(s):
    ''' Count the total number of permutations of sorted sequence `s` '''
    n = fac(len(s))
    for _, g in groupby(s):
        n //= fac(sum(1 for u in g))
    return n

def perm_rank(target, base):
    ''' Determine the permutation rank of string `target`
        given the rank zero permutation string `base`,
        i.e., the chars in `base` are in lexicographic order.
    '''
    if len(target) < 2:
        return 0
    total = 0
    head, newtarget = target[0], target[1:]
    for i, c in enumerate(base):
        newbase = base[:i] + base[i+1:]
        if c == head:
            return total + perm_rank(newtarget, newbase)
        elif i and c == base[i-1]:
            continue
        total += perm_count(newbase)

base = 'abcccdde'
print('total number', perm_count(base))

for i, s in enumerate(lexico_permute_string(base)):
    rank = perm_rank(s, base)
    assert rank == i, (i, s, rank)
    #print('{:2} {} {:2}'.format(i, s, rank))
print('ok')

के बारे में lexico_permute_string

यह एल्गोरिथ्म, नारायण पंडिता के कारण है https://en.wikipedia.org/wiki/Permutation#Generation_in_lexicographic_order से है

लेक्सिकोग्राफ़िक क्रम में अगला क्रमचय उत्पन्न करने के लिए a

  1. सबसे बड़ा इंडेक्स जे का पता लगाएं, जैसे कि [जे] <[जे + 1]। यदि ऐसा कोई सूचकांक मौजूद नहीं है, तो क्रमपरिवर्तन अंतिम क्रमपरिवर्तन है।
  2. J से बड़ा सबसे बड़ा इंडेक्स k खोजें जैसे कि [j] <[k]।
  3. [K] के साथ [k] का मान स्वैप करें।
  4. अनुक्रम को एक [जे + 1] से उल्टा और अंतिम तत्व सहित [एन]।

FWIW, आप यहाँ उस फ़ंक्शन का एक एनोटेट संस्करण देख सकते हैं ।


FWIW, यहाँ उलटा फ़ंक्शन है।

def perm_unrank(rank, base, head=''):
    ''' Determine the permutation with given rank of the 
        rank zero permutation string `base`.
    '''
    if len(base) < 2:
        return head + ''.join(base)

    total = 0
    for i, c in enumerate(base):
        if i < 1 or c != base[i-1]:
            newbase = base[:i] + base[i+1:]
            newtotal = total + perm_count(newbase)
            if newtotal > rank:
                return perm_unrank(rank - total, newbase, head + c)
            total = newtotal
# Test

target = 'a quick brown fox jumps over the lazy dog'
base = ''.join(sorted(target))
rank = perm_rank(target, base)
print(target)
print(base)
print(rank)
print(perm_unrank(rank, base))

उत्पादन

a quick brown fox jumps over the lazy dog
        aabcdeefghijklmnoooopqrrstuuvwxyz
436629906477779191275460617121351796379337
a quick brown fox jumps over the lazy dog

और यहाँ एक फ़ंक्शन है जिसे मैंने विकसित करते समय लिखा था perm_unrankजो उप-खंडों के टूटने को दर्शाता है।

def counts(base):
    for i, c in enumerate(base):
        newbase = base[:i] + base[i+1:]
        if newbase and (i < 1 or c != base[i-1]):
            yield c, perm_count(newbase)
            for h, k in counts(newbase):
                yield c + h, k 

def show_counts(base):
    TAB = ' ' * 4
    for s, t in counts(base):
        d = len(s) - 1
        print('{}{} {}'.format(TAB * d, s, t))

# Test
base = 'abccc'
print('total number', perm_count(base))
show_counts(base)

उत्पादन

a 4
    ab 1
        abc 1
            abcc 1
    ac 3
        acb 1
            acbc 1
        acc 2
            accb 1
            accc 1
b 4
    ba 1
        bac 1
            bacc 1
    bc 3
        bca 1
            bcac 1
        bcc 2
            bcca 1
            bccc 1
c 12
    ca 3
        cab 1
            cabc 1
        cac 2
            cacb 1
            cacc 1
    cb 3
        cba 1
            cbac 1
        cbc 2
            cbca 1
            cbcc 1
    cc 6
        cca 2
            ccab 1
            ccac 1
        ccb 2
            ccba 1
            ccbc 1
        ccc 2
            ccca 1
            cccb 1

वाह! अद्भुत समाधान! पाइथन के कुछ बिट्स हैं यहां मैं परिचित नहीं हूं कि मुझे इसे पूरी तरह से समझने के लिए ऊपर जाना होगा। बहुत बढ़िया!
डेविड कॉनराड

आप को बदल सकते हैं z=0और में स्थानापन्न t[0]और t[1:]जहां वे (वर्तमान में इस्तेमाल कर रहे हैं hऔर t) 8 बाइट्स को बचाने के लिए।
डेविड कॉनराड

बधाई हो, आपको अतिरिक्त कुदोस भी मिलते हैं! भले ही जार्ग हुल्सरमैन पहले था, लेकिन आपका संस्करण पुनरावर्ती है, इसलिए यह उसके जैसा नहीं है।
kyrill

धन्यवाद, @kyrill अब मैं सोच रहा हूं कि रिवर्स प्रक्रिया को कुशलता से कैसे किया जाए: इसके सूचकांक से क्रमचय का उत्पादन करें। मुझे लगता है कि दोहराव के बिना क्रमपरिवर्तन के लिए इस्तेमाल की जाने वाली सामान्य फैक्टरियल-बेस तकनीक को संशोधित करना बहुत मुश्किल नहीं होना चाहिए ...
PM 2Ring

1
यहाँ मैं सबसे कम आ सकता है। यह True1 या उससे कम के मानों के लिए लौटता है , लेकिन मुझे लगता है कि आपके कोड के साथ सब ठीक होना चाहिए? f=lambda n:n<2or n*f(n-1)
अरेबो


3

05AB1E , 5 बाइट्स

œê¹Sk

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

अदनान के जवाब से स्वतंत्र रूप से पता चला।


उसने आपको 42 सेकंड तक हराया: D
kyrill

@kyrill यद्यपि आपने अभी भी गलत उत्तर को स्वीकार किया है, मैंने उसे अपने जेली के उत्तर के साथ 5 मिनट से हराया।
एर्गेल आउटफर

लेकिन उस जेली में 1-अनुक्रमित उत्पादन होता है। नियम बताते हैं कि क्रमपरिवर्तन 0 से ऊपर की ओर हैं। मैंने लुइस मेंडो को एक अपवाद दिया, जिन्होंने स्पष्ट रूप से इसके लिए कहा था।
kyrill


6
हाँ, कुछ उपयोगकर्ताओं को अपवाद देते हुए उसे छोड़ दिया जाता है।
आउटगोल्फर

3

PHP, 124 बाइट्स

$a=str_split($argn);sort($a);for($i=$j=join($a);$i<=strrev($j);$i++)$i==$argn?print+$n:(($c=count_chars)($i)!=$c($j)?:$n++);

PHP, 136 बाइट्स

foreach($t=($c=count_chars)($argn)as$k=>$v)$i=$s.=str_repeat(chr($k),$v);for(;$i<=strrev($s);$i++)$i==$argn?print+$n:($c($i)!=$t?:$n++);

ऑनलाइन संस्करण

साथ दौड़ो

echo '<string>' | php -nR '<code>'

तथ्य के साथ गणना करें

विस्तारित संस्करण

function f($i){return array_product(range(1,$i));} #factorial
function p($s){
return f(strlen($s))/array_product(array_map("f",count_chars($s,1)));
} # factorial / divide through product of factorials for each char
$a=$argn;
$b="";
$r=[];
for($d=0;$a;$d++) # loop range before used chars in string 
{
    for($i=0;$i<strlen($a);$i++){ # loop for every char in the rest string 
        if($a[$i]<$a[0]) # if char is before first char order by ascii
        $r[$d.$a[$i]]=p(substr_replace($a,"",$i,1)); # add range before
    }
    $a=substr($a,1); # remove first char
}
echo array_sum($r); # Output the range before the used permutation

स्ट्रिंग पीपीसीजी के लिए आउटपुट

Array
(
    [0C] => 3    # in first run C is before P startposition = 3
    [0G] => 3    # in first run G is before P startposition = 3+3
    [1C] => 2    # in second run PC is before PP startposition = 3+3+2
    [1G] => 2    # in second run PG is before PP startposition = 3+3+2+2=8
)

ऑनलाइन संस्करण


यह कैसा जादू है? आपके पास मूल दृष्टिकोण के लिए बोनस अंक हैं, लेकिन आप अभी भी सभी क्रमपरिवर्तन का उत्पादन करते हैं और फिर इनपुट की खोज करते हैं।
किरिल

@kyrill PHP तार बढ़ा सकता है php.net/manual/en/language.operators.increment.php इनपुट के लिए तर्क नहीं खोजता है । यह इनपुट की तुलना में अधिक है
Jörg Hülsermann

@ बायरल 5 बाइट के लिए मैं print+$n´ with ´die("$n")´ and the loop will stop after the permutation is found. And I must add $ n = 0` को लूप में बदल सकता था, फिर पूर्णांक में कलाकारों को इस परिवर्तन में काम नहीं करना
Jörg Hülsermann

1
मैं PHP नहीं पढ़ता, लेकिन मुझे लगता है कि आपका विस्तारित एल्गोरिथ्म मेरा काफी समान है। एफडब्ल्यूआईडब्ल्यू, मैंने ध्यान नहीं दिया कि जब तक मैं अपना जवाब नहीं लिखूंगा।
PM 2Ring

1
@ PM2Ring यह हो सकता है कि मैं वास्तव में आपके अजगर संस्करण को नहीं पढ़ सका
Jörg Hülsermann

3

जूलिया, 121 125 बाइट्स

नॉनकंपेटिंग, क्योंकि यह डुप्लिकेट पत्रों से सही तरीके से नहीं निपटता है। मैंने इसे एक अन्य भाषा से, एक परियोजना यूलर समस्या के समाधान के भाग से, जो मैंने कई साल पहले किया था, और पहले, 121-बाइट संस्करण में एक बग था क्योंकि मैंने अनुमत स्ट्रिंग और सॉर्ट किए गए, कैनोनिकल संदर्भ का उपयोग किया था। स्ट्रिंग।

f(p)=(n=0;z=length(p)-1;s=join(sort(collect(p)));for c in p z-=(n+=factorial(z)*(search(s, c)-1);p=replace(s,c,"",1);1)end;n)

बड़े इनपुट्स के लिए, यह संस्करण 8 अतिरिक्त बाइट्स की कीमत पर bignums का उपयोग करता है:

f(p)=(n=0;z=BigInt(length(p)-1);s=join(sort(collect(p)));for c in p z-=(n+=factorial(z)*(search(s, c)-1);p=replace(s,c,"",1);1)end;n)

Ungolfed:

function f(perm)
    nth = 0
    size = length(perm) - 1
    sorted = join(sort(collect(p)))
    for ch in sorted
        index = search(perm, ch) - 1
        nth += factorial(size) * index
        perm = replace(perm, ch, "" , 1) # replace at most one copy
        size -= 1
    end
    return nth
end

एक कारक संख्या प्रणाली का उपयोग करता है , qv इस प्रकार, यह सभी क्रमपरिवर्तन का उत्पादन नहीं करता है और बड़े आदानों के लिए उन लोगों की तुलना में बहुत तेजी से चलेगा।

उदाहरण के लिए, वर्णमाला को बल्कि वंचित वाक्य "क्वार्ट्ज ग्लिफ़ जॉब vex'd cwm सिंक" में अनुमति दी जा सकती है। वह वाक्य वर्णमाला के अक्षरों का 259,985,607,122,410,643,097,474,123 वाँ कोशिक क्रमांक है। (लगभग 260 सेप्टिल्थ क्रमचय।) इस कार्यक्रम में पाया गया कि मेरी मशीन पर लगभग 65 se है।

julia> @time f("quartzglyphjobvexdcwmfinks")
  0.000065 seconds (570 allocations: 19.234 KB)
259985607122410643097474122

ध्यान दें कि संख्या ... 122 के बजाय ... 123 में समाप्त होती है क्योंकि ओपी ने अनुरोध किया था कि क्रमपरिवर्तन 1 के बजाय 0 से गिने जाएं।

जूलिया, 375 बाइट्स

मैंने पठनीयता के लिए इंडेंटेशन छोड़ दिया है, लेकिन बाइट गिनती इसके बिना है।

p(t,b="")=begin
    l=length
    if l(t)<2 return 0 end
    f=factorial
    g(w)=(a=[];
        while w!=""
            s=""
            for c in w if c==w[1] s="$s$c" end end
            w=replace(w,s,"")
            push!(a,s)
        end;a)
    b=b>""?b:join(sort(collect(t)))
    z=0
    for(i,c) in enumerate(b)
        w=b[1:i-1]*b[i+1:end]
        if c==t[1] return z+p(t[2:end],w)
        elseif i>1&&c==b[i-1] continue end
        n=f(l(w))
        for v in g(w) n=div(n,f(l(v))) end
        z+=n
    end
    z
end

यह पीएम 2Ring के शानदार पायथन समाधान का एक सीधा जूलिया पोर्ट है। मुझे भूख लगी थी, इसलिए मैंने फैसला किया कि मुझे कुकी की इच्छा है। दो भाषाओं के बीच समानताएं और अंतर देखना दिलचस्प है। मैंने itertools.groupby(एक सीमित रूप में) लागू कियाg(w)

लेकिन तर्क मेरा नहीं है, इसलिए जाओ और PM 2Ring के जवाब को आगे बढ़ाओ

बदलें f=factorialके साथ f(x)=factorial(BigInt(x))अगर आप पी ( "QUARTZGLYPHJOBVEXDCWMFINKS") जैसे बड़े निवेशों को संभालने में सक्षम होना चाहता हूँ।


अति उत्कृष्ट। आप कुकी प्राप्त करें! बस ungolfed संस्करण में चर नाम ठीक करें।
kyrill

1
वास्तव में मुझे अपनी कुकी वापस चाहिए। आपका कार्यक्रम गलत परिणाम देता है BAA- अपेक्षित 2, वास्तविक 3
किरिल

@kyrill आह, ऐसा लगता है कि मैंने डुप्लिकेट को गलत समझा। उस स्थिति में, मुझे यकीन नहीं है कि मैं ऐसा करने का एक तरीका देख सकता हूं जो सभी क्रमपरिवर्तन के उत्पादन से बच जाएगा।
डेविड कॉनरैड

FWIW, मेरा जवाब एक समान काम करता है, लेकिन बार-बार चार्ट के साथ इनपुट स्ट्रिंग्स के लिए।
PM 2Ring

3

MATL , 13 12 11 बाइट्स

1 बाइट जीबी के लिए धन्यवाद बचा लिया !

tY@Xu=!Af1)

आउटपुट 1-आधारित है।

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

व्याख्या

t      % Input string implicitly. Duplicate
Y@     % All permutations, sorted; each in a different row
Xu     % Unique rows
=      % Compare for equality, with broadcast
!      % Transpose
A      % All: true for columns that contain all entries true
f      % Find: indices of nonzero elements
1)     % Get first of those indices. Implicitly display

अब तुम सिर्फ qसही निकालोगे?
kyrill

@ सर्किल बिल्कुल :-)
लुइस

1
और S का क्या? क्या आपको वास्तव में क्रमपरिवर्तन से पहले इसे क्रमबद्ध करने की आवश्यकता है?
जीबी

@ जीबी अच्छी बात है, इसकी जरूरत नहीं है! मैं भूल गया कि "सभी क्रमपरिवर्तन" फ़ंक्शन मानों पर आधारित हैं, न कि सूचकांकों पर। धन्यवाद!
लुइस मेंडो

2

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

2-बाइट बचत के लिए अनुमति दी गई समस्या युक्ति को बदलना।

Permutations@Sort@#~Position~#&

शुद्ध कार्य इनपुट के रूप में एक सूची ले रहा है और Nफॉर्म में एक नॉनजेटिव पूर्णांक लौटा रहा है {{N}}


1
तुम गिरा सकते हो -1
मार्टिन एंडर

@ मर्टिनएंडर मूल रूप से एक आवश्यकता थी कि क्रमपरिवर्तन को 0. से अनुक्रमित किया जाए
kyrill

@kyrill हाँ, लेकिन आपने इसे हटा दिया, इसलिए ग्रेग उन दो बाइट्स को बचा सकता है।
मार्टिन एंडर

2

जावास्क्रिप्ट (ईएस 6), 130 बाइट्स

s=>(o=new Set,p=(s,q)=>s.map((t,i)=>p(t=[...s],q.concat(t.splice(i,1))))[0]||o.add(q.join``))([...s],[])&&[...o].sort().indexOf(s)

कम गोल्फ वाला

s=>{
  o = new Set; // use a set to avoid duplicates

  // recursive function to build all permutations (no cookie for me)
  p = (s, q) => 
  {
    y = s.map( (t,i) => // execute for each char at position i
          (
             t = [...s], // using t as local variable, store a copy of s
             x = t.splice(i,1), // remove char from t in position i, and store in array x
             p(t, q.concat(x)) // recursive call
          ));
    if (!y[0]) // if s was empty, I have a new permutation in q
      o.add( q.join('')) // convert to string and add to output set 
  }
  // call p to enumerate all permutations
  p( [...s], [] ) // convert string s to array, q starts empty

  o = [...o].sort() // get elements of o and sort lexicographically 
  return o.indexOf(s) // return the position of the input in o
}

परीक्षा

F=
s=>(o=new Set,p=(s,q)=>s.map((t,i)=>p(t=[...s],q.concat(t.splice(i,1))))[0]||o.add(q.join``))([...s],[])&&[...o].sort().indexOf(s)

function update() {
  O.textContent = F(I.value)
}

update()
<input id=I value='DCBA' oninput='update()'>
<pre id=O></pre>


ठीक है, आपको एक कुकी नहीं मिलती है, लेकिन आप क्रमपरिवर्तन उत्पन्न करने के लिए अपने स्वयं के कार्य को लागू करने के लिए अतिरिक्त क्रेडिट प्राप्त करते हैं ;-)
kyrill


1

अजगर, 5 बाइट्स

xS{.p

ऑनलाइन दुभाषिया

उद्धृत इनपुट लेता है।


@LeakyNun यह काम नहीं करता है।
आउटगोल्फर

@LeakyNun इनपुट शून्य-अनुक्रमित होने के बाद 'BAA'वापस लौटना चाहिए 2, लेकिन यह 4बदले में लौटता है ।
को आउटगोल्फर

1

स्काला, 40 बाइट्स

s=>s.permutations.toSeq.sorted indexOf s

इसका उपयोग करने के लिए, इस फ़ंक्शन को एक चर में असाइन करें:

val f:(String=>Int)=s=>s.permutations.toSeq.sorted indexOf s
println(f("BAA"))

इसे ऑनलाइन ideone पर आज़माएं

दुर्भाग्य से, permutationsएक पुनरावृत्त रिटर्न देता है, जिसमें एक sortedविधि नहीं है , इसलिए इसे एक में बदलना होगाSeq


1

सी ++, 96 बाइट्स

हम यहां मानक पुस्तकालय का पूरा उपयोग कर सकते हैं। अक्षरों की सूची मानक C ++ शैली में प्रारंभ / समाप्ति पुनरावृत्तियों के रूप में पारित की गई है।

#include<algorithm>
int f(char*a,char*z){int i=0;while(std::prev_permutation(a,z))++i;return i;}

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

परीक्षण कार्यक्रम:

#include<cstring>
#include<iostream>
int main(int argc, char **argv)
{
    while (*++argv)
        std::cout << *argv << ": "
                  << f(*argv, *argv+std::strlen(*argv)) << std::endl;
}

परीक्षण के परिणाम:

BAA: 0
BAA: 1
BAA: 2
ZZZ: 0
DCBA: 23
: 0

यह एक मूल दृष्टिकोण है। आपके लिए भी अतिरिक्त कुदोस!
kyrill


0

रूबी, 50 बाइट्स

मुझे उम्मीद थी कि यह छोटा होगा। मैं नहीं जोड़ा है | sortअगर डॉक्स नहीं कहा "कार्यान्वयन जिस क्रम में क्रमपरिवर्तन झुकेंगे कर रहे हैं के बारे में कोई गारंटी नहीं देता।"

->x{x.chars.permutation.map{|v|v*""}.sort.index x}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.