Tìm thứ hạng của một từ


23

Định nghĩa

Thứ hạng của một từ được định nghĩa là vị trí của từ khi tất cả các hoán vị (hoặc sắp xếp) có thể có của các chữ cái được sắp xếp theo thứ tự abc, như trong từ điển, bất kể các từ đó có ý nghĩa hay không.

Chúng ta hãy xem xét hai từ này - "màu xanh" và "nhìn thấy". Để bắt đầu, chúng tôi sẽ viết tất cả các sắp xếp có thể có của các chữ cái của các từ này theo thứ tự bảng chữ cái:

"blue": "belu","beul","bleu","blue","buel","bule","eblu","ebul","elub","elbu","eubl",
        "eulb","lbeu","lbue","lebu","leub","lube","lueb","ubel","uble","uebl","uelb",
        "ulbe","uleb"
"seen": "eens","eesn","enes","ense","esen","esne","nees","nese","nsee","seen",
        "sene","snee"

Bây giờ chúng ta hãy nhìn từ bên trái và tìm vị trí của các từ chúng ta cần. Chúng tôi thấy rằng từ "màu xanh" ở vị trí thứ 4 và "nhìn thấy" ở vị trí thứ 10. Vì vậy, thứ hạng của từ "màu xanh" là 4 và thứ hạng của "nhìn thấy" là 10. Đây là cách tính chung cho thứ hạng của một từ. Hãy chắc chắn rằng bạn bắt đầu đếm từ 1 chỉ.

Bài tập

Nhiệm vụ của bạn là viết mã để lấy bất kỳ từ nào làm đầu vào và hiển thị thứ hạng của nó. Thứ hạng nên là đầu ra. Hãy cẩn thận về các từ có chứa các chữ cái lặp đi lặp lại.

Ví dụ

"prime" -> 94

"super" -> 93

"bless" -> 4

"speech" -> 354

"earth" -> 28

"a" -> 1

"abcd" -> 1

"baa" -> 3    

Bạn có thể giả sử đầu vào hoàn toàn bằng chữ thường và đầu vào sẽ chỉ chứa các ký tự chữ cái . Ngoài ra nếu một khoảng trống hoặc một chuỗi không hợp lệ được nhập vào, bạn có thể trả lại bất cứ thứ gì.

Chấm điểm

Đây là , vì vậy đoạn mã ngắn nhất sẽ thắng!



14
"Hãy chắc chắn rằng bạn bắt đầu đếm từ 1." - Hoàn toàn tùy thuộc vào bạn để có yêu cầu này, nhưng xin lưu ý rằng việc cho phép lập chỉ mục dựa trên 0 hoặc 1 cho các thách thức đó là khá phổ biến.
Jonathan Allan

1
Vâng ikr nhưng nếu bạn bắt đầu từ 0 thì bạn thực sự không hiển thị thứ hạng ban đầu, đó là lý do tại sao tôi quyết định thêm yêu cầu này.
Manish Kundu

Liên kết hữu ích . Bạn sẽ nhận được AC nếu chương trình của bạn chạy kịp thời O(n log n)hoặc ít hơn. (xin lỗi, không có Python) Trình của tôi (C ++) mất 2,53 giây để giải bài kiểm tra 14.
user202729

Tôi có thể làm một tuple hoặc một danh sách với từ đó, ví dụ ['h', 'e', 'l', 'l', 'o']như trái ngược với 'hello'?
0WJYxW9FMN

Câu trả lời:





4

Bình thường , 6 byte

