Đánh giá một bảng tính đơn giản


13

Quy tắc

  1. Không có tham chiếu phạm vi ô ( A2:B3).

  2. Tối đa 9 hàng và 9 cột.

  3. Không có tham chiếu tròn hoặc lỗi công thức.

  4. Các ô trống đánh giá 0.

  5. Dữ liệu chỉ là số, nhưng có thể được lấy dưới dạng chuỗi.

  6. Công thức là chuỗi.

Lựa chọn thực hiện

Bạn phải nêu lựa chọn của mình trong những vấn đề này:

  1. Yêu cầu các công thức phải được thêm tiền tố vào bất kỳ ký tự đơn nào, ví dụ =- hoặc không.

  2. Ô ngoài cùng bên trái của hàng thứ hai là A2hoặc R2C1, theo hai quy ước được sử dụng bởi Excel et al.

  3. Yêu cầu bất kỳ tiền tố hoặc hậu tố một ký tự trong tham chiếu ô, ví dụ $- hoặc không.

  4. Một trong các null, chuỗi rỗng, danh sách trống, v.v., (nhưng không 0) để thể hiện các ô trống.

  5. Ngôn ngữ trình của bạn (người quản lý bảng tính không được phép).

  6. Ngôn ngữ cho các công thức (có thể khác với ở trên). *

  7. Brownie điểm hoặc cookie để giải thích giải pháp của bạn.

Ví dụ

Lựa chọn: 7 : =; 8 : A2; 9: không có; 10 : ""; 12: Ngôn ngữ công thức Excel

Trong:

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

Ngoài:

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

Trong:

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

Ngoài:

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

Trong:

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

Ngoài:

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

Trong:

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

Ngoài:

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

* Ngôn ngữ công thức phải được PPCG chấp nhận , nhưng bạn chỉ phải hỗ trợ các tham chiếu ô cộng với tiêu chí 3 và 4 ở đó, wiz. bổ sung và xác định nguyên thủy.


Được gửi một câu trả lời trong Excel / VBA không được phép? Expand array to cells, evaluate.
Bạch tuộc ma thuật Urn

@carusocomputing Nếu bạn không chỉ để Excel làm việc đó, thì hãy đăng bài.
Adám

Chúng ta có thể có các tế bào dựa trên không? Như trong , R0C0?
Conor O'Brien

@ ConorO'Brien Không, nó phải là một trong hai quy ước được sử dụng bởi Excel et al.
Adám

Câu trả lời:


6

JavaScript, 125 112 105 byte

Để sử dụng, thêm f=vào lúc bắt đầu và gọi như thế nào 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))

Lựa chọn:

  1. Không yêu cầu =.
  2. Các ô bên trái của hàng thứ hai là A2.
  3. Không yêu cầu bất kỳ tiền tố hoặc hậu tố.
  4. "" (Chuỗi rỗng) để biểu thị ô trống.
  5. JavaScript.
  6. JavaScript.
  7. Bánh quy. 🍪🍪🍪

Giải trình:

Giải pháp này lặp lại trên tất cả các ô của trang tính (từng phần tử của các mảng con của mảng đã cho) và nếu tìm thấy Chuỗi không trống, thay thế các tham chiếu ô của nó bằng các tham chiếu tương ứng theo mảng đã cho và đánh giá biểu thức với eval()(vâng, điều xấu xa đó ám ảnh bạn trong những cơn ác mộng của bạn ). Giải pháp này giả định rằng các hằng số được cung cấp trong mảng đầu vào là kiểu Integer.

Các trường hợp thử nghiệm

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


Rất đẹp. Đây:.
Adám

Bất kỳ lý do bạn không thể sử dụng /\w\d/gcho regex của bạn?
powelles

@powelles cũng \wkhớp các chữ số và cũng \dkhớp với 0, cả hai điều bạn không muốn trong trường hợp này. /[A-I][1-9]/gnên làm việc mặc dù
LarsW

@LarsW /\w\d/gtạo ra kết quả chính xác tương tự trong các trường hợp thử nghiệm. Ngoài ra, sử dụng một mẫu bằng chữ trong phần eval có thể tiết kiệm được một số byte.
powelles

