ค้นหาอันดับของ Word


23

คำนิยาม

อันดับของคำถูกกำหนดให้เป็นตำแหน่งของคำเมื่อการเรียงสับเปลี่ยน (หรือการจัดเรียง) ที่เป็นไปได้ทั้งหมดของตัวอักษรถูกจัดเรียงตามลำดับตัวอักษรเช่นในพจนานุกรมไม่ว่าคำนั้นจะมีความหมายหรือไม่ก็ตาม

ให้เราพิจารณาสองคำนี้ - "สีน้ำเงิน" และ "เห็น" ก่อนอื่นเราจะเขียนตัวอักษรของคำเหล่านี้ตามลำดับตัวอักษร:

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

ทีนี้ลองดูจากทางซ้ายและค้นหาตำแหน่งของคำที่เราต้องการ เราเห็นว่าคำว่า "สีน้ำเงิน" อยู่ที่ตำแหน่งที่ 4 และ "เห็น" อยู่ที่ตำแหน่งที่ 10 ดังนั้นอันดับของคำว่า "สีน้ำเงิน" คือ 4 และของ "เห็น" คือ 10 นี่คือวิธีทั่วไปในการคำนวณอันดับของคำ ตรวจสอบให้แน่ใจว่าคุณเริ่มนับจาก 1 เท่านั้น

งาน

งานของคุณคือการเขียนรหัสเพื่อใช้คำใด ๆ ที่เป็นอินพุตและแสดงอันดับของมัน อันดับควรเป็นผลลัพธ์ ระวังคำที่มีตัวอักษรซ้ำ ๆ

ตัวอย่าง

"prime" -> 94

"super" -> 93

"bless" -> 4

"speech" -> 354

"earth" -> 28

"a" -> 1

"abcd" -> 1

"baa" -> 3    

คุณสามารถสมมติว่าอินพุตเป็นตัวพิมพ์เล็กทั้งหมดและอินพุตจะมีอักขระตัวอักษรเท่านั้น นอกจากนี้หากป้อนช่องว่างหรือสตริงที่ไม่ถูกต้องคุณอาจส่งคืนสิ่งใดก็ได้

เกณฑ์การให้คะแนน

นี่คือดังนั้นรหัสที่สั้นที่สุดชนะ!



14
"ตรวจสอบให้แน่ใจว่าคุณเริ่มนับจาก 1 เท่านั้น" - ขึ้นอยู่กับคุณว่าจะมีข้อกำหนดนี้ แต่โปรดทราบว่าเป็นเรื่องธรรมดาที่จะอนุญาตให้มีการทำดัชนีตาม 0 หรือ 1 สำหรับความท้าทายดังกล่าว
Jonathan Allan

1
ใช่ ikr แต่ถ้าคุณเริ่มจาก 0 คุณจริง ๆ แล้วไม่ได้แสดงอันดับเดิมซึ่งเป็นเหตุผลที่ฉันตัดสินใจที่จะเพิ่มข้อกำหนดนี้
Manish Kundu

ลิงค์ที่มีประโยชน์ คุณจะได้ AC ถ้าโปรแกรมของคุณทำงานตรงเวลาO(n log n)หรือน้อยกว่า (ขออภัยไม่มี Python) การส่งของฉัน (C ++) ใช้เวลา 2.53 วินาทีเพื่อแก้ปัญหาการทดสอบ 14.
user202729

ฉันสามารถทำสิ่งอันดับหรือรายการด้วยคำนั้นเช่น['h', 'e', 'l', 'l', 'o']ตรงข้ามกับได้ 'hello'ไหม
0WJYxW9FMN

คำตอบ:





4

Pyth , 6 ไบต์

