Endeksleri ve değerleri değiştirme


29

Görev

, Girişi bir liste / dizisi olan bir program ya da işlev Yazın X, çıkış tamsayılar ve tam sayıların setlerinin bir listesi , Y , örneğin, her bir eleman için , e her bir set , Y [ I ], X, [ E ] = I , ve bu setler toplam eleman sayısı o Y eleman sayısına eşit X .

(Bu, temelde dizilere uygulanması dışında bir karmaşanın / sözlüğün tersine çevrilmesiyle aynı işlemdir.)

Örnekler

Bu örnekler 1 tabanlı dizinlemeyi varsaymaktadır, ancak tercih ederseniz bunun yerine 0 tabanlı dizinlemeyi kullanabilirsiniz.

X             Y
[4]           [{},{},{},{1}]
[1,2,3]       [{1},{2},{3}]
[2,2,2]       [{},{1,2,3}]
[5,5,6,6]     [{},{},{},{},{1,2},{3,4}]
[6,6,5,5]     [{},{},{},{},{3,4},{1,2}]

Açıklamalar

  • İsterseniz bir seti bir liste olarak temsil edebilirsiniz. Bunu yaparsanız, elemanlarının sırası önemli değildir, ancak elemanları tekrar etmeyebilirsiniz.
  • Herhangi bir makul belirgin G / Ç formatı kullanabilirsiniz; örneğin, bir kümenin öğelerini boşluklarla ve kümelerin kendilerini yeni çizgilerle ayırabilirsiniz.
  • Y , son derece uzun ve en azından X'in tüm öğelerini dizi dizinleri olarak alacak kadar uzun olmalıdır . Bununla birlikte, X'in maksimum elemanından daha uzun olabilir (ekstra elemanlar boş kümeler olur).
  • X öğelerinin tümü geçerli dizi indisleri, yani 0 tabanlı indeksleme kullanıyorsanız negatif tamsayılar veya 1 tabanlı indeksleme kullanıyorsanız pozitif tamsayılar olacaktır.

Zafer durumu

Bir As meydan, kısa olması daha iyidir.


İlgili . In Sandbox yazı (şimdi silindi, ancak ünü varsa de görüntüleyebilir), bunun muhtemelen bir kopya değildi karar verdi, ama eğer katılmıyorum sona oylamak için çekinmeyin.

"Kendi elemanlarının sırası önemli değil" nin çıkışları anlamına mı [5,5,6,6]ve [6,6,5,5]aynı olabilir?
Sızdıran Rahibe

1
@ LeakyNun Çıkış listesindeki kümelerin elemanlarının sırası önemli değil. Yani [5,5,6,6]ve [6,6,5,5]aynı çıkışı olamaz, ama için çıkış [5,5,6,6], örneğin, aynı zamanda olabilirdi [{},{},{},{},{2,1},{4,3}].
ngenis,

X'te bir dizinin kabul edilebilir bir maksimum değeri var mı? Ayrıca boş kümeler aslında boş olmak yerine içlerinde 0 olabilir mi? Örneğin, [{0},{0},{0},{0},{1,2},{3,4}]geçerli çıktı olur [5,5,6,6]mu?
Skidsdev

@Mayube: İlk cevaba hayır (tamsayılarla sınırlı bir dil kullanıyorsanız, programı tamsayılar sınırsız derecede büyük olabilirmiş gibi yazabilirsiniz ve birisi size bir çıkış verirse kırılması konusunda endişelenmeyin- aralık olarak tamsayı değeri). İkinci soruya gelince, bu, 1 tabanlı bir dizinleme kullanırken belirsiz (garipse) bir sözdizimidir, bu durumda evet (yani, 0 tabanlı bir dizinleme kullanıyorsanız hayır; başka.)

Yanıtlar:


9

MATL , 8 bayt

tn:IXQ&D

Giriş, ;ayırıcı olarak bir sütun vektörüdür (örneğin [2;2;2]). Çıktı, satır vektörlerinin (örneğin {[]; [1 2 3]}) bir hücre dizisinin dize gösterimidir . Tek bir elemanın satır vektörü sayı ile aynıdır ( {1; 2; 3}bunun yerine çıkış olacaktır {[1]; [2]; [3]}).

Çevrimiçi deneyin! Veya tüm test durumlarını doğrulayın .

açıklama

