Arama endeksi yapma


12

Bir dize verildiğinde, ilk sütunun dizgenin oluşma sırasına göre benzersiz harflerine sahip olduğu bir tablo döndürün ve sonraki sütunlar sıfır veya tek tabanlı dizine ekleme kullanarak dizede bu harfin dizinlerini listeler. En soldaki sütun dikey olarak hizalandığı sürece yatay boşluk önemli değildir. Endeksler soldan sağa doğru artan sırada olmalıdır.

Örnekler

Sıfır tabanlı indeksleme kullanarak ve verilen "abrakadabra", döndür

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

Tek tabanlı dizine ekleme ve "3141592653589793238462643383279503" verilen, şunu döndürün:

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                     

Çıktıda önde gelen boşluklar olabilir mi?
Outgolfer Erik

Çıktı formatı katı olmalı mı?
Sızan Rahibe

@EriktheOutgolfer Evet. Katma.
Adám

@LeakyNun No. Eklendi.
Adám

2
Bunun yazdırılabilir ASCII olmayan karakterler için çalışması gerekiyor mu? Dizede olmayacağını varsayabileceğimiz herhangi bir karakter var mı (özellikle boşluk)?
FryAmTheEggman

Yanıtlar:


6

APL (Dyalog) , 4 bayt

,⌸

Çevrimiçi deneyin!

( 3 bayttır)

1 tabanlı indeksleme kullanır.

ana operatördür. Burada monadik bir operatör gibi davranır. Fonksiyonu uygular, ,sol argümanı sağ argümanla birleştirir, sağ argümanındaki her benzersiz öğeye ve özgün argümandaki bu benzersiz öğenin dizinlerine uygular .


Hm, bunun bir açıklamaya ihtiyacı var :-)
Adám

4
@ Adám Bu zorluğun özellikle APL 😉 için özel olarak tasarlandığından şüpheleniyorum
Uriel

@Uriel Diğer yol. APL'nin düzgün bir şekilde neler yapabileceğine bakıyordum ve bunun iyi bir meydan okuma olacağını düşündüm.
Adám

Orada 4 bayt görüyorum.
Adám

2

Haskell , 86 bayt

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

fBu çıktıyı içeren bir Dize döndüren bir işlev tanımlar .

Çevrimiçi deneyin!

Nasıl?

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 için kullanılan yorum biçimini hiç gördüğümü sanmıyorum.
Adám

İç liste anlayışınız kısaltılabilir [' ':show i|(i,c)<-zip[0..]s,c==x].
Laikoni

2

kdb + / q , 5 bayt

group

İnşa fab vardır

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

Genellikle k olarak golf oynarım , ancak 2 bayt k sürümü ( =:) çıktıyı güzel biçimlendirmez

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

Sonuçlar tamamen aynıdır, ancak biçimlendirme kaybolur. Biçimlendirmek ve döndürülen nesneyi kaldırmak için, q sürümünden daha fazla bayt alıyoruz

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, sözlük döndürüyor. İlginç.
Adám





0

05AB1E , 14 bayt

ÙvSyQƶ0Ky¸ìðý,

Çevrimiçi deneyin!

açıklama

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

tek tabanlı indeksleme kullanma

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

0

JavaScript (ES Taslak), 77 bayt

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

Eski tarayıcılarda 88 bayt:

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 bayt

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

açıklama

Bu , bu meydan okumadaki cevabımın önemli kısımlarını kopyalar :

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$

Örnek çalışma:

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


0

Python 3, 111106 bayt

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 bayt

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 bayt

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)

Daha okunabilir bir versiyon:

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 orijinal öğeden oluşan tuples içeren yeni bir dizi oluşturur ve orijinal dizideki 0 tabanlı dizindir.

Gerisi asla golf için iyi bir şey olan oldukça kendini açıklayıcı!


0

R , 80 77 bayt

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

Çevrimiçi deneyin!

anonim bir işlev; sonucu, sondaki yeni satırla 1 dizinli olarak yazdırır.



0

Kabuk , 10 bayt

§mȯ§:;ms¥u

Çevrimiçi deneyin!

Not: Kabuk (veya en azından komut ¥) bu mücadeleden daha yenidir.

açıklama

§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.
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.