আমি আপনাকে Nth অনুগমন, আপনি আমাকে এন


20

ইনপুট: বড়হাতের অক্ষর একটি অনুক্রম (হওয়া ASCII [65; 90]) যা এন তার অক্ষরের multiset এর আভিধানিক বিন্যাস *

* ক্রমবিধিগুলি 0 বা 1 থেকে উপরের দিকে নম্বরযুক্ত

আউটপুট: বেস -10 পূর্ণসংখ্যা এন


Rulez

  • সেখানে সদৃশ হতে পারে (যে কিভাবে এই চ্যালেঞ্জ পৃথক এই এক )
  • অক্ষরগুলি তাদের ASCII মান অনুসারে অর্ডার করা হয়
  • এর চেয়ে বড় বা 1 এর সমান কম দৈর্ঘ্যের একটি ইনপুট ক্ষেত্রে, ইনপুট প্রথম বিন্যাস এবং ফল 0বা 1যথাক্রমে
  • প্রথম অনুমানটি হ'ল যেখানে বামতম অক্ষরের সর্বনিম্ন মান থাকে, ডানদিকের চরিত্রটির সর্বাধিক মান থাকে এবং প্রথম এবং শেষ বর্ণের মধ্যে অক্ষরের ক্রমটি তার অক্ষরের মাল্টিসেটের প্রথম অনুমান হয় (পুনরাবৃত্ত সংজ্ঞা!)
  • স্বল্পতম এন্ট্রি জয়

উদাহরণ

  • ইনপুট AABআউটপুট উত্পাদন করে0
  • ইনপুট ABAআউটপুট উত্পাদন করে1
  • ইনপুট BAAআউটপুট উত্পাদন করে2

  • ইনপুট ZZZআউটপুট উত্পাদন করে0
  • ইনপুট DCBAআউটপুট উত্পাদন করে23

সম্পাদনা

যার কাছে এমন কোনও সমাধান রয়েছে যেটি এমন কোনও সমাধান নিয়ে আসতে পারে যা সমস্ত অনুমতি ছাড়াই উত্পাদন করে না এবং তারপরে ইনপুটটি অনুসন্ধান করে। এটা কিছু চ্যালেঞ্জ।


হ্যালো এবং সাইটে আপনাকে স্বাগতম। এই প্রশ্নটি বরং বরং অস্পষ্ট। আমি কীভাবে আদেশের আদেশ দেওয়া হয়েছে তা সত্যই নিশ্চিত নই। এগুলি কি ডিকোসোগ্রাফিকভাবে অর্ডার করা হয়েছে? এটি আপনার প্রশ্নের সংজ্ঞা দেওয়া উচিত।
গম উইজার্ড

1
আমাদের একটি স্যান্ডবক্সও রয়েছে যাতে আপনি আমাদের মূল সাইটে পোস্ট করার আগে এই জাতীয় প্রতিক্রিয়া পেতে পারেন। প্রথমে সেখানে পোস্ট করা বাধ্যতামূলক নয়, তবে অনেক সময় এটি খুব সহায়ক।
গম উইজার্ড

আপনি ' বড় হাতের অক্ষর ' বলেছিলেন, zzzএবং dcbaএটি বড় নয়।
ম্যাথু রোহ

@ সিআইজিএসইজিভি সংশোধন করেছে
কিরিল

আউটপুট সূচকটি 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.wikedia.org/wiki/ পরিমিতি # জেনারেশন_ ইন_লেক্সিকোগ্রাফিক_ অর্ডার থেকে

সিকোয়েন্সের লিক্সোগ্রাফিক ক্রমে পরবর্তী ক্রমান্বয়ে উত্পাদন করতে a

  1. বৃহত্তম সূচক জে যেমন একটি [জে] <ক [জে + 1] সন্ধান করুন। যদি এরকম কোনও সূচক না থাকে তবে অনুক্রমটি হ'ল শেষ অনুমান perm
  2. জে এর চেয়ে বৃহততম সূচক কে সন্ধান করুন যা একটি [জে] <ক [কে]।
  3. একটি [জে] এর মান একটি [কে] এর সাথে অদলবদল করুন।
  4. চূড়ান্ত উপাদানটিকে [j + 1] থেকে চূড়ান্ত উপাদান a [n] সহ উল্টো করুন।

