评估一个简单的电子表格


13

规则

  1. 没有单元格范围参考(A2:B3)。

  2. 最多9行9列。

  3. 没有循环引用或公式错误。

  4. 空单元格的计算结果为0

  5. 数据仅是数字,但可以视为字符串。

  6. 公式是字符串。

实施选择

您必须在以下事项中陈述您的选择:

  1. 要求公式以任何单个字符为前缀,例如=–或不带。

  2. 根据Excel等人使用的两种约定,第二行的最左侧单元格为A2R2C1

  3. 在单元格引用中要求任何单字符前置或后缀,例如$-或不要求。

  4. 空,空字符串,空列表等(但不是0)之一,代表空单元格。

  5. 您提交的语言(不允许使用电子表格管理器)。

  6. 公式的语言(可能与上述语言有所不同)。*

  7. 布朗尼点或cookie,用于解释您的解决方案。

例子

选择:7 :=;8 :A2;9:没有 10 :"";12:Excel公式语言

在:

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

出:

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

在:

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

出:

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

在:

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

出:

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

在:

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

出:

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

*公式语言必须是PPCG可接受的,但是您只需要支持单元格引用以及其中的条件3和4,即wiz。加法和素数确定。


不允许在Excel / VBA中提交答案吗?Expand array to cells, evaluate.
魔术八达通骨灰盒

@carusocomputing如果您不只是让Excel做事情,请随时发布。
ADAM

我们可以让单元格从零开始吗?如,R0C0
科纳·奥布莱恩

@ ConorO'Brien不,它必须是Excel等人使用的两个约定
2015年

Answers:


6

JavaScript, 125 112 105字节

要使用,请f=在开头添加并调用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))

选择:

  1. 不需要=
  2. 第二行最左边的单元格是A2
  3. 不需要任何前缀或后缀。
  4. "" (空字符串)表示空单元格。
  5. JavaScript。
  6. JavaScript。
  7. 饼干。🍪🍪🍪

说明:

此解决方案遍历工作表的所有单元格(给定数组的子数组的每个元素),并且如果找到非空String,则将给定数组的单元格引用替换为相应的引用,并计算表达式用eval()(是的,那邪恶的东西萦绕在你的噩梦)。此解决方案假定输入数组中提供的常量为Integer类型。

测试用例

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


非常好。在这里:🍪。
亚当

有什么原因不能/\w\d/g用于正则表达式?
鲍威尔

@powelles也可以\w匹配数字,也可以\d匹配0,在这种情况下,您都不需要。/[A-I][1-9]/g应该可以工作
LarsW

@LarsW /\w\d/g在测试案例中产生完全相同的结果。此外,在eval部分中使用模板文字可以节省少量字节。
鲍威尔

@powelles是的,但是测试用例可能不完整。无论如何,我认为必须遵循所选的规则。但是它们可能只是输入限制(或两者兼而有之),所以也可能是问题所在
LarsW

4

PHP,265263259259258257240224222213202196字节

特色array_walk_recursive,一个递归的匿名函数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).';');});}

要么

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

对输入进行操作:按引用调用。在线测试

  • 没有表达式前缀
  • 参考格式R2C1,无前缀
  • 任何虚假的空单元格
  • 计算任何(小写)PHP表达式,包括所有算术

细目分类(第一版)

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非常好;🍪。您说的是标准算术,但实际上任何合理的PHP表达式都可以,不是吗?
亚当

1
@Adám现在您提到了它……只要是小写字母,是的。虽然max(range(A1,A3))可能会造成混淆。:D
Titus

