Hacer un índice de búsqueda


12

Dada una cadena, devuelva una tabla donde la primera columna tiene las letras únicas de la cadena en orden de ocurrencia y las columnas posteriores enumeran los índices de esa letra en la cadena, usando indexación basada en cero o en una. El espacio en blanco horizontal no importa, siempre que la columna de la izquierda esté alineada verticalmente. Los índices deben estar en orden ascendente de izquierda a derecha.

Ejemplos

Usando indexación basada en cero y dado "abracadabra", regrese

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

Usando indexación basada en uno y dado "3141592653589793238462643383279503", devuelva:

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                     

¿Puedo tener espacios iniciales en la salida?
Erik the Outgolfer

¿El formato de salida debe ser estricto?
Leaky Nun

@EriktheOutgolfer Sí. Adicional.
Adám

@LeakyNun No. Agregado.
Adám

2
¿Esto debe funcionar para los personajes que no son ascii imprimibles? ¿Hay algún personaje que podamos asumir que no estará en la cadena (particularmente en el espacio en blanco)?
FryAmTheEggman

Respuestas:


6

APL (Dyalog) , 4 bytes

,⌸

Pruébalo en línea!

( son 3 bytes)

Utiliza indexación basada en 1.

Es el operador clave. Aquí se comporta como un operador monádico. Aplica la función ,, concatenar el argumento izquierdo con el argumento derecho, a cada elemento único en su argumento derecho y los índices de ese elemento único en el argumento original.


Hm, esto necesita una explicación :-)
Adám

44
@ Adám Sospecho que este desafío se diseñó específicamente para APL 😉
Uriel

@Uriel Al revés. Estaba viendo qué APL puede hacer perfectamente, y pensé que esto sería un buen desafío.
Adám

Veo 4 bytes allí.
Adám

2

Haskell , 86 bytes

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

Define una función, fque devuelve una Cadena que contiene esta salida.

Pruébalo en línea!

¿Cómo?

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
No creo haber visto ese formato de comentario utilizado para Haskell.
Adám

Su comprensión de la lista interna se puede acortar [' ':show i|(i,c)<-zip[0..]s,c==x].
Laikoni

2

kdb + / q , 5 bytes

group

Las construcciones son fabulosas

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

Normalmente juego golf en k , pero la versión k de 2 bytes ( =:) no formatea bien la salida

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

Los resultados son exactamente los mismos, pero se pierde el formato. Para formatear y eliminar el objeto devuelto, en realidad recogemos más bytes que la versió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

Hm, devuelve un diccionario. Interesante.
Adám





0

05AB1E , 14 bytes

ÙvSyQƶ0Ky¸ìðý,

Pruébalo en línea!

Explicación

Ù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 bytes

usando indexación basada en uno

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

0

JavaScript (borrador ES), 77 bytes

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

88 bytes en navegadores antiguos:

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 bytes

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

Explicación

Esto copia partes significativas de mi respuesta en este desafío :

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$

Ejecución de muestra:

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

0

C (clang) , 176 bytes

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

Por supuesto, esta es la respuesta más larga aquí ...

Pruébalo en línea!


¿Dónde está la solución Java?
Adám


0

Python 3, 111 106 bytes

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


0

C # , 138 bytes

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 bytes

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)

Una versión más legible:

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 crea una nueva secuencia que contiene tuplas que se componen del elemento original y su índice basado en 0 en la secuencia original.

¡El resto se explica por sí mismo, lo que nunca es bueno para el golf!


0

R , 80 77 bytes

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

Pruébalo en línea!

una función anónima; imprime el resultado 1 indexado con una nueva línea final.



0

Casco , 10 bytes

§mȯ§:;ms¥u

Pruébalo en línea!

Nota: Husk (o al menos el comando ¥) es más nuevo que este desafío.

Explicación

§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.
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.