Bir listeyi n-fotoğrafla


12

Sayının bir liste Verilen Lve bir tamsayı N, çıktı Lsplitted Neşit lenghts sublists.

Bölünemez uzunluklar

Eğer Nuzunluğunu bölmek yok Lo zaman bütün Alt listeler eşit uzunluğa sahip olması mümkün değildir.

Her durumda, çıktının son alt listesi, uzunluğunu listenin geri kalanını içerecek şekilde uyarlayan listedir.

Her Alt listeler bu araçlar Lsonuncusu hariç uzunlukta olmalıdır length(L) // N, burada //katlı bölümü (örneğin, bir 3//2 = 1).

Bazı kurallar

  • L boş olabilir.

  • N >= 1.

  • İstediğiniz yerleşik olanı kullanabilirsiniz.

  • Girdiyi STDINbir işlev bağımsız değişkeni ya da benzer bir şey olarak alabilirsiniz.

  • Çıktıyı STDOUTbir işleve yazdırabilir, bir işlevden döndürebilir veya buna benzer bir şey yapabilirsiniz.

  • Listeler ve tamsayı için dilinizdeki listelerin ve tamsayıların en doğal temsili olduğu sürece herhangi bir formatı seçebilirsiniz.

Test senaryoları

Input:  [1,2,3,4], 2
Output: [[1,2],[3,4]]

Input:  [-1,-2,3,4,-5], 2
Output: [[-1,-2],[3,4,-5]]

Input:  [1,2,3,4], 1
Output: [[1,2,3,4]]

Input:  [4,8,15,16,23,42], 5
Output: [[4],[8],[15],[16],[23,42]]

Input:  [4,8,15,16,23,42], 7
Output: [[],[],[],[],[],[],[4,8,15,16,23,42]]

Input:  [2,3,5,7,11,13,17,19,23], 3
Output: [[2,3,5],[7,11,13],[17,19,23]]

Input:  [], 3
Output: [[],[],[]]

Input:  [1,2,3,4,5,6,7,8], 3
Output: [[1,2],[3,4],[5,6,7,8]]

puanlama

Bu , bu yüzden bayttaki en kısa cevap kazanır.




Sadece pozitif tamsayılar mı? Ya da belki bir test örneği ekleyin
Luis Mendo

@LuisMendo Hayır. Bunu test etmek için bir test durumunu değiştirdim.
16:54

N = 3 uzunluğundaki (user2357112 tarafından önerilen) uzunluk 8'in listesi iyi bir test senaryosu olabilir - yöntemimi kırdı.
xnor

Yanıtlar:


2

Pyth, 11 10 bayt

@FryAmTheEggman sayesinde 1 bayt .

cJEt*R/lJQ

Test odası.

Girdileri ters sırada alır.

Örnek giriş:

5
[1,2,3,4,5,6,7]

Örnek çıktı:

[[1], [2], [3], [4], [5, 6, 7]]

açıklama

cJEt*R/lJQ     Main function, first input:Q, second input:E.
cJEt*R/lJQQ    Implicit arguments.

c              The function c is special.
               It can chop arrays.
               If the second argument is a list of integers,
               then it chops the first array at the indices
               specified by the second array.

 JE            The first argument is the second input, stored
               to the variable J.

   t*R/lJQQ    This is the second argument.
      /lJQ     Yield length of J, integer-divided by Q.
    *R    Q    Multiply it to the following respectively:
                   [0,1,2,3,...,Q-1]
   t           Then throw away the first element.
               For example, if Q=3 and E=[1,2,3,4,5,6,7,8],
               we would now have [3,6].

4

JavaScript (ES6), 63 bayt

(a,n,l=a.length/n|0)=>[...Array(n)].map(_=>--n?a.splice(0,l):a)

2

Python, 76 73 bayt

