Oceń prosty arkusz kalkulacyjny

13

Zasady

  1. Brak odwołań do zakresu komórek ( A2:B3).

  2. Maksymalnie 9 wierszy i 9 kolumn.

  3. Brak odwołań cyklicznych lub błędów formuł.

  4. Puste komórki oceniają na 0.

  5. Dane są tylko liczbami, ale można je traktować jako ciągi znaków.

  6. Formuły są łańcuchami.

Opcje realizacji

Musisz podać swoje wybory w następujących kwestiach:

  1. Wymagaj, aby formuły były poprzedzone dowolnym pojedynczym znakiem, np. =- lub nie.

  2. Lewa komórka drugiego rzędu to A2lub R2C1, zgodnie z dwiema konwencjami stosowanymi przez Excela i in.

  3. Wymagaj dowolnego jednoznakowego prefiksu lub sufiksu w odwołaniach do komórki, np. $- lub nie.

  4. Jeden z null, pusty ciąg, pusta lista itp. (Ale nie 0) reprezentujący puste komórki.

  5. Język Twojego zgłoszenia (menedżerowie arkuszy kalkulacyjnych nie są dozwoleni).

  6. Język formuł (może różnić się od powyższego). *

  7. Punkty Brownie lub pliki cookie wyjaśniające rozwiązanie.

Przykłady

Wybory: 7 =:; 8 A2:; 9: brak; 10 "":; 12: Excel Formula Language

W:

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

Na zewnątrz:

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

W:

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

Na zewnątrz:

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

W:

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

Na zewnątrz:

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

W:

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

Na zewnątrz:

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

* Język formuły musi być dopuszczalny dla PPCG , ale musisz tylko obsługiwać odwołania do komórek oraz kryteria 3 i 4, wiz. określenie dodatku i prymitywności.

Adám
źródło
Czy przesłana odpowiedź w programie Excel / VBA jest niedozwolona? Expand array to cells, evaluate.
Magic Octopus Urn
@carusocomputing Jeśli nie tylko pozwalasz Excelowi wykonywać swoje zadania, nie krępuj się pisać.
Adám,
Czy możemy mieć komórki oparte na zerach? Jak w R0C0,?
Conor O'Brien,
@ ConorO'Brien Nie, musi to być jedna z dwóch konwencji stosowanych przez Excela i in.
Adám

Odpowiedzi:

6

JavaScript, 125 112 105 bajtów

Aby użyć, dodaj f=na początku i wywołaj jak 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))

Wybory:

  1. Nie wymaga =.
  2. Najbardziej lewa komórka drugiego rzędu to A2.
  3. Nie wymaga żadnego prefiksu ani sufiksu.
  4. "" (Pusty ciąg) oznacza pustą komórkę.
  5. JavaScript.
  6. JavaScript.
  7. Ciasteczka. 🍪🍪🍪

Wyjaśnienie:

To rozwiązanie dokonuje iteracji po wszystkich komórkach arkusza roboczego (każdym elemencie podtablic danej tablicy) i jeśli zostanie znaleziony niepusty ciąg, zastępuje odniesienia do komórki odpowiednimi odniesieniami pod względem podanej tablicy i ocenia wyrażenie z eval()(tak, ta zła rzecz, która prześladuje cię w twoich koszmarach ). To rozwiązanie zakłada, że ​​stałe podane w tablicy wejściowej są typu Integer.

Przypadki testowe

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
źródło
Bardzo dobrze. Tutaj: 🍪.
Adám
Z jakichś powodów nie możesz użyć /\w\d/gwyrażenia regularnego?
powelles
@powelles \wdopasowuje również cyfry i \ddopasowuje również 0, obie rzeczy, których nie chcesz w tym przypadku. /[A-I][1-9]/gpowinien jednak działać
LarsW
@LarsW /\w\d/gdaje dokładnie takie same wyniki w przypadkach testowych. Również użycie literału szablonu w części eval może zaoszczędzić garść bajtów.
powelles
@powelles tak, ale przypadki testowe mogą być niekompletne. W każdym razie założyłem, że należy przestrzegać wybranych zasad; ale mogą to być tylko ograniczenia wejściowe (lub oba), więc to też może stanowić problem
LarsW
4