@powelles có, nhưng các trường hợp thử nghiệm có thể không đầy đủ. Dù sao, tôi giả định các quy tắc được lựa chọn cần phải được tuân theo; nhưng chúng có thể chỉ là các hạn chế đầu vào (hoặc cả hai), vì vậy đó cũng có thể là vấn đề
LarsW

4

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

tính năng array_walk_recursive, một hàm ẩn danh đệ quypreg_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).';');});}

hoặc là

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

hoạt động trên đầu vào: gọi bằng cách tham khảo. Kiểm tra nó trực tuyến .

  • không có tiền tố biểu thức
  • định dạng tham chiếu R2C1, không có tiền tố
  • bất cứ điều gì sai lệch cho ô trống
  • đánh giá bất kỳ biểu thức PHP (chữ thường) nào, bao gồm tất cả các arithologists

sự cố (phiên bản đầu tiên)

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 Rất đẹp; 🍪. Bạn nói mỹ phẩm tiêu chuẩn, nhưng thực sự bất kỳ biểu thức PHP hợp lý nào cũng sẽ hoạt động, phải không?
Adám

1
@ Adám Bây giờ bạn đề cập đến nó ... miễn là chữ viết thường, vâng. Mặc dù max(range(A1,A3))có thể gây nhầm lẫn. : D
Tít

1
Đẹp golf đưa tôi khá dài để tìm bất cứ điều gì: $d=$c;preg_match($x="#[A-Z](.)#",$c=$c[0]để preg_match($x="#[A-Z](.)#",$c=($d=$c)[0]nên lưu 1 byte.
Christoph

Có thể bao gồm một thử nó trực tuyến! liên kết?
Adám

1
@Christoph đưa tôi một cách tiếp cận mới để khắc phục ví dụ thứ hai ... và đã tiết kiệm rất nhiều trong quá trình ... cộng với việc chơi gôn hơn
Tít

3

Toán học, 119 115 95 byte

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

Lựa chọn:

  1. Không có tiền tố.
  2. R2C1 Phong cách.
  3. Không có tiền tố hoặc hậu tố.
  4. "" cho các ô trống.
  5. Toán học.
  6. Toán học. Các biểu thức số học tùy ý không sử dụng các biến của biểu mẫu RxCyvà không có tác dụng phụ sẽ hoạt động.

Giải trình

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

Chúng tôi bắt đầu bằng cách thay thế tất cả các chuỗi trống trong đầu vào ( #) bằng các số 0 và lưu trữ kết quả vào m, bởi vì chúng tôi sẽ cần điều này một lần nữa ở một nơi khác.

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

Liên tục thay thế bất kỳ chuỗi còn lại sbằng ...

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

Nối bất kỳ chuỗi con nào của biểu mẫu RxCyvào svà thay thế chúng bằng ...

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

Mà cho m[[x,y]], mà sử dụng xynhư chỉ số vào ma trận m.

...ToExpression@...

Finallz, đánh giá chuỗi này là một biểu thức Mathicala.


Mát mẻ. Tôi nghĩ rằng nó sẽ mất nhiều thời gian hơn thế ... Có cách nào để thử cái này không?
Adám

@ Adám Thật không may, nó dường như không hoạt động trong Toán học, vì vậy nếu không có bản sao của Mathicala, có lẽ là không.
Martin Ender

Vẫn đang chờ bản dựng ...
YSC

@YSC Excel, 0 byte.
Adám

@ Adám Điều đó sẽ không cạnh tranh theo các quy tắc của thử thách này. Ngoài ra, tôi nghĩ Martin xứng đáng với một cookie.
Erik the Outgolfer

2

Clojure, 263 281 byte

Ôi chết tiệt mà không có apply map vectorkết quả là chuyển vị, như A2bảng chữ cái trước đây 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)))))

Ví dụ:

