Listeyi İkiye Katla


24

Bir tamsayı listesi katlayacağız. Bunu yapma prosedürü aşağıdaki gibidir: Liste eşit uzunluktaysa, yeni listenin ’maddesinin eski listenin item maddesinin ve the ila eski listenin son maddesi. Mesela listemiz olsaydı

[1 2 3 4 5 6 7 8]

Öyle katlayacağız

 [8 7 6 5]
+[1 2 3 4]
__________
 [9 9 9 9]

Liste tuhaf bir uzunluktaysa, katlamak için önce ortadaki öğeyi kaldırır, eşitmiş gibi katlar ve ortadaki öğeyi sonuçlara ekleriz.

Mesela listemiz olsaydı

[1 2 3 4 5 6 7]

Öyle katlayacağız

 [7 6 5]
+[1 2 3]
__________
 [8 8 8]
++     [4]
__________
 [8 8 8 4]

Görev

Girdi olarak tam sayıların listesini alan ve katlanmış olan listenin çıktılarını gösteren bir program veya işlev yazın.

Bu bir sorusudur, bu yüzden cevaplar daha az byte daha iyi olacak şekilde byte olarak puanlanır.

Örnek uygulama

İşte Haskell'de fkatlama yapan bir işlevi tanımlayan bir uygulama .

f(a:b@(_:_))=a+last b:f(init b)
f x=x

Çevrimiçi deneyin!


Tamsayılar derken, buna sıfır veya negatif tamsayılar dahil mi?
Neil,

1
@Neil Evet öyle.
Buğday Sihirbazı,

2
@ GrzegorzPuławski Listeyi sıralamamalısınız. Herhangi bir sıralı koleksiyona izin verilir, örneğin vektör veya dizi.
Buğday Sihirbazı,

1
@DavidStarkey En makul listeler, makul miktarda bellekle taşmaz. Katlama aslında toplamı artırmaz; bu nedenle listeler, orijinal listenin toplamının tekiline yakınlaşacaktır.
Buğday Sihirbazı

2
@WheatWizard Bundan haberim yok, herhangi bir listeyi 7 defadan fazla ikiye katlamanın imkansız olduğunu duydum.
Carmeister

Yanıtlar:


9

Python , 46 bayt

f=lambda l:l[1:]and[l[0]+l[-1]]+f(l[1:-1])or l

Çevrimiçi deneyin!

Aynı uzunluk:

f=lambda l:l[1:]and[l.pop(0)+l.pop()]+f(l)or l

Uzun listeler için çok daha kısa bir çözüm çalışıyor (30 bayt)

lambda l:[x+l.pop()for x in l]

Çevrimiçi deneyin!

Hala tek uzunluğu düzeltmek için kısa bir yol bulmaya çalışıyorum.


Oh, korkunç derecede öfkeli oldum ÷ _ ÷
Bay

"Orta zemin" çözümü f=lambda l:l[1:]and[l[0]+l.pop()]+f(l[1:])or lde aynı uzunluktadır ...
ETHproductions

8

05AB1E , 5 bayt

kod

2ä`R+

05AB1E kodlamasını kullanır . Çevrimiçi deneyin!

açıklama

2ä        # Split the list into two pieces
  `       # Flatten the stack
   R      # Reverse the second element from the list
    +     # Vectorized addition

8

Emojicode , 203 bayt

🐋🍨🍇🐖🔢🍇🔂i⏩0➗🐔🐕2🍇😀🔡➕🍺🔲🐽🐕i🚂🍺🔲🐽🐕➖🐔🐕➕1i🚂10🍉🍊😛1🚮🐔🐕2🍇😀🔡🍺🔲🐽🐕➗🐔🐕2🚂10🍉🍉🍉

Bu benim için kod için en acı Emojicode cevap oldu. Gereksiz uzunluk: /

Çevrimiçi deneyin!



3

Gaia , 7 bayt

e2÷ev+†

açıklama

e        Eval the input (push the list).
 2÷      Split it in half. The first half will be longer for an odd length.
   e     Dump the two halves on the stack.
    v    Reverse the second.
     +†  Element-wise addition. If the first half has an extra element, it is simply appended.