1
尼斯高尔夫球花了相当长的时间找到什么:$d=$c;preg_match($x="#[A-Z](.)#",$c=$c[0]preg_match($x="#[A-Z](.)#",$c=($d=$c)[0]应保存1个字节。
克里斯多夫(Christoph)

是否可以包含在线试用!链接?
亚当

1
@Christoph带我采用了一种解决第二个示例的新方法...并在此过程中节省了很多时间...以及进一步打高尔夫球
Titus

3

Mathematica,119 115 95字节

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

选择:

  1. 无前缀。
  2. R2C1 样式。
  3. 无前缀或后缀。
  4. "" 对于空单元格。
  5. Mathematica。
  6. Mathematica。不使用形式变量RxCy并且没有副作用的任意算术表达式应该起作用。

说明

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

首先,将输入(#)中的所有空字符串替换为零,并将结果存储在中m,因为我们将在另一个地方再次使用它。

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

反复s以下内容替换所有剩余的字符串...

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

匹配表格RxCy中的任何子字符串,s并将其替换为...

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

给出m[[x,y]],使用xy作为矩阵的索引m

...ToExpression@...

Finallz,将此字符串评估为Mathematica表达式。


凉。我认为那会花更长的时间...有什么办法可以尝试?
亚当

@Adám不幸的是,它似乎不适用于数学,因此如果没有Mathematica的副本,可能不会。
马丁·恩德

仍在等待内置的...
YSC

@YSC Excel,0个字节。
亚当

@Adám按照这项挑战的规则,这是不对的。另外,我认为马丁值得一个cookie。
暴民埃里克(Erik the Outgolfer)'17年

2

Clojure,263281字节

噢,该死的apply map vector,正如前面A2的字母顺序那样,结果是转置的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)))))

例子:

(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. 公式是S表达式
  2. A2
  3. 不,(+ A1 A2)很好
  4. nilfalse用作空单元格,但空字符串不起作用
  5. Clojure
  6. S表达式(Clojure +任何内置宏)

线程优先宏的示例:

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

C循环中的起始值为哈希映射,键为单元格名称,值为原始值。然后将所有单元格引用替换为引用单元格的内容,直到收敛为止(Previous = Current),然后对单元格进行求值并将平面结构重新划分为嵌套列表。

会很酷找到一个解决方案,其中A1A2等其实都是可调用的函数,那么(* 2 B2 B3)可以重写(* 2 (B2) (B3))和执行。

在线尝试!


2

APL(Dyalog),51字节

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

  2. A2

  3. 没有

  4. 空字符串

  5. 杀伤人员地雷

  6. 杀伤人员地雷

在线尝试!

⍎¨ 评估结果的每个单元格

()⍣≡ 连续应用以下两个功能,直到没有其他变化为止

{ 第一个将要应用的匿名功能…

  0 发生任何
  :: 错误:
    返回未修改的参数

   现在尝试;

   如果该参数的
   理货:
  × 为正
  : ,则:
    字符串化
    评估的
    字符串化的
    说法

   其他;

  0 返回零

 …到每个单元格

{ 要应用的第二个匿名函数…

  '←',¨
   在参数的 每个单元格前添加赋值箭头

  (),¨ 在该单元格的每个单元格前添加以下内容

   1↓ 删除
   ⎕D 所有数字的字符串的第一个(即零)

   ⎕A 在A字母的所有字母都向下的情况下,
   ∘., 制作一个串联表(其余数字向右)

    转置(以减少递增的数字,使字母正确进行)

   ()↑ 取左上方的子矩阵,其大小为…

    
     参数 的大小

} …到上一个函数的结果。


1
您的解释总是很漂亮,谢谢,这使我想学习APL,而我从阅读这些答案中学不到的知识。
魔术章鱼缸

@carusocomputing谢谢。我很乐意为您提供帮助。随时在APL聊天室中提问和提出请求。如果需要,我也会帮助您进行设置。
2015年

1

Python 2 273,265,263,259字节

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

在线尝试!

选择:

  1. =

  2. A2

  3. 没有

  4. Python 2.7

  5. Python表达式

基本说明:

对于子列表中的每个公式,将其替换为相应的列表(即B1 s [0] [1])索引并评估结果!

  • 通过将str()更改为反引号,可以得到-4个字节!

您没有在答案中添加re的导入。也不会通过此输入:s=[[ 3, 4,"max(A1,B1)"],[ 2, 5,"A2**B2"],[ "", "","C1+C2"]]
Dead Possum

输入格式为[[ 3, 4,"=max(A1,B1)"],[ 2, 5,"=A2**B2"],[ "", "","=C1+C2"]]那是标题的一部分!在“尝试在线”链接上进行检查!
Keerthana Prabhakaran

1
它应包括在字节数中。只需在此站点上查看其他python答案
Dead Possum

是吗?我很喜欢codeglof。感谢您的评论。将其添加。
Keerthana Prabhakaran

就其他答案而言,它们还没有包含输入内容!我已经编辑了导入的再见!
Keerthana Prabhakaran
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.