(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. Công thức là biểu thức S
  2. A2
  3. Không, (+ A1 A2)ổn
  4. nilfalsehoạt động như các ô trống, nhưng chuỗi rỗng thì không
  5. Clojure
  6. Biểu thức S (Clojure + bất kỳ macro tích hợp nào)

Một ví dụ về macro đầu tiên của luồng:

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

Giá trị bắt đầu của Cvòng lặp là bản đồ băm, các khóa là tên ô và giá trị là giá trị gốc. Sau đó, tất cả các tham chiếu ô được thay thế bằng nội dung của các ô được tham chiếu cho đến khi chúng tôi hội tụ ( Previous =C ), sau đó các ô được đánh giá và cấu trúc phẳng được phân vùng lại thành một danh sách lồng nhau.

Sẽ thật tuyệt khi tìm một giải pháp trong đó A1, A2vv là các hàm thực sự có thể gọi được, sau đó (* 2 B2 B3)có thể được viết lại (* 2 (B2) (B3))và thực thi.

Hãy thử trực tuyến!


2

APL (Dyalog) , 51 byte

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

  2. A2

  3. không ai

  4. Chuỗi rỗng

  5. APL

  6. APL

Hãy thử trực tuyến!

⍎¨ Đánh giá từng ô của kết quả từ

(... )⍣≡ ứng dụng liên tục trong hai chức năng sau cho đến khi có gì thay đổi nhiều

{ chức năng ẩn danh đầu tiên được áp dụng

  0 trên bất kỳ
  :: lỗi nào :
    trả về đối số không được sửa đổi

   bây giờ cố gắng;

   nếu của lập luận
   kiểm đếm:
  × là dương tính
  : thì:
    stringify
    các đánh giá
    chuyển đổi thành chuỗi
    lập luận

   khác;

  0 trả về số không

 Liên kết với từng tế bào

{ chức năng ẩn danh thứ hai sẽ được áp dụng

  '←',¨ đặt trước một mũi tên gán cho mỗi ô của
   đối số

  (... ),¨ Thêm tiền tố sau đây để mỗi tế bào đó

   1↓ thả chuỗi đầu tiên của
   ⎕D tất cả các igits D (tức là số không)

   ⎕A Với tất cả các chữ cái của một lph.us đi xuống,
   ∘.,  hãy tạo một bảng ghép (với các chữ số còn lại ở bên phải)

    hoán vị (để tăng số lượng xuống, tiến trình đúng chữ cái)

   (Giáo dục)↑  lấy submatrix trên bên trái với kích thước của ...

     kích thước của
      đối số

} Kết quả của các chức năng trước đó.


1
Lời giải thích của bạn luôn đẹp, cảm ơn, khiến tôi muốn học APL ngoài những gì tôi biết khi đọc những câu trả lời này.
Bạch tuộc ma thuật Urn

@carusocomputing Cảm ơn bạn. Tôi sẽ rất vui khi được giúp đỡ bạn. Hãy thoải mái với các câu hỏi và yêu cầu trong phòng trò chuyện APL . Tôi cũng sẽ giúp bạn thiết lập nếu bạn cần điều đó.
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

Hãy thử trực tuyến!

Lựa chọn:

  1. = =

  2. A2

  3. không ai

  4. ""

  5. Python 2.7

  6. Biểu thức Python

Giải thích cơ bản:

Đối với mọi công thức trong danh sách con, hãy thay thế nó bằng danh sách tương ứng (nghĩa là cho chỉ số B1 s [0] [1]) và đánh giá kết quả!

  • -4 byte bằng cách thay đổi str () thành backticks!

Bạn đã không thêm nhập lại trong câu trả lời của bạn. Ngoài ra, nó không vượt qua đầu vào này:s=[[ 3, 4,"max(A1,B1)"],[ 2, 5,"A2**B2"],[ "", "","C1+C2"]]
Dead Possum

Định dạng đầu vào là [[ 3, 4,"=max(A1,B1)"],[ 2, 5,"=A2**B2"],[ "", "","=C1+C2"]]Đó là một phần của các tiêu đề! Kiểm tra nó trên liên kết thử trực tuyến!
Keerthana Mitchhakaran

1
Nó nên được bao gồm trong số byte. Chỉ cần xem các câu trả lời khác về con trăn trên trang web này
Dead Possum

Là nó? Tôi đang net đến codeglof. Cảm ơn các bình luận. Sẽ thêm nó.
Keerthana Mitchhakaran

Theo như các câu trả lời khác được xem xét, họ không bao gồm đầu vào! Tôi đã chỉnh sửa với số lượng nhập khẩu tạm biệt!
Keerthana Mitchhakaran
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.