Évaluez une feuille de calcul simple

13

Règles

  1. Aucune référence de plage de cellules ( A2:B3).

  2. Maximum 9 lignes et 9 colonnes.

  3. Aucune référence circulaire ou erreur de formule.

  4. Les cellules vides sont évaluées 0.

  5. Les données sont uniquement des nombres, mais peuvent être considérées comme des chaînes.

  6. Les formules sont des chaînes.

Choix d'implémentation

Vous devez indiquer vos choix dans ces domaines:

  1. Exiger que les formules soient préfixées par un caractère unique, par exemple =- ou non.

  2. La cellule la plus à gauche de la deuxième ligne est A2ou R2C1, selon les deux conventions utilisées par Excel et al.

  3. Exiger tout préfixe ou suffixe à caractère unique dans les références de cellule, par exemple $- ou non.

  4. Une chaîne vide, vide, liste vide, etc., (mais pas 0) pour représenter des cellules vides.

  5. Langue de votre soumission (les gestionnaires de feuilles de calcul ne sont pas autorisés).

  6. Langue des formules (peut différer de la précédente). *

  7. Points brownie ou cookies pour expliquer votre solution.

Exemples

Choix: 7 =:; 8 A2:; 9: aucun; 10 "":; 12: langage de formule Excel

Dans:

[[       2, 3],
 ["=A1+B1",""]]

En dehors:

[[2,3],
 [5,0]]

Dans:

[[       2,"=A1+B2"],
 ["=A1+B1",      ""]]

En dehors:

[[2,2],
 [4,0]]

Dans:

[[ 3, 4,"=A1*B1"],
 [ 2, 5,"=A2*B2"],
 ["","","=C1+C2"]]

En dehors:

[[3,4,12],
 [2,5,10],
 [0,0,22]]

Dans:

[["","=2*B2*B3"     ,""],
 [ 3,"=A1+(A2+C2)/2", 2],
 [ 1,"=C1+(A3+C3)/2", 5]]

En dehors:

[[0,15,  0],
 [3, 2.5,2],
 [1, 3  ,5]]

* Le langage de la formule doit être PPCG admissible , mais il vous suffit de prendre en charge les références de cellule plus les critères 3 et 4, wiz. l'addition et la détermination de la primauté.

Adam
la source
La réponse soumise dans Excel / VBA est-elle refusée? Expand array to cells, evaluate.
Magic Octopus Urn
@carusocomputing Si vous ne laissez pas simplement Excel faire son travail, n'hésitez pas à publier.
2017 à 17h08
Peut-on avoir des cellules à base zéro? Comme dans R0C0,?
Conor O'Brien
@ ConorO'Brien Non, ce doit être l'une des deux conventions utilisées par Excel et al.
Adám

Réponses:

6

JavaScript, 125 112 105 octets

Pour l'utiliser, ajoutez f=au début et invoquez like f(argument).

a=>a.map(b=>b.map(p=>+p?p:p?eval(p.replace(/[A-I][1-9]/g,m=>`a[${m[1]-1}][${(m.charCodeAt(0)-65)}]`)):0))

Les choix:

  1. Ne nécessite pas =.
  2. La cellule la plus à gauche de la deuxième ligne est A2.
  3. Ne nécessite aucun préfixe ou suffixe.
  4. "" (Chaîne vide) pour indiquer une cellule vide.
  5. JavaScript.
  6. JavaScript.
  7. Biscuits. 🍪🍪🍪

Explication:

Cette solution parcourt toutes les cellules de la feuille de calcul (chaque élément des sous-tableaux du tableau donné) et si une chaîne non vide est trouvée, remplace ses références de cellule par les références correspondantes en termes du tableau donné et évalue l'expression avec eval()(ouais, cette mauvaise chose qui vous hante dans vos cauchemars ). Cette solution suppose que les constantes fournies dans le tableau d'entrée sont de type entier.