এফডাব্লুআইডাব্লু, আপনি এখানে এখানে ফাংশনটির একটি টীকাযুক্ত সংস্করণ দেখতে পারেন ।


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:]যেখানে 8 টি বাইট সংরক্ষণ করতে তারা ব্যবহৃত হয় (বর্তমানে hএবং t)।
ডেভিড কনরাড

অভিনন্দন, আপনি অতিরিক্ত কুডোও পাবেন! যদিও জার্গ হালসারম্যান প্রথম ছিলেন তবে আপনার সংস্করণটি পুনরাবৃত্ত হয় সুতরাং এটি তার মতো নয়।
কিরিল

ধন্যবাদ, @ কিরিল এখন আমি ভাবছি কীভাবে বিপরীত প্রক্রিয়াটি দক্ষতার সাথে করা যায়: এর সূচক থেকে অনুমানের উত্পাদন করুন। আমি অনুমান করি যে পুনরাবৃত্তি ছাড়াই
আদেশের

1
এখানে আমি সংক্ষিপ্ততম আসতে পারি। এটি True1 বা নীচের মানের জন্য ফিরে আসে , তবে আমি আপনার কোডটি দিয়ে মনে করি যা সব ঠিক হওয়া উচিত? f=lambda n:n<2or n*f(n-1)
আরবো


3

05 এ বি 1 ই , 5 বাইট

œê¹Sk

এটি অনলাইন চেষ্টা করুন!

আদনান এর উত্তর থেকে স্বতন্ত্রভাবে আবিষ্কার।


তিনি আপনাকে 42 সেকেন্ডের ব্যবধানে পরাজিত করেছেন: ডি
কিরিল

@ ক্যারিল যদিও আপনি এখনও ভুল উত্তরটি মেনে নিয়েছেন, আমি আমার জেলি উত্তর দিয়ে 5 মিনিটের মধ্যে তাকে মারলাম।
এরিক আউটগল্ফার

তবে জেলি 1-ইনডেক্সড আউটপুট উত্পাদন করে। বিধিগুলি উল্লেখ করে যে ক্রমগুলি 0 থেকে উপরে উঠেছে। আমি লুই মেন্ডোকে ব্যতিক্রম দিয়েছিলাম যারা স্পষ্টভাবে এটি চেয়েছিল।
কিরিল


6
হ্যাঁ, নির্দিষ্ট ব্যবহারকারীদের ব্যতিক্রম দেওয়ার বিষয়টি ভ্রান্ত নয়।
এরিক আউটগল্ফার

3

পিএইচপি, 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++);

পিএইচপি, 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
)

অনলাইন সংস্করণ


এ কেমন জাদু? আপনার কাছে আসল পদ্ধতির জন্য বোনাস পয়েন্ট রয়েছে তবে আপনি এখনও সমস্ত ক্রম উত্পাদন এবং তারপরে ইনপুট অনুসন্ধান করেন।
কিরিল 11

@ ক্যারিল পিএইচপি php.net/manual/en/language.operators.increment.php স্ট্রিংগুলিকে বৃদ্ধি করতে পারে যুক্তি ইনপুটটির জন্য অনুসন্ধান করে না। এটি
ইনপুটটির

