Valuta un semplice foglio di calcolo


13

Regole

  1. Nessun riferimento all'intervallo di celle ( A2:B3).

  2. Massimo 9 righe e 9 colonne.

  3. Nessun riferimento circolare o errori di formula.

  4. Le celle vuote valutano 0.

  5. I dati sono solo numeri, ma possono essere presi come stringhe.

  6. Le formule sono stringhe.

Scelte di implementazione

Devi dichiarare le tue scelte in queste materie:

  1. Richiede che le formule siano precedute da un singolo carattere, ad es. =- oppure no.

  2. La cella più a sinistra della seconda riga è A2o R2C1, secondo le due convenzioni utilizzate da Excel et al.

  3. Richiede qualsiasi prefisso o suffisso a carattere singolo nei riferimenti di cella, ad es. $- oppure no.

  4. Una stringa vuota, vuota, elenco vuoto, ecc. (Ma non 0) per rappresentare celle vuote.

  5. Lingua della richiesta (i gestori di fogli di calcolo non sono ammessi).

  6. Lingua per le formule (può differire da quanto sopra). *

  7. Punti brownie o cookie per spiegare la tua soluzione.

Esempi

Scelte: 7: =; 8 A2:; 9: nessuno; 10 "":; 12: Excel Formula Language

Nel:

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

Su:

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

Nel:

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

Su:

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

Nel:

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

Su:

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

Nel:

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

Su:

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

* La lingua della formula deve essere ammissibile PPCG , ma devi solo supportare i riferimenti di cella più i criteri 3 e 4 lì, vale a dire. determinazione di addizione e primosità.


Non è stata inviata una risposta in Excel / VBA? Expand array to cells, evaluate.
Magic Octopus Urn

@carusocomputing Se non stai solo lasciando che Excel faccia la sua cosa, sentiti libero di pubblicare.
Adám

Possiamo avere cellule a base zero? Come in R0C0?
Conor O'Brien

@ ConorO'Brien No, deve essere una delle due convenzioni utilizzate da Excel et al.
Adám,

Risposte:


6

JavaScript, 125 112 105 byte

Per usare, aggiungi f=all'inizio e invoca 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))

scelte:

  1. Non richiede =.
  2. La cella più a sinistra della seconda riga è A2.
  3. Non richiede alcun prefisso o suffisso.
  4. "" (Stringa vuota) per indicare la cella vuota.
  5. JavaScript.
  6. JavaScript.
  7. Biscotti. 🍪🍪🍪

Spiegazione:

Questa soluzione scorre su tutte le celle del foglio di lavoro (ogni elemento dei sotto-array della matrice data) e se viene trovata una stringa non vuota, sostituisce i suoi riferimenti di cella con i corrispondenti riferimenti in termini di matrice data e valuta l'espressione con eval()(sì, quella cosa malvagia che ti perseguita nei tuoi incubi ). Questa soluzione presuppone che le costanti fornite nell'array di input siano di tipo intero.

Casi 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]]));


Molto bella. Qui: 🍪.
Adám,

Qualche motivo che non puoi usare /\w\d/gper la tua regex?
Powelles,

@powelles \wcorrisponde anche alle cifre e \danche a 0, entrambe le cose che non vuoi in questo caso. /[A-I][1-9]/gdovrebbe funzionare però
LarsW

@LarsW /\w\d/gproduce gli stessi esatti risultati nei casi di test. Anche l'uso di un modello letterale nella parte eval potrebbe salvare una manciata di byte.
Powelles,

@powelles sì, ma i casi di test potrebbero essere incompleti. Comunque, ho pensato che le regole scelte dovevano essere seguite; ma potrebbero essere solo restrizioni di input (o entrambi), quindi anche questo può essere il problema
LarsW

4

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

caratterizzato da array_walk_recursiveuna funzione anonima ricorsiva e 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).';');});}

o

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

opera su input: chiama per riferimento. Provalo online .

  • nessun prefisso di espressione
  • formato di riferimento R2C1, nessun prefisso
  • qualcosa di falso per cella vuota
  • valuta qualsiasi espressione PHP (minuscola), comprese tutte le aritmetiche

guasto (prima versione)

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

+1 Molto bello; 🍪. Dici l'aritmetica standard, ma davvero qualsiasi ragionevole espressione di PHP funzionerebbe, no?
Adám,

1
@Adám Ora che lo dici ... fintanto che è minuscolo, sì. Anche se max(range(A1,A3))potrebbe essere fonte di confusione. : D
Tito

