Bir diziden topakları oluşturma


21

Göreviniz bir dizi ve bir sayı verilen bir program yazmak, diziyi boyuta sahip parçalara bölmeniz gerekir.

kurallar

Programınız Apozitif bir tamsayı olarak bir dizi alacak n. Daha sonra dizi uzunluğu artıklarına bölünmeli n, ipin uzunluğu nartık herhangi bir artık tarafından bölünemezse , kendi parçası olarak kabul edilmelidir.

  • Eğer ndizinin uzunluğundan daha büyüktür A, diziyi döndürmek gerekir A, örneğin: if n = 4ve array A = [1,2,3], sen dönmelidir[1,2,3]

  • Dizi, sayı yerine herhangi bir tür içerebilir.

  • Hiçbir öğenin sırasını (veya yönünü) soldan sağa değiştirmemelisiniz. Örneğin if n = 2ve A= [1,2,3]. Bunun yerine herhangi bir sonuç [[1,2],[3]]geçersiz olacaktır.

Test Kılıfları

n   A               Output

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

Bu , yani her dilin en kısa baytı kazanan olacak.


4
Eğer nuzunluğundan daha büyüktür Adönmek gerekir A‽ Eğer emin ortalama yok misiniz [A]?
Adám

9
@chaugiang Hala çok büyük , örneğin ndönmesi gerektiğini düşünüyorum . Ya tam olarak uzunluğu ise ? [A][[1,2,3]]nA
Adám

4
@chaugiang Adam doğru. Dönüş değeri tutarlı olmalıdır.
Jonah

1
@chaugiang n hiç 1'e eşit olabilir mi?
DJMcMayhem

4
Güçlü yazılmış bir dilde, Açok fazla [A] dili dışlamak yerine , geri dönmek imkansızdır .
dfeuer

Yanıtlar:



9

JavaScript (ES6), 36 bayt

Girişi olarak alır (n)(array).

n=>g=a=>a+a&&[a.splice(0,n),...g(a)]

Çevrimiçi deneyin!

Yorumlananlar

n =>                  // n = chunk size
  g = a =>            // g = recursive function taking the array a[]
    a + a             // if a[] is empty, stop recursion and return an empty string
    &&                // otherwise, return an array made of:
    [ a.splice(0, n), //   the next chunk
      ...g(a)         //   followed by the result of a recursive call
    ]                 //   (the last call leads to ...'', which adds nothing)

Şimdi bu temiz ve temiz bir çözüm ve özyinelemeli anonim işlevler hakkında da öğrendim!
Joe,

9

APL (Dyalog Unicode) , 12 bayt SBCS

⊢⊂⍨(⍴⊢)⍴1↑⍨⊣

Adám'a temel olarak tüm golf oynamalarını (ve temelde şu anda sahip olduğum tüm APL bilgileri için >>>) yaptığınız için teşekkür ederiz .

açıklama

 ⊂⍨           Partitioned enclose (commuted, i.e. left and right switched) - for each  in left,  in right, if  = 0, create a new sub-array, push  to latest sub-array
             Right argument of entire expression
             Reshape - Change size of right into dimensions specified by left
   (⍴ )       Shape of (here, there is only one dimension - length)
             Right argument of entire expression
         ↑⍨   Take (commuted) - takes  elements from left where  is right. Extra elements (zeroes here) are automatically added
        1     1
             Left argument of entire expression

infaz

Argümanlar 2, 1 2 3 4 5 6 7. APL dizilerinin a b cisteğe bağlı çevre parantezleri ile birlikte olduğunu unutmayın .

             2
        1     1
         ↑⍨   12 = 1 0
             1 2 3 4 5 6 7
   (⍴ )       1 2 3 4 5 6 7 = 7
             71 0 = 1 0 1 0 1 0 1
             1 2 3 4 5 6 7
 ⊂⍨           1 0 1 0 1 0 11 2 3 4 5 6 7 = (1 2)(3 4)(5 6)(7)

Çevrimiçi deneyin!


7
İlk APL cevabınız için tebrikler. Ve güzel de açıkladı! Burada, bir APL pasta var: 🥧
Adám


7

Prolog (SWI) , 90 84 61 bayt

Kod:

[]*_*[].
L*N*[P|R]:-length(P,N),append(P,T,L),T*N*R;P=L,R=[].

Giriş formatı biraz tuhaf olabilir, ancak:

A * n * Result.

Örneğin, giriş için:

n = 2
 A = [1, 2, 3, 4, 5, 6]

Kullanman gerekecek [1, 2, 3, 4, 5, 6] * 2 * Result..

Çevrimiçi deneyin!


Ungolfed versiyonu:

divide([], _, []).
divide(List, N, [Prefix | Result]) :-
    length(Prefix, N), append(Prefix, Remaining, List), divide(Remaining, N, Result) 
  ; Prefix = List, Result = [].

Çevrimiçi deneyin! .


6

PHP, 15 bayt

$f=array_chunk;

PHP 7 gerektirir $f(ARRAY, N).


6
Bir yerleşime başka bir isim vermeniz gerektiğini düşünmüyorum, bu yüzden bu sadece 11 puan, değil mi?
Neil

@Neil bunun yasak bir kaçamak olabileceğini düşündüm ; ama haklı olabilirsin.
Titus




5

Brainfuck, 71 bayt

,[>+>+<<-]>>>,[<[>.,<-]>>>++++[<++++++++>-]<.[-]<<<[<+>>+<-]<[->+<]>>>]

