Lipat Daftar menjadi Setengah


24

Kami akan melipat daftar bilangan bulat. Prosedur untuk melakukannya adalah sebagai berikut, Jika daftar tersebut memiliki panjang genap, buatlah daftar setengah dari panjangnya di mana item ke-n dari daftar baru adalah jumlah dari item ke-n dari daftar lama dan urutan ke-n item terakhir dari daftar lama. Misalnya kalau kita punya daftarnya

[1 2 3 4 5 6 7 8]

Kami akan melipatnya seperti itu

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

Jika daftar itu panjangnya aneh , untuk melipatnya pertama-tama kita menghapus item tengah, lipat itu seolah-olah genap dan tambahkan item tengah ke hasilnya.

Misalnya kalau kita punya daftarnya

[1 2 3 4 5 6 7]

Kami akan melipatnya seperti itu

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

Tugas

Tulis program atau fungsi yang mengambil daftar bilangan bulat sebagai input dan output yang dilipat daftar.

Ini adalah pertanyaan sehingga jawaban akan dinilai dalam byte, dengan lebih sedikit byte yang lebih baik.

Implementasi sampel

Berikut ini adalah implementasi di Haskell yang mendefinisikan fungsi fyang melakukan flip.

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

Cobalah online!


Ketika Anda mengatakan bilangan bulat, apakah ini termasuk bilangan bulat nol atau negatif?
Neil

1
@Neil Ya itu.
Wheat Wizard

2
@ GrzegorzPuล‚awski Anda tidak harus mengurutkan daftar. Setiap koleksi yang dipesan diperbolehkan, misalnya vektor atau larik.
Wheat Wizard

1
@ Davidvidarkarkey Sebagian besar daftar tidak masuk akal akan meluap dengan jumlah memori yang masuk akal. Melipat sebenarnya tidak menambah jumlah sehingga daftar akan menyatu dengan jumlah tunggal dari daftar asli.
Wheat Wizard

2
@WheatWizard Saya tidak tahu tentang itu, saya pernah mendengar bahwa tidak mungkin untuk melipat daftar menjadi dua kali lebih dari 7 kali.
Carmeister

Jawaban:


9

Python , 46 byte

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

Cobalah online!

Sama panjang:

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

Solusi yang jauh lebih pendek bekerja untuk daftar panjang genap (30 byte)

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

Cobalah online!

Saya masih berusaha menemukan cara singkat untuk memperbaikinya dengan panjang yang aneh.


Oh, aku sangat terkalahkan
Mr.

Solusi "jalan tengah" f=lambda l:l[1:]and[l[0]+l.pop()]+f(l[1:])or ljuga sama panjangnya ...
ETHproduksi

8

05AB1E , 5 byte

Kode

2รค`R+

Menggunakan 05AB1E penyandian . Cobalah online!

Penjelasan

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

8

Emojicode , 203 byte

๐Ÿ‹๐Ÿจ๐Ÿ‡๐Ÿ–๐Ÿ”ข๐Ÿ‡๐Ÿ”‚iโฉ0โž—๐Ÿ”๐Ÿ•2๐Ÿ‡๐Ÿ˜€๐Ÿ”กโž•๐Ÿบ๐Ÿ”ฒ๐Ÿฝ๐Ÿ•i๐Ÿš‚๐Ÿบ๐Ÿ”ฒ๐Ÿฝ๐Ÿ•โž–๐Ÿ”๐Ÿ•โž•1i๐Ÿš‚10๐Ÿ‰๐ŸŠ๐Ÿ˜›1๐Ÿšฎ๐Ÿ”๐Ÿ•2๐Ÿ‡๐Ÿ˜€๐Ÿ”ก๐Ÿบ๐Ÿ”ฒ๐Ÿฝ๐Ÿ•โž—๐Ÿ”๐Ÿ•2๐Ÿš‚10๐Ÿ‰๐Ÿ‰๐Ÿ‰

Ini adalah jawaban Emojicode yang paling menyakitkan bagi saya. Panjang yang tidak perlu: /

Cobalah online!



3

Gaia , 7 byte

e2รทev+โ€ 

Penjelasan

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 byte

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

2

Mathematica 57 Bytes

(#+Reverse@#)[[;;d-1]]&@Insert[#,0,d=โŒˆLength@#/2โŒ‰+1]&

Menyisipkan nol di titik tengah, menambahkan daftar ke kebalikannya dan mengambil panjang yang sesuai.








1

JavaScript, 75 71 byte

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

Cobalah online

Disimpan 2 byte berkat produk ETH


1

JavaScript (ES6), 41 byte

f=a=>1/a[1]?[a.shift()+a.pop(),...f(a)]:a


1

MATL , 9 byte

`6L&)swtn