hxS{.p

Bộ thử nghiệm.

Giải trình

hxS {.p | | Chương trình đầy đủ.

    .p | | Tất cả các hoán vị của đầu vào.
   {|| Khử trùng lặp.
  S | | Sắp xếp.
 x | | Chỉ số của đầu vào vào danh sách này.
h | | Tăng.

3

Thạch , 5 byte

Œ!ṢQi

Hãy thử trực tuyến! hoặc xem bộ kiểm tra

Làm thế nào nó hoạt động

Œ!ṢQi - Main link. Argument: s (string)      e.g. 'baa'
Œ!    - All permutations                          ['baa', 'baa', 'aba', 'aab', 'aba', 'aab']
  Ṣ   - Sort                                      ['aab', 'aab', 'aba', 'aba', 'baa', 'baa']
   Q  - Deduplicate                               ['aab', 'aba', 'baa']
    i - 1-based index of s                        3

Thất bại cho các từ có chứa các chữ cái lặp đi lặp lại.
Manish Kundu

@M BiếnKundu và Xcoder, đã được sửa
caird coinheringaahing

Thật không may Œ¿, không làm việc.
dùng202729

ṢŒ¿hoạt động không?
Trái cây Esolanging

@EsolangingFnut Không, đó chỉ là kết quả đầu ra1
caird coinheringaahing




2

Japt , 8 10 byte

Chỉ số 0. Poxy, lập chỉ mục 1 không cần thiết, tăng 25% số byte của tôi!

á â n bU Ä

Kiểm tra nó


Giải trình

ánhận được tất cả các hoán vị của đầu vào, âloại bỏ trùng lặp, nsắp xếp chúng và blấy chỉ số của lần xuất hiện đầu tiên , U.


Lưu ý (không bình thường) "Đảm bảo bạn bắt đầu đếm từ 1 chỉ". Tôi đã nhận xét theo OP rằng việc cho phép dựa trên 0 cũng là bình thường.
Jonathan Allan

1
À, chết tiệt; stoopid 1-index. Sẽ cập nhật sớm nhưng nó sẽ tăng số byte của tôi thêm 25%.
Xù xì

2

J , 28 23 byte

-5 byte nhờ FrownyFrog

1+/:~@~.@(A.~i.@!@#)i.]

Làm thế nào nó hoạt động?

                      ] - the argument
         (A.~      )    - permutations in the 
             i.@!@#     - range 0 to factorial of the arg. length
  /:~@~.@               - remove duplicates and sort
                    i.  - index of arg. in the sorted list
1+                      - add 1 (for 1-based indexing)

Hãy thử trực tuyến!


1
23:1+/:~@~.@(A.~i.@!@#)i.]
FrownyFrog

@FrownyFrog - Sử dụng tốt i. để tìm chỉ số! Cảm ơn!
Galen Ivanov

Liên kết TIO vẫn là phiên bản cũ :)
Conor O'Brien

@Conor O'Brien - đã sửa
Galen Ivanov

Như thường lệ tôi không hạnh phúc cho đến khi tôi nhận được một giải pháp trong K đó là ngắn hơn so với J một. Điều đó nói rằng, bạn có thể sử dụng thủ thuật tương tự ở đây? Tạo hoán vị của chuỗi đầu vào được sắp xếp (do đó loại bỏ sự cần thiết phải sắp xếp danh sách hoán vị)?
streetster

2

Tcl, 196 byte

proc p {a p} {if {$a eq {}} {lappend ::p $p} {while {[incr n]<=[llength $a]} {p [lreplace $a $n-1 $n-1] $p[lindex $a $n-1]}}}
p [split $argv ""] ""
puts [expr [lsearch [lsort -unique $p] $argv]+1]

Tcl không có phương pháp tích hợp để tính toán hoán vị từ vựng tiếp theo, vì vậy chúng tôi phải tự làm điều đó. Nhưng chờ đã ... nó ngắn hơn để làm điều đó với một hàm đệ quy đơn giản, tính toán tất cả các hoán vị có thể theo bất kỳ thứ tự nào.

Ung dung:

# Compute all possible permutations of the argument list
# Puts the result in ::all_permutations
proc generate_all_permutations {xs {prefixes ""}} {
  if {$xs eq {}} {
    lappend ::all_permutations $prefixes
  } else {
    while {[incr n] <= [llength $xs]} {
      generate_all_permutations [lreplace $xs $n-1 $n-1] $prefixes[lindex $xs $n-1]
    } 
  }
}

# Get our input as command-line argument, turn it into a list of letters
generate_all_permutations [split $argv ""]

# Sort, remove duplicates, find the original argument, and print its 1-based index
puts [expr [lsearch [lsort -unique $all_permutations] $argv]+1]

Tôi đã loại bỏ một số byte: tio.run/ Kẻ
sergiol

Thêm cạo râu tio.run / từ
sergiol

Cảm ơn bạn. Khi tôi có quyền truy cập vào một máy tính thực sự một lần nữa, tôi sẽ cập nhật.
Dúthomhas

2

K (oK) , 23 18 byte

Dung dịch:

1+*&x~/:?x@prm@<x:

Hãy thử trực tuyến!

Ví dụ:

1+*&x~/:?x@prm@<x:"seen"
10
1+*&x~/:?x@prm@<x:"blue"
4

Giải trình:

Tạo các hoán vị của các chỉ số của chuỗi đầu vào được sắp xếp, sử dụng chúng để lập chỉ mục trở lại chuỗi đầu vào, lấy các điểm khác biệt, xem nơi chuỗi gốc khớp với nhau và thêm một chuỗi.

1+*&x~/:?x@prm@<x: / the solution
                x: / save input string as x
               <   / return indices when sorting x ascending
           prm@    / apply (@) function prm
         x@        / index into x with these permutations
        ?          / distinct (remove duplicates)
    x~/:           / apply match (~) between x and each-right (/:)
   &               / return indexes where true (ie the match)
  *                / take the first one
1+                 / add 1 due to 1-indexing requirement

2

Java 8, 211 byte

import java.util.*;TreeSet q=new TreeSet();s->{p("",s);return-~q.headSet(s).size();}void p(String p,String s){int l=s.length(),i=0;if(l<1)q.add(p);for(;i<l;p(p+s.charAt(i),s.substring(0,i)+s.substring(++i,l)));}

Giải trình:

Hãy thử trực tuyến.

import java.util.*;        // Required import for TreeSet

TreeSet q=new TreeSet();   // Sorted Set on class-level

s->{                       // Method with String parameter and integer return-type
  p("",s);                 //  Save all unique permutations of the String in the sorted set
  return-~q.headSet(s).size();}
                           //  Return the 0-indexed index of the input in the set + 1

void p(String p,String s){ // Separated method with 2 String parameters and no return-type
  int l=s.length(),        //  The length of the String `s`
      i=0;                 //  Index integer, starting at 0
  if(l<1)                  //  If String `s` is empty
    q.add(p);              //   Add `p` to the set
  for(;i<l;                //  Loop from 0 to `l` (exclusive)
    p(                     //   Do a recursive call with:
      p+s.charAt(i),       //    `p` + the character at the current index of `s` as new `p`
      s.substring(0,i)+s.substring(++i,l)));}
                           //    And `s` minus this character as new `s`

2

Python 3 , 183 182 byte

Câu trả lời đầu tiên chạy trong thời gian đa thức!

a=[*map(ord,input())]
f=lambda x:x and x*f(x-1)or 1
c=[0]*98
for C in a:c[C]+=1
l=len(a)
F=f(l)
for i in c:F//=f(i)
r=1
for x in a:F//=l;l-=1;r+=sum(c[:x])*F;F*=c[x];c[x]-=1
print(r)

Hãy thử trực tuyến!

Yêu cầu đầu vào phải là chữ hoa, bởi vì ... nó tiết kiệm một byte.

Chương trình đầy đủ, lấy đầu vào từ stdinvà đầu ra stdout.


Tên biến: (loại mã không mã hóa)

a : permu
f : factorial
c : count_num
C : char
l : n_num_left
F : factor
r : result

Thật không may, from math import factorial as fmất chính xác thêm 1 byte.


(Lưu ý không liên quan: Tôi đã kiểm tra Combinatorica`gói Mathicala, không có gì hữu ích, kể cả RankPermutation)


Mã đó thực sự tốt đẹp.
Manish Kundu

1

Husk , 6 byte

S€(OuP

Hãy thử trực tuyến! Tôi cảm thấy nên có một cách để thả (.

Giải trình:

 €     -- return index of the input 
S (    -- in the list generated by applying the following functions to the input:
     P -- permutations
    u  -- remove duplicates
   O   -- sort

1

Sạch , 113 111 byte

import StdEnv,StdLib
?s=elemIndex s[[]:removeDup(foldr(\a b=sort[insertAt i a x\\x<-b,i<-[0..length x]])[[]]s)]

Hãy thử trực tuyến!

+3 byte để xử lý lập chỉ mục 1: /





1

JavaScript (ES6), 106 100 byte

w=>(P=(a,s)=>a[0]?a.map((_,i)=>P(b=[...a],s+b.splice(i,1))):P[s]=P[s]||++k)[P([...w].sort(),k=''),w]

Các trường hợp thử nghiệm

Làm sao?

P () là hàm hoán vị đệ quy của chúng ta. Nhưng đối tượng bao gồm của P cũng được sử dụng để lưu trữ các cấp bậc của hoán vị.

P = (a, s) =>               // given an array of letters a[] and a string s
  a[0] ?                    // if a[] is not empty:
    a.map((_, i) =>         //   for each entry at position i in a[]:
      P(                    //     do a recursive call to P() with:
        b = [...a],         //       a copy b[] of a[], with a[i] removed
        s + b.splice(i, 1)  //       the extracted letter appended to s
      )                     //     end of recursive call
    )                       //   end of map()
  :                         // else:
    P[s] = P[s] || ++k      //   if P[s] is not already defined, set it to ++k

Mã gói bây giờ đọc là:

w =>                        // given the input word w
  P[                        // return the permutation rank for w
    P(                      //   initial call to P() with:
      [...w].sort(),        //     the lexicographically sorted letters of w
      k = ''                //     s = k = '' (k is then coerced to a number)
    ),                      //   end of call
    w                       //   actual index used to read P[]
  ]                         // end of access to P[]

1

C ++, 230 byte

#include<algorithm>
#include<iostream>
#include<string>
using namespace std;void R(string s){int n=1;auto p=s;sort(begin(p),end(p));do if(p==s)cout<<n;while(++n,next_permutation(begin(p),end(p)));}int main(int n,char**a){R(a[1]);}

Theo yêu cầu của tôi, mã chắc chắn cần phải được thực thi như vốn có. Mệnh đề chỉ chức năng cơ bản là rác. : - @

Cảm ơn những người vui lòng trả lời câu hỏi về những gì có thể được cắt ra cho tôi. Lợi ích của hợp lệ mã , tôi đã tránh được GCC-ism phổ biến bao gồm <bits / stdc ++. H>, mà tôi luôn coi là một lỗ hổng gian lận xấu.

Những gì tiếp theo là những gì còn lại của bài viết gốc của tôi:


Tôi luôn không chắc chắn khi sử dụng C và C ++, cái gì được tính vào tổng byte. Theo Chương trình, Chức năng, hay Đoạn trích? câu trả lời vẫn còn mơ hồ (miễn là nó không phải là một đoạn trích, tôi đoán vậy). Vì vậy, tôi sẽ đi với ngắn nhất trong hai khả năng.

Ở đây nó không được cung cấp với các tiêu đề cần thiết, vv:

#include <algorithm>
#include <iostream>
#include <string>
using namespace std;

void R( string s )
{
  int n = 1;
  auto p = s;
  sort( begin(p), end(p) );
  do if (p == s) cout << n;
  while (++n, next_permutation( begin(p), end(p) ));
}

int main( int n, char** a )
{
  R( a[1] );
}

Đó là golf xuống tới 230 byte, một phần ba trong số các bản soạn sẵn tiêu chuẩn được yêu cầu bởi mọi chương trình C ++. (Vì vậy, tôi không cảm thấy quá tệ khi không đếm nó, nhưng vì tôi chưa bao giờ thấy một khiếu nại chắc chắn nào, OP sẽ phải cho tôi biết anh ta thích thỏa mãn điều gì khi viết mã để lấy bất kỳ từ nào làm đầu vào và hiển thị thứ hạng của nó.

Tôi cũng không chắc chắn nếu điều này thỏa mãn thì thứ hạng sẽ là đầu ra.


1
Uh ... AFAIK số quy tắc của chúng tôi cần thiết ( using namespace std, #include <algorithm> các tiêu đề được sử dụng để xác định hàm theo byte. Và ... Không, main(){}là chương trình C ++ (g ++) hợp lệ ở 8 byte.
user202729

Tôi không cố gắng trở thành một người cố chấp, nhưng tôi thấy các bài nộp cho C và C ++ (cũng như các ngôn ngữ khác) mọi lúc chỉ là một chức năng. Tôi muốn một câu trả lời dứt khoát. Tôi thường không chơi golf bằng ngôn ngữ C vì lý do này. (Và tôi rất vui khi regolf.)
Dúthomhas

1
Ngay cả trong Python, import maththường là cần thiết. Hãy để tôi tìm meta có liên quan ...
user202729

@ Dúthomhas Những giải pháp đó không yêu cầu tiêu đề bao gồm. Số học cơ bản không yêu cầu tiêu đề và một số hàm có thể được khai báo và điền đầy đủ bằng cách liên kết của stdlib (như putsprintf). Mã của bạn phải biên dịch và chạy thành công vì nó là hợp lệ. Xem: codegolf.meta.stackexchange.com/a/10085/45941
Mego

@Mego Nếu không khai báo các mainchức năng thì không thể chạy được.
dùng202729




0

PowerShell , 275 byte

param($s)function n($a){if($a-eq1){return}0..($a-1)|%{n($a-1);if($a-eq2){$b.ToString()}$p=($j-$a);[char]$t=$b[$p];for($z=($p+1);$z-lt$j;$z++){$b[($z-1)]=$b[$z]}$b[($z-1)]=$t}}if($s.length-eq1){1;exit}$b=New-Object Text.StringBuilder $s;(n($j=$s.length)|sort -u).indexOf($s)+1

Hãy thử trực tuyến!

Vì vậy, đây là một mớ hỗn độn đẫm máu.

PowerShell không có bất kỳ hoán vị nào được tích hợp sẵn, vì vậy mã này sử dụng thuật toán từ đây (được đánh rất nhiều), có sẵn theo Giấy phép Công cộng của Microsoft Limited ( Triển lãm B trên trang cấp phép này).

Chương trình lấy đầu vào $slà một chuỗi, sau đó chương trình thực tế bắt đầu bằng $b=New-Object .... Chúng tôi đang xây dựng một đối tượng StringBuilder mới , về cơ bản là một chuỗi các ký tự có thể thay đổi. Điều này sẽ cho phép chúng tôi xử lý các hoán vị dễ dàng hơn. Sau đó chúng ta gọi hàm n(cài đặt$j dọc theo chiều dài của chuỗi đầu vào), sortvới -ucờ nique là đầu ra, lấy .indexOf()chuỗi tìm chuỗi đầu vào và thêm 1vì PowerShell không được lập chỉ mục.

Chức năng là phần chính của chương trình. Nó nhận đầu vào là một số và mỗi lần lặp sẽ đếm ngược cho đến khi chúng ta đạt được1 (nghĩa là một chữ cái duy nhất). Phần còn lại của hàm về cơ bản gọi đệ quy hàm cũng như lấy chữ cái hiện tại và lặp lại nó qua mọi vị trí.

Có một bit logic bổ sung if($s.length-eq1){1;exit}để tính các chuỗi đầu vào có độ dài 1do cách thức hoạt động của hàm hoán vị.


0

Pyt , 5 byte

ĐᒆỤ≥Ʃ

Giải trình:

            Implicit input
Đ           Duplicate input
 ᒆ         Get list of all permutations of input
  Ụ         Get unique permutations
   ≥        Does each permutation come before or is equal to the input?
    Ʃ       Sum of result of previous step (converts booleans to ints)

Hãy thử trực tuyến!

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.