Listeler listesindeki girişlere sırayla girerek tuples


9

Meydan okuma:

Boş olmayan tamsayı listelerinin bir listesi verildiğinde, aşağıdaki formdaki tupleslerin bir listesini döndürün: İlk liste, ilk listenin her bir öğesinden sonra gelen her bir listenin ilk öğesinden başlayarak, sonraki listenin ilk öğesiyle başlar, bu nedenle i. Tuple olmalıdır [ith element of first list, first element of second list, ... , first element of last list]. Örneğin:

[[1, 2, 3], [4, 5, 6], [7, 8, 9]] => [[1, 4, 7], [2, 4, 7], [3, 4, 7], ...

O zaman formun tuples'ını yapın [last element of first list, ith element of second list, first element of third list, ..., first element of last list], bu yüzden örneğimizde bu şöyle olurdu:

[[1, 2, 3], [4, 5, 6], [7, 8, 9]] =>  ..., [3, 4, 7], [3, 5, 7], [3, 6, 7], ...

Kalan her listeyle devam edene kadar devam edin [last element of first list, ..., last element of second to last list, ith element of last list]:

[[1, 2, 3], [4, 5, 6], [7, 8, 9]] => ..., [3, 6, 7], [3, 6, 8], [3, 6, 9]]

Tam çıktı aşağıdaki gibidir:

[[1, 2, 3], [4, 5, 6], [7, 8, 9]] => 
        [[1, 4, 7], [2, 4, 7], [3, 4, 7], [3, 5, 7], [3, 6, 7], [3, 6, 8], [3, 6, 9]]

İyi önlem için bazı kazanlar:

  • Girdinin dize listesi veya pozitif tamsayı listesi olmasını istiyorsanız sorun yok. Soru, listeleri değiştirmekle ilgili değil, listeleri değiştirmekle ilgilidir.
  • Giriş ve çıkış kabul edilebilir herhangi bir formatta olabilir .
  • Tam bir programa veya işleve izin verilir.
  • Standart boşluklara varsayılan olarak izin verilmez.
  • Bu soru kod golf, bu yüzden en düşük bayt sayısı kazanır.

Örnekler:

[] => [[]] (or an error, thanks to ngn for correcting the output in this case)

[[1]] => [[1]]

[[1, 2], [3, 4], [5]] => [[1, 3, 5], [2, 3, 5], [2, 4, 5]]

[[1], [2], [5, 6], [3], [4]] => [[1, 2, 5, 3, 4], [1, 2, 6, 3, 4]]

[[1, 2, 3], [4, 5]] => [[1, 4], [2, 4], [3, 4], [3, 5]]

[[1, 2, 3], []] => unspecified behavior (can be an error)

[[3, 13, 6], [9, 2, 4], [5, 10, 8], [12, 1, 11], [7, 14]] => 
     [[3, 9, 5, 12, 7], [13, 9, 5, 12, 7], [6, 9, 5, 12, 7], [6, 2, 5, 12, 7], 
      [6, 4, 5, 12, 7], [6, 4, 10, 12, 7], [6, 4, 8, 12, 7], [6, 4, 8, 1, 7], 
      [6, 4, 8, 11, 7], [6, 4, 8, 11, 14]]  

[[16, 8, 4, 14, 6, 7, 10, 15], [11, 1, 12, 2, 19, 18, 9, 3], [13, 5, 17]] =>
    [[16, 11, 13], [8, 11, 13], [4, 11, 13], [14, 11, 13], [6, 11, 13], 
     [7, 11, 13], [10, 11, 13], [15, 11, 13], [15, 1, 13], [15, 12, 13], [15, 2, 13], 
     [15, 19, 13], [15, 18, 13], [15, 9, 13], [15, 3, 13], [15, 3, 5], [15, 3, 17]]

Birisi daha iyi bir unvanı varsa, bana bildirin.


1
Ben bir his var [] => []gerçekten olmalı [] => [[]]ama neden açıklamak için kelime bulamıyorum.
ngn

1
@ngn Haklısınız, bunun [[]]nedeni, (sıfır) alt listesinin her birinden bir girişi olan tek bir boş demet olması gerektiğidir . Muhtemelen programların bunu doğru bir şekilde çıkarmasını gerektirecek kadar can sıkıcı, bu yüzden gerekli olmadığını söyleyeceğim.
Hood

1
Evet [], kesinlikle, boş olmayan listelerin boş bir listesidir, ancak çıktı, izin verilen bir girdi arasında []ve belirsizse [[]]. ("İlk liste, ilk listenin her bir öğesiyle başlar ..." - ilk liste yok, bu yüzden işimiz bitti -> [])
Jonathan Allan

1
@JonathanAllan Şimdi "doğru" çıktı olması []gerektiğine ikna oldum [[]]. Örneğin, çıkış tuples sayısı sum(inner list lengths) - length of outer list + 1boş durumda verir 1, uzunluğu, [[]]ancak uzunluğu değil []. Bu biraz bilgiçliksel bir sorun olsa ...
Hood

