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!

Wisaya Gandum
sumber
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.

Tidak
sumber
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
Adnan
sumber
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!

betseg
sumber
4

Japt , 21 18 16 byte


l
รญUjยฐV/2V w)mx

Uji secara online!

Benar-benar mengerikan. Sedikit kurang enak untuk @Oliver . BRB setelah saya menerapkan lebih banyak built-in dan memperbaiki beberapa bug ...

Produksi ETH
sumber
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.
Kucing Bisnis
sumber
2

Mathematica, 88 byte

(d=Array[s[[#]]+s[[-#]]&,x=โŒŠt=Length[s=#]/2โŒ‹];If[IntegerQ@t,d,d~AppendTo~s[[x+1]]])&
J42161217
sumber
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.

Kelly Lowder
sumber
2

Japt , 12 byte

รฅ@o +Y*(Z<Ul

Cobalah online! dengan -Qbendera untuk melihat array yang diformat.

Solusi alternatif, 14 byte

o(ยฝ*Ul)c)รญU mx

Cobalah online!

Justin Mariner
sumber
2

Jelly , 7 byte

ล“s2U2ยฆS

Cobalah online!

-2 Berkat produksi ETH ... dan saya sadari sebelumnya.

Erik the Outgolfer
sumber
ETH benar, 7 byte
Mr. Xcoder
@ ETHproductions Terima kasih, meskipun saya sudah tahu setelah saya mematikan komputer saya.
Erik the Outgolfer
2

R , 81 70 68 57 byte

function(l)c((l+rev(l))[1:(w=sum(l|1)/2)],l[w+1][!!w%%1])

Cobalah online!

fungsi anonim; mengembalikan hasilnya.

Giuseppe
sumber
1

Python 3 , 101 byte

lambda l:[sum(x)for x in zip(l[:len(l)//2],l[int(len(l)/2+.5):][::-1])]+[[],[l[len(l)//2]]][len(l)%2]

Cobalah online!

Tuan Xcoder
sumber
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


sumber
1

JavaScript (ES6), 41 byte

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

Rick Hitchcock
sumber
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)
Luis Mendo
sumber
1

WendyScript , 72 byte

<<f=>(l){<<r=[]<<b=l.size#i:0->b/2r+=l[i]+l[b-i-1]?b%2!=0r+=l[(b/2)]/>r}

f([1,2,3,4,5,6,7,8]) // => [9,9,9,9]
f([1,2,3,4,5,6,7]) // => [8,8,8,4]

Cobalah online!

Felix Guo
sumber
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
);
Grzegorz Puล‚awski
sumber
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));
bytepusher
sumber
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

Dave
sumber
Coba gunakan c2<list>untuk membagi daftar menjadi dua. Perintah lain yang mungkin berguna adalah .T.
FryAmTheEggman
17 byte:WtQ aY+.)Q.(Q0;+Y
Tn. Xcoder
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);
}
Karl Napf
sumber
1

J , 22 byte

({.+/@,:|.@}.)~>.@-:@#

Cobalah online!

Jonah
sumber
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
voidhawk
sumber
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!

Renzo
sumber
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)
Phoenix
sumber
0

Mathematica , 52

(a=#;i=0;(i++;a[[i;;-i]]*=x)&/@a;(Tr@a+O@x^i)[[3]])&
Tuan Penyihir
sumber
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 .

Neil
sumber
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.

Jakob
sumber