Mengevaluasi spreadsheet sederhana

13

Aturan

  1. Tidak ada referensi rentang sel ( A2:B3).

  2. Maksimum 9 baris dan 9 kolom.

  3. Tidak ada referensi lingkaran atau kesalahan rumus.

  4. Sel-sel kosong dievaluasi 0.

  5. Data hanya angka, tetapi dapat diambil sebagai string.

  6. Rumus adalah string.

Pilihan implementasi

Anda harus menyatakan pilihan Anda dalam masalah ini:

  1. Membutuhkan rumus untuk diawali dengan karakter tunggal apa pun, misalnya =- atau tidak.

  2. Sel paling kiri dari baris kedua adalah A2atau R2C1, sesuai dua konvensi yang digunakan oleh Excel et al.

  3. Mengharuskan pra-atau akhiran karakter tunggal dalam referensi sel, misalnya $- atau tidak

  4. Salah satu dari nol, string kosong, daftar kosong, dll., (Tetapi tidak 0) untuk mewakili sel kosong.

  5. Bahasa kiriman Anda (manajer spreadsheet tidak diizinkan).

  6. Bahasa untuk rumus (mungkin berbeda dari yang di atas). *

  7. Poin atau cookie Brownie untuk menjelaskan solusi Anda.

Contohnya

Pilihan: 7 =:; 8 A2:; 9: tidak ada; 10 "":; 12: Bahasa Formula Excel

Di:

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

Di luar:

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

Di:

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

Di luar:

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

Di:

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

Di luar:

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

Di:

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

Di luar:

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

* Bahasa formula harus dapat diterima PPCG , tetapi Anda hanya perlu mendukung referensi sel plus kriteria 3 dan 4 di sana, wiz. penambahan dan penentuan primeness.

Adm
sumber
Apakah jawaban yang diajukan dalam Excel / VBA tidak diizinkan? Expand array to cells, evaluate.
Magic Gurita Guci
@carusocomputing Jika Anda tidak hanya membiarkan Excel melakukan tugasnya, jangan ragu untuk memposting.
Adám
Bisakah kita membuat sel berbasis nol? Seperti di R0C0,?
Conor O'Brien
@ ConorO'Brien Tidak, itu harus menjadi salah satu dari dua konvensi yang digunakan oleh Excel et al.
Adám

Jawaban:

6

JavaScript, 125 112 105 byte

Untuk menggunakan, tambahkan f=di awal dan panggil seperti 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))

Pilihan:

  1. Tidak membutuhkan =.
  2. Sel paling kiri dari baris kedua adalah A2.
  3. Tidak membutuhkan awalan atau akhiran apa pun.
  4. "" (String Kosong) untuk menunjukkan sel kosong.
  5. JavaScript.
  6. JavaScript.
  7. Kue. 🍪🍪🍪

Penjelasan:

Solusi ini berulang pada semua sel lembar kerja (setiap elemen dari sub-array array yang diberikan) dan jika String tidak kosong ditemukan, ganti referensi selnya dengan referensi yang sesuai dalam hal array yang diberikan dan evaluasi ekspresi dengan eval()(yeah, hal jahat yang menghantui Anda dalam mimpi buruk Anda ). Solusi ini mengasumsikan bahwa konstanta yang disediakan dalam larik input bertipe Integer.

Uji Kasus

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
sumber
Sangat bagus. Di sini: 🍪.
Adám
Apa alasan Anda tidak bisa menggunakan /\w\d/guntuk regex Anda?
powelles
@ Powell juga \wcocok dengan digit, dan juga \dcocok dengan 0, kedua hal yang tidak Anda inginkan dalam kasus ini. /[A-I][1-9]/gharus bekerja
LarsW
@ LarsW /\w\d/gmenghasilkan hasil yang sama persis dalam kasus uji. Juga menggunakan templat literal di bagian eval bisa menghemat beberapa byte.
powelles
@ Powell ya, tetapi kasus uji mungkin tidak lengkap. Bagaimanapun, saya berasumsi bahwa aturan yang dipilih harus diikuti; tetapi mereka mungkin hanya batasan input (atau keduanya), sehingga bisa menjadi masalah juga
LarsW
4

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

menampilkan array_walk_recursive, fungsi anonim rekursif dan 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).';');});}

atau

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

beroperasi pada input: panggilan dengan referensi. Uji secara online .

  • tidak ada awalan ekspresi
  • format referensi R2C1, tidak ada awalan
  • sesuatu yang palsu untuk sel kosong
  • mengevaluasi setiap ekspresi PHP (huruf kecil), termasuk semua aritmatika