5 বাইটের জন্য আরও ক্যারিল আমি লুপটিতে print+$n´ with ´die("$n")´ and the loop will stop after the permutation is found. And I must add $ n = 0` প্রতিস্থাপন করতে পারলাম তারপর কাস্ট ইন টু পূর্ণসংখ্যা এই পরিবর্তনটিতে কাজ করে না
জার্গ হালসারম্যান

1
আমি পিএইচপি পড়ি না, তবে আমি মনে করি আপনার প্রসারিত অ্যালগরিদমটি আমার সাথে মোটামুটি মিল। এফডাব্লুআইডাব্লু, আমি আমার উত্তরটি লেখার পরে অবধি লক্ষ্য করিনি।
প্রধানমন্ত্রী 2Ring

1
@ পিএম 2 রিং এটি হতে পারে আমি সত্যিই আপনার অজগর সংস্করণটি পড়তে পারিনি
জার্গ হালসারম্যান

3

জুলিয়া, 121 125 বাইট

নন-কেপটিং, কারণ এটি সদৃশ অক্ষরের সাথে সঠিকভাবে ডিল করে না। আমি বেশ কয়েক বছর আগে প্রজেক্ট ইউলারের সমস্যার সমাধানের অংশ থেকে অন্য একটি ভাষা থেকে এটিকে পোর্ট করেছি এবং প্রথমটি, 121-বাইট সংস্করণে একটি বাগ ছিল কারণ আমি অনুমতিপ্রাপ্ত স্ট্রিং এবং সাজানো, ক্যানোনিকাল রেফারেন্সের ব্যবহার স্থানান্তর করেছি because স্ট্রিং।

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 টি অতিরিক্ত বাইটের দামে বিনমনাম ব্যবহার করে:

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

একটি ফ্যাকটোরিয়াডিক নম্বর সিস্টেম ব্যবহার করে , কিউভি ব্যবহার করে সুতরাং, এটি সমস্ত ক্রিয়াকলাপ তৈরি করে না এবং বৃহত ইনপুটগুলির ক্ষেত্রে এটির চেয়ে প্রচুর দ্রুত চলবে।

উদাহরণস্বরূপ, বর্ণমালা বরং পরিবর্তিত বাক্যটিতে অনুমতি দেওয়া যেতে পারে "কোয়ার্টজ গ্লাইফ জব সিডব্লুএম ফাইনস ভ্যাকস।" সেই বাক্যটি বর্ণমালার বর্ণগুলির 259,985,607,122,410,643,097,474,123 তম অভিধানিকৃত অনুমান। (আনুমানিক 260 সেপটিলিয়নথ ক্রমাঙ্কন।) এই প্রোগ্রামটি আমার মেশিনে প্রায় 65। এর মধ্যে খুঁজে পাওয়া যায়।

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

নোট করুন যে সংখ্যাটি 122 এর পরিবর্তে ... 122 এ শেষ হবে কারণ ওপি অনুরোধ করেছে যে অনুমতিগুলি 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

এটি কেবলমাত্র পিএম 2 রিংয়ের উজ্জ্বল পাইথন সমাধানের সরল জুলিয়া বন্দর। আমি ক্ষুধার্ত হয়ে পড়েছি, তাই আমি সিদ্ধান্ত নিয়েছি যে আমি সর্বোপরি কুকি চাই। দুটি ভাষার মিল এবং পার্থক্যগুলি দেখতে আকর্ষণীয়। আমি itertools.groupby(সীমিত আকারে) হিসাবে বাস্তবায়ন করেছিg(w)

তবে যুক্তিটি আমার নয়, তাই যান এবং প্রধানমন্ত্রীর 2 রিংয়ের উত্তরটিকে অগ্রাহ্য করুন

প্রতিস্থাপন f=factorialসঙ্গে f(x)=factorial(BigInt(x))আপনি পি ( "QUARTZGLYPHJOBVEXDCWMFINKS") মত বৃহৎ ইনপুট হ্যান্ডেল করতে সক্ষম হতে চান।


চমৎকার। আপনি কুকি পেতে! কেবল বর্ণহীন সংস্করণে পরিবর্তনীয় নামগুলি ঠিক করুন।
কিরিল

1
আসলে আমি আমার কুকি ফিরে চাই। আপনার প্রোগ্রামটি BAAপ্রত্যাশিত 2, বাস্তবের জন্য ভুল ফলাফল দেয় 3
কাইরিল

@ ক্যারিল আহ, মনে হচ্ছে আমি নকলগুলি ভুল বুঝেছি। সেক্ষেত্রে আমি নিশ্চিত নই যে আমি এটি করার কোনও উপায় দেখতে পাচ্ছি যা সমস্ত অনুমানের উত্পাদন এড়াতে পারে।
ডেভিড কনরাড

এফডাব্লুআইডাব্লু, আমার উত্তরটি একই রকম কাজ করে তবে বারবার অক্ষরের সাথে ইনপুট স্ট্রিংয়ের জন্য।
প্রধানমন্ত্রী 2Ring

3

এমএটিএল , 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ডান অপসারণ করবেন ?
কিরিল

@ কিরিল ঠিক :-)
লুইস মেন্ডো

1
আর এস এর কী হবে? আপনার কি সত্যিই এটিকে সাজানোর আগে বাছাই করতে হবে?
জিবি

@ জিবি গুড পয়েন্ট, এটির দরকার নেই! আমি ভুলে গেছি যে "সমস্ত অনুমতি" ফাংশন সূচকে নয়, মানগুলির উপর ভিত্তি করে সাজানো। ধন্যবাদ!
লুইস মেন্ডো

2

গণিত, 33 31 বাইট

সমস্যা বর্ধিতকরণটিকে 2-বাইট সঞ্চয় করার অনুমতি দেওয়া হয়েছে।

Permutations@Sort@#~Position~#&

খাঁটি ফাংশন ইনপুট হিসাবে একটি তালিকা গ্রহণ এবং Nফর্ম একটি nonnegative পূর্ণসংখ্যা ফিরে {{N}}


1
আপনি ড্রপ করতে পারেন -1
মার্টিন এন্ডার

@ মার্টিনএন্ডার মূলত এই প্রয়োজন ছিল যে
অনুমতিগুলি

@ ক্যারিল হ্যাঁ, তবে আপনি এটি সরিয়ে দিয়েছেন, যাতে গ্রেগ সেই দুটি বাইট সংরক্ষণ করতে পারে।
মার্টিন এন্ডার

2

জাভাস্ক্রিপ্ট (ES6), 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>


ঠিক আছে, আপনি একটি কুকি পান না, তবে অনুমতি তৈরি করতে আপনার নিজস্ব ফাংশন বাস্তবায়নের জন্য অতিরিক্ত ক্রেডিট পাবেন ;-)
কাইরিল


1

পাইথ, 5 বাইট

xS{.p

অনলাইন দোভাষী

উদ্ধৃত ইনপুট নেয়।


পছন্দ করুন
এরিক আউটগল্ফার

@ লিক্যনুন ইনপুটটি '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"))

আইডিয়োন এ এটি অনলাইন চেষ্টা করুন

দুর্ভাগ্যক্রমে, permutationsএকটি পুনরাবৃত্তি প্রদান করে, যার কোনও sortedপদ্ধতি নেই, সুতরাং এটিকে একটিতে রূপান্তর করতে হবেSeq


1

সি ++, 96 বাইট

আমরা এখানে স্ট্যান্ডার্ড লাইব্রেরির পুরো ব্যবহার করতে পারি। অক্ষরের তালিকাটি স্ট্যান্ডার্ড সি ++ স্টাইলে স্টার্ট / শেষ পুনরাবৃত্তকারী হিসাবে পাস করা হয়।

#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

এটি একটি আসল পদ্ধতির। আপনাকেও অতিরিক্ত কুডোস!
কিরিল


0

রুবি, 50 বাইট

আমি আশা করি এটি আরও কম হবে। আমি যোগ করা যেত sortযদি ডক্স বলেন নি "বাস্তবায়ন ক্রমে একাধিক বিন্যাসন পাওয়া সম্পর্কে কোন গ্যারান্টি করে তোলে।"

->x{x.chars.permutation.map{|v|v*""}.sort.index x}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.