Bewerten Sie eine einfache Tabelle

13

Regeln

  1. Keine Zellbereichsreferenzen ( A2:B3).

  2. Maximal 9 Zeilen und 9 Spalten.

  3. Keine Zirkelverweise oder Formelfehler.

  4. Leere Zellen werden zu ausgewertet 0.

  5. Daten sind nur Zahlen, können aber als Zeichenketten verwendet werden.

  6. Formeln sind Zeichenfolgen.

Auswahl der Implementierung

Sie müssen Ihre Auswahl in diesen Angelegenheiten angeben:

  1. Erfordert Formeln, denen ein einzelnes Zeichen vorangestellt wird, z =. B. - oder nicht.

  2. Die Zelle ganz links in der zweiten Zeile ist A2oder R2C1gemäß den beiden von Excel et al.

  3. Benötigen Sie ein einzelnes Prä- oder Suffix in Zellreferenzen, z $. B. - oder nicht.

  4. Eine der folgenden Optionen: Null, leere Zeichenfolge, leere Liste usw. (jedoch nicht 0), um leere Zellen darzustellen.

  5. Sprache Ihrer Einreichung (Tabellenkalkulationsmanager sind nicht erlaubt).

  6. Sprache für die Formeln (kann von oben abweichen). *

  7. Brownie-Punkte oder Cookies zur Erläuterung Ihrer Lösung.

Beispiele

Wahlmöglichkeiten: 7: =; 8 A2:; 9: keine; 10 "":; 12: Excel-Formelsprache

Im:

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

Aus:

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

Im:

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

Aus:

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

Im:

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

Aus:

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

Im:

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

Aus:

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

* Die Formelsprache muss PPCG-zulässig sein , aber Sie müssen nur die Zellreferenzen sowie die Kriterien 3 und 4 unterstützen, Assistent. Zugabe- und Primheitsbestimmung.

Adam
quelle
Wird eine Antwort in Excel / VBA nicht zugelassen? Expand array to cells, evaluate.
Magic Octopus Urn
@carusocomputing Wenn Sie nicht nur Excel sein Ding machen lassen, können Sie gerne posten.
Adám
Können wir Zellen nullbasiert haben? Wie in R0C0?
Conor O'Brien
@ ConorO'Brien Nein, es muss eine der beiden von Excel et al.
Adám

Antworten:

6

JavaScript, 125 112 105 Bytes

Zu verwenden, f=am Anfang hinzufügen und wie aufrufen 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))

Auswahlmöglichkeiten:

  1. Benötigt nicht =.
  2. Die am weitesten links stehende Zelle der zweiten Reihe ist A2.
  3. Benötigt kein Präfix oder Suffix.
  4. "" (Leere Zeichenfolge), um eine leere Zelle zu kennzeichnen.
  5. JavaScript.
  6. JavaScript.
  7. Kekse. 🍪🍪🍪

Erläuterung:

Diese Lösung durchläuft alle Zellen des Arbeitsblatts (jedes Element der Unterarrays des angegebenen Arrays). Wenn eine nicht leere Zeichenfolge gefunden wird, werden ihre Zellreferenzen durch die entsprechenden Referenzen im Hinblick auf das angegebene Array ersetzt und der Ausdruck ausgewertet mit eval()(ja, das böse Ding, das dich in deinen Albträumen verfolgt ). Diese Lösung setzt voraus, dass die im Eingabearray angegebenen Konstanten vom Typ Integer sind.

Testfälle

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
quelle
Sehr schön. Hier: 🍪.
Adám
Gibt es einen Grund, den Sie nicht /\w\d/gfür Ihre Regex verwenden können?
Powelles
@powelles \wentspricht auch Ziffern und \d0, beides, was Sie in diesem Fall nicht wollen. /[A-I][1-9]/gsollte aber funktionieren
LarsW
@LarsW /\w\d/gliefert in den Testfällen genau die gleichen Ergebnisse. Auch die Verwendung eines Vorlagenliteral im eval-Teil könnte eine Handvoll Bytes einsparen.
Powelles
@ Powelles ja, aber die Testfälle können unvollständig sein. Wie auch immer, ich ging davon aus, dass die gewählten Regeln befolgt werden müssen. aber sie können nur Eingabebeschränkungen (oder beides) sein, so dass dies auch das Problem sein kann
LarsW
4

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