t     % Implicit input, say x. Duplicate
n     % Number of elements, say N
:     % Range: [1 2 ... N]
IXQ   % accumarray(x, [1 2 ... N], [], @(x){sort(x).'})
&D    % String representation

Çalışmanın çoğu, Matlab'ın accumarrayikinci girişteki elemanları ilk önce eşleşen değerlere göre gruplayan ve her gruba belirli bir işlevi uygulayan üst düzey işlevi tarafından yapılır . Bu durumda, @(x){sort(x).'}her gruptaki sıralı elemanları çıkaran ve tüm grupların sonuçlarının bir hücre dizisine paketlenmesine neden olan fonksiyondur.


7

Python, 69 bayt

lambda s:[[j for j,x in enumerate(s)if x==i]for i in range(max(s)+1)]

0 tabanlı endeksleme kullanır.


7

Jöle , 7 5 bayt

=þṀT€

Çevrimiçi deneyin!

Nasıl çalışır

=þṀT€  Main link. Argument: A (array)

  Ṁ    Yield m, the maximum of A.
=þ     Equals table; for each t in [1, ..., m], compare all elemnts of A with t,
       yielding a 2D Boolean array.
   T€  Truth each; for each Boolean array, yield all indices of 1.

5

Jöle , 8 bayt

Jẋ"Ṭ€;"/

Çevrimiçi deneyin!

Nasıl çalışır

Jẋ"Ṭ€;"/  argument: z           eg. [6,6,4,4]
J         [1 .. len(z)]             [1,2,3,4]
   Ṭ€     untruth each of z         [[0,0,0,0,0,1],
                                     [0,0,0,0,0,1],
                                     [0,0,0,1],
                                     [0,0,0,1]]
 ẋ"       repeat each of ^^         [[[],[],[],[],[],[1]],
          as many times as           [[],[],[],[],[],[2]],
          each of ^                  [[],[],[],[3]],
                                     [[],[],[],[4]]]
       /  reduce by...
     ;"   vectorized concatenation  [[],[],[],[3,4],[],[1,2]]

4

Mathematica, 36 bayt

Join@@@#~Position~n~Table~{n,Max@#}&

açıklama

enter image description here