Cas de test

f=a=>a.map(b=>b.map(p=>+p?p:p?eval(p.replace(/[A-I][1-9]/g,m=>`a[${m[1]-1}][${(m.charCodeAt(0)-65)}]`)):0))

console.log(f([[1,2,3],["A1+B1+C1",10,11]]));
console.log(f([[1,2,5,4,6,89,0],[0,1,2,3,"A2+A1",5,6]]));
console.log(f([[1,2,4,5],["A1/B1*C1+A1+Math.pow(5,B1)",2,3,4]]));

Arjun
la source
Très agréable. Ici: 🍪.
2017
Une raison que vous ne pouvez pas utiliser /\w\d/gpour votre expression régulière?
powelles
@powelles \wcorrespond également aux chiffres et \dcorrespond également à 0, les deux choses que vous ne voulez pas dans ce cas. /[A-I][1-9]/gdevrait fonctionner si
LarsW
@LarsW /\w\d/gproduit exactement les mêmes résultats dans les cas de test. L'utilisation d'un littéral de modèle dans la partie eval pourrait également économiser une poignée d'octets.
powelles
@powelles oui, mais les cas de test peuvent être incomplets. Quoi qu'il en soit, j'ai supposé que les règles choisies devaient être suivies; mais ce ne sont peut-être que des restrictions d'entrée (ou les deux), ce qui peut aussi être le problème
LarsW
4

PHP, 265 263 259 258 257 240 224 222 222 213 202 196 octets

avec array_walk_recursiveune fonction anonyme récursive et preg_replace_callback:

function f(&$a){array_walk_recursive($a,$p=function(&$c)use($a,&$p){eval('$c='.preg_replace_callback("#R(.)C(.)#",function($m)use($a,&$p){$d=$a[$m[1]-1][$m[2]-1];$p($d);return$d;},$c?:0).';');});}

ou

function f(&$a){array_walk_recursive($a,$p=function(&$c)use($a,&$p){eval('$c='.preg_replace_callback("#R(.)C(.)#",function($m)use($a,&$p){return$p($a[$m[1]-1][$m[2]-1]);},$c?:0).';');return$c;});}

fonctionne en entrée: appel par référence. Testez-le en ligne .

  • aucun préfixe d'expression
  • format de référence R2C1, pas de préfixe
  • quelque chose de faux pour une cellule vide
  • évalue toute expression PHP (en minuscules), y compris toutes les arithmétiques

panne (première version)

function f(&$a)
{
    array_walk_recursive($a,                    # walk through elements ...
        $p=function(&$c)use($a,&$p){            # use array $a and recursive $p
            eval('$c='.                             # 3. evaluate expression
                preg_replace_callback('#R(.)C(.)#', # 2. replace references with ...
                function($m)use($a,&$p){
                    $d=$a[$m[1]-1][$m[2]-1];            # $d=content of referenced cell
                    $p($d);                             # recursive evaluation
                    return$d;                           # return $d
                },$c?:0)                            # 1. replace empty with 0
                .';'
            );
        }
    );
}
Titus
la source
+1 Très agréable; 🍪. Vous dites l'arithmétique standard, mais vraiment n'importe quelle expression PHP raisonnable fonctionnerait, non?
Adám
1
@ Adám Maintenant que vous le mentionnez ... tant qu'il est en minuscules, oui. Cela max(range(A1,A3))pourrait être déroutant. : D
Titus
1
Le bon golf m'a pris assez de temps pour trouver quoi que ce soit: $d=$c;preg_match($x="#[A-Z](.)#",$c=$c[0]pour preg_match($x="#[A-Z](.)#",$c=($d=$c)[0]économiser 1 octet.
Christoph
Serait-il possible d'inclure un essai en ligne! lien?
2017
1
@Christoph m'a pris une nouvelle approche pour corriger le deuxième exemple ... et a sauvé beaucoup de choses dans le processus ... plus de golf
Titus
3

