Tạo một chỉ số tra cứu


12

Đưa ra một chuỗi, trả về một bảng trong đó cột đầu tiên có các chữ cái duy nhất của chuỗi theo thứ tự xuất hiện và các cột tiếp theo liệt kê các chỉ số của chữ cái đó trong chuỗi, sử dụng lập chỉ mục bằng 0 hoặc một. Khoảng trắng ngang không quan trọng, miễn là cột ngoài cùng bên trái được căn chỉnh theo chiều dọc. Các chỉ số phải theo thứ tự tăng dần từ trái sang phải.

Ví dụ

Sử dụng lập chỉ mục dựa trên zero và đưa ra "abracadabra", trả lại

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

Sử dụng lập chỉ mục một dựa trên và đưa ra "3141592653589793238462643383279503", trả về:

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                     

Tôi có thể có không gian hàng đầu trong đầu ra không?
Erik the Outgolfer

Định dạng đầu ra phải nghiêm ngặt?
Leaky Nun

@EriktheOutgolfer Có. Thêm.
Adám

@LeakyNun Số Đã thêm.
Adám

2
Điều này có cần phải làm việc cho các ký tự không in được ascii không? Có bất kỳ ký tự nào chúng ta có thể giả sử sẽ không nằm trong chuỗi (đặc biệt là khoảng trắng) không?
FryAmTheEggman

Câu trả lời:


6

APL (Dyalog) , 4 byte

,⌸

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

( là 3 byte)

Sử dụng lập chỉ mục dựa trên 1.

là nhà điều hành chính. Ở đây nó hoạt động như một nhà điều hành đơn nguyên. Nó áp dụng hàm ,, nối đối số bên trái với đối số bên phải, cho từng phần tử duy nhất trong đối số bên phải và các chỉ số của phần tử duy nhất đó trong đối số ban đầu.


Hừm, điều này cần một lời giải thích :-)
Adám

4
@ Adám Tôi nghi ngờ thử thách này đã được thiết kế riêng cho APL
Uriel

@Uriel Cách khác. Tôi đã xem xét những gì APL có thể làm một cách gọn gàng và nghĩ rằng điều này sẽ tạo ra một thách thức tốt.
Adám

Tôi thấy 4 byte ở đó.
Adám

2

Haskell , 86 byte

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

Xác định hàm, ftrả về một Chuỗi chứa đầu ra này.

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

Làm sao?

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
Tôi không nghĩ rằng tôi đã từng thấy định dạng bình luận được sử dụng cho Haskell.
Adám

Hiểu danh sách bên trong của bạn có thể được rút ngắn để [' ':show i|(i,c)<-zip[0..]s,c==x].
Laikoni

2

kdb + / q , 5 byte

group

Nội dung là fab

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

Tôi thường chơi golf ở k , nhưng phiên bản k 2 byte ( =:) không định dạng đầu ra độc đáo

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

Các kết quả hoàn toàn giống nhau, nhưng định dạng bị mất. Để định dạng và để loại bỏ đối tượng trả về, chúng tôi thực sự chọn nhiều byte hơn phiên bản 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

Hừm, nó trả về một cuốn từ điển. Hấp dẫn.
Adám





0

05AB1E , 14 byte

ÙvSyQƶ0Ky¸ìðý,

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

Giải trình

Ù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

Toán học, 85 byte

sử dụng lập chỉ mục một

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

0

JavaScript (Dự thảo ES), 77 byte

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

88 byte trong các trình duyệt cũ hơn:

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 byte

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)=@

Giải trình

Điều này sao chép phần quan trọng trong câu trả lời của tôi về thử thách này :

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$

Chạy mẫu:

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


0

Python 3, 111 106 byte

def q(f):
 d={a:[]for a in f}
 for a,b in enumerate(f):d[b]+=[a]
 [print(p,*d.pop(p))for p in f if p in d]

thay thế


0

C # , 138 byte

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 byte

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)

Một phiên bản dễ đọc hơn:

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 tạo một chuỗi mới chứa các bộ dữ liệu được cấu thành từ phần tử gốc và chỉ số dựa trên 0 trong chuỗi ban đầu.

Phần còn lại là khá tự giải thích đó không bao giờ là một điều tốt cho golf!


0

R , 80 77 byte

function(s)for(i in (z=unique(s<-strsplit(s,'')[[1]])))cat(i,which(s==i),"
")

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

một chức năng ẩn danh; in kết quả 1 - được lập chỉ mục với một dòng mới.



0

Husk , 10 byte

§mȯ§:;ms¥u

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

Lưu ý: Husk (hoặc ít nhất là lệnh ¥ ) mới hơn thử thách này.

Giải trình

§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.
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.