评估一个简单的电子表格


13

规则

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

  2. 最多9行9列。

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

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

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

  6. 公式是字符串。

实施选择

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

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

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

  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]],使用x和y作为矩阵的索引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. nil并false用作空单元格,但空字符串不起作用
  5. Clojure
  6. S表达式(Clojure +任何内置宏)

线程优先宏的示例:

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

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

会很酷找到一个解决方案,其中A1,A2等其实都是可调用的函数,那么(* 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. ”

  5. Python 2.7

  6. 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.