Inspiré par cela
Dans le défi lié, il nous est demandé d'appliquer l'addition aux éléments de l'original et de l'inverse du tableau d'entrée. Dans ce défi, nous allons le rendre un peu plus difficile, en introduisant les autres opérations mathématiques de base.
Étant donné un tableau d'entiers, parcourez +, *, -, //, %, ^
, où //
est la division entière et ^
est exposant, tout en l'appliquant à l'inverse du tableau. Ou, en d'autres termes, appliquez l'une des fonctions ci-dessus à chaque élément d'un tableau, le deuxième argument étant l'inverse du tableau, la fonction appliquée parcourant la liste ci-dessus. Cela peut encore prêter à confusion, permet donc de travailler sur un exemple.
Input: [1, 2, 3, 4, 5, 6, 7, 8, 9]
Reverse: [9, 8, 7, 6, 5, 4, 3, 2, 1]
[ 1, 2, 3, 4, 5, 6, 7, 8, 9]
Operand: + * - / % ^ + * -
[ 9, 8, 7, 6, 5, 4, 3, 2, 1]
Result: [10, 16, -4, 0, 0, 1296, 10, 16, 8]
de sorte que la sortie pour [1, 2, 3, 4, 5, 6, 7, 8, 9]
serait[10, 16, -4, 0, 0, 1296, 10, 16, 8]
Pour couvrir les cas d'angle, l'entrée ne contiendra jamais de 0, mais peut contenir tout autre entier dans la plage allant de l'infini négatif à l'infini positif. Vous pouvez prendre l'entrée comme une liste de chaînes représentant des chiffres si vous le souhaitez.
Cas de test
input => output
[1, 2, 3, 4, 5, 6, 7, 8, 9] => [10, 16, -4, 0, 0, 1296, 10, 16, 8]
[5, 3, 6, 1, 1] => [6, 3, 0, 0, 1]
[2, 1, 8] => [10, 1, 6]
[11, 4, -17, 15, 2, 361, 5, 28] => [39, 20, -378, 7, 2, 3.32948887119979e-44, 9, 308]
C'est un code-golf donc le code le plus court (en octets) gagne!
la source
Réponses:
Gelée, 10 octets ( fourchette )
Je travaillais juste sur l'implémentation d'un rapide pour cela l'autre jour, il est donc assez surprenant de voir une utilisation si tôt. Il n'existe toujours qu'en tant que fork, vous ne pouvez donc pas l'essayer en ligne.
Exemple de sortie
Explication
la source
ƭ
en charge des nilades (remplacer la valeur) et des monades (appliquer sur l'argument de gauche)2 1”q3ƭ€
de[7,4,9,0]
retours[2, 1, 'q', 2]
Husk , 16 octets
Ce défi favorise les langages qui peuvent créer des listes infinies de fonctions.Peut-être pas,eval
FTWEssayez-le en ligne!
Comment?
Solution alternative à 17 octets:
la source
ë+*-÷%^
? Pourquoi faire lee
nécessaire?ë
prend 4 arguments,e
prend 2. Il n'y en a pas un pour 605AB1E , 18 octets
Essayez-le en ligne!
Explication
la source
Ig∍
si vous vouliez utiliser la commande "newish" (vous n'avez pas vu grand chose∍
ici).Utilitaires Bash + GNU, 53
Ce script prend un nom de fichier comme paramètre de ligne de commande.
Essayez-le en ligne .
La bonne chose ici est que cela
paste -d
permet de donner une liste de séparateurs, qui sont utilisés de manière cyclique. Le reste, il suffit de mettre l'entrée dans le bon format pour ce faire.la source
Gelée , 15 octets
Essayez-le en ligne! ou voir la suite de tests .
Comment?
la source
ż“+×_:%*”;"ṚV
ż“+×_:%*”ṁ$;"ṚV
ce qui est également de 15 octets.Python 2 , 67 octets
-3 octets grâce aux ovs.
Essayez-le en ligne!
Python 2 , 95 octets
Essayez-le en ligne!
eval
est mal ... mais peut-être plus golfique. : Pla source
JavaScript (ES7),
6867 octetsAfficher l'extrait de code
la source
o
entre parenthèses.pop()
pour économiser quelques octets.o
est également utilisée comme condition de l'opérateur ternaire. Cela briserait ce schéma.Perl 6 ,
6766 octets1 octet enregistré grâce à @nwellnhof.
Essayez-le en ligne!
Solution très peu imaginative (et probablement mauvaise). Zips l'argument avec lui-même inversé. La liste résultante est ensuite mappée avec le bloc qui
EVAL
est la chaînea (operator) b
. L'opérateur est choisi dans la liste des chaînes en<+ * - div % **>
utilisant la variable librestate
(pensezstatic
en C - la valeur persiste à travers les appels du bloc)$
. Ceci est créé séparément pour chaque bloc et mis à 0. Vous pouvez faire tout ce que vous voulez avec lui, mais vous ne pouvez le référencer qu'une seule fois (chaque occurrence de$
fait référence à une autre variable, en fait). Il en$++%6
est de même de 0 lors du premier appel, de 1 lors du second, ... de 5 lors du 6, de 0 lors du 7 et ainsi de suite.J'ai d'abord essayé de m'en passer
EVAL
. Les opérateurs ne sont en fait que des sous-marins (= fonctions), mais leurs noms sont tellement peu mordants (&infix:<+>
et ainsi de suite) que j'ai dû renoncer à cette approche.la source
map {EVAL ".[0] ... .[1]"},zip $_,.reverse
est 1 octet plus court.Haskell ,
74117105 octetsEssayez-le en ligne!
12 octets enregistrés grâce à @nimi
Il existe certainement un meilleur moyen d'y parvenir.
EDIT 1. Exposant fixe pour les entiers; 2. Il y a certainement une meilleure façon, voir le commentaire ci-dessous:
9591 octetsEssayez-le en ligne!
la source
zipWith3($)(cycle[(+),(*),(-),div,mod,(^)])<*>reverse
Est une version plus courte et maintenant supprimée de la vôtre.h
dans l'appel deo
:o a b
et sans cela vous pouvez inlineh
( TIO ).Python 2 , 71 octets
Essayez-le en ligne!
Sauvegardé 2 octets grâce aux ovs!
la source
J,
4442 octetsBarré 44, yada yada ...
-2 octets grâce à @ ConorO'Brien
Essayez-le en ligne!
Tant de parens et d'inserts ... Il y a sûrement une meilleure façon de le faire (peut-être en utilisant insert plutôt qu'infix?)
Explication
Quelques notes:
J n'a pas de division entière, donc nous composons -division
%
avec>.
-floor. Le mod (|
) de J fait l'ordre inverse de ce que nous attendons, nous devons donc inverser son ordre en utilisant~
-reflexive.Même si nous nous déplaçons sur des intervalles de 2, nous devons utiliser
/
-insert pour insérer les verbes pour les utiliser dyadiquement puisque c'est ainsi que\
-infix fonctionne.la source
()
et répété/
- je n'ai pas pu le comprendre ..../
sur un tableau inversé (car il fonctionne à l'envers ...) avec des verbes comme(,+)`(,*)
mais cela n'aide pas beaucoup ... (aussi cela ne fonctionne pas)+/`(*/)`...
Rubis ,
6357 octetsRien d'extraordinaire, vraiment. Il suffit d'itérer sur le tableau, d'utiliser un index comme itérateur inverse, de se joindre à une chaîne en utilisant le bon opérateur, d'évaluer, de rincer et de répéter.
Essayez-le en ligne!
la source
k , 40 octets
Essayez-le en ligne!
la source
MATL ,
2723 octets-4 octets grâce à @LuisMendo
Essayez-le en ligne!
Explication:
la source
Perl 5 , 68 + 1 (-p) = 69 octets
Essayez-le en ligne!
Prend l'entrée comme une liste de nombres séparés par des espaces.
la source
R , 74 octets
Essayez-le en ligne!
C'est la réponse finale que j'ai trouvée. Il renvoie une liste de longueur
length(l)
où chaque élément est une liste contenant l'élément correspondant. Un peu merdique mais ils sont tous là. Si cela est inacceptable, l'un ou l'autreMap
peut être remplacé parmapply
+3 octets.Puisque les opérateurs R sont toutes des fonctions (la notation infixe étant simplement du sucre syntaxique), j'ai essayé d'en sélectionner une dans une liste; par exemple, la solution de 94 octets ci-dessous.
Pour essayer de me débarrasser de la boucle, j'ai essayé
sapply
, mais cela ne fonctionne qu'avec une seule fonction et une seule liste d'entrée. Ensuite, je me suis souvenu de la forme multivariéemapply
, qui prend unen-ary
fonctionFUN
et desn
arguments successifs, s'appliquantFUN
aux premier, deuxième, ..., éléments de chacun des arguments, recyclant si nécessaire . Il y a aussi une fonction wrapper pourmapply
,Map
qui "ne fait aucune tentative pour simplifier le résultat" . Comme il est plus court de trois octets, c'est une bonne opportunité de jouer au golf.J'ai donc défini une fonction trinaire (comme dans la solution de 80 octets ci-dessous) qui prend une fonction comme premier argument et l'applique à ses deuxième et troisième. Cependant, j'ai réalisé que
Map
c'est une fonction qui prend une fonction comme premier argument et l'applique à des fonctions successives. Soigné!Enfin, nous sous-ensemble à la fin pour nous assurer de ne renvoyer que les premières
length(l)
valeurs.R , 80 octets
Essayez-le en ligne!
Celui-ci ne fonctionne pas, car il renverra 6 valeurs pour les listes de moins de 6 éléments.
R , 94 octets
Essayez-le en ligne!
Explication (légèrement non golfée):
Parce que chacune des fonctions est vectorisée, nous pouvons indexer à la fin (
res[i]
). C'est mieux que l'eval
approche ci-dessous.R , 100 octets
Essayez-le en ligne!
C'est l'
eval
approche la plus courte que j'ai pu trouver; parce que nous devons recueillir les résultats dans un vecteur, nous devonspaste
unc( )
autour de toutes les expressions, ce qui ajoute une tonne d'octets inutilesla source
Casio-Basic, 108 octets
C'était douloureux. Surtout parce que
mod(x,y)
revientx
quand il ne devrait vraiment pas, ce qui signifie que j'ai dû créer ma propre fonction de mod: d'où lex-int(x/y)y
.Boucles
i
de 0 àlength(l)-1
, en prenant des éléments successifs dans lao
liste et en demandantl[i]
pourx
etl[-i]
poury
. (les indices négatifs ne fonctionnent pas cependant, donc à la place je soustraisi
de la longueur de la liste et prends cet index.)107 octets pour la fonction, +1 octet à ajouter
l
dans la boîte de paramètres.la source
Java 8, 336 octets
Essayez-le ici.
Soupir ..
Entrée comme
int[]
, sortie commejava.math.BigInteger[]
.Sans la règle " Pour couvrir les cas d'angle, l'entrée ne contiendra jamais de 0, mais peut contenir tout autre entier dans la plage de l'infini négatif à l'infini positif. ", En utilisant des entiers dans la plage
-2147483648
de2147483647
, ce serait 186 octets (entrée asint[]
, et aucune sortie car il modifie ce tableau d'entrée à la place pour économiser des octets):Essayez-le ici.
Explication:
la source