1
Tüm kayıtların farklı olduğunu varsayabilir miyiz? Ya da daha önemlisi, örneklerinizdeki gibi 1..n üzerinde bir permütasyon?
xnor

Yanıtlar:


5

JavaScript (ES6), 59 bayt

Pozitif tamsayıların bir listesini bekler .

f=a=>[a.map(a=>a[0]),...a.some(a=>a[1]&&a.shift())?f(a):[]]

Çevrimiçi deneyin!

Nasıl?

Her yinelemede:

  • Her listenin ilk öğesinden oluşan yeni bir liste çıkarıyoruz.
  • İlk listenin en az 2 öğe içeren ilk öğesini kaldırır ve işlemi tekrarlarız. Veya böyle bir liste yoksa özyinelemeyi durdururuz.

1
Bu a.somehile harika!
ETHproductions

1
@ETHproductions Şimdi kullanmak awe.somebayt kaybı olmaz bir meydan okuma arıyor ... :)
Arnauld


2

Jöle , 15 bayt

ẈṚṪ×€PƊƤFQṚCịŒp

Çevrimiçi deneyin! (altbilgi bir Jelly temsili yerine gerçek döndürülen listeyi görüntüler)

Nasıl?

Gerekli noktalarda listelerin Kartezyen ürününe indeksler ...

ẈṚṪ×€PƊƤFQṚCịŒp - Link: list of lists  e.g. [[6,8,4,9],[7,1,5],[3,2]]
Ẉ               - length of each            [4,3,2]
 Ṛ              - reverse                   [2,3,4]
       Ƥ        - for each prefix:             [2]      [2,3]      [2,3,4]
      Ɗ         -   last 3 links as a monad:
  Ṫ             -     tail (pop rightmost)     2        3          4
     P          -     product (of remaining)   1        2          6
    €           -     for €ach (range tail)    [1,2]    [1,2,3]    [1,2,3,4]   
   ×            -       multiply               [1,2]    [2,4,6]    [6,12,18,24]
        F       - flatten                   [1,2,2,4,6,6,12,18,24]
         Q      - de-duplicate              [1,2,4,6,12,18,24]
          Ṛ     - reverse                   [24,18,12,6,4,2,1]
           C    - complement (1-x)          [-23,-17,-11,-5,-3,-1,0]
             Œp - Cartesian product (of the input)
                -         -> [[6,7,3],[6,7,2],[6,1,3],[6,1,2],[6,5,3],[6,5,2],[8,7,3],[8,7,2],[8,1,3],[8,1,2],[8,5,3],[8,5,2],[4,7,3],[4,7,2],[4,1,3],[4,1,2],[4,5,3],[4,5,2],[9,7,3],[9,7,2],[9,1,3],[9,1,2],[9,5,3],[9,5,2]]
            ị   - index into (1-based & modular)
                -   indexes:      -23,                                            -17,                                            -11,                                             -5,             -3,             -1,     0
                -    values: [[6,7,3],                                        [8,7,3],                                        [4,7,3],                                        [9,7,3],        [9,1,3],        [9,5,3],[9,5,2]]
                -         -> [[6,7,3],[8,7,3],[4,7,3],[9,7,3],[9,1,3],[9,5,3],[9,5,2]]

ẈṚ’ṣ1T$¦ƬUṚị"€(14 bayt) (izlemeyen) uzunluktaki bir listeye sahip girişler için başarısız olur; ama belki ṣ1T$başka bir şeyle değiştirilebilir?


2

K (ngn / k) , 40 21 19 18 bayt

{x@'/:?|\+|!|#:'x}

Çevrimiçi deneyin!

@ H.PWiz'in cevabındaki fikirleri kullanır

{ } argüman ile işlev x

#:' her birinin uzunluğu

| tersine çevirmek

! bu boyutlara sahip bir dizi için bir matristeki sütunlar (liste listesi)

| tersine çevirmek

+ devrik

|\ maxima koşmak

? benzersiz

x@'/: sağdaki her bir tupleı ilgili listelerde endeks olarak kullanın. x


1

Odun kömürü , 33 bayt

IE⊕ΣEθ⊖LιEθ§λ⌈⟦⁰⌊⟦⊖Lλ⁻ι∧μΣE…θμ⊖Lν

Çevrimiçi deneyin! Bağlantı, kodun ayrıntılı versiyonudur. Açıklama:

Her biri kendi satırındaki öğeler ve iç içe listeler çift aralıklı olarak varsayılan çıktı biçimini kullanarak örtük olarak yazdırmadan önce tamsayıları dizelere yayınlayın.

E⊕ΣEθ⊖Lι

Liste uzunluklarının toplamını alın ve liste listesinin uzunluğunu çıkarın. Sonra 0'dan bu değere (bu değere dahil) döngü.