kerusakan (versi pertama)

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
sumber
+1 Sangat bagus; 🍪. Anda mengatakan aritmatika standar, tetapi benar-benar ungkapan PHP yang masuk akal akan berhasil, bukan?
Adám
1
@ Adam Sekarang Anda menyebutkannya ... asalkan huruf kecil, ya. Meskipun max(range(A1,A3))mungkin membingungkan. : D
Titus
1
Bagus golf membawa saya cukup lama untuk menemukan sesuatu: $d=$c;preg_match($x="#[A-Z](.)#",$c=$c[0]untuk preg_match($x="#[A-Z](.)#",$c=($d=$c)[0]harus menyimpan 1 byte.
Christoph
Apakah mungkin untuk menyertakan Coba secara online! tautan?
Adám
1
@Christoph membawa saya pendekatan baru untuk memperbaiki contoh kedua ... dan menyelamatkan banyak dalam proses ... ditambah golf lebih lanjut
Titus
3

Mathematica, 119 115 95 byte

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

Pilihan:

  1. Tidak ada awalan.
  2. R2C1 gaya.
  3. Tidak ada awalan atau akhiran.
  4. "" untuk sel kosong.
  5. Mathematica.
  6. Mathematica. Ekspresi aritmatika sewenang-wenang yang tidak menggunakan variabel formulir RxCydan tidak memiliki efek samping harus berfungsi.

Penjelasan

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

Kita mulai dengan mengganti semua string kosong di input ( #) dengan nol dan menyimpan hasilnya m, karena kita akan membutuhkan ini lagi di tempat lain.

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

Ganti string yang tersisa berulangs dengan yang berikut ...

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

Ditemukan substring dari bentuk RxCydi sdan menggantinya dengan ...

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

Yang memberi m[[x,y]], yang menggunakan xdan ysebagai indeks ke dalam matriks m.

...ToExpression@...

Finallz, evaluasi string ini sebagai ekspresi Mathematica.

Martin Ender
sumber
Keren. Saya pikir itu akan memakan waktu sedikit lebih lama dari itu ... Ada cara untuk mencoba ini?
Adám
@ Adám Sayangnya, sepertinya tidak berfungsi dalam Matematika, jadi tanpa salinan Mathematica, mungkin tidak.
Martin Ender
Masih menunggu bangunan ...
YSC
@YSC Excel, 0 byte.
Adám
@ Adám Itu tidak akan bersaing sesuai aturan tantangan ini. Juga, saya pikir Martin layak mendapatkan kue.
Erik the Outgolfer
2

Clojure, 263 281 byte

Sialan tanpa itu apply map vectorhasilnya ada dalam transpose, seperti A2abjad sebelumnya 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)))))

Contoh:

(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. Rumus adalah ekspresi-S
  2. A2
  3. Tidak, (+ A1 A2)tidak apa-apa
  4. nildan falsebekerja sebagai sel kosong, tetapi string kosong tidak
  5. Clojure
  6. S-expressions (Clojure + makro bawaan apa saja)

Contoh makro utas pertama:

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

Nilai awal Cdalam loop adalah hash-map, kunci adalah nama sel dan nilai adalah nilai asli. Kemudian semua referensi sel diganti dengan konten sel yang direferensikan sampai kita telah konvergen ( Previous =C ), kemudian sel dievaluasi dan struktur datar dipartisi kembali menjadi daftar bersarang.

Akan keren untuk menemukan solusi di mana A1, A2dll sebenarnya adalah fungsi yang (* 2 B2 B3)bisa dipanggil, kemudian dapat ditulis ulang (* 2 (B2) (B3))dan dieksekusi.

Cobalah online!

NikoNyrh
sumber
2

APL (Dyalog) , 51 byte

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

  2. A2

  3. Tidak ada

  4. String kosong

  5. APL

  6. APL

Cobalah online!

⍎¨ Evaluasi setiap sel hasil dari

(... )⍣≡ aplikasi berkelanjutan dari dua fungsi berikut sampai tidak ada lagi perubahan

{ fungsi anonim pertama yang diterapkan ...

  0 pada
  :: kesalahan apa pun :
    kembalikan argumen yang tidak dimodifikasi

   sekarang coba;

   jika argumen
   penghitungan:
  × positif
  : maka:
    stringify
    dievaluasi
    stringified
    argumen

   lain;

  0 mengembalikan nol

 ... untuk setiap sel

{ fungsi anonim kedua untuk diterapkan ...

  '←',¨ tambahkan panah tugas ke setiap sel
   argumen

  (... ),¨ tambahkan yang berikut ke masing-masing sel itu

   1↓ lepaskan
   ⎕D string pertama dari semua igit D (yaitu nol)

   ⎕A Dengan semua huruf dari lfabet A turun,
   ∘., buatlah tabel gabungan (dengan angka-angka lainnya berada di kanan)

    transpos (untuk mendapatkan peningkatan angka ke bawah, huruf maju dengan benar)

   (... )↑ ambil submatrix kiri atas dengan ukuran ...

     ukuran
     argumen

} ... ke hasil fungsi sebelumnya.

Adm
sumber
1
Penjelasan Anda selalu indah, terima kasih, membuat saya ingin belajar APL melebihi sedikit yang saya tahu dari membaca jawaban ini.
Magic Gurita Guci
@carusocomputing Terima kasih. Saya akan dengan senang hati membantu Anda. Silakan pertanyaan dan permintaan di ruang obrolan APL . Saya akan membantu Anda mengatur juga jika Anda membutuhkannya.
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

Cobalah online!

Pilihan:

  1. =

  2. A2

  3. tidak ada

  4. ""

  5. Python 2.7

  6. Ekspresi python

Penjelasan dasar:

Untuk setiap rumus dalam sublist, gantilah dengan daftar yang sesuai (yaitu, untuk indeks B1 [0] [1]) dan evaluasi hasilnya!

  • -4 byte dengan mengubah str () menjadi backticks!
Keerthana Prabhakaran
sumber
Anda tidak menambahkan impor re dalam jawaban Anda. Juga tidak lulus input ini:s=[[ 3, 4,"max(A1,B1)"],[ 2, 5,"A2**B2"],[ "", "","C1+C2"]]
Dead Possum
Format inputnya adalah [[ 3, 4,"=max(A1,B1)"],[ 2, 5,"=A2**B2"],[ "", "","=C1+C2"]]Itu ada sebagai bagian dari header! Lihat di tautan coba online!
Keerthana Prabhakaran
1
Itu harus dimasukkan dalam jumlah byte. Lihat saja jawaban python lain di situs ini
Dead Possum
Apakah itu? Saya bersih untuk codeglof. Terima kasih atas komentarnya. Akan menambahkannya.
Keerthana Prabhakaran
Sejauh jawaban lain dipertimbangkan, mereka belum memasukkan input! Saya telah mengedit dengan hitungan impor tinggal!
Keerthana Prabhakaran