hxS{.p

ชุดทดสอบ

คำอธิบาย

hxS {.p || โปรแกรมเต็มรูปแบบ

    .p || การเรียงสับเปลี่ยนทั้งหมดของอินพุต
   {|| deduplicate
  S | | ประเภท
 x || ดัชนีของอินพุตในรายการนี้
h | | การเพิ่มขึ้น

3

เยลลี่ 5 ไบต์

Œ!ṢQi

ลองออนไลน์! หรือดูชุดทดสอบ

มันทำงานอย่างไร

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

ล้มเหลวสำหรับคำที่มีตัวอักษรซ้ำแล้วซ้ำอีก
Manish Kundu

@ManishKundu และ Xcoder แก้ไขแล้ว
caird coinheringaahing

น่าเสียดายที่Œ¿ใช้งานไม่ได้
user202729

ไม่ṢŒ¿ทำงานหรือไม่
แยกผลไม้

@EsolangingFruit ไม่นั่นเป็นเพียงแค่ผลลัพธ์1
caird coinheringaahing


3

CJam , 8 ไบต์

q_e!\a#)

ลองออนไลน์!

+1 ไบต์เนื่องจากข้อกำหนดที่มีการจัดทำดัชนี 1 รายการ


เพิ่งได้รับคำตอบที่เหมือนกัน :(
แยกผลไม้

@EsolangingFruit คุณยังสามารถโพสต์ได้หากคุณต้องการ :-)
Erik the Outgolfer


2

Japt , 8 10 ไบต์

0 การจัดทำดัชนี Poxy ไม่จำเป็นต้องทำดัชนี 1 ดัชนีเพิ่มจำนวนไบต์ของฉัน 25%!

á â n bU Ä

ทดสอบมัน


คำอธิบาย

áรับการเรียงสับเปลี่ยนทั้งหมดของอินพุตâลบรายการที่ซ้ำกันnเรียงลำดับพวกเขาและbรับดัชนีการเกิดขึ้นครั้งแรกของอินพุตUได้รับดัชนีเกิดขึ้นครั้งแรกของการป้อนข้อมูล


โปรดสังเกตข้อกำหนด (ปกติ) "ตรวจสอบให้แน่ใจว่าคุณเริ่มนับจาก 1 เท่านั้น" ฉันได้แสดงความคิดเห็นภายใต้ OP ว่ามันจะเป็นเรื่องปกติที่จะอนุญาตให้ใช้แบบ 0 เช่นกัน
Jonathan Allan

1
อ้า goddamnit; stoopid 1 การจัดทำดัชนี จะอัปเดตในไม่ช้า แต่จะเพิ่มจำนวนไบต์ของฉัน 25%
ขนดก

2

J , 28 23 ไบต์

-5 ไบต์ขอบคุณ FrownyFrog

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

มันทำงานอย่างไร?

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

ลองออนไลน์!


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

@ FronyFrog - ใช้ประโยชน์จาก i ได้ดี สำหรับการค้นหาดัชนี! ขอบคุณ!
Galen Ivanov

การเชื่อมโยง TIO ยังคงเป็นรุ่นเก่า :)
Conor โอไบรอัน

@Conor O'Brien - แก้ไขแล้ว
Galen Ivanov

ตามปกติผมไม่มีความสุขจนกว่าฉันจะได้รับการแก้ปัญหาในภาคที่สั้นกว่าJหนึ่ง ที่กล่าวว่าคุณสามารถใช้เคล็ดลับเดียวกันได้ที่นี่ สร้างการเรียงสับเปลี่ยนของสตริงอินพุตที่เรียงลำดับแล้วดังนั้นจึงไม่จำเป็นต้องเรียงลำดับรายการที่เปลี่ยนรูป
roadster

2

Tcl, 196 ไบต์

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 ไม่มีวิธีการในตัวที่จะคำนวณการเปลี่ยนแปลงทางคำศัพท์ต่อไปดังนั้นเราต้องทำเอง แต่เดี๋ยวก่อน ... มันสั้นกว่าที่จะทำมันด้วยฟังก์ชั่นเรียกซ้ำง่าย ๆ ที่คำนวณการเรียงสับเปลี่ยนที่เป็นไปได้ทั้งหมดในลำดับใด ๆ

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]

ฉันโกนทิ้งไบต์: tio.run/…
sergiol


ขอขอบคุณ. เมื่อฉันได้รับการเข้าถึงคอมพิวเตอร์จริงอีกครั้งฉันจะอัปเดต
Dúthomhas

2

K (oK) , 23 18 ไบต์

วิธีการแก้:

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

ลองออนไลน์!

ตัวอย่าง:

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

คำอธิบาย:

สร้างการเรียงสับเปลี่ยนของดัชนีของสตริงอินพุตที่เรียงลำดับแล้วใช้ดัชนีเหล่านั้นกลับเข้าไปในสตริงอินพุตนำข้อมูลที่แตกต่างดูที่ที่สตริงดั้งเดิมจับคู่และเพิ่มหนึ่งสตริง

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 ไบต์

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

คำอธิบาย:

ลองออนไลน์

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 ไบต์

คำตอบแรกที่ทำงานในเวลาพหุนาม!

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)

