สร้างดัชนีการค้นหา


12

รับสตริงส่งคืนตารางที่คอลัมน์แรกมีตัวอักษรที่ไม่ซ้ำกันของสตริงตามลำดับการเกิดขึ้นและคอลัมน์ที่ตามมาจะแสดงรายการดัชนีของตัวอักษรนั้นในสตริงโดยใช้การจัดทำดัชนีเป็นศูนย์หรือใช้ครั้งเดียว ช่องว่างในแนวนอนไม่สำคัญตราบใดที่คอลัมน์ซ้ายสุดอยู่ในแนวตั้ง ดัชนีจะต้องอยู่ในลำดับจากซ้ายไปขวา

ตัวอย่าง

ใช้การทำดัชนีแบบ zero-based และกำหนด "abracadabra" ให้ส่งคืน

a 0 3 5 7 10
b 1 8       
r 2 9       
c 4         
d 6   

ใช้การจัดทำดัชนีแบบฐานเดียวและได้รับ "3141592653589793238462643383279503", คืนค่า:

3  1 10 16 18 25 26 28 34
1  2  4                  
4  3 20 24               
5  5  9 11 32            
9  6 13 15 31            
2  7 17 22 29            
6  8 21 23               
8 12 19 27               
7 14 30                  
0 33                     

ฉันสามารถมีช่องว่างนำหน้าในเอาต์พุตได้หรือไม่?
Erik the Outgolfer

รูปแบบผลลัพธ์จะต้องเข้มงวดหรือไม่
Leun Nun

@EriktheOutgolfer ใช่ ที่เพิ่ม
อดัม

@LeakyNun ไม่ได้เพิ่ม
อดัม

2
สิ่งนี้จำเป็นสำหรับตัวละครที่ไม่สามารถพิมพ์ได้หรือไม่? มีอักขระอะไรบ้างที่เราสามารถสันนิษฐานได้ว่าจะไม่อยู่ในสตริง (โดยเฉพาะช่องว่าง)?
FryAmTheEggman

คำตอบ:


6

APL (Dyalog) 4 ไบต์

,⌸

ลองออนไลน์!

( คือ 3 ไบต์)

ใช้การจัดทำดัชนีแบบอิง 1

เป็นผู้ดำเนินการที่สำคัญ ที่นี่มันทำงานเป็นผู้ประกอบการ monadic มันใช้ฟังก์ชั่น,เชื่อมอาร์กิวเมนต์ซ้ายกับอาร์กิวเมนต์ที่ถูกต้องให้กับแต่ละองค์ประกอบที่ไม่ซ้ำกันในการโต้แย้งที่ถูกต้องและดัชนีขององค์ประกอบที่ไม่ซ้ำกันในการโต้แย้งเดิม


หืมนี้ต้องการคำอธิบาย :-)
2560

4
@ Adámฉันสงสัยว่าความท้าทายนี้ได้รับการปรับแต่งเป็นพิเศษสำหรับ APL 😉
Uriel

@Uriel วิธีอื่น ๆ ฉันกำลังดูว่า APL สามารถทำอะไรได้อย่างเรียบร้อยและคิดว่านี่จะเป็นการท้าทายที่ดี
อดัม

ฉันเห็น 4 ไบต์ที่นั่น
อดัม

2

Haskell , 86 ไบต์

import Data.List
f s=unlines[x:concat[' ':show i|i<-[0..length s-1],s!!i==x]|x<-nub s]

นิยามฟังก์ชันfซึ่งส่งคืนสตริงที่มีเอาต์พุตนี้

ลองออนไลน์!

อย่างไร?

import Data.List                                                            -- Imports Data.List. This contains the nub method which is necessary
f s =                                                                       -- Define a function, f, which takes one argument, s
            [                                               |x<-nub s]      -- Loop through nub s with the variable x. Nub removes duplicates from a list, in this case the input.
                     [          |i<-[0..length s-1]        ]                -- Go thourgh the list [0,1,2...] until the length of the input - 1. Basically a indexed for-loop
                                                   ,s!!i==x                 -- Filter out everything where the char at this index isn't x
                      ' ':show i                                            -- i as a string with a space before it
               concat                                                       -- Flatten the whole list
             x:                                                             -- Append x before it
     unlines                                                                -- Insert newlines between every element in the list and flatten it, effectively putting every element on it's own line

2
ฉันไม่คิดว่าฉันเคยเห็นรูปแบบความคิดเห็นที่ใช้สำหรับ Haskell
Adám

ความเข้าใจในรายการภายในของคุณสามารถย่อให้เล็กลง[' ':show i|(i,c)<-zip[0..]s,c==x]ได้
Laikoni

2

kdb + / q , 5 ไบต์

group

Builtins นั้นยอดเยี่ยม

q)group"abracadabra"
a| 0 3 5 7 10
b| 1 8
r| 2 9
c| ,4
d| ,6

ฉันมักจะเล่นกอล์ฟในkแต่รุ่น 2 ไบต์ k ( =:) ไม่ได้จัดรูปแบบผลลัพธ์เป็นอย่างดี

k)=:"abracadabra"
"abrcd"!(0 3 5 7 10;1 8;2 9;,4;,6)

ผลลัพธ์เหมือนกันทุกประการ แต่การจัดรูปแบบจะหายไป ในการจัดรูปแบบและเพื่อลบวัตถุส่งคืนเรารับไบต์มากกว่ารุ่น q

k)f:{1@.Q.s x;} //11 bytes!
k)f"abracadabra"
a| 0 3 5 7 10
b| 1 8
r| 2 9
c| ,4
d| ,6

