Buat indeks pencarian

12

Diberikan string, kembalikan tabel di mana kolom pertama memiliki huruf unik dari string dalam urutan kejadian dan kolom berikutnya daftar indeks huruf itu dalam string, menggunakan pengindeksan berbasis nol atau satu. Spasi horisontal tidak menjadi masalah, selama kolom paling kiri disejajarkan secara vertikal. Indeks harus dalam urutan menaik dari kiri ke kanan.

Contohnya

Dengan menggunakan pengindeksan berbasis nol dan diberi "abracadabra", kembali

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

Menggunakan pengindeksan berbasis satu dan diberikan "3141592653589793238462643383279503", kembali:

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                     
Adm
sumber
Bisakah saya memiliki spasi utama dalam output?
Erik the Outgolfer
Apakah format output harus ketat?
Leaky Nun
@EriktheOutgolfer Ya. Ditambahkan.
Adám
@LeakyNun No. Ditambahkan.
Adám
2
Apakah ini perlu untuk karakter yang tidak dapat dicetak ascii? Adakah karakter yang dapat kita asumsikan tidak ada dalam string (terutama spasi putih)?
FryAmTheEggman

Jawaban:

6

APL (Dyalog) , 4 byte

,⌸

Cobalah online!

( adalah 3 byte)

Menggunakan pengindeksan berbasis 1.

adalah operator utama. Di sini ia berperilaku sebagai operator monadik. Ini menerapkan fungsi ,, menggabungkan argumen kiri dengan argumen kanan, untuk setiap elemen unik dalam argumen kanannya dan indeks elemen unik itu dalam argumen asli.

pengguna41805
sumber
Hm, ini perlu penjelasan :-)
Adám
4
@ Adám Saya menduga tantangan ini dirancang khusus untuk APL 😉
Uriel
@Uriel sebaliknya. Saya melihat apa yang bisa dilakukan APL dengan rapi, dan berpikir bahwa ini akan menjadi tantangan yang bagus.
Adám
Saya melihat 4 byte di sana.
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]

Menentukan fungsi,, fyang mengembalikan sebuah String yang berisi output ini.

Cobalah online!

Bagaimana?

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
Loovjo
sumber
2
Saya tidak berpikir saya pernah melihat format komentar yang digunakan untuk Haskell.
Adám
Pemahaman daftar batin Anda dapat disingkat menjadi [' ':show i|(i,c)<-zip[0..]s,c==x].
Laikoni
2

kdb + / q , 5 byte

group

Builtin hebat

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

Saya biasanya bermain golf di k , tetapi versi 2-byte k ( =:) tidak memformat output dengan baik

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

Hasilnya persis sama, tetapi formatnya hilang. Untuk memformat, dan menghapus objek kembali, kami sebenarnya mengambil lebih banyak byte daripada versi q

k)f:{[email protected] x;} //11 bytes!
k)f"abracadabra"
a| 0 3 5 7 10
b| 1 8
r| 2 9
c| ,4
d| ,6
Simon Major
sumber
Hm, ini mengembalikan kamus. Menarik.
Adám
1

Python, 96 byte

def f(s,r=[]):
 for c in s:
  if c not in r:print(c,*(i for i,l in enumerate(s) if l==c));r+=[c]

coba online!

Uriel
sumber
0

05AB1E , 14 byte

ÙvSyQƶ0Ky¸ìðý,

Cobalah online!

Penjelasan

Ù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
Emigna
sumber
0

Mathematica, 85 byte

menggunakan pengindeksan berbasis satu

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

JavaScript (Draf ES), 77 byte

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

88 byte di browser yang lebih lama:

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>

Neil
sumber
0

PHP , 82 byte

for(;~$c=$argn[$i];)$r[$c].=str_pad(++$i,5," ",0);foreach($r as$k=>$v)echo"$k$v
";

Cobalah online!

Jörg Hülsermann
sumber
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)=@

Penjelasan

Ini menyalin bagian penting dari jawaban saya untuk tantangan ini :

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$

Contoh dijalankan:

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

C (dentang) , 176 byte

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

Tentu ini adalah jawaban terpanjang di sini ...

Cobalah online!

R. Kap
sumber
Di mana solusi Java?
Adám
164 byte
ceilingcat
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]

repl.it

Wondercricket
sumber
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)))));

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

Versi yang lebih mudah dibaca:

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 membuat urutan baru yang berisi tupel yang terdiri dari elemen asli dan itu berdasarkan indeks 0 dalam urutan asli.

Sisanya cukup jelas yang tidak pernah bagus untuk golf!


sumber
0

R , 80 77 byte

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

Cobalah online!

fungsi anonim; mencetak hasil 1-diindeks dengan baris baru tambahan.

Giuseppe
sumber
0

J , 11 byte

~.,.":@I.@=

Cobalah online!

FrownyFrog
sumber
0

Sekam , 10 byte

§mȯ§:;ms¥u

Cobalah online!

Catatan: Sekam (atau setidaknya perintah ¥) lebih baru dari tantangan ini.

Penjelasan

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