mit array_walk_recursiveeiner rekursiven anonymen Funktion und 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).';');});}

oder

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

Funktioniert bei Eingabe: Aufruf durch Referenz. Testen Sie es online .

  • Kein Ausdruckspräfix
  • Referenzformat R2C1, kein Präfix
  • alles falsch für leere Zelle
  • wertet jeden (Klein-) PHP-Ausdruck aus, einschließlich aller Arithmetik

Aufschlüsselung (erste 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
quelle
+1 Sehr schön; 🍪. Sie sagen, Standardarithmetik, aber wirklich jeder sinnvolle PHP-Ausdruck würde funktionieren, nein?
Adám
1
@ Adám Nun, da Sie es erwähnen ... solange es Kleinbuchstaben sind, ja. Obwohl max(range(A1,A3))es verwirrend sein könnte. : D
Titus
1
Nizza Golf hat mich ziemlich lange gebraucht, um etwas zu finden: um 1 Byte $d=$c;preg_match($x="#[A-Z](.)#",$c=$c[0]zu preg_match($x="#[A-Z](.)#",$c=($d=$c)[0]sparen.
Christoph
Wäre es möglich ein Try it online einzubinden! Verknüpfung?
Adám
1
@Christoph hat einen neuen Ansatz gewählt, um das zweite Beispiel zu korrigieren ... und dabei eine Menge gespart ... plus weiteres Golfen
Titus
3

Mathematica, 119 115 95 Bytes

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

Auswahlmöglichkeiten:

  1. Kein Präfix.
  2. R2C1 Stil.
  3. Kein Präfix oder Suffix.
  4. "" für leere Zellen.
  5. Mathematica.
  6. Mathematica. Beliebige arithmetische Ausdrücke, die keine Variablen des Formulars verwenden RxCyund keine Nebenwirkungen haben, sollten funktionieren.

Erläuterung

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

Wir beginnen damit, alle leeren Zeichenfolgen in der input ( #) durch Nullen zu ersetzen und das Ergebnis in zu speichern m, da wir dies an einer anderen Stelle erneut benötigen.

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

Ersetzen Sie die verbleibenden Zeichenfolgen wiederholt durch sdie folgenden Zeichenfolgen :

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

Ordnen Sie alle Teilzeichenfolgen des Formulars RxCyzu sund ersetzen Sie sie durch ...

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

Was gibt m[[x,y]], was verwendet xund yals Indizes in die Matrix m.

...ToExpression@...

Finallz, werte diesen String als Mathematica-Ausdruck aus.

Martin Ender
quelle
Cool. Ich dachte, dass es etwas länger dauern würde ... Gibt es eine Möglichkeit, das zu versuchen?
Adám
@Adam Leider scheint es in Mathematik nicht zu funktionieren, also ohne eine Kopie von Mathematica wahrscheinlich nicht.
Martin Ender
Warten immer noch auf den Einbau ...
YSC
@YSC Excel, 0 Bytes.
Adám
@Adam Das wäre nach den Regeln dieser Herausforderung nicht konkurrenzfähig. Ich denke auch, dass Martin einen Keks verdient.
Erik der Outgolfer
2

Clojure, 263 281 Bytes

Oh verdammt, ohne das ist apply map vectordas Ergebnis in transponiert, wie A2es alphabetisch vorher ist 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)))))

Beispiele:

