Finden Sie den Rang eines Wortes


23

Definition

Der Rang eines Wortes ist definiert als die Position des Wortes, wenn alle möglichen Permutationen (oder Anordnungen) seiner Buchstaben alphabetisch angeordnet sind, wie in einem Wörterbuch, unabhängig davon, ob die Wörter bedeutungsvoll sind oder nicht.

Betrachten wir diese beiden Wörter - "blau" und "gesehen". Zunächst würden wir alle möglichen Anordnungen der Buchstaben dieser Wörter in alphabetischer Reihenfolge schreiben:

"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"

Nun schauen wir von links und finden die Position der Wörter, die wir brauchen. Wir sehen, dass sich das Wort "blau" an der 4. Position und "gesehen" an der 10. Position befindet. Der Rang des Wortes "blau" ist also 4 und der des Wortes "gesehen" ist 10. Dies ist die allgemeine Methode zur Berechnung des Rangs eines Wortes. Stellen Sie sicher, dass Sie nur mit 1 anfangen zu zählen.

Aufgabe

Ihre Aufgabe ist es, einen Code zu schreiben, der ein beliebiges Wort als Eingabe aufnimmt und dessen Rang anzeigt. Der Rang sollte die Ausgabe sein. Seien Sie vorsichtig mit Wörtern, die wiederholte Buchstaben enthalten.

Beispiele

"prime" -> 94

"super" -> 93

"bless" -> 4

"speech" -> 354

"earth" -> 28

"a" -> 1

"abcd" -> 1

"baa" -> 3    

Sie können davon ausgehen, dass die Eingabe vollständig in Kleinbuchstaben erfolgt und nur alphabetische Zeichen enthält . Auch wenn ein Leerzeichen oder eine ungültige Zeichenfolge eingegeben wird, können Sie alles zurückgeben.

Wertung

Das ist , also gewinnt der kürzeste Code!



14
Msgstr "Vergewissern Sie sich, dass Sie nur mit 1 anfangen zu zählen." - Es liegt ganz bei Ihnen, diese Anforderung zu erfüllen. Beachten Sie jedoch, dass es durchaus üblich ist, für solche Herausforderungen eine 0- oder 1-basierte Indizierung zuzulassen.
Jonathan Allan

1
Ja, ikr, aber wenn Sie bei 0 beginnen, wird der ursprüngliche Rang nicht angezeigt, weshalb ich mich entschlossen habe, diese Anforderung hinzuzufügen.
Manish Kundu

Nützlicher Link . Sie erhalten AC, wenn Ihr Programm nicht rechtzeitig ausgeführt wird O(n log n). (sorry, kein Python) Mein Beitrag (C ++) benötigt 2,53s, um Test 14 zu lösen.
user202729

Kann ich ein Tupel oder eine Liste mit diesem Wort machen, zB ['h', 'e', 'l', 'l', 'o']im Gegensatz zu 'hello'?
0WJYxW9FMN

Antworten:





4

Pyth , 6 Bytes

hxS{.p

Testsuite.

Erläuterung

hxS {.p || Volles Programm.

    .p || Alle Permutationen der Eingabe.
   {|| Deduplizieren
  S || Sortieren.
 x || Index der Eingaben in diese Liste.
h || Zuwachs.

3

Gelee , 5 Bytes

Œ!ṢQi

Probieren Sie es online! oder sehen Sie sich die Testsuite an

Wie es funktioniert

Œ!Ṣ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

Schlägt bei Wörtern mit wiederholten Buchstaben fehl.
Manish Kundu

@ManishKundu und Xcoder, fest
caird coinheringaahing

Funktioniert leider Œ¿nicht.
user202729

Does ṢŒ¿Arbeit?
Esolanging Fruit

@ EsolangingFruit Nein, das gibt nur aus1
Caird Coinheringaahing




2

Japt , 8 10 Bytes

0-indiziert. Poxy, unnötige 1-Indizierung, erhöht meine Byteanzahl um 25%!

á â n bU Ä

Probier es aus


Erläuterung

áRuft alle Permutationen der Eingabe ab, âentfernt Duplikate, nsortiert sie und bruft den Index des ersten Auftretens der Eingabe ab U.


Beachten Sie die (ungewöhnliche) Anforderung "Stellen Sie sicher, dass Sie nur von 1 an zählen". Ich habe unter dem OP angemerkt, dass es normal wäre, auch 0-basiert zuzulassen.
Jonathan Allan

1
Ah, verdammt noch mal. doofe 1-Indizierung. Wird in Kürze aktualisiert, erhöht aber meine Byteanzahl um 25%.
Shaggy

2

J , 28 23 Bytes

-5 Bytes dank FrownyFrog

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

Wie es funktioniert?

                      ] - 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)

Probieren Sie es online!


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

@FrownyFrog - Gute Verwendung von i. um den Index zu finden! Vielen Dank!
Galen Ivanov

Der TIO-Link ist immer noch die alte Version :)
Conor O'Brien