1
Il bel golf mi ha impiegato parecchio tempo per trovare qualcosa: $d=$c;preg_match($x="#[A-Z](.)#",$c=$c[0]per preg_match($x="#[A-Z](.)#",$c=($d=$c)[0]salvare 1 byte.
Christoph,

Sarebbe possibile includere un Provalo online! Link?
Adám,

1
@Christoph mi ha adottato un nuovo approccio per risolvere il secondo esempio ... e ha risparmiato molto nel processo ... oltre a continuare a giocare a golf
Titus

3

Mathematica, 119 115 95 byte

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

scelte:

  1. Nessun prefisso
  2. R2C1 stile.
  3. Nessun prefisso o suffisso.
  4. "" per celle vuote.
  5. Matematica.
  6. Matematica. Le espressioni aritmetiche arbitrarie che non usano le variabili del modulo RxCye non hanno effetti collaterali dovrebbero funzionare.

Spiegazione

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

Iniziamo sostituendo tutte le stringhe vuote nell'input ( #) con zeri e memorizzando il risultato m, perché ne avremo bisogno di nuovo in un altro posto.

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

Sostituisci ripetutamente qualsiasi stringa rimanente scon il seguente ...

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

Abbinare qualsiasi sottostringhe della forma RxCyin se sostituirli con ...

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

Che dà m[[x,y]], che usa xe ycome indici nella matrice m.

...ToExpression@...

Finallz, valuta questa stringa come espressione di Mathematica.


Freddo. Ho pensato che ci sarebbe voluto un po 'più di tempo ... Qualche modo per provare questo?
Adám,

@Adám Purtroppo, non sembra funzionare in matematica, quindi senza una copia di Mathematica, probabilmente no.
Martin Ender,

Sto ancora aspettando l'edificio ...
YSC

@YSC Excel, 0 byte.
Adám,

@Adám Non sarebbe in concorrenza con le regole di questa sfida. Inoltre, penso che Martin meriti un biscotto.
Erik the Outgolfer,

2

Clojure, 263 281 byte

Oh dannazione senza che apply map vectoril risultato sia in trasposizione, come in A2ordine alfabetico prima 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)))))

Esempi:

(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. Le formule sono espressioni S
  2. A2
  3. No, (+ A1 A2)va bene
  4. nile falsefunzionano come celle vuote, ma le stringhe vuote no
  5. Clojure
  6. Espressioni S (Clojure + eventuali macro incorporate)

Un esempio di prima macro thread:

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

Il valore iniziale di Cnel ciclo è una mappa hash, le chiavi sono nomi di celle e i valori sono valori originali. Quindi tutti i riferimenti di cella vengono sostituiti dal contenuto delle celle di riferimento fino a quando non abbiamo fatto convergere ( Previous =C urrent), quindi le celle vengono valutate e la struttura piatta viene ripartita in un elenco nidificato.

Sarebbe bello trovare una soluzione in cui A1, A2ecc. Sono effettivamente funzioni richiamabili, quindi (* 2 B2 B3)potrebbero essere riscritte (* 2 (B2) (B3))ed eseguite.

Provalo online!


2

APL (Dyalog) , 51 byte

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

  2. A2

  3. Nessuna

  4. Stringa vuota

  5. APL

  6. APL

Provalo online!

⍎¨ Valuta ogni cella del risultato da

(... )⍣≡ applicazione continua delle seguenti due funzioni fino a quando non cambia più nulla

{ prima funzione anonima da applicare ...

  0 in caso di
  :: errore:
    restituisce l'argomento non modificato

   ora prova;

   se il
   conteggio dell'argomento :
  × è positivo,
  : allora:
    stringi
    l'  argomento valutato
    valutato
   

   altro;

  0 restituisce zero

 ... per ogni cella

{ seconda funzione anonima da applicare ...

  '←',¨ anteporre una freccia di assegnazione a ciascuna cella
   dell'argomento

  (... ),¨ anteponi quanto segue a ciascuna cella

   1↓ rilascia la prima della
   ⎕D stringa di tutte le D igit (cioè zero)

   ⎕A Con tutte le lettere dell'alfabeto A che scendono,
   ∘., crea una tabella di concatenazione (con le cifre rimanenti che vanno a destra)

    trasporre (per ottenere numeri crescenti verso il basso, avanzando lettere a destra)

   (... )↑ prendi il sottomatrix in alto a sinistra con le dimensioni di ...

     la dimensione
     dell'argomento

} ... al risultato della funzione precedente.


1
Le tue spiegazioni sono sempre belle, grazie, mi fa venir voglia di imparare APL oltre quel poco che so leggendo queste risposte.
Magic Octopus Urn

@carusocomputing Grazie. Sarò felice di aiutarti. Sentiti libero di domande e richieste nella chat room APL . Ti aiuterò a prepararti anche se ne hai bisogno.
Adám,

1

Python 2 273.265.263 , 259 byte

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

Provalo online!

scelte:

  1. =

  2. A2

  3. nessuna

  4. ""

  5. Python 2.7

  6. Espressioni Python

Spiegazione di base:

Per ogni formula nell'elenco secondario, sostituirla con l'indice dell'elenco corrispondente (ovvero, per B1 s [0] [1]) e valutare il risultato!

  • -4 byte cambiando str () in backtick!

Non hai aggiunto l'importazione di re nella tua risposta. Inoltre non passa questo input:s=[[ 3, 4,"max(A1,B1)"],[ 2, 5,"A2**B2"],[ "", "","C1+C2"]]
Dead Possum

Il formato di input è [[ 3, 4,"=max(A1,B1)"],[ 2, 5,"=A2**B2"],[ "", "","=C1+C2"]]Quello è lì come parte delle intestazioni! Controllalo sul link provalo online!
Keerthana Prabhakaran,

1
Dovrebbe essere incluso nel conteggio dei byte. Dai un'occhiata alle altre risposte di Python su questo sito
Dead Possum,

È? Sono al netto di codeglof. Grazie per il commento. Lo aggiungerà.
Keerthana Prabhakaran,

Per quanto riguarda le altre risposte, non hanno incluso l'input! Ho modificato con il conteggio ciao di importazione!
Keerthana Prabhakaran,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.