พับครึ่งรายการ


24

เรากำลังจะพับลิสต์ของจำนวนเต็ม ขั้นตอนที่ต้องทำมีดังต่อไปนี้หากรายการมีความยาวเท่ากันให้ทำรายการครึ่งหนึ่งของความยาวโดยที่รายการที่ n ของรายการใหม่คือผลรวมของรายการที่ n ของรายการเก่าและ nth-to- รายการสุดท้ายของรายการเก่า ตัวอย่างเช่นถ้าเรามีรายการ

[1 2 3 4 5 6 7 8]

เราจะพับมันอย่างนั้น

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

หากรายการมีความยาวคี่ในการพับเราจะลบรายการกลางก่อนพับมันราวกับว่ามันเป็นคู่และผนวกรายการกลางเพื่อผล

ตัวอย่างเช่นถ้าเรามีรายการ

[1 2 3 4 5 6 7]

เราจะพับมันอย่างนั้น

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

งาน

เขียนโปรแกรมหรือฟังก์ชั่นที่รับรายการจำนวนเต็มเป็นอินพุตและเอาต์พุตที่รายการถูกพับ

นี่เป็นคำถามเกี่ยวกับการเขียนดังนั้นคำตอบจะได้คะแนนเป็นไบต์โดยมีจำนวนไบต์น้อยกว่าดีกว่า

การใช้งานตัวอย่าง

นี่คือการใช้งานใน Haskell ที่กำหนดฟังก์ชั่นfที่ทำหน้าที่พับครึ่ง

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

ลองออนไลน์!


เมื่อคุณพูดจำนวนเต็มสิ่งนี้จะรวมศูนย์หรือจำนวนเต็มลบหรือไม่
Neil


2
@ GrzegorzPuławskiคุณไม่ควรเรียงลำดับรายการ อนุญาตให้ใช้คอลเล็กชันที่สั่งซื้อได้เช่น vector หรือ array
ข้าวสาลีตัวช่วยสร้าง

1
@DavidStarkey รายการที่สมเหตุสมผลส่วนใหญ่จะไม่ล้นด้วยจำนวนหน่วยความจำที่เหมาะสม การพับไม่ได้เพิ่มผลรวมดังนั้นรายการจะรวมกันเป็นหนึ่งเดียวของผลรวมของรายการดั้งเดิม
ข้าวสาลีช่วยสร้าง

2
@WeatWizard ฉันไม่รู้เรื่องนี้ฉันได้ยินมาว่ามันเป็นไปไม่ได้ที่จะพับรายการใด ๆ ในครึ่งมากกว่า 7 ครั้ง
Carmeister

คำตอบ:


9

Pythonขนาด 46 ไบต์

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

ลองออนไลน์!

ความยาวเท่ากัน:

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

โซลูชันที่สั้นกว่าทำงานได้กับรายการที่มีความยาวเท่ากัน (30 ไบต์)

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

ลองออนไลน์!

ฉันยังคงพยายามหาวิธีแก้ไขสั้น ๆ เพื่อแก้ไขความยาวคี่


โอ้ฉันได้รับ outgolfed อย่างมาก÷ _ ÷
นาย Xcoder

โซลูชัน "สายดินกลาง" f=lambda l:l[1:]and[l[0]+l.pop()]+f(l[1:])or lนั้นมีความยาวเท่ากัน ...
ETHproductions


8

อิโมจิโคเดะ , 203 ไบต์

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

นี่เป็นคำตอบที่เจ็บปวดที่สุดสำหรับ Emojicode สำหรับฉัน ความยาวที่ไม่จำเป็น: /

ลองออนไลน์!


4

Japt , 21 18 16 ไบต์


l
íUj°V/2V w)mx

ทดสอบออนไลน์!

น่ากลัวน้อยลงอย่างสิ้นเชิงขอบคุณน้อยมาก @Oliver BRB หลังจากที่ฉันใช้บิวด์อินเพิ่มเติมและแก้ไขข้อบกพร่องบางอย่าง ...


3

Gaia , 7ขนาดไบต์

e2÷ev+†

คำอธิบาย

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 57 Bytes

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

แทรกศูนย์ที่จุดกึ่งกลางเพิ่มรายการลงในสิ่งที่ตรงกันข้ามและใช้ความยาวที่เหมาะสม










