Złożyć listę na pół


24

Zamierzamy złożyć listę liczb całkowitych. Procedura, aby to zrobić, jest następująca: Jeśli lista ma parzystą długość, zrób listę połowy jej długości, gdzie n-ty element nowej listy jest sumą n-tego elementu starej listy i od n-tego do ostatni element starej listy. Na przykład, gdybyśmy mieli listę

[1 2 3 4 5 6 7 8]

Złożylibyśmy to w ten sposób

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

Jeśli lista ma nieparzystą długość, aby ją złożyć, najpierw usuwamy środkowy element, składamy go tak, jakby był parzysty, i dodajemy środkowy element do wyniku.

Na przykład, gdybyśmy mieli listę

[1 2 3 4 5 6 7]

Złożylibyśmy to w ten sposób

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

Zadanie

Napisz program lub funkcję, która pobiera listę liczb całkowitych jako dane wejściowe i wyjściowe, które ta lista jest złożona.

To jest pytanie w więc odpowiedzi będą oceniane w bajtach, przy czym mniej bajtów będzie lepszych.

Przykładowa implementacja

Oto implementacja w Haskell, która definiuje funkcję, fktóra wykonuje fold.

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

Wypróbuj online!


Kiedy mówimy o liczbach całkowitych, czy obejmuje to zero lub ujemne liczby całkowite?
Neil

1
@Neil Tak to robi.
Wheat Wizard

2
@ GrzegorzPuławski Nie należy sortować listy. Dowolna zamówiona kolekcja jest dozwolona, ​​np. Wektor lub tablica.
Wheat Wizard

1
@DavidStarkey Najbardziej rozsądne listy nie przepełnią się rozsądną ilością pamięci. Składanie w rzeczywistości nie zwiększa sumy, więc listy zbiegną się w singleton sumy oryginalnej listy.
Wheat Wizard

2
@WheatWizard Nie wiem o tym, słyszałem, że nie można złożyć żadnej listy na pół więcej niż 7 razy.
Carmeister

Odpowiedzi:


9

Python , 46 bajtów

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

Wypróbuj online!

Ta sama długość:

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

Znacznie krótsze rozwiązanie działa w przypadku list o równej długości (30 bajtów)

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

Wypróbuj online!

Nadal próbuję znaleźć krótki sposób, aby poprawić to dla nieparzystej długości.


Och, strasznie mnie obrzucono ogniem ÷ _ ÷
Mr. Xcoder,

Rozwiązanie „środkowego gruntu” f=lambda l:l[1:]and[l[0]+l.pop()]+f(l[1:])or lma również tę samą długość ...
ETHprodukcje

8

05AB1E , 5 bajtów

Kod

2ä`R+

Wykorzystuje kodowanie 05AB1E . Wypróbuj online!

Wyjaśnienie

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

8

Emojicode , 203 bajty

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

To była dla mnie najbardziej bolesna odpowiedź na kod Emojicode. Niepotrzebna długość: /

Wypróbuj online!



3

Gaia , 7 bajtów

e2÷ev+†

Wyjaśnienie

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 bajtów

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

2

Mathematica 57 bajtów

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

Wstawia zero w punkcie środkowym, dodaje listę do tyłu i przyjmuje odpowiednią długość.








1

JavaScript, 75 71 bajtów

a=>a.slice(0,n=a.length/2).map(b=>b+a[--z],z=n*2).concat(n%1?a[n|0]:[])

Wypróbuj online

Zaoszczędzono 2 bajty dzięki produktom ETH



1

MATL , 9 bajtów

`6L&)swtn

Wypróbuj online!

Jak to działa

Biorąc pod uwagę tablicę [a b c ... x y z], [a z]nazwijmy ją podtablicą „crust” i podtablicą [b c ... y z]„core”.

Kod składa się z pętli, która usuwa skorupę, oblicza jej sumę i przesuwa rdzeń na górę stosu, gotowa do następnej iteracji. Warunkiem pętli jest liczba elementów w podstawowej tablicy pomocniczej

`       % 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 bajtów

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

Liczba bajtów obejmuje również

using System.Linq;

Wypróbuj online!

Jako dane wejściowe użyj liczb oddzielonych przecinkami ( ,) lub spacją. Wyjaśnienie:

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
);

Czy można zapisać bajty, ustawiając długość zmiennej i przechodząc do jawnego zwrotu?
TheLethalCoder

@TheLethalCoder niestety jest już dłuższy
Grzegorz Puławski

1

Perl, 42 38 znaków

sub f {@ a = map {$ + pop} splice @ , 0, @ / 2; @ a, @ }

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

Spróbuj na przykład tak:

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

1
Naprawiono błąd, który pojawiał się z powodu mojego emocjonalnego i zawodowego przywiązania do zmiennych. Nie pozwól, aby JS: P
bytepusher

1

Pyth, 18 17 13 bajtów

V.Tc2Q aYsN;Y

Moje oryginalne podejście było

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

-1 bajt dzięki Mr. Xcoder

-4 bajty dzięki FryAmTheEggman


Spróbuj c2<list>podzielić listę na pół. Kolejnym przydatnym poleceniem jest .T.
FryAmTheEggman


1

C ++ 17, 75 73 71 bajtów

Jako nienazwana lambda, przyjmowanie kontenera takiego jak vectorlub listzwraca wartość przez modyfikację danych wejściowych:

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

Korzystanie ze znanego operatora „od samego początku” <-- i potrójnego plusu+++

Niegolfowany i przykład:

#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 bajtów SBCS

-3 bajty dzięki @ Adám.

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

Wypróbuj online!

Wyjaśnienie:

(⌊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

Dyalog Extended, 18 bajtów:+⌿(⌊2÷⍨≢)(↑↑⍮⌽⍤↓)⊢
Adám


1

Common Lisp, 106 bajtów

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

Wypróbuj online!



0

Scala, 91 bajtów

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


0

JavaScript (ES6), 46 43 bajtów

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

Zapisano 3 bajty z inspiracją od Asafa .


Miły. Możesz zmienić „1 / c [0]” na „[] + c”, aby zapisać 2 bajty.
Asaf

@Asaf Właściwie myślę, że c+cdziała na trzeci bajt.
Neil

0

Java 8, 93 bajty

Dwu cyfrowy! To lambda, która bierze int[]i zwraca an 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);}

Niegolfowana 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);
}

Całkiem proste. Składa drugą połowę na miejscu na pierwszą połowę danych wejściowych i zwraca kopię tylko pierwszej połowy.

Co zaskakujące, kopia tablicowa w instrukcji return wydaje się być najtańszym sposobem radzenia sobie z końcowym dziwactwem dla danych wejściowych o nieparzystej długości.


Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.