introduction
Considérons deux tableaux entiers non vides, disons A = [0 3 2 2 8 4] et B = [7 8 7 2] . Pour effectuer un ajout d'alignement sur eux, nous procédons comme suit:
Répétez chaque tableau suffisamment de fois pour obtenir une longueur totale de 1 cm (longueur (A), longueur (B)) . Ici, lcm représente le plus petit commun multiple.
A -> [0 3 2 2 8 4][0 3 2 2 8 4] B -> [7 8 7 2][7 8 7 2][7 8 7 2]
Effectuez l'addition élément par élément sur les tableaux répétés et coupez le résultat à chaque position où il y a une coupure dans l'un ou l'autre.
A -> [0 3 2 2 8 4][0 3 2 2 8 4] B -> [7 8 7 2][ 7 8 7 2][7 8 7 2] -> [7 11 9 4][15 12][7 5][9 10 15 6]
Ce tableau de tableaux est votre résultat.
La tâche
Vos entrées sont deux tableaux d'entiers non vides, et votre sortie doit être le résultat de leur ajout d'alignement, tel que défini ci-dessus. Les entrées et les sorties peuvent être dans n'importe quel format raisonnable. Vous n'avez pas à vous soucier du dépassement d'entier lors de l'ajout.
Règles et notation
Vous pouvez écrire un programme complet ou une fonction. Le plus petit nombre d'octets gagne.
Cas de test
[1] [4] -> [[5]]
[1,2,-3,-4] [15] -> [[16],[17],[12],[11]]
[0,-4] [2,1,0,-3] -> [[2,-3],[0,-7]]
[0,3,2,2,8,4] [7,8,7,2] -> [[7,11,9,4],[15,12],[7,5],[9,10,15,6]]
[18,17,16] [-1,-2,-3,-4] -> [[17,15,13],[14],[16,14],[15,13],[15],[16,14,12]]
[18,17,16,15] [-1,-2,-3,-4] -> [[17,15,13,11]]
[1,1,1,1,1] [6,5,6,5,6,5,6,2,1] -> [[7,6,7,6,7],[6,7,3,2],[7],[6,7,6,7,6],[7,3,2],[7,6],[7,6,7,6,7],[3,2],[7,6,7],[6,7,6,7,3],[2],[7,6,7,6],[7,6,7,3,2]]
[1,1,1,1,1,1] [6,5,6,5,6,5,6,2,1] -> [[7,6,7,6,7,6],[7,3,2],[7,6,7],[6,7,6,7,3,2]]
[1,1,1,1,1,1,1] [6,5,6,5,6,5,6,2,1] -> [[7,6,7,6,7,6,7],[3,2],[7,6,7,6,7],[6,7,3,2],[7,6,7],[6,7,6,7,3,2],[7],[6,7,6,7,6,7,3],[2],[7,6,7,6,7,6],[7,3,2],[7,6,7,6],[7,6,7,3,2],[7,6],[7,6,7,6,7,3,2]]
Réponses:
JavaScript (ES6),
10199 octetsPrend l'entrée sous forme de 2 tableaux. Retourne une chaîne.
Comment ça marche
Nous itérons sur le premier tableau
a
avec un pointeuri
lors de la mise à jour d'un autre pointeurj
dans le second tableaub
. Les sommesa[i] + b[j]
sont ajoutées à la chaîne de sorties
. Un séparateur est inséré à chaque foisi == 0
ouj == 0
. Nous répétons ce processus jusqu'à ce qu'ilj
soit exactement au début oub
à la fin d'une itération.Remarque: Lorsque l'
|
opérateur est appliqué, ila.map(...)
est contraintNaN
(sia
contient plus d'un élément) ou à la valeur actuelle dej
(s'ila
contient exactement un élément). Par conséquent,a.map(...)|j == j
dans tous les cas et est sans danger pour utiliser ici.Cas de test
Afficher l'extrait de code
la source
Haskell,
8479 octetsMa première version était la même dans une mise en page plus lisible:
Utiliser une définition locale pour ne pas avoir à donner
(%)
d’arguments supplémentaires poura
etb
. Étonnamment, c'est presque la même solution donnée presque au même moment que celle de @ nimi, de qui j'ai eu l'idée d'utiliser une seule ligne pour la définition locale.Usage:
la source
!
.PHP,
126120 octetsEssayez-le ici!
Fonction anonyme qui retourne le tableau résultant de tableaux.
Essentiellement, nous parcourons le contenu de nos deux tableaux, en modifiant notre itérateur en fonction de la longueur du tableau pour les simuler en les "copiant". En prenant chacune des valeurs des tableaux, nous les additionnons et les ajoutons à un tableau dans
$c
. Si nous arrivons à la fin de l’un de nos tableaux d’entrée (une division, en termes de défi), nous commençons à assigner un nouveau tableau dans$c
.La raison de la
do while
boucle est parce que notre condition est basée sur$i
, qui commence à0
. Si nous utilisons une boucle où la condition est vérifiée au début, la boucle ne serait pas exécutéeNous ne finissons la sommation que lorsque nous atteignons la fin des deux tableaux en même temps, ce qui impliquerait le LCM.
la source
$b[$i%$y]
pas être ça ? Vous pouvez économiser 3 octets en passant$x=count($a)
à la première utilisation de$x
; idem pour$y=count($b)
et un octet avec bitwise ou dans l'while
étatHaskell,
8784 octetsExemple d'utilisation:
[0,3,2,2,8,4] # [7,8,7,2]
->[[7,11,9,4],[15,12],[7,5],[9,10,15,6]]
.Récursion simple. Cas de base: les deux listes sont vides. Si un seul d'entre eux est vide, redémarrez avec une version complète et démarrez un nouveau cluster dans la sortie. Si aucun n'est vide, ajoutez la somme à l'élément from.
Regardez aussi la réponse de @Christian Sievers , qui est presque identique et a été postée quelques secondes plus tôt.
la source
Octave, 113 octets
cette fonction est directement appelable pour l'appeler, la placer entre parenthèses et appeler comme (@ (a, b) ...) ([1 2 3 4], [6 4 5])
la source
CJam , 30 octets
Essayez-le en ligne!
Prend les entrées comme une paire de listes.
Explication
L'idée est d'insérer dans les tableaux d'entrée des marqueurs (sous la forme de chaînes courtes) indiquant l'endroit où le tableau aligné se termine et où nous devons insérer les ruptures dans les tableaux. De cette façon, nous pouvons éviter de devoir calculer le LCM.
la source
Jelly ,
212018 octetsEssayez-le en ligne!
Comment ça marche
la source
Python 3.5 - (
146137134130 + 12) = 142 octetsJe n'arrive pas à comprendre comment mettre la boucle complète en une ligne.
Modifications:
la source
gcd
fonction est dansfractions
, pasmath
.3.4.3
.l*k
et les avoirprint(r);r=[]
sur la dernière ligne.Python 2, 119 octets
Prend l'entrée de stdin sous la forme de deux tuples séparés par une virgule, affiche les listes résultantes dans stdout. Termine en levant l'
ZeroDivisionError
exception, puisque cela semble être autorisé .Par exemple, si l'entrée est
(0, 3, 2, 2, 8, 4), (7, 8, 7, 2)
, le programme imprimerasur la sortie standard et l’exception traceback vers stderr.
la source
J ,
3432 octetsEssayez-le en ligne!
Explication
la source
Haskell, 166 octets
Ce n’est probablement pas l’approche la plus élégante: en gros, la fonction
?
crée une liste de la longueur requise avec ces sommes et%
réduit ce montant.!
est la dernière fonction qui fusionne les deux.la source
ind
park
ou autre chose, et il y a des parenthèses inutiles autour dedrop i l
etmap(+(-i))ind
. Pensez également à avoir deux cas pour%
, avec correspondance de motif activéel
.[PHP],
183152135 octetsBelle version:
Sortie:
la source
$i=$j=$k=0;
inutile si vous utilisez+$i
etc. pour les index de tableau dans l'affectation ajoutée (-8 octets).$i++;if(!isset($A[$i])){$i=0;$k++;}
->isset($A[++$i])?:$i=!++$k;
(-9, deux fois).$i==0&&$j==0&&!isset()
->!$i&!$j&!isset()
(-6).return$O;
n'a pas besoin d'espace (-1).$i=$j=0;
partie car les premières valeurs des tableaux ne seront pas correctes. J'ai un peu modifié la logique pour ne pas savoir comment implémenter les opérateurs ternaires dans ce cas. Merci pour les++$i
conseils.unset($i);$A[+$i]
. Le+
cast va ennull
entier0
.if(!isset($A[++$i])){$i=0;++$k;++$f;}
->isset($A[++$i])?:$i=!++$k|!++$f;
enregistre encore 5 octets chacun. Sauver un plus avec$f<2
au lieu de$f!=2
. et deux autres avecwhile($f=$f<3){...}
au lieu dewhile($f<2){$f=0;...}
(initialise et réinitialise$f
à 1 à moins d’être incrémenté deux fois)PowerShell ,
147145 octetsEssayez-le en ligne!
(Les suggestions de golf sont les bienvenues. J’ai le sentiment qu’il est probablement possible de supprimer 10 à 15 octets supplémentaires. )
Prend les entrées sous forme de deux tableaux explicites (avec la
@(...)
syntaxe) comme arguments de ligne de commande. Renvoie une table de hachage des tableaux résultants, car les tableaux multidimensionnels de PowerShell peuvent devenir bizarres et cela est plus cohérent. Définit des variables initiales, puis entre à nouveau dans une boucledo
/until
, avec la condition conditionnelle jusqu’à ce que$i
le nombre de cm du tableau compte .A chaque itération de la boucle, nous additionnons les valeurs correspondantes
$a
et correspondantes, nous les$b
traitons comme un tableau,(...)
avant de l’ajouter à la table$o
de hachage à l’emplacement approprié$j
. L'encapsulation de matrice est nécessaire pour empêcher l'addition arithmétique - ceci oblige la+=
surcharge à la concaténation de matrice à la place. Ensuite, une condition sur$x
et$y
(les comptes) pour déterminer si nous sommes au bord du tableau - si c'est le cas, nous incrémentons$j
.Enfin, nous partons
$o
sur le pipeline et la sortie est implicite.(NB: En raison de la façon dont PowerShell énumère les hashtables avec les valeurs par défaut
Write-Output
, ceci a tendance à être "en amont"; comme dans, le "0ème" tableau résultant est sur le "bas" de la sortie. Le hachage est correct et utilisé très bien si, par exemple, vous encapsulez ce code dans une variable de retour ... cela a l'air bizarre quand il est imprimé.)Vous avez enregistré 2 octets en déplaçant $ x et $ y dans l'indexation du tableau plutôt que de les séparer (deux points-virgules enregistrés).
la source
Python 2, 113 octets
la source
not
s pourrait être<1
s à la place?Python 3.5,
210176173169158 octetsPrend deux listes en entrée et imprime toutes les listes.
C'est ma première réponse et je ne sais pas encore jouer au golf. L’idée de base que j’ai utilisée est d’avoir deux compteurs pour chaque liste qui indiquent une scission et une liste en cours où les valeurs ajoutées sont ajoutées; Dès qu'une scission se produit, nous imprimons la liste actuelle et en créons une nouvelle.
la source
x=[];c=len(a);d=len(b);e=f=0
. Aussi,true
peut devenir1
etx.append(a[e]+b[f])
peut devenirx+=a[e]+b[f],
.if
et leswhile
déclarations n'ont pas besoin de parenthèses.Raquette 373 octets
Ungolfed:
Essai:
Sortie:
la source
Clojure,
280206 octetsCela a beaucoup plus de sens. Générer la somme par élément, ajouter des métadonnées de position, prendre pendant que nous n'avons pas encore répété et attribuer la valeur de somme à chaque partition.
Original: J'espère améliorer cela, mais c'est le cas le plus sérieux que j'ai pour le moment.
Ungolfed and verbose:
Commence par "fusionner" un cycle infini de collections
a
etb
, ajoute des métadonnées sur l'index de chaque élément dans la collection, jusqu'à ce que les deux séquences recommencent à partir de l'index 0.Cette collection
c
est ensuite fusionnée avec les données de partition (une somme cumulative de 1 et de zéros), partitionnée et le dernier élément (la somme d'éléments) est sélectionné.Je pense que pour des améliorations significatives, une approche totalement différente est nécessaire.
la source
PHP,
150121119 octetsfonction anonyme prend l'entrée sous forme de tableaux.
panne
la source
C ++ 14, 206 octets
Comme lambda générique sans nom, nécessitant des conteneurs d'entrée
P
,Q
et le conteneur de sortieR
pour être commevector<vector<int>>
.Ungolfed et utilisation:
la source
Mathematica 112 octets
Cela pourrait probablement être amélioré. L'idée est de créer un tableau 2D avec le deuxième élément utilisé pour suivre le bailleur du compteur i mod la longueur de chaque tableau d'entrée.
Usage
la source
JavaScript (ES6), 131 octets
Légèrement non-golfé:
d
ete
contiennent des chiffres, la somme du premier numéro est ajouté às
et les éléments restants sont traités de manière récursives
est ajouté au résultat.r
et l'autre tableau est réinitialisé sur son tableau initial.Malheureusement, cette solution n'a pas l'efficacité impitoyable de @ Arnauld, mais au moins, je pense que c'est une belle solution.
la source