หืมมันส่งคืนพจนานุกรม น่าสนใจ
อดัม





0

05AB1E , 14 ไบต์

ÙvSyQƶ0Ky¸ìðý,

ลองออนไลน์!

คำอธิบาย

Ùv              # for each unique char y in input
  S             # split input into a list of chars
   yQ           # compare each to y for equality
     ƶ          # multiply each by its 1-based index
      0K        # remove zeroes
        y¸ì     # prepend y to the list of indices
           ðý,  # join by spaces and print

0

Mathematica, 85 ไบต์

ใช้การจัดทำดัชนีแบบฐานเดียว

(t=#;j=First/@t~StringPosition~#&/@(s=First/@Tally@Characters@t);Row[Column/@{s,j}])&

0

จาวาสคริปต์ (ES Draft), 77 ไบต์

s=>s.replace(/./g,(c,i)=>a[c]=(a[c]||c)+` `+i,a={})&&Object.values(a).join`
`

88 ไบต์ในเบราว์เซอร์รุ่นเก่า:

f=
s=>s.replace(/./g,(c,i)=>a[c]=(a[c]||c)+` `+i,a={})&&Object.keys(a).map(c=>a[c]).join`
`
<input oninput=o.textContent=f(this.value)><pre id=o>



0

QBIC , 95 ไบต์

dim X(126)[_l;||i=asc(_sA,a,1|)┘X(i)=X(i)+@ `+!a$][_lA||_SA,b,1|i=asc(C)~X(i)<>D|?C,X(i)┘X(i)=@

คำอธิบาย

สิ่งนี้คัดลอกส่วนสำคัญของคำตอบของฉันต่อความท้าทายนี้ :

dim x(126)      Create an array of 126 elements (one for each ASCII element)
[_l;||          Read cmd line input, loop over its length
i=asc(_sA,a,1|) Read the next char's ascii value
┘               (Syntactic linebreak)
X(i)=           Set the value for this ascii-codepoint to
 X(i)             everything we've put in before
 +@ `             and a literal space
 +!a$             and the current (1-based) index cast as string
 ]              close the FOR loop
 [_lA||         Loop over the original string again (to preserve order of appearance)
 _SA,b,1|       Read 1 char, assign to C$ (note the capital S in the function call,
                this auto-creates C$ abd assigns it the value of the substring-call)
 i=asc(C)       Get the index in our storage array from C$'s ascii value
 ~X(i)<>D       IF the storage array holds data for i (<> D$, which we'll set to "" in a second), 
 |?C,X(i)       THEN PRINT the character, followed by the indices saved for this char
 ┘              (Syntactic linebreak)
 X(i)=@         Clear out the data stored for C$
                @ declares a string lit, ` would close it and that gets auto-added at EOF, 
                creating the literal @`, which gets assigned to D$

วิ่งตัวอย่าง:

Command line: abracadabra
a              1 4 6 8 11
b              2 9
r              3 10
c              5
d              7

0

C (เสียงดังกราว) , 176 ไบต์

G(S,V,c,g,i,H,L)char*S,*V;{for(V=malloc(8),H=strlen(S),c=g=-1;++g<H;){if(strchr(V,L=S[g]))continue;printf("%c ",V[c++]=L);for(i=-1;++i<H;printf(S[i]==L?"%d ":"",i));puts("");}}

แน่นอนว่านี่เป็นคำตอบที่ยาวที่สุดที่นี่ ...

ลองออนไลน์!


โซลูชัน Java อยู่ที่ไหน
อดัม



0

C # , 138 ไบต์

using System.Linq;s=>Console.Write(string.Join("\n",s.Distinct().Select(c=>c+string.Join("",s.Select((d,i)=>d==c?i:-1).Where(i=>i>-1)))));

0

F # , 120 ไบต์

let f s=s|>Seq.indexed|>Seq.groupBy(fun(a,b)->b)|>Seq.iter(fun(a,b)->
 printf"\n%c"a 
 Seq.iter(fun(c,_)->printf"%i"c)b)

รุ่นที่อ่านได้มากขึ้น:

let f s =
    s
    |> Seq.indexed
    |> Seq.groupBy (fun (idx, char) -> char)
    |> Seq.iter (fun (char, charIdxSeq) ->
         printf "\n%c" char 
         Seq.iter (fun (idx, _) -> printf "%i" idx) charIdxSeq)

Seq.indexed สร้างลำดับใหม่ที่มี tuples ซึ่งประกอบด้วยองค์ประกอบดั้งเดิมและเป็นดัชนี 0 ที่อยู่ในลำดับเดิม

ส่วนที่เหลือเป็นคำอธิบายตัวเองค่อนข้างไม่เคยเป็นสิ่งที่ดีสำหรับการเล่นกอล์ฟ!




0

Huskขนาด 10 ไบต์

§mȯ§:;ms¥u

ลองออนไลน์!

หมายเหตุ: Husk (หรืออย่างน้อยคำสั่ง¥) นั้นใหม่กว่าความท้าทายนี้

คำอธิบาย

§mȯ§:;ms¥u  Implicit input, say S = "ababbc".
         u  Remove duplicates: "abc"
§m          Map over this string:
             Argument is a character, say 'b'.
        ¥    1-based indices in S: [2,4,5]
      ms     Convert each to string: ["2","4","5"]
     ;       Wrap argument in a string: "b"
  ȯ§:        Prepend to list of index strings: ["b","2","4","5"]
            Result is a list of lists of strings
             [["a","1","3"],["b","2","4","5"],["c","6"]]
            Implicitly print, separating strings by spaces and lists by newlines.
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.