(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. Formeln sind S-Ausdrücke
  2. A2
  3. Nein, (+ A1 A2)ist in Ordnung
  4. nilund falsearbeiten als leere Zellen, aber leere Zeichenfolge nicht
  5. Clojure
  6. S-Ausdrücke (Clojure + alle eingebauten Makros)

Ein Beispiel für ein Thread-First-Makro:

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

Startwert von C in der Schleife ist eine Hash-Map, Schlüssel sind Zellennamen und Werte sind Originalwerte. Dann werden alle PZellreferenzen durch den Inhalt der referenzierten Zellen ersetzt, bis wir konvergiert haben ( revious =C urrent), dann werden die Zellen ausgewertet und die flache Struktur wird zurück in eine verschachtelte Liste partitioniert.

Wäre cool, eine Lösung zu finden, wo A1,A2 usw. sind eigentlich aufrufbare Funktionen, dann (* 2 B2 B3)könnte neu geschrieben werden (* 2 (B2) (B3))und ausgeführt.

Probieren Sie es online!

NikoNyrh
quelle
2

APL (Dyalog) , 51 Bytes

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

  2. A2

  3. Keiner

  4. Leerer String

  5. APL

  6. APL

Probieren Sie es online!

⍎¨ Bewerten Sie jede Zelle des Ergebnisses von

()⍣≡ Die folgenden beiden Funktionen kontinuierlich anwenden, bis sich nichts mehr ändert

{ erste anonyme Funktion angewendet werden ...

  0 Bei
  :: Fehlern:
    Das Argument wird unverändert zurückgegeben

   jetzt versuche es;

   wenn das Argument
   tally:
  × positiv ist
  : dann:
    stringify
    den ausgewerteten
    Zeichenfolge
    Argument

   sonst;

  0 Null zurückgeben

 ... zu jeder Zelle

{ zweite anonyme Funktion angewendet werden ...

  '←',¨ Stellen Sie jeder Zelle des
   Arguments einen Zuweisungspfeil voran

  (),¨ Stellen Sie jeder Zelle Folgendes voran

   1↓ fällt die erste von
   ⎕D der Zeichenfolge aller D igits (dh null)

   ⎕A Mit allen Buchstaben des A lphabet nach unten geht,
   ∘., machen eine Verkettung Tabelle (mit den restlichen Ziffern gehen rechts)

    transponieren (um Zahlen nach unten zu bringen, Buchstaben nach rechts fortlaufend)

   ()↑ Nimm die obere linke Submatrix mit der Größe von…

     die Größe des
     Arguments

} … Zum Ergebnis der vorherigen Funktion.

Adam
quelle
1
Ihre Erklärungen sind immer schön, danke, ich möchte mehr über APL lernen, als ich aus dem Lesen dieser Antworten weiß.
Magic Octopus Urn
@carusocomputing Vielen Dank. Ich werde Ihnen gerne weiterhelfen. Fühlen Sie sich frei, Fragen und Wünsche in den APL-Chatraum . Ich helfe dir auch beim Einrichten, wenn du das brauchst.
Adám
1

Python 2 273,265,263 , 259 Bytes

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

Probieren Sie es online!

Auswahlmöglichkeiten:

  1. =

  2. A2

  3. keiner

  4. ""

  5. Python 2.7

  6. Python-Ausdrücke

Grundlegende Erklärung:

Ersetzen Sie jede Formel in der Unterliste durch den entsprechenden Listenindex (dh für B1 s [0] [1]) und werten Sie das Ergebnis aus!

  • -4 Bytes durch Ändern von str () in backticks!
Keerthana Prabhakaran
quelle
Sie haben in Ihrer Antwort den Import von Re nicht hinzugefügt. Auch diese Eingabe wird nicht weitergegeben:s=[[ 3, 4,"max(A1,B1)"],[ 2, 5,"A2**B2"],[ "", "","C1+C2"]]
Dead Possum
Das Eingabeformat ist [[ 3, 4,"=max(A1,B1)"],[ 2, 5,"=A2**B2"],[ "", "","=C1+C2"]]Das gibt es als Teil der Überschriften! Überprüfen Sie es auf dem Online-Link try it!
Keerthana Prabhakaran
1
Es sollte in der Byteanzahl enthalten sein. Schauen Sie sich einfach andere Python-Antworten auf dieser Website an
Dead Possum
Ist es? Ich bin net zu codeglof. Danke für den Kommentar. Füge es hinzu.
Keerthana Prabhakaran
Soweit die anderen Antworten berücksichtigt werden, haben sie die Eingabe nicht enthalten! Ich habe mit dem Abschiedszähler den Import bearbeitet!
Keerthana Prabhakaran