@Conor O'Brien - behoben
Galen Ivanov

Wie immer bin ich nicht glücklich, bis ich eine Lösung in K bekomme , die kürzer als die in J ist . Das heißt, können Sie den gleichen Trick hier verwenden? Permutationen der sortierten Eingabezeichenfolge generieren (daher muss die permutierte Liste nicht mehr sortiert werden)?
Straßenhändler

2

Tcl, 196 Bytes

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 hat keine eingebaute Methode zur Berechnung der nächsten lexikografischen Permutation, daher müssen wir dies selbst tun. Aber warte ... es ist kürzer , dies mit einer einfachen rekursiven Funktion zu tun, die alle möglichen Permutationen in beliebiger Reihenfolge berechnet .

Ungolfed:

# 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]

Ich habe einige Bytes abgeschabt
sergiol

Weitere Rasur tio.run/…
Sergiol

Vielen Dank. Wenn ich wieder auf einen echten Computer zugreifen kann, aktualisiere ich.
Dúthomhas

2

K (oK) , 23 18 Bytes

Lösung:

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

Probieren Sie es online!

Beispiele:

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

Erläuterung:

Generieren Sie Permutationen der Indizes der sortierten Eingabezeichenfolge, indizieren Sie sie wieder in die Eingabezeichenfolge, nehmen Sie die Unterscheidungsmerkmale, überprüfen Sie, wo die ursprüngliche Zeichenfolge übereinstimmt, und fügen Sie eine hinzu.

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 Bytes

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)));}

Erläuterung:

Probieren Sie es online aus.

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 Bytes

Die erste Antwort, die im Polynom läuft!

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)

Probieren Sie es online!

Die Eingabe muss in Großbuchstaben erfolgen, da ... ein Byte gespeichert wird.

Vollständiges Programm, nimmt Eingaben von stdinund Ausgaben an stdout.


Variablennamen: (Art ungolfed Code)

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

Dauert leider from math import factorial as fgenau 1 Byte mehr.