2

Mathematica, 88 bayt

(d=Array[s[[#]]+s[[-#]]&,x=⌊t=Length[s=#]/2⌋];If[IntegerQ@t,d,d~AppendTo~s[[x+1]]])&

2

Mathematica 57 Bayt

(#+Reverse@#)[[;;d-1]]&@Insert[#,0,d=⌈Length@#/2⌉+1]&

Orta noktaya sıfır ekler, listeyi tersine ekler ve uygun uzunluğu alır.










1

MATL , 9 bayt

`6L&)swtn

Çevrimiçi deneyin!

Nasıl çalışır

Bir dizi Verilen [a b c ... x y z], bırakıldığında yukarı [a z]"kabuk" altdizilim çağırılabilir ve[b c ... y z] "çekirdek" SubArray.

Kod, kabuğu kaldıran, toplamını hesaplayan ve bir sonraki tekrarlamaya hazır olan çekirdeği yığının en üstüne taşıyan bir döngüden oluşur. Döngü koşulu, çekirdek alt dizideki öğelerin sayısıdır

`       % Do...while
  6L    %   Push [2 -1+1j]. As an index, this is interpreted as 2:end-1
  &)    %   2-output reference indexing: pushes a subarray with the indexed 
        %   elements (core) and another with the ramaining elements (crust)
  s     %   Sum of (crust) subarray
  w     %   Swap. Moves the core subarray to the top
  t     %   Duplicate
  n     %   Number of elements.
        % End (implicit). Procced with next iteration if top of the stack is
        % nonzero; else exit
        % Display stack (implicit)


1

C # (.NET Core) , 118 111 bayt

a=>a.Reverse().Zip(a,(c,d)=>c+d).Take(a.Length/2).Concat(a.Skip(a.Length/2).Take(a.Length%2))

Bayt sayısı da içerir

using System.Linq;

Çevrimiçi deneyin!

Girdi olarak lütfen virgülle ( ,) veya boşlukla ayrılmış sayıları kullanın . Açıklama:

a =>                                  // Take one input parameter (array)
a.Reverse()                           // Reverse it
.Zip(a, (c, d) => c + d)              // Take every corresponding member of reversed
                                      //    and original, and add them together
.Take(a.Length / 2)                   // Get first half of the collection
.Concat(                              // Add another collection
    a.Skip(a.Length / 2)              // Take input and leave out first half of it
    .Take(a.Length % 2)               // If length is odd, take first element (so the middle)
                                      //    otherwise create an empty collection
);

Uzunluğu bir değişkene ayarlayarak ve açık bir geri dönüşe geçerek bayt tasarruf edebilir misiniz?
TheLethalCoder

@TheLethalCoder ne yazık ki daha uzun
Grzegorz

1

Perl, 42 38 karakter

alt f {@ a = harita {$ + pop} splice @ , 0, @ / 2; @ a, @ }

sub f{(map{$_+pop}splice@_,0,@_/2),@_} 

Örneğin şöyle deneyin:

perl -e 'my @input=(1..9); sub f{(map{$_+pop}splice@_,0,@_/2),@_}  print join(",",f(@input));

1
Değişkenlere olan duygusal ve profesyonel bağlılığım nedeniyle ortaya çıkan bir hata düzeltildi. JS tarafından aşılmayı reddetmek: P
bytepusher

1

Pyth, 18 17 13 bayt

V.Tc2Q aYsN;Y

Benim orijinal yaklaşımım

WtQ aY+.)Q.(Q0;+Y

Bay Xcoder sayesinde -1 bayt

FryAmTheEggman sayesinde -4 bayt


c2<list>Bir listeyi ikiye bölmeyi deneyin . İşe yarayabilecek başka bir komut ise .T.
FryAmTheEggman


1

C ++ 17, 75 73 71 bayt

Adsız lamda olarak, vectorveya benzeri bir kabı kabul etmek list, girişi değiştirerek geri döner:

[](auto&L){for(auto a=L.begin(),b=L.end();a<--b;L.pop_back())*a+++=*b;}

İyi bilinen 'gider' operatörünü <--ve üçlü artı'yı kullanma+++

Ungolfed ve örnek:

#include<iostream>
#include<vector>

using namespace std;

auto f=
[](auto&L){
 for(
  auto a=L.begin(),b=L.end();
  a<--b;
  L.pop_back()
 )
 *a+++=*b;
}
;

void test(auto L) {
 for(auto x:L)cout << x << ", ";
 cout << endl;
 f(L);
 for(auto x:L)cout << x << ", ";
 cout << endl << endl;
}

int main() { 
 vector<int> A = {1,2,3,4,5,6,7,8}, B = {1,2,3,4,5,6,7};
 test(A);
 test(B);
}


1

APL (Dyalog Unicode) , 21 bayt SBCS

@ Adám sayesinde -3 bayt.

(⌊2÷⍨≢)(↑{+⌿↑⍺⍵}∘⌽↓)⊢

Çevrimiçi deneyin!

Açıklama:

(⌊2÷⍨≢)(↑{+⌿↑⍺⍵}∘⌽↓)⊢   Monadic function train
(⌊2÷⍨≢)                   Left portion:
                         Take the length of the input...
  2÷⍨                     Divide it by two...
                         And floor it. This gives our midpoint index. Call it "X"
                         Right portion: return the original input. Call it "Y"
       (↑{+⌿↑⍺⍵}∘⌽↓)    Midddle portion: takes X and Y as arguments
                        Take and drop Y by X. Essentially splits Y in half
                          Presents the two halves to the next function
                 ∘⌽      Reverse the second half
         {+⌿↑⍺⍵}        Final function, takes first half and reversed second half
              ⍺⍵         Construct a nested list of first and second halves...
                        ...and "mix" them into a matrix. Has the nice property that
                         it will pad the first half with a zero if needed.
          +⌿            Sum the matrix along the columns, return resulting vector

Genişletilmiş, 18 bayt Dyalog:+⌿(⌊2÷⍨≢)(↑↑⍮⌽⍤↓)⊢
Adam


1

Ortak Lisp, 106 bayt

(lambda(l)(setf(values a b)(floor(length l)2))`(,@(#1=subseq(mapcar'+ l(reverse l))0 a),@(#1#l a(+ a b))))

Çevrimiçi deneyin!



0

Scala, 91 bayt

(s:Seq[Int])=>(s.take(s.size/2),s.reverse).zipped.map(_+_)++s.drop(s.size/2).take(s.size%2)

0

Mathematica , 52

(a=#;i=0;(i++;a[[i;;-i]]*=x)&/@a;(Tr@a+O@x^i)[[3]])&

0

JavaScript (ES6), 46 43 bayt

f=(a,[b,...c]=a)=>c+c?[b+c.pop(),...f(c)]:a

Asaf'tan ilham alınarak 3 bayt kurtarıldı .


Güzel. 2 bayttan tasarruf etmek için '1 / c [0]' değerini '[] + c' olarak değiştirebilirsiniz.
Asaf

@Asaf Aslında c+cüçüncü bayt için çalışıyor düşünüyorum .
Neil,

0

Java 8, 93 bayt

Çift haneli! Bu bir alır int[]ve bir döndürür bir lambda int[].

l->{int n=l.length,i=0;for(;i<n/2;)l[i]+=l[n-++i];return java.util.Arrays.copyOf(l,n/2+n%2);}

Ungolfed lambda

l -> {
    int n = l.length, i = 0;
    for (; i < n / 2; )
        l[i] += l[n - ++i];
    return java.util.Arrays.copyOf(l, n / 2 + n % 2);
}

Oldukça açık. İkinci yarıyı girişteki ilk yarıya katlar ve sadece ilk yarıdan bir kopyasını döndürür.

Şaşırtıcı bir şekilde, return ifadesindeki dizi kopyası, tuhaf uzunluktaki girdiler için son öğe tuhaflığını kullanmanın en ucuz yolu gibi görünüyor.


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.