Mathematica, 119 115 95 octets

(m=#/.""->0)//.s_String:>ToExpression@StringReplace[s,"R"~~x_~~"C"~~y_:>"m[["<>{x,",",y,"]]"}]&

Les choix:

  1. Pas de préfixe.
  2. R2C1 style.
  3. Aucun préfixe ou suffixe.
  4. "" pour les cellules vides.
  5. Mathematica.
  6. Mathematica. Les expressions arithmétiques arbitraires qui n'utilisent pas de variables du formulaire RxCyet n'ont pas d'effets secondaires devraient fonctionner.

Explication

(m=#/.""->0)

Nous commençons par remplacer toutes les chaînes vides dans l'entrée ( #) par des zéros et en stockant le résultat m, car nous en aurons besoin à un autre endroit.

...//.s_String:>...

Remplacez à plusieurs reprises toute chaîne restante spar ce qui suit ...

...StringReplace[s,"R"~~x_~~"C"~~y_:>...]

Faites correspondre les séquences de la forme RxCyen sles remplacer par ...

..."m[["<>{x,",",y,"]]"}

Ce qui donne m[[x,y]], qui utilise xet ycomme indices dans la matrice m.

...ToExpression@...

Finallz, évaluez cette chaîne comme une expression Mathematica.

Martin Ender
la source
Cool. Je pensais que ça prendrait un peu plus longtemps que ça ... Une façon d'essayer ça?
2017
@ Adám Malheureusement, cela ne semble pas fonctionner en mathématiques, donc sans une copie de Mathematica, probablement pas.
Martin Ender
Toujours en attente de la construction ...
YSC
@YSC Excel, 0 octet.
2017
@ Adám Ce ne serait pas en compétition selon les règles de ce défi. De plus, je pense que Martin mérite un cookie.
Erik the Outgolfer
2

Clojure, 263 281 octets

Oh putain sans ça apply map vectorle résultat est en transposition, comme A2avant alphabétiquement B1.

#(apply map vector(partition(count(% 1))(for[v(vals(loop[C(into{}(mapcat(fn[i r](map(fn[j v][(str j i)(or v"0")])"ABCDEFGHI"r))(rest(range))%))P[]](if(= C P)C(recur(into(sorted-map)(for[[k v]C][k(reduce(fn[r[K V]](clojure.string/replace r K V))v C)]))C))))](eval(read-string v)))))

Exemples:

(def f #(...))

(f [["2" "3"]["(+ A1 B1)" nil]])
([2 3] [5 0])

(f [[nil ,"(* 2 B2 B3)"                ,nil],
    ["3" ,"(+ A1 (/ (+ A2 C2) 2))"     ,"2"],
    ["1" ,"(-> A3 (+ C3) (/ 2) (+ C1))","5"]])
([0 15N 0] [3 5/2 2] [1 3 5])
  1. Les formules sont des expressions S
  2. A2
  3. Non, (+ A1 A2)ça va
  4. nilet falsefonctionnent comme des cellules vides, mais la chaîne vide ne
  5. Clojure
  6. Expressions S (Clojure + toutes les macros intégrées)

Un exemple de première macro de thread:

(macroexpand '(-> A3 (+ C3) (/ 2) (+ C1)))
(+ (/ (+ A3 C3) 2) C1)

La valeur de départ de Cdans la boucle est une carte de hachage, les clés sont des noms de cellule et les valeurs sont des valeurs d'origine. Ensuite, toutes les références de cellules sont remplacées par le contenu des cellules référencées jusqu'à ce que nous ayons convergé ( Previous = urrent C), puis les cellules sont évaluées et la structure plate est partitionnée à nouveau dans une liste imbriquée.

Ce serait cool de trouver une solution où A1, A2etc. sont en fait des fonctions appelables, puis (* 2 B2 B3)pourraient être réécrites (* 2 (B2) (B3))et exécutées.

Essayez-le en ligne!

NikoNyrh
la source
2

APL (Dyalog) , 51 octets

⍎¨({((⍴⍵)↑⍉⎕A∘.,1↓⎕D),¨'←',¨⍵}{0::⍵⋄×≢⍵:⍕⍎⍕⍵⋄0}¨)⍣≡
  1. Aucun

  2. A2

  3. Aucun

  4. Chaîne vide

  5. APL

  6. APL

Essayez-le en ligne!

⍎¨ Évaluez chaque cellule du résultat de

(… L' )⍣≡ application continue des deux fonctions suivantes jusqu'à ce que plus rien ne change

{ première fonction anonyme à appliquer…

  0 en cas d'
  :: erreur:
    renvoyer l'argument non modifié

   Essayez maintenant;

   si le
   décompte de l'argument :
  × est positif
  : alors:
    stringify
    l'  argument
    stringified évalué
   

   autre;

  0 retourner zéro

 … À chaque cellule

{ deuxième fonction anonyme à appliquer…

  '←',¨ ajouter une flèche d'affectation à chaque cellule de
   l'argument

  (),¨ Ajoutez le texte suivant à chaque cellule de cette

   1↓ supprimer le premier de
   ⎕D la chaîne de tous les chiffres D (c'est-à-dire zéro)

   ⎕A Avec toutes les lettres de l' A lphabet aller vers le bas,
   ∘., faire une table de concaténation (avec les chiffres restants vont à droite)

    transposer (pour diminuer les nombres, faire avancer les lettres à droite)

   ()↑ Prenez la sous-matrice supérieure gauche de la taille de…

     la taille de
     l'argument

} … Au résultat de la fonction précédente.

Adam
la source
1
Vos explications sont toujours belles, merci, me donne envie d'apprendre APL au-delà du peu que je sais de la lecture de ces réponses.
Urne de poulpe magique
@carusocomputing Merci. Je serai ravi de vous aider. N'hésitez pas à répondre aux questions et demandes dans la salle de chat APL . Je vais aussi vous aider à vous installer si vous en avez besoin.
2017 à 17h07
1

Python 2 273 265 265 , 259 octets

import re
def g(m):x=m.group();return's[%d][%d]'%(int(x[1])-1,ord(x[0])-65)
e=enumerate
while'='in`s`:
    for x,i in e(s):
        for i,j in e(i):
            try:s[x][i]=0if not j else float(eval(re.sub('\w\d',g,str(j)).strip('=')))
            except:pass

Essayez-le en ligne!

Les choix:

  1. =

  2. A2

  3. aucun

  4. ""

  5. Python 2.7

  6. Expressions Python

Explication de base:

Pour chaque formule de la sous-liste, remplacez-la par la liste correspondante (c'est-à-dire pour B1 s [0] [1]) et évaluez le résultat!

  • -4 octets en changeant str () en backticks!
Keerthana Prabhakaran
la source
Vous n'avez pas ajouté d'importation de re dans votre réponse. De plus, il ne passe pas cette entrée:s=[[ 3, 4,"max(A1,B1)"],[ 2, 5,"A2**B2"],[ "", "","C1+C2"]]
Dead Possum
Le format d'entrée est [[ 3, 4,"=max(A1,B1)"],[ 2, 5,"=A2**B2"],[ "", "","=C1+C2"]]Cela fait partie des en-têtes! Vérifiez-le sur le lien Essayez-le en ligne!
Keerthana Prabhakaran
1
Il doit être inclus dans le nombre d'octets. Il suffit de consulter les autres réponses python sur ce site
Dead Possum
C'est ça? Je suis net à codeglof. Merci pour le commentaire. Va l'ajouter.
Keerthana Prabhakaran
En ce qui concerne les autres réponses, elles n'ont pas inclus la saisie! J'ai édité avec le décompte d'importation!
Keerthana Prabhakaran