Pliez une liste en deux


24

Nous allons plier une liste d'entiers. La procédure à suivre est la suivante. Si la liste est de longueur paire, faites une liste de la moitié de sa longueur où le nième élément de la nouvelle liste est la somme du nième élément de l'ancienne liste et du nième au dernier. dernier élément de l'ancienne liste. Par exemple, si nous avions la liste

[1 2 3 4 5 6 7 8]

Nous le plierions comme ça

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

Si la liste est de longueur impaire , pour la plier, nous supprimons d'abord l'élément du milieu, plions-le comme s'il était pair et ajoutons l'élément du milieu au résultat.

Par exemple, si nous avions la liste

[1 2 3 4 5 6 7]

Nous le plierions comme ça

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

Tâche

Écrivez un programme ou une fonction qui prend une liste d'entiers en entrée et sort cette liste pliée.

Il s'agit d'une question de donc les réponses seront notées en octets, avec moins d'octets étant mieux.

Exemple d'implémentation

Voici une implémentation dans Haskell qui définit une fonction fqui effectue un repli.

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

Essayez-le en ligne!


Lorsque vous dites des entiers, cela inclut-il zéro ou des nombres négatifs?
Neil

1
@Neil Oui.
Wheat Wizard

2
@ GrzegorzPuławski Vous ne devez pas trier la liste. Toute collection ordonnée est autorisée, par exemple un vecteur ou un tableau.
Wheat Wizard

1
@DavidStarkey La plupart des listes raisonnables ne déborderont pas avec une quantité raisonnable de mémoire. Le pliage n'augmente pas réellement la somme, donc les listes convergeront vers un singleton de la somme de la liste d'origine.
Wheat Wizard

2
@WheatWizard Je ne sais pas, j'ai entendu dire qu'il était impossible de plier une liste en deux plus de 7 fois.
Carmeister

Réponses:


9

Python , 46 octets

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

Essayez-le en ligne!

Même longueur:

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

Une solution beaucoup plus courte fonctionne pour les listes de longueur égale (30 octets)

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

Essayez-le en ligne!

J'essaie toujours de trouver un moyen court de le corriger pour une longueur impaire.


Oh, je me suis terriblement dépassé ÷ _ ÷
M. Xcoder

La solution du "terrain d'entente" f=lambda l:l[1:]and[l[0]+l.pop()]+f(l[1:])or lest également de la même longueur ...
ETHproductions

8

05AB1E , 5 octets

Code

2ä`R+

Utilise l' encodage 05AB1E . Essayez-le en ligne!

Explication

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

8

Emojicode , 203 octets

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

C'était la réponse Emojicode la plus douloureuse au code pour moi. La longueur inutile: /

Essayez-le en ligne!



3

Gaia , 7 octets

e2÷ev+†

Explication

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 octets

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

2

Mathematica 57 octets

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

Insère un zéro au milieu, ajoute la liste à son revers et prend la longueur appropriée.








1

JavaScript, 75 71 octets

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

Essayez-le en ligne

Sauvegardé 2 octets grâce à ETHproductions



1

MATL , 9 octets

`6L&)swtn

Essayez-le en ligne!

Comment ça marche

Étant donné un tableau [a b c ... x y z], [a z]appelons le sous- tableau "crust" et[b c ... y z] le le "core".

Le code consiste en une boucle qui supprime la croûte, calcule sa somme et déplace le noyau vers le haut de la pile, prêt pour la prochaine itération. La condition de boucle est le nombre d'éléments dans le sous-tableau central

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

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

Le nombre d'octets comprend également

using System.Linq;

Essayez-le en ligne!

Veuillez saisir des nombres séparés par des virgules ( ,) ou des espaces. Explication:

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

Pouvez-vous économiser des octets en définissant la longueur sur une variable et en passant à un retour explicite?
TheLethalCoder

@TheLethalCoder, malheureusement, c'est plus long
Grzegorz Puławski

1

Perl, 42 38 caractères

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

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

Essayez par exemple comme ceci:

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

1
Correction d'une erreur qui s'est glissée en raison de mon attachement émotionnel et professionnel aux variables. Refuser de se faire déjouer par JS: P
bytepusher

1

Pyth, 18 17 13 octets

V.Tc2Q aYsN;Y

Mon approche originale était

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

-1 octet merci à M. Xcoder

-4 octets grâce à FryAmTheEggman


Essayez d'utiliser c2<list>pour diviser une liste en deux. Une autre commande qui pourrait être utile est .T.
FryAmTheEggman


1

C ++ 17, 75 73 71 octets

En tant que lambda sans nom, accepter un conteneur comme vectorou list, revient en modifiant l'entrée:

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

Utilisation de l'opérateur bien connu <--et du triple plus+++

Non golfé et exemple:

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

-3 octets grâce à @ Adám.

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

Essayez-le en ligne!

Explication:

(⌊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 octets:+⌿(⌊2÷⍨≢)(↑↑⍮⌽⍤↓)⊢
Adam


1

Lisp commun, 106 octets

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

Essayez-le en ligne!



0

Scala, 91 octets

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

0

Mathematica , 52

(a=#;i=0;(i++;a[[i;;-i]]*=x)&/@a;(Tr@a+O@x^i)[[3]])&

0

JavaScript (ES6), 46 43 octets

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

Enregistré 3 octets avec l'inspiration d' Asaf .


Agréable. Vous pouvez remplacer «1 / c [0]» par «[] + c» pour économiser 2 octets.
Asaf

@Asaf En fait, je pense que cela c+cfonctionne pour le troisième octet.
Neil

0

Java 8, 93 octets

À deux chiffres! Il s'agit d'un lambda qui prend un int[]et retourne un 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 non golfé

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

Assez simple. Il replie la seconde moitié en place sur la première moitié de l'entrée et renvoie une copie de la première moitié uniquement.

Étonnamment, la copie du tableau dans la déclaration de retour semble être le moyen le moins cher de gérer la bizarrerie de l'élément final pour les entrées de longueur impaire.


En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.