Cobalah online!

Bagaimana itu bekerja

Diberikan array [a b c ... x y z], biarkan [a z]disebut subarray "kerak" dan [b c ... y z]"inti".

Kode terdiri dari satu loop yang menghilangkan kerak, menghitung jumlahnya, dan memindahkan inti ke atas tumpukan, siap untuk iterasi berikutnya. Kondisi loop adalah jumlah elemen dalam subarray inti

`       % 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 byte

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

Jumlah byte juga termasuk

using System.Linq;

Cobalah online!

Sebagai input, harap gunakan angka yang dipisahkan dengan koma ( ,) atau spasi. Penjelasan:

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

Bisakah Anda menyimpan byte dengan mengatur panjang ke variabel dan beralih ke pengembalian eksplisit?
TheLethalCoder

@TheLethalCoder sayangnya lebih panjang
Grzegorz Puล‚awski

1

Perl, 42 38 karakter

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

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

Coba misalnya seperti:

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

1
Memperbaiki kesalahan yang masuk karena keterikatan emosional dan profesional saya pada variabel. Menolak untuk dikalahkan oleh JS: P
bytepusher

1

Pyth, 18 17 13 byte

V.Tc2Q aYsN;Y

Pendekatan awal saya adalah

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

-1 byte terima kasih kepada Tn. Xcoder

-4 byte terima kasih kepada FryAmTheEggman


Coba gunakan c2<list>untuk membagi daftar menjadi dua. Perintah lain yang mungkin berguna adalah .T.
FryAmTheEggman


1

C ++ 17, 75 73 71 byte

Sebagai lambda yang tidak disebutkan namanya, menerima wadah seperti vectoratau list, kembali melalui memodifikasi input:

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

Menggunakan operator 'masuk ke' yang terkenal <-- dan triple plus+++

Tidak disatukan dan contoh:

#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 byte SBCS

-3 byte terima kasih kepada @ Adรกm.

(โŒŠ2รทโจโ‰ข)(โ†‘{+โŒฟโ†‘โบโต}โˆ˜โŒฝโ†“)โŠข

Cobalah online!

Penjelasan:

(โŒŠ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



1

Gangguan Umum, 106 byte

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

Cobalah online!



0

Scala, 91 byte

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

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

Disimpan 3 byte dengan inspirasi dari Asaf .


Bagus. Anda dapat mengubah '1 / c [0]' menjadi '[] + c' untuk menyimpan 2 byte.
Asaf

@ Asaf Sebenarnya saya pikir c+cberfungsi untuk byte ketiga.
Neil

0

Java 8, 93 byte

Digit ganda! Ini adalah lambda yang mengambil int[]dan mengembalikan sebuah 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);}

Lambda yang tidak tersentuh

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

Cukup mudah. Ini melipat bagian kedua di tempat ke bagian pertama dari input dan mengembalikan salinan hanya bagian pertama.

Anehnya, salinan array dalam pernyataan kembali tampaknya menjadi cara termurah untuk menangani quirk elemen terakhir untuk input panjang ganjil.


Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.