Bu sayılırsa sayılmaz dunno ... giriş formatı:

<character whose ascii is n>AAAAAAAAAAAAA
For example, in the input:
 1234567890123492034
n is 32 since the ASCII value of space is 32

Girdiyi alır ve nkarakterler her geçtiğinde bir boşluk koyar

Açıklama (virgül yok çünkü programı bozacak):

, take n
[>+>+<<-] copy into next two cells (destroys original)
>>>, take first of A into next cell
[ while that input exists
<[>.,<-] if n is nonzero output take next of A subtract one from n
>>>++++[<++++++++>-]<.[-]< n is zero so put a space
<<[<+>>+<-] copy the old n into surrounding cells
<[->+<] move from first cell to second
>>>] take input, do again

2
71 karakter için boşlukları kaldır
MilkyWay90

lol, hepsini çıkardım sanıyordum ama bunları farketmedim, teşekkürler!
vityavv

Hücreleri daha fazla kullandığınız hücrelerin daha erişilebilir olmasını sağlayacak şekilde yeniden düzenlemeyi deneyin (örneğin, giriş hücresi ( ,daha fazla kullandığınız ) diğer hücrelerde) veya bruteforcer kullanın. BF'de golf konusunda yetenekli değilim, bu yüzden bu öneriler yardımcı olmayabilir.
MilkyWay90

Şimdiye kadar n n n A spacehücre kurulumum var, eğer daha iyi bir yol düşünürseniz ...
vityavv

Çalışabilir A space n n n ...(veya space A n n n...)?
MilkyWay90





4

Kömür 1 bayt

Çevrimiçi deneyin! Kömürün varsayılan G / Ç dizeleri dışında herhangi bir şey kullandığını göstermeyi zorlaştırır. Nümerik listeleri alan ve formatlanmış listeleri çıkaran tam bir program istiyorsanız, bu şekilde yapılabilir:

E⪪AN⪫ι,

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

  A      Input array
 ⪪       Split into chunks of
   N     Input number
E       Map over chunks
     ι  Current chunk
    ⪫   Joined with
      , Literal `,`
        Implicitly print each chunk on its own line



4

J , 4 bayt

<\~-

Çevrimiçi deneyin!

Diziyi left arg ve chunk boyutunu right arg olarak alır.

İkili bir kanca ve eki zarfını , tanım olarak istediğimizi yapan, negatif bir argümanla kullanır .

Not: İade tipi kutulanmış olmalıdır , çünkü J sadece eşit büyüklükteki kalemlerin tablolarına izin verir.



3

PHP , 45 bayt

function f($a,$b){return array_chunk($a,$b);}

Çevrimiçi deneyin!


3
Sadece array_chunkgeçerli bir cevap olur mu?
Arnauld

@Bilmiyorum bilmiyorum. İşyerinde kullanmama rağmen php'de golf oynamamıştım.
Luis felipe De jesus Munoz

Ben de% 100 emin değilim, ancak bildirilmemiş değişkenlerin bir dizeye örtük olarak dönüştürülmesini kötüye kullanabilir ve bunun gibi bir şey yapabiliriz .
Arnauld

(hata: tanımsız sabitleri kastettim )
Arnauld

3

Java 10, 106 80 bayt

L->n->{for(int l=L.size(),i=0;i<l;)System.out.print(L.subList(i,(i+=n)<l?i:l));}

Sınırlayıcıları ayırıcı olmadan yazdırır.

Çevrimiçi deneyin.

106 bayt:

L->n->{var r=new java.util.Stack();for(int l=L.size(),i=0;i<l;)r.add(L.subList(i,(i+=n)<l?i:l));return r;}

Aslında bir liste listesini döndürür.

Çevrimiçi deneyin.

Açıklama:

L->n->{                       // Method with List and integer parameters and List return-type
  var r=new java.util.Stack();//  Create an empty List
  for(int l=L.size(),         //  Determine the size of the input-List
      i=0;i<l;)               //  Loop `i` in the range [0, size):
    r.add(                    //   Add to the result-List:
      L.subList(i,            //    A sublist of the input-list in the range from `i`
        Math.min(i+=n,l)));   //    to the minimum of: `i` + input-integer or the size
                              //    (and increase `i` by the input-integer at the same)
  return r;}                  //  Return the List of Lists of integers as result





3

V , 6 bayt

òÀf,r

Çevrimiçi deneyin!

HexDump:

00000000: f2c0 662c 720a                           ..f,r.

Açıklama:

ò           " Until an error happens:
  f         "   (f)ind the...
 À          "     n'th...
   ,        "     ","
            "   (If there are less than n commas after the cursor, throw an error)
    r       "   Replace the char under the cursor with...
     <cr>   "     A newline

3

Clojure, 14 bayt

#(partition %)

sanırım yerleşikler


Selam hoşgeldin. İşlev iki argüman almalıdır: bölümlenecek dizi ve öbek uzunluğu. Ayrıca son öbek bölüm kullanırken "dolu" olmazsa ne olur?
NikoNyrh

3

Haskell , 26 bayt

import Data.Lists
chunksOf

İşte daha ilginç bir sürüm, sadece birkaç bayt daha (her çözümde beş bayt için nimi sayesinde):

Haskell , 31 bayt

n![]=[]
n!x=take n x:n!drop n x

Çevrimiçi deneyin!


Yapabileceğini düşünüyorum
aloisdg

1
n!x=take n x:n!drop n x. Data.Listsayrıca sağlar chunksOf.
nimi


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.