목록을 반으로 접으십시오


24

정수 목록을 접을 것입니다. 절차는 다음과 같습니다. 목록의 길이가 짝수 인 경우 새 목록의 n 번째 항목이 이전 목록의 n 번째 항목과 n 번째 -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]

태스크

정수 목록을 입력으로 사용하고 그 목록을 접은 출력으로하는 프로그램이나 함수를 작성하십시오.

이것은 질문이므로 바이트 수가 적을수록 답변 점수가 바이트로 표시됩니다.

샘플 구현

다음 f은 접기를 수행하는 함수 를 정의하는 Haskell의 구현입니다 .

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

온라인으로 사용해보십시오!


정수를 말할 때 여기에는 0 또는 음의 정수가 포함됩니까?
Neil

1
@Neil 예.
밀 마법사

2
@ GrzegorzPuławski 목록을 정렬해서는 안됩니다. 예를 들어 벡터 또는 배열과 같은 정렬 된 컬렉션이 허용됩니다.
밀 마법사

1
@DavidStarkey 가장 합리적인 목록은 적당한 양의 메모리로 오버플로되지 않습니다. 접기는 실제로 합계를 증가시키지 않으므로 목록은 원래 목록 합계의 단일 톤으로 수렴됩니다.
밀 마법사

2
@WheatWizard 나는 그것에 대해 모른다. 내가 목록을 7 번 이상 반으로 접을 수 없다는 것을 들었다.
Carmeister

답변:


9

파이썬 , 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]

온라인으로 사용해보십시오!

나는 여전히 홀수 길이를 수정하는 짧은 방법을 찾으려고 노력하고 있습니다.


오, 난 정말 너무 뛰어 났어요 ÷ _ ÷
Mr. 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 답변이었습니다. 불필요한 길이 : /

온라인으로 사용해보십시오!



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

수학, 88 바이트

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

2

매스 매 티카 57 바이트

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

중간 점에 0을 삽입하고리스트를 반대 방향으로 추가하고 적절한 길이를 취합니다.









1

자바 스크립트 (ES6), 41 바이트

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


1

MATL , 9 바이트

`6L&)swtn

온라인으로 사용해보십시오!

작동 원리

배열을 지정해 [a b c ... x y z], LET [a z]은 "지각"부분 배열이라고 할[b c ... y z] 은 "핵심"부분 배열을.

이 코드는 크러스트를 제거하고 그 합을 계산하며 코어를 스택의 맨 위로 이동시켜 다음 반복을 준비하는 루프로 구성됩니다. 루프 조건은 핵심 하위 배열의 요소 수입니다.

`       % 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 코어) , 118111 바이트

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

펄, 42 38 자

하위 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
감정적이고 전문적인 변수 부착으로 인해 발생하는 오류를 수정했습니다. JS : P
bytepusher outgolfed 거부

1

Pyth, 18 17 13 바이트

V.Tc2Q aYsN;Y

내 원래 접근 방식은

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

Mr. Xcoder 덕분에 -1 바이트

FryAmTheEggman 덕분에 -4 바이트


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

잘 알려진 'goes-to'연산자 사용 <-- 와 트리플 플러스 사용하기+++

언 골프 및 예 :

#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

@ Adám 덕분에 -3 바이트.

(⌊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÷⍨≢)(↑↑⍮⌽⍤↓)⊢
Adám




0

스칼라, 91 바이트

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


0

자바 스크립트 (ES6), 46 43 바이트

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

Asaf 에서 영감을 얻어 3 바이트를 절약했습니다 .


좋은. '1 / c [0]'을 '[] + c'로 변경하여 2 바이트를 절약 할 수 있습니다.
Asaf

@Asaf 사실 c+c세 번째 바이트에서 작동 한다고 생각 합니다.
Neil

0

자바 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.