ลองออนไลน์!

ต้องการอินพุตเป็นตัวพิมพ์ใหญ่ทั้งหมดเนื่องจาก ... มันบันทึกไบต์

โปรแกรมเต็มรูปแบบใช้การป้อนข้อมูลจากและส่งออกไปยังstdinstdout


ชื่อตัวแปร: (เรียงลำดับของโค้ดที่ไม่ถูกปรับแต่ง)

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

น่าเสียดายที่from math import factorial as fต้องใช้อีก 1 ไบต์


(หมายเหตุที่ไม่เกี่ยวข้อง: ฉันตรวจสอบCombinatorica`แพ็คเกจของ Mathematica แล้วไม่มีประโยชน์อะไรรวมไปถึงRankPermutation)


รหัสนั้นดีจริงๆ
Manish Kundu

1

Husk , 6 ไบต์

S€(OuP

ลองออนไลน์! ฉันรู้สึกว่าควรจะมีวิธีที่จะลดลง(ฉันรู้สึกเหมือนว่าควรจะมีวิธีที่จะลดลง

คำอธิบาย:

 €     -- 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 ไบต์

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]

กรณีทดสอบ

อย่างไร?

P ()เป็นฟังก์ชันการเปลี่ยนรูปแบบการเรียกซ้ำ แต่วัตถุที่ล้อมรอบของPยังใช้เพื่อจัดอันดับการเรียงสับเปลี่ยน

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

ตอนนี้โค้ดตัดคำอ่านเป็น:

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 ไบต์

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

ตามที่ฉันถามรหัสจะต้องถูกเรียกใช้อย่างแน่นอนตามที่เป็นจริง ส่วนคำสั่งฟังก์ชั่นเท่านั้นโดยทั่วไปจะเป็นขยะ : - @

ขอบคุณผู้ที่กรุณาตอบคำถามของสิ่งที่สามารถตัดออกสำหรับฉัน อยู่ในความสนใจของถูกต้องรหัสที่ฉันได้หลีกเลี่ยง GCC-ism ที่เป็นที่นิยมซึ่งรวมถึง <bits / stdc ++. h> ซึ่งฉันถือว่าการโกงช่องโหว่ที่ไม่ดีอยู่เสมอ

สิ่งที่ตามมาคือสิ่งที่เหลืออยู่ของการโพสต์ต้นฉบับของฉัน:


ฉันไม่แน่ใจอยู่เสมอเมื่อใช้ C และ C ++ สิ่งที่นับรวมกับจำนวนไบต์ ตามProgram, Function หรือ Snippet? คำตอบยังคลุมเครือ (ตราบใดที่มันไม่ใช่ตัวอย่างฉันเดา) ดังนั้นฉันจะไปด้วยความเป็นไปได้ที่สั้นที่สุดของทั้งสอง

ที่นี่มันเป็นส่วนหัวที่ไม่จำเป็นต้องมี ฯลฯ :

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

ที่ลงไปถึง 230 ไบต์หนึ่งในสามของมาตรฐานสำเร็จรูปที่ต้องการโดยทุกโปรแกรม C ++ (ดังนั้นฉันไม่รู้สึกแย่เกินไปที่จะไม่นับมัน แต่เมื่อฉันไม่เคยเห็นการร้องเรียนอย่างใดอย่างหนึ่งทาง OP จะต้องบอกฉันว่าเขาชอบที่จะตอบสนอง“ เขียนรหัสเพื่อใช้คำใด ๆ เป็นอินพุต และแสดงระดับของมัน”)

ฉันยังไม่แน่ใจว่าสิ่งนี้เป็นไปตาม“ อันดับที่ควรได้รับหรือไม่”


1
เอ่อ ... AFAIK กฎของเรานับจำเป็น ( using namespace std, #include <algorithm> ส่วนหัวใช้ในการกำหนดฟังก์ชั่นในไบต์และ ... ไม่มี. main(){}เป็น C ++ ที่ถูกต้อง (g ++) โปรแกรมที่ 8 ไบต์.
user202729

ฉันไม่ได้พยายามที่จะเป็นคนหัวเสีย แต่ฉันเห็นการส่งสำหรับ C และ C ++ (รวมถึงภาษาอื่น ๆ ) ตลอดเวลาที่เป็นเพียงฟังก์ชั่นเดียว ฉันต้องการคำตอบที่ชัดเจน ฉันมักจะไม่เล่นกอล์ฟในภาษา C ด้วยเหตุผลนี้ (และฉันมีความสุขที่จะกลับใจใหม่)
Dúthomhas

1
แม้แต่ใน Python import mathก็มักจะจำเป็น ให้ฉันค้นหา meta ที่เกี่ยวข้อง ...
user202729

@ Dúthomhasโซลูชั่นเหล่านั้นไม่จำเป็นต้องมีส่วนหัว เลขคณิตพื้นฐานไม่จำเป็นต้องมีส่วนหัวและฟังก์ชั่นบางอย่างสามารถประกาศโดยปริยายและกรอกข้อมูลด้วยการเชื่อมโยงของ stdlib (เช่นputsและprintf) รหัสของคุณจะต้องรวบรวมและทำงานให้สำเร็จตามที่เป็นจริงเพื่อให้ถูกต้อง ดู: codegolf.meta.stackexchange.com/a/10085/45941
Mego

@Mego หากไม่มีการประกาศmainฟังก์ชั่นจะไม่สามารถทำงานได้ตามที่เป็นอยู่
user202729




0

PowerShell , 275 ไบต์

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

ลองออนไลน์!

ดังนั้นนี่เป็นความยุ่งเหยิงของเลือด

PowerShell ไม่มีการเรียงสับเปลี่ยนในตัวดังนั้นรหัสนี้จึงใช้อัลกอริธึมจากที่นี่ (ตีหนักมาก) ซึ่งมีให้บริการภายใต้ใบอนุญาตสาธารณะของ Microsoft Limited ( Exhibit Bในหน้าใบอนุญาตนี้)

โปรแกรมที่จะเข้าเป็นสตริงแล้วโปรแกรมที่เกิดขึ้นจริงจะเริ่มต้นด้วย$s $b=New-Object ...เรากำลังสร้างออบเจกต์StringBuilderใหม่ซึ่งเป็นสตริงอักขระที่ไม่แน่นอน สิ่งนี้จะช่วยให้เราจัดการกับพีชคณิตได้ง่ายขึ้น จากนั้นเราจะเรียกใช้ฟังก์ชันn(ตั้งค่า$jตามความยาวของสตริงอินพุต) sortโดยใช้-uแฟล็ก nique เอาต์พุตใช้.indexOf()เพื่อค้นหาสตริงอินพุตและเพิ่ม1เนื่องจาก PowerShell ไม่มีการทำดัชนี

ฟังก์ชั่นเป็นส่วนหลักของโปรแกรม มันต้องใช้ตัวเลขเป็นตัวป้อนและแต่ละการวนซ้ำจะนับจนกว่าเราจะไปถึง1(เช่นตัวอักษรเดียว) ส่วนที่เหลือของฟังก์ชั่นเป็นหลักเรียกฟังก์ชั่นซ้ำเช่นเดียวกับที่ใช้ตัวอักษรปัจจุบันและซ้ำมันผ่านทุกตำแหน่ง

มีตรรกะเพิ่มเติมเล็กน้อยif($s.length-eq1){1;exit}สำหรับบัญชีสำหรับสตริงอินพุตความยาว1เนื่องจากฟังก์ชันการเรียงสับเปลี่ยนทำงานอย่างไร


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.