1

MATL , 9 ไบต์

`6L&)swtn

ลองออนไลน์!

มันทำงานอย่างไร

รับอาร์เรย์[a b c ... x y z]ให้[a z]เรียกว่า "เปลือก" subarray และ[b c ... y z]"แกน" subarray

รหัสประกอบด้วยวงที่เอาเปลือกออกคำนวณผลรวมของมันและย้ายแกนไปที่ด้านบนของสแต็คพร้อมสำหรับการทำซ้ำครั้งถัดไป เงื่อนไขลูปคือจำนวนขององค์ประกอบในระบบย่อยหลัก

`       % 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 ไบต์

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

จำนวนไบต์ยังรวมถึง

using System.Linq;

ลองออนไลน์!

โปรดป้อนหมายเลขที่คั่นด้วยเครื่องหมายจุลภาค ( ,) หรือช่องว่าง คำอธิบาย:

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

คุณสามารถบันทึกไบต์โดยการตั้งค่าความยาวเป็นตัวแปรและเปลี่ยนเป็นการคืนอย่างชัดเจนได้หรือไม่?
TheLethalCoder

@TheLethalCoder น่าเสียดายที่มันนานกว่านี้
Grzegorz Puławski

1

Perl, 42 38 ตัวอักษร

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

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

ลองตัวอย่างเช่น:

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

1
แก้ไขข้อผิดพลาดที่เกิดขึ้นเนื่องจากความผูกพันทางอารมณ์และอาชีพของฉันกับตัวแปร ปฏิเสธที่จะถูก outgolfed โดย JS: P
bytepusher

1

Pyth, 18 17 13 ไบต์

V.Tc2Q aYsN;Y

วิธีการดั้งเดิมของฉันคือ

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

-1 ไบต์ขอบคุณ Mr. Xcoder

-4 ไบต์ขอบคุณ FryAmTheEggman


ลองใช้c2<list>แบ่งครึ่งรายการ .Tคำสั่งที่อาจเป็นประโยชน์เป็นอีกหนึ่ง
FryAmTheEggman


1

C ++ 17, 75 73 71 ไบต์

ในฐานะแลมบ์ดาที่ไม่มีชื่อให้ยอมรับคอนเทนเนอร์เช่นvectorหรือlistส่งคืนผ่านการแก้ไขอินพุต:

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

การใช้โอเปอเรเตอร์ 'go-to' ที่เป็นที่รู้จักกันดี<--และทริปเปิ้ลพลัส+++

Ungolfed และตัวอย่าง:

#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 ไบต์SBCS

-3 ไบต์ขอบคุณ @ Adám

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

ลองออนไลน์!

คำอธิบาย:

(⌊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 ขยาย 18 ไบต์:+⌿(⌊2÷⍨≢)(↑↑⍮⌽⍤↓)⊢
อดัม

การฝึกอบรม 21 ไบต์: (⌊2÷⍨≢)(↑{+⌿↑⍺⍵}∘⌽↓)⊢`
อดัม





0

JavaScript (ES6), 46 43 ไบต์

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

ที่บันทึกไว้ 3 ไบต์ด้วยแรงบันดาลใจจากAsaf


ดี คุณสามารถเปลี่ยน '1 / c [0]' เป็น '[] + c' เพื่อบันทึก 2 ไบต์
Asaf

@ Asaf จริง ๆ แล้วฉันคิดว่าc+cใช้ได้กับไบต์ที่สาม
Neil

0

Java 8, 93 ไบต์

เลขสองหลัก! นี่คือแลมบ์ดาที่ใช้เวลาอีกด้วยและส่งกลับint[]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);}

แลมบ์ดา

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

ค่อนข้างตรงไปตรงมา มันพับครึ่งหลังเข้าที่ครึ่งแรกของอินพุตและส่งคืนสำเนาของครึ่งแรก

น่าแปลกที่การคัดลอกอาเรย์ในข้อความสั่ง return ดูเหมือนจะเป็นวิธีที่ถูกที่สุดในการจัดการองค์ประกอบสุดท้ายของการเล่นโวหารสำหรับอินพุตที่มีความยาวคี่


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.