Her biri için nin {1, 2, ..., Max@#}, Max@#giriş listesindeki en büyük tamsayıdır, hesaplar Positions nereye ngirdi listesinde görünür #. Yana Position[{6,6,5,5},5](örneğin) dönüşleri {{3},{4}}, o zaman Apply Joinseviyede tüm elemanlara {1}sonucu.


3

Haskell , 45 bayt

stamsayıların listesini alır ve listelerin listesini döndürür. Test senaryosu girişlerini değiştirilmemiş halde tutmak için 1 indeksli (çıkış ekstra boş listeler alsa da).

s l=[[i|(i,y)<-zip[1..]l,y==x]|x<-[1..sum l]]

Çevrimiçi deneyin!

Bunlar oldukça basit iç içe liste kavramalardır. Sadece hafif çimdik sumyerine kullanarak daha uzun bir liste yapma seçeneğinden yararlanıyor maximum.


3

PHP, 55 bayt

<?while($i<=max($_GET))print_r(array_keys($_GET,$i++));

0 endeksli.


3

R, 68 49 47 bayt

lapply(1:max(x<-scan()),function(y)which(y==x)) 

Şaşırtıcı bir şekilde, uzun çözümlerden çok daha kolay. Bir vektör Alır x, STDIN'den bir vektör oluşturur 1için max(x)örtülü uzunlukta bir listesini oluşturur,max(x) hangi endekslerini ve çekler xyeni listede olanlarla tekabül. Örtük çıktılar yazdırır.

Eski versiyon:

o=vector('list',max(x<-scan()));for(i in x)o[[i]]=c(o[[i]],F<-F+1);o

Diğer R cevabına biraz farklı yaklaşım. STDIN'e bir vektör alır, girişteki maksimum değere eşit uzunlukta bir liste oluşturur. Girdi üzerinde dolaşır ve dizini doğru yere ekler.

1 tabanlı indeksleme kullanır.


2

Python 2 , 91 86 85 bayt

Telefonumda programlama yapıyorum ancak bu zorluğu gerçekten sevdim. Kesinlikle bundan daha fazla golf oynayabilirim.

def f(a):
 r=[[]for i in range(max(a)+1)]
 for i,j in enumerate(a):r[j]+=[i]
 print r

Çevrimiçi deneyin!


Yuvalanmış bir liste kavrayışıyla tekrar golf oynadı. : D
totalhuman

2

Jöle , 9 bayt

Ṭ+\ịĠȧ@"Ṭ

1-indeksli, boş kümeler olarak temsil edildi 0, bir öğenin Nkümeleri olarak temsil edildi;[M,N,...]

Çevrimiçi deneyin!

Nasıl?

Ṭ+\ịĠȧ@"Ṭ - Main link: list a        e.g. [6,6,4,4]
Ṭ         - untruth a                     [0,0,0,1,0,1]
  \       - cumulative reduce with:
 +        -   addition                    [0,0,0,1,1,2]
    Ġ     - group indices of a by value   [[3,4],[1,2]]
   ị      - index into                    [[1,2],[1,2],[1,2],[3,4],[3,4],[1,2]]
        Ṭ - untruth a                     [0,0,0,1,0,1]
       "  - zip with:
     ȧ@   -   and with reversed @rguments [0,0,0,[3,4],0,[1,2]]

2

JavaScript (ES6), 64 62 bayt

@SteveBennett sayesinde 2 bayt kaydedildi


0 indeksli giriş alır. Virgülle ayrılmış bir takım listesi döndürür.

a=>a.map((n,i)=>o[n]=[i,...o[n]||[]],o=[])&&`{${o.join`},{`}}`

Test durumları


Alternatif sürüm, 53 bayt

Böyle bir basitleştirilmiş çıktı '||||3,2|1,0'kabul edilebilir ise, biz sadece yapabiliriz:

a=>a.map((n,i)=>o[n]=[i,...o[n]||[]],o=[])&&o.join`|`

Vay. `{${o.join`},{`}}`ES2015’in yasal olmasının ne kadar karışık olduğunu .
Steve Bennett

@ SteveBennett, bu bir hazır bilgi şablonu . JS'nin eski sürümlerinde "{" + o.join("},{") + "}", eğer daha net olursa, öyle olacaktır .
Shaggy

Hayır, ben bunları biliyorum - bu kafa karıştırıcı kelime beni şaşırtıyor sonra katılımdır. Bu ipi kapatıyor mu (hangi durumda wtf) yoksa sıkı bir şekilde mi kaçarsın?
Steve Bennett

Hmm, tamam, yani bu bağlamda join`eşittir join('. Bunu yapabileceğini bilmiyordum.
Steve Bennett

Ah, şimdi anlıyorum. Etiketlenmiş bir şablon hazır. Hangi (diğerlerini yok sayar) bir dize argüman alan bir işleve çağırarak her karakter bir çift kaydetmek için kötüye kullanabilirler: array.join` `. Süper kafa karıştırıcı çünkü bunu bir şablon dizgisine yerleştiriyorsunuz, ve hatta daha da kafa karıştırıcı olan, birleştirici dizge, },{rastlantısal olarak şablon dizisinin bir parçası gibi görünüyordu ... ve yine de çok garip ve çirkin. :)
Steve Bennett

1

Bash , 109 bayt

Çok kötü dizi maksimum değer için yerleşik bir yoktur.

a=($@)
for((x=m=1;x<=m;x++)){ for((y=0;y<$#;)){((m<a[y]))&&((m=a[y]));((a[y++]==x))&&printf "%d " $y;};echo;}

Çevrimiçi deneyin!


1

Mathematica 62 bayt

(Y={}~Table~Max@#;Y[[#[[j]]]]~AppendTo~j~Table~{j,Tr[1^#]};Y)&

Senin için koşacağım

(Y={}~Table~Max@#;Y[[#[[j]]]]~AppendTo~j~Table~{j,Tr[1^#]};Y)&[{4,5,2,3,3,8,6,3}]

{{}, {3}, {4, 5, 8}, {1}, {2}, {7}, {}, {6}}

Çevrimiçi deneyin (yalnızca kodu ctrl-v ile yapıştırın ve shift + enter tuşuna basın)
giriş listesini yukarıdaki örnekteki gibi yapıştırmayı unutmayın


PPCG'ye Hoşgeldiniz! İçin bir bayt kaydedebilirsiniz AppendTo. Ayrıca, {j,1,Length[#1]}sadece {j,Length@#}, hatta daha kısa olabilir {j,Tr[1^#]}. kullanarak bir bayt kurtarmak Tr[1^#]için oldukça yaygın bir hiledirLength .
ngenis

1

Perl 6 ,  36 32  29 bayt

->\a{map {a.grep(*==$_):k},1..a.max}

Dene

{map {.grep(*==$^a):k},1.. .max}

Dene

{map {.grep($^a):k},1.. .max}

Dene


Expanded:

{  # bare block lambda with implicit parameter 「$_」

  map

    {  # bare block lambda with placeholder parameter 「$a」

      .grep(  # grep for the values in 「$_」
        $^a   # that are equal to the currently tested value (and declare param)
      ) :k    # return the key (index) rather than the value
    },

    1 .. .max # Range from 1 to the maximum value in 「$_」

}

Op ile birleştirilmiş 1 tabanlı kullanım çapraz operatörünü ( X)+ almak için sıfır tabanlı dizinleri döndürür . (33 bayt)

{1 X+.grep($^a):k}

Döndürmek için Set s komutunu buraya ekleyinset (toplam 37 bayt)

{set 1 X+.grep($^a):k}

1

R, 80 72 bayt

1 indeksli, Xstdin'den alır . NULLBoş küme olarak, dizinlerin vektörlerinin bir listesini döndürür .

X=scan();Y=vector('list',max(X));Y[X]=lapply(X,function(x)which(X==x));Y

Çevrimiçi deneyin!

eski versiyon:

X=scan();Y=vector('list',max(X));for(i in 1:length(X))Y[[X[i]]]=c(Y[[X[i]]],i);Y

Çevrimiçi deneyin!


Sanırım bu Y=list();da iyi çalışıyor
rturnbull

Cevabımda bir fewbayt tıraş başardı
JAD




0

GNU Make , 214 213 208 204 bayt

X=$(MAKECMDGOALS)
M=0
P=$(eval N=$(word $1,$X))$(if $N,$(if $(shell dc -e$Nd$Mds.\>.p),$(eval M=$N),)$(eval A$N+=$1$(call $0,$(shell expr $1 + 1))),)
$(call P,1)$(foreach K,$(shell seq $M),$(info $(A$K)))

G / Ç: bağımsız değişkenler yoluyla girdi dizisi, çıktı stdout, satır başına bir, boşluklarla ayrılmış.

$ make -f swap.mk 2 2 2

3 2 1
make: *** No rule to make target `2'.  Stop.

açıklama

X=$(MAKECMDGOALS)     # Input array
M=0                   # Max value encountered in X
P=$(eval
    N=$(word $1,$X))  # Get next word from X
  $(if $N,$(if $(shell dc -e$Nd$Mds.\>.p),
    $(eval M=$N),)    # Update M
    $(eval A$N+=$1    # Append index to a variable named after value
      $(call $0,      # Recurse (call returns empty string)
        $(shell expr $1 + 1))),)
$(call P,1)           # Initial call to P. 1 is the first index
$(foreach K,          # Print all values of A* variables
  $(shell seq $M),
  $(info $(A$K)))     # Uninitialized ones default to empty strings

Kümelerdeki endekslerin sırası ters çevrilmiştir çünkü Pgüncelleme yapmadan önce kendisini tekrar tekrar A$2çağırır (çağrı sağ tarafın değerlendirmesinde yapılır).


makeAritmetik yapmanın herhangi bir yolu var mı ? Bunu yapmak için harici programları çağırmak biraz hile yapmak gibi hissettirir, çünkü muhtemelen bu algoritmalardan daha fazlasını algoritmaya koyabilir ve daha kısa bir programla sonuçlanabilir.

@ ais523 Yapmadı. Önceki versiyon kullanılmış bcve grep. Ben de kullanabilir testve $?. dcterser bir sözdizimi vardır, fakat açıkçası bunların hepsi aynıdır.
eush77

0

Ortak Lisp, 91 bayt

(lambda(x &aux(l(make-list(eval`(max,@x))))(i 0))(dolist(y x l)(push(incf i)(nth(1- y)l))))

1 tabanlı indeksleme, setleri liste halinde döndürür.

Çevrimiçi deneyin!


0

k , 13 bayt

{(=x)@!1+|/x}

Bu 0 indeksli.

Çevrimiçi deneyin!

{           } /function(x)
 (=x)         /make a map/dictionary of values to their indices
         |/x  /get maximum value in x
      !1+     /make a range from 0 to the value, inclusive
     @        /get map value at each of the values in the range
              /    0N is given where there is no result
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.