PHP, 265 263 259 258 257 240 224 222 213 202 196 bajtów

wyposażony array_walk_recursivew rekurencyjną anonimową funkcję oraz 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).';');});}

lub

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

działa na wejściu: połączenie przez odniesienie. Przetestuj online .

  • bez przedrostka wyrażenia
  • format odniesienia R2C1, bez prefiksu
  • coś fałszywego dla pustej komórki
  • ocenia dowolne (małe) wyrażenie PHP, w tym całą arytmetykę

podział (pierwsza wersja)

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
                .';'
            );
        }
    );
}
Tytus
źródło
+1 Bardzo miło; 🍪. Mówisz, że standardowa arytmetyka, ale tak naprawdę każde rozsądne wyrażenie PHP zadziałałoby, nie?
Adám
1
@ Adám Teraz, kiedy o tym wspominasz ... tak długo, jak to jest małe, tak. Chociaż max(range(A1,A3))może to być mylące. : D
Tytus
1
Ładny golf zabrał mnie dość długo, aby znaleźć coś: $d=$c;preg_match($x="#[A-Z](.)#",$c=$c[0]do preg_match($x="#[A-Z](.)#",$c=($d=$c)[0]powinien zapisać 1 bajt.
Christoph
Czy możliwe byłoby dołączenie Wypróbuj online! połączyć?
Adám
1
@Christoph przyjął mi nowe podejście do naprawy drugiego przykładu ... i zaoszczędził wiele w tym procesie ... plus dalszą grę w golfa
Titus
3

Mathematica, 119 115 95 bajtów

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

Wybory:

  1. Bez prefiksu
  2. R2C1 styl.
  3. Bez przedrostka lub przyrostka.
  4. "" dla pustych komórek.
  5. Matematyka.
  6. Matematyka. Arbitralne wyrażenia arytmetyczne, które nie używają zmiennych formularza RxCyi nie mają skutków ubocznych, powinny działać.

Wyjaśnienie

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

Zaczynamy od zastąpienia wszystkich pustych ciągów wejściowych ( #) zerami i zapisania wyniku m, ponieważ będziemy potrzebować go ponownie w innym miejscu.

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

Wielokrotnie zastępuj pozostałe ciągi snastępującymi ...

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

Dało żadnych podciągi formularza RxCyw si zastąpić je ...

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

Co daje m[[x,y]], które wykorzystuje xi yjako wskaźniki do macierzy m.

...ToExpression@...

Finallz, oceń ten ciąg jako wyrażenie Mathematica.

Martin Ender
źródło
Chłodny. Myślałem, że potrwa to trochę dłużej ... Jakiś sposób, aby tego spróbować?
Adám
@ Adám Niestety, nie działa w matematyce, więc bez kopii Mathematiki prawdopodobnie nie.
Martin Ender
Wciąż czekam na wbudowane ...
YSC
@YSC Excel, 0 bajtów.
Adám
@ Adám To nie byłoby konkurencyjne zgodnie z zasadami tego wyzwania. Myślę też, że Martin zasługuje na ciasteczko.
Erik the Outgolfer
2

Clojure, 263 281 bajtów

Cholera, bez tego apply map vectorwynik jest transponowany, jak A2to wcześniej alfabetycznie 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)))))

Przykłady:

(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. Formuły są wyrażeniami S.
  2. A2
  3. Nie, w (+ A1 A2)porządku
  4. nili falsedziałają jako puste komórki, ale pusty ciąg nie
  5. Clojure
  6. Wyrażenia S (Clojure + dowolne wbudowane makra)

Przykład pierwszego makra wątku:

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

Wartość Cpoczątkowa w pętli jest mapą skrótu, klucze to nazwy komórek, a wartości to wartości oryginalne. Następnie wszystkie odwołania do komórek są zastępowane zawartością komórek, do których się odwołujemy, dopóki nie zbiegniemy się ( Previous = Current), następnie komórki są oceniane i płaska struktura jest dzielona z powrotem na zagnieżdżoną listę.

Byłoby super, aby znaleźć rozwiązanie, w którym A1, A2itd. Są faktycznie funkcje wywoływalne, a następnie (* 2 B2 B3)może zostać przepisany do (* 2 (B2) (B3))i wykonywany.

Wypróbuj online!

NikoNyrh
źródło
2

APL (Dyalog) , 51 bajtów

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

  2. A2

  3. Żaden

  4. Pusta struna

  5. APL

  6. APL

Wypróbuj online!

⍎¨ Oceń każdą komórkę wyniku z

()⍣≡ Ciągłe stosowanie następujących dwóch funkcji, aż nic się nie zmieni

{ pierwsza anonimowa funkcja do zastosowania…

  0 przy każdym
  :: błędzie:
    zwróć argument niezmodyfikowany

   Spróbuj teraz;

   Jeśli argument za
   tally:
  × jest pozytywny
  : , wówczas:
    stringify
    ewaluowaną
    stringified
    argumentu

   jeszcze;

  0 zwróć zero

 … Do każdej komórki

{ druga anonimowa funkcja do zastosowania…

  '←',¨ wstaw strzałkę przypisania do każdej komórki
   argumentu

  (),¨ Wstawiamy następujące do każdej komórki tego

   1↓ upuść pierwszy
   ⎕D ciąg wszystkich D igitów (tj. zero)

   ⎕A Po opadnięciu wszystkich liter alfabetu A utwórz
   ∘., tabelę konkatenacji (pozostałe cyfry będą w prawo)

    transponuj (aby zmniejszyć liczbę cyfr, przesuwając litery w prawo)

   ()↑ Weź lewą górną podmacierz o rozmiarze…

     wielkość
     argumentu

} … Do wyniku poprzedniej funkcji.

Adám
źródło
1
Twoje wyjaśnienia są zawsze piękne, dzięki, że chcę nauczyć się APL poza tym, co niewiele wiem z przeczytania tych odpowiedzi.
Magic Octopus Urn
@carusocomputing Dziękujemy. Z przyjemnością Ci pomogę. Zapraszam do pytań i próśb w czacie APL . Pomogę ci też się przygotować, jeśli będziesz tego potrzebować.
Adám,
1

Python 2 273,265,263 , 259 bajtów

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

Wypróbuj online!

Wybory:

  1. =

  2. A2

  3. Żaden

  4. „”

  5. Python 2.7

  6. Wyrażenia w języku Python

Podstawowe wyjaśnienie:

Dla każdej formuły na liście podrzędnej zamień ją na odpowiedni indeks listy (to znaczy dla B1 s [0] [1]) i oceń wynik!

  • -4 bajty, zmieniając str () na backticks!
Keerthana Prabhakaran
źródło
Nie dodałeś importu odpowiedzi w swojej odpowiedzi. Ponadto nie przechodzi on przez te dane wejściowe:s=[[ 3, 4,"max(A1,B1)"],[ 2, 5,"A2**B2"],[ "", "","C1+C2"]]
Dead Possum
Format wejściowy to: [[ 3, 4,"=max(A1,B1)"],[ 2, 5,"=A2**B2"],[ "", "","=C1+C2"]]Jest to część nagłówków! Sprawdź to, wypróbuj link online!
Keerthana Prabhakaran
1
Powinien być uwzględniony w liczbie bajtów. Wystarczy sprawdzić inne odpowiedzi python na tej stronie
Dead Possum
Czy to jest Jestem gotów na codeglof. Dziękuję za komentarz. Dodam to.
Keerthana Prabhakaran
Jeśli chodzi o inne odpowiedzi, nie zawierały one danych wejściowych! Mam edycję z importem liczby bajtów!
Keerthana Prabhakaran