(Hinweis ohne Bezug: Ich habe das Combinatorica`Paket von Mathematica überprüft , nichts Nützliches, einschließlich RankPermutation)


Dieser Code ist wirklich nett.
Manish Kundu

1

Schale , 6 Bytes

S€(OuP

Probieren Sie es online! Ich habe das Gefühl, dass es einen Weg zum Ablegen geben sollte (.

Erläuterung:

 €     -- 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

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]

Testfälle

Wie?

P () ist unsere rekursive Permutationsfunktion. Das umgebende Objekt von P wird aber auch zum Speichern der Ränge der Permutationen verwendet.

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

Der Umhüllungscode lautet nun:

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 Bytes

#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]);}

Gemäß meiner Anfrage muss der Code definitiv so wie er ist ausführbar sein. Die reine Funktionsklausel ist im Grunde genommen Müll. : - @

Vielen Dank an alle, die freundlicherweise die Frage beantwortet haben, was für mich herausgeschnitten werden kann. Im Interesse der Gültigkeit Codes habe ich den beliebten GCC-Ansatz des Einbindens von <bits / stdc ++. H> vermieden, den ich immer als schlechten Schlupfloch-Cheat angesehen habe.

Was folgt ist, was von meinem ursprünglichen Beitrag übrig bleibt:


Ich bin mir bei der Verwendung von C und C ++ immer unsicher, was für die Bytesumme zählt. Je nach Programm, Funktion oder Ausschnitt?Die Antwort ist immer noch vage (solange es sich nicht um einen Ausschnitt handelt, denke ich). Ich gehe also mit der kürzesten der beiden Möglichkeiten.

Hier ist es nicht mit den notwendigen Überschriften usw. bespielt :

#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] );
}

Das sind bis zu 230 Bytes, ein Drittel der Standardgröße, die jedes C ++ - Programm benötigt. (Also, ich fühle mich nicht schlecht, wenn ich es nicht mitzähle, aber da ich noch nie eine feste Beschwerde gesehen habe, muss OP mir sagen, welche er am liebsten befriedigt. Schreiben Sie einen Code, um ein Wort als Eingabe zu nehmen und zeige seinen Rang an. “)

Ich bin mir auch nicht sicher, ob dies "der Rang sollte ausgegeben werden" erfüllt.


1
Äh ... AFAIK, unsere Regeln zählen als notwendig ( using namespace std, #include <algorithm> Header, die zum Definieren der Funktion in Bytes verwendet werden. Und ... Nein, main(){}ist ein gültiges C ++ (g ++) - Programm mit 8 Bytes.
user202729

Ich versuche nicht, ein hartnäckiger Rotz zu sein, aber ich sehe die ganze Zeit Einreichungen für C und C ++ (sowie für andere Sprachen) , die nur eine einzige Funktion sind. Ich möchte eine endgültige Antwort. Aus diesem Grund spiele ich normalerweise nicht in C-Sprachen. (Und ich bin glücklich, Regolf.)
Dúthomhas

1
Auch in Python import mathist das oft nötig. Lassen Sie mich die relevanten Meta finden ...
user202729

@ Dúthomhas Diese Lösungen erfordern keine Header-Includes. Grundlegende Arithmetik erfordert keinen Header und einige Funktionen können implizit deklariert und durch die Verknüpfung der stdlib (like putsund printf) ausgefüllt werden . Ihr Code muss so kompiliert und erfolgreich ausgeführt werden, damit er gültig ist. Siehe: codegolf.meta.stackexchange.com/a/10085/45941
Mego

@Mego ohne mainFunktionsdeklaration kann nicht wie besehen ausgeführt werden.
user202729




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

Probieren Sie es online!

Das ist also eine blutige Sauerei.

In PowerShell sind keine Permutationen integriert. Daher verwendet dieser Code den Algorithmus von hier (mit starkem Golfsport), der unter der Microsoft Limited Public License ( Anhang B auf dieser Lizenzseite) verfügbar ist .

Das Programm nimmt Eingaben $sals String an, dann beginnt das eigentliche Programm mit $b=New-Object .... Wir bauen ein neues StringBuilder- Objekt, bei dem es sich (im Wesentlichen) um eine veränderbare Zeichenfolge handelt. Dadurch können wir die Permutationen einfacher handhaben. Anschließend rufen wir die Funktion auf n(wobei $jdie Länge der Eingabezeichenfolge festgelegt wird), markieren die Ausgabe sortmit -unique .indexOf(), suchen die Eingabezeichenfolge und fügen sie hinzu, 1da PowerShell mit Nullindex versehen ist.

Die Funktion ist der Hauptteil des Programms. Als Eingabe wird eine Zahl verwendet, und jede Iteration wird heruntergezählt, bis wir 1einen einzelnen Buchstaben erreichen. Der Rest der Funktion ruft die Funktion im Wesentlichen rekursiv auf, nimmt den aktuellen Buchstaben und iteriert ihn durch jede Position.

Aufgrund der Funktionsweise der Permutationsfunktion gibt es ein einziges Bit zusätzlicher Logik if($s.length-eq1){1;exit}, um Eingabezeichenfolgen mit einer Länge zu berücksichtigen 1.


0

Pyt , 5 Bytes

ĐᒆỤ≥Ʃ

Erläuterung:

            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)

Probieren Sie es online!

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.