lambda L,N:list(map(lambda x,r=len(L)//N:L[x*r:][:r+(x>N-2)*N],range(N)))

Temel olarak görevi yerine getiren adsız bir işlev. Kurtarılan baytlar için LeakyNun'a teşekkürler!


1
Ayrıca, PPCG'ye hoş geldiniz!
Sızdıran Rahibe

@LeakyNun Nun 73 sanırım aslında. Ayrıca düzenleme yaparken fazla dikkat etmediğim için çoğunlukla benim hatam. İşyerinde koda golfün tehlikeleri: P
Lause

@LeakyNun - ilk noktaya kadar - işe yaramıyor. İfade temel olarak normal öğeler için [: r] ve kalan tüm öğeleri yakalaması beklenen son öğe için [: r + N] şeklindedir. İkinci nokta - denedim ama r atamak izin biliyorum tüm yolları benim kod daha uzun yapmak.
Lause

Ancak, r * (x> N-2) durumunda [: 0] değil, [:] değil.
Lause


2

Ortak Lisp, 114 bayt

(defun f(l n &optional(p(floor(length l)n))(i 1))(if(= i n)(list l)(cons(subseq l 0 p)(f(subseq l p)n p(+ i 1)))))

Ungolfed:

(defun f (l n &optional (p (floor (length l) n)) (i 1))
  (if (= i n) (list l)
              (cons (subseq l 0 p)
                    (f (subseq l p) n p (+ i 1))))
  )

Örnek çağrı:

(format t "~A~C~C" (f (read) (read)) #\return #\newline)

Burada deneyin!

Temelde:

  • Son grubu kesiyorsak, ilk listenin solunda kalanları iade edin.
  • Aksi takdirde p = |L| / Nöğeleri listeden çıkarın ve geri kalanını yinelemeli bir çağrının sonucuna birleştirin. idurma koşulu için kullanılan bir yineleme sayacıdır.

Öncelikle, programın gruplardan Nziyade unsur grupları oluşturması gerektiğini düşünerek, meydan okumayı yanlış anlamıştım N. Her neyse, bu sürüm fazladan 10 baytlık iş yapar. LisP bu kez kazanamayacak, ancak fırsatı gerçekten kaçıramadım: ')


2

Haskell, 69 67 bayt

a%b=a#b where l#1=[l];l#n|(h,t)<-splitAt(div(length a)b)l=h:t#(n-1)

Kullanım örneği: [1,2,3,4] % 3-> [[1],[2],[3,4]].

@ Xnor'un cevabına benzer basit bir özyinelemeli yaklaşım .

Düzenleme: @Will Ness 2 bayt kaydetti. Teşekkürler!


h:t#(n-1)ayrıca çalışır.
Ness

1

PowerShell v2 +, 125 bayt

param($l,$n)if($p=[math]::Floor(($c=$l.count)/$n)){1..$n|%{$l[(($_-1)*$p)..((($_*$p-1),$c)[!($_-$n)])]}}else{(,''*($n-1))+$l}

Çok uzun hissettiriyor, ancak çıktıda boş diziler varsa dilimlemenin mutlu bir şekilde çalışmasını sağlamak için bir yol bulamıyorum, bu yüzden bu vakaları ele almak için kapsüllemeye if/ ihtiyacım var else. Ayrıca, PowerShell'in .ToString()konsol çıktısı üzerinden diziler için varsayılan değeri biraz garip görünebileceğinden -join',', dizileri konsolda satırsonu ile ayrılmış yerine virgülle ayrılmış olarak göstermek için a tuşunu kullanabilirsiniz . Çıktıyı daha net hale getirmek için aşağıdaki örneklerde yaptım, ancak çıkışı başka bir komutun almak için boru hattında bırakıyorsanız bunu yapmak istemezsiniz.

açıklama

param($l,$n)Liste ve bölüm sayısı için sırasıyla girdi alır . Sonra bir if/ elseifadesi giriyoruz . Her bölümün boyutu $psıfırdan farklıysa (ayar yardımcısı yol boyunca $colacaksa .count), içindeyiz if.

İçinde ifdan, biz döngü 1için $nbirlikte |%{...}ve her bir yineleme biz oldukça karmaşık görünümlü dizi dilim yapıyoruz $l[(($_-1)*$p)..((($_*$p-1),$c)[!($_-$n)])]. İlk parens, hangi bölümde olduğumuza ve bölüm boyutumuzun ne kadar büyük olduğuna bağlı olarak başlangıç ​​dizinimizdir. Bunu sahte üçlüden.. oluşan son endeksimizle değiştiriyoruz . Burada, $cson yığın içinde olup olmamıza bağlı olarak ya (dizinin gerçek sonu) ya da bölümümüzün uzunluğu arasında seçim yapıyoruz $_-$n.

Aksi takdirde, biz else. Virgül operatörünün ,''*istenenden daha az sayıda bölüme eşit olduğu boş bir dizi oluştururuz ve ardından girdi dizisine son öğe olarak yapışırız.

Örnekler

Burada, yeni satırlarla ayrılmış bölümleri ve her bir öğeyi ayrı ayrı ,, yukarıda açıklandığı gibi gösteriyoruz.

PS C:\Tools\Scripts\golfing> .\n-chotomize-a-list.ps1 (1,2,3,4) 2
1,2
3,4

PS C:\Tools\Scripts\golfing> .\n-chotomize-a-list.ps1 (-1,-2,3,4,-5) 2
-1,-2
3,4,-5

PS C:\Tools\Scripts\golfing> .\n-chotomize-a-list.ps1 (1,2,3,4) 1
1,2,3,4

PS C:\Tools\Scripts\golfing> .\n-chotomize-a-list.ps1 (4,8,15,16,23,42) 5
4
8
15
16
23,42

PS C:\Tools\Scripts\golfing> .\n-chotomize-a-list.ps1 (4,8,15,16,23,42) 7






4,8,15,16,23,42

PS C:\Tools\Scripts\golfing> .\n-chotomize-a-list.ps1 (2,3,5,7,11,13,17,19,23) 3
2,3,5
7,11,13
17,19,23

PS C:\Tools\Scripts\golfing> .\n-chotomize-a-list.ps1 $null 3



PS C:\Tools\Scripts\golfing> 

1

F #, 100 98 bayt

fun n l->
let a=List.length l/n
List.init n (fun i->if i<n-1 then l.[a*i..a*i+a-1] else l.[a*i..])

Almaya karar verirken bir eğer maddesi ile, F # liste dilimleme kullanarak bir unsurlarını veya geriye kalan tüm elemanları.


1

Prolog, 100 99 bayt.

n(A,B):-length(B,A).
p(L,K,G):-n(K,G),append(A,[_],G),n(N,L),M is N//K,maplist(n(M),A),append(G,L).

Örneğin ara

p - ([1,2,3,4,5,6,7], 3, X).
X = [[1, 2], [3, 4], [5, 6, 7]] .


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.