Eθ§λ

Liste listesi üzerinden eşleştirin ve her listeye dizin ekleyin.

⌈⟦⁰⌊⟦⊖Lλ

Dizini 0 ve listedeki son dizine sabitleyin. (Kapatma braketleri ima edilmiştir.)

⁻ι∧μΣE…θμ⊖Lν

İlk listeden sonra, en önceki dizinden önceki tüm listelerin azaltılmış uzunluklarını çıkarın. (Bu liste ilk liste için geçerli değildir çünkü listelerin uzunluğu boştur ve toplam sayı değildir.)



1

APL (Dyalog Klasik) , 32 30 27 bayt

1↓¨∪⊃{(⍵,¨⊃⍺),⍺,¨⍨⊢/⍵}/⌽0,⎕

Çevrimiçi deneyin!

tam program, giriş klavyeden ( )

giriş []çıkışları için [[]](APL eşdeğerleri 0⍴⊂⍬ve,⊂⍬ )

girişteki sayıların benzersizliğini varsayar


1
Çıktıda bir fark yarattığı için değil, ama ikinci test için girdi olması gerektiğini düşünüyorum,⊂,1
H.PWiz

@ H.PWiz bu doğru, sabit, alkış
ngn

1

JavaScript (ES6), 58 54 bayt

h=(x,s)=>[x.map(y=>s|y?y[0]:s=y.shift()),...s?h(x):[]]

Benim kod aşağı golf 14 + denemelerinden sonra (süre döngüler, tüm örnekleri kaldırma push, ve concat), ne kadar özlü olduğu şaşırtıcı, @ Arnauld cevap benzer bir yineleme geldi !

Pozitif tamsayıların bir listesini kabul eder. Çevrimiçi deneyin!

58 bayt

1 daha byte için, değiştirilmesi s = y.shift()ile y.shift(s = 1)(Ben şahsen test etmedim olarak, muhtemelen) tüm tamsayılar işlemek gerekir.

h=(x,s)=>[x.map(y=>!s/y[1]?s=y.shift():y[0]),...s?h(x):[]]

58 bayt

Hafif yeniden düzenleme ile bonus versiyonu:

h=x=>[x.map(y=>s&&y[1]?y.shift(s=0):y[0],s=[]),...s||h(x)]

açıklama

Kodun ilk sürümleri, her dizinin ilk öğelerinin bir klonunu (bir dizi) değiştirmeye çalıştı, ancak bu diziyi başlatmanın ekstra adımı pahalıydı ... her dizinin ilk öğeleri üzerinde eşlemenin kabaca olduğunu fark edene kadar orijinal dizileri değiştirirsem "yalnızca" işlemi gerekir.

Henüz herhangi bir dizinin kaydırılmış (yani kısaltılmış) olup olmadığını kontrol etmek için bir boole bayrağı kullanır. NaN olarak çoklu değerlere sahip dizileri zorlarken, JS'nin bu sayıya tek öğe olarak bir sayı değeriyle dizileri zorladığını gözlemleyerek koşullu denetimi daha da aşağı çekti.

var
h = (x, s) => 
    [
        x.map(y =>                 // map to first element of each array
            s|y                    // if s == 1 (i.e. an array has been shortened)
                                   // or the current array y has length == 1
                ? y[0]
                : s = y.shift()    // remove first element of y and set s to truthy
        ),
        ...s ? h(x) : []           // only concatenate a recurrence of the function if an array has had a value removed
    ]

1

APL (Dyalog) , 15 bayt ( SBCS )

Gereksiz bir baytı işaret ettiğiniz için teşekkürler ngn

{∪⌈\,⍉⍳≢¨⍵}⊃¨¨⊂

Çevrimiçi deneyin!

{∪⌈\,⍉⍳≢¨⍵}girdiye dizine eklenecek listeler oluşturur. Örneğin(1 2 3) (4 5 6) (7 8 9) -> (0 0 0) (1 0 0) (2 0 0) (2 1 0) (2 2 0) (2 2 1) (2 2 2)

≢¨⍵: girişteki her listenin uzunluğu

,⍉⍳girişine kadar tüm sayı kombinasyonlarını oluşturur. Örneğin2 3 -> (0 0) (1 0) (0 1) (1 1) (0 2) (1 2)

⌈\: maksimum tarama. örneğin, yukarıdaki örnek şimdi(0 0) (1 0) (1 1) (1 1) (1 2) (1 2)

: kopyaları kaldır

⊃¨¨⊂ her iki argümanın derinliğine dikkat ederek endekslemeyi yapar


Mükemmel cevap! Beni neredeyse byte'larımın altından dövüyorsun. gereksiz görünüyor .
ngn


@ngn Güzel, düşünmeme neden olan şeyi hatırlayamıyorum. Teşekkürler!
H.PWiz

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.