ประเมินสเปรดชีตอย่างง่าย


13

กฎระเบียบ

  1. ไม่มีการอ้างอิงช่วงเซลล์ ( A2:B3)

  2. สูงสุด 9 แถวและ 9 คอลัมน์

  3. ไม่มีการอ้างอิงแบบวงกลมหรือข้อผิดพลาดของสูตร

  4. 0เซลล์ว่างประเมิน

  5. ข้อมูลเป็นตัวเลขเท่านั้น แต่อาจถูกใช้เป็นสตริง

  6. สูตรเป็นสตริง

ตัวเลือกการนำไปใช้

คุณต้องระบุตัวเลือกของคุณในเรื่องเหล่านี้:

  1. ต้องการสูตรที่จะนำหน้าด้วยอักขระตัวเดียวเช่น=- หรือไม่

  2. เซลล์ซ้ายสุดของแถวที่สองคือA2หรือR2C1ตามอนุสัญญาทั้งสองที่ใช้โดย Excel et al

  3. ต้องการตัวอักษรล่วงหน้าหรือคำต่อท้ายในการอ้างอิงเซลล์เช่น$- หรือไม่

  4. หนึ่งใน null, สตริงว่าง, รายการว่าง, ฯลฯ , (แต่ไม่ใช่0) เพื่อแทนเซลล์ว่าง

  5. ภาษาที่คุณส่ง (ผู้จัดการสเปรดชีตไม่ได้รับอนุญาต)

  6. ภาษาสำหรับสูตร (อาจแตกต่างจากด้านบน) *

  7. บราวนี่ชี้หรือคุกกี้เพื่ออธิบายการแก้ปัญหาของคุณ

ตัวอย่าง

ทางเลือก: 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 ที่นั่นเท่านั้น ความมุ่งมั่นนอกจากนี้และความดั้งเดิม


ส่งคำตอบใน Excel / VBA ไม่ได้รับอนุญาตหรือไม่ Expand array to cells, evaluate.
Magic Octopus Urn

@carusocomputing หากคุณไม่เพียงให้ Excel ทำสิ่งนั้นให้โพสต์
อดัม

เราสามารถมีเซลล์เป็นศูนย์ได้หรือไม่? เช่นเดียวกับในR0C0?
Conor O'Brien

@ ConorO'Brien ไม่มันจะต้องเป็นหนึ่งในสองอนุสัญญาที่ Excel ใช้และอื่น ๆ
อดัม

คำตอบ:


6

JavaScript, 125 112 105 ไบต์

ในการใช้งานเพิ่มที่จุดเริ่มต้นและเรียกเช่นf=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. คุ้กกี้. 🍪🍪🍪

คำอธิบาย:

วิธีนี้จะวนซ้ำทุกเซลล์ของแผ่นงาน (แต่ละองค์ประกอบของอาร์เรย์ย่อยของอาร์เรย์ที่กำหนด) และหากพบสตริงที่ไม่ว่างให้แทนที่การอ้างอิงเซลล์ด้วยการอ้างอิงที่สอดคล้องกันในแง่ของอาร์เรย์ที่กำหนดและประเมินการแสดงออก ด้วยeval()(ใช่สิ่งชั่วร้ายที่หลอกหลอนคุณในฝันร้ายของคุณ ) วิธีการแก้ปัญหานี้สันนิษฐานว่าค่าคงที่ที่มีให้ในอาร์เรย์อินพุตเป็นประเภทจำนวนเต็ม

กรณีทดสอบ

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กับ regex ของคุณได้
powelles

@powelles \wจับคู่หลักด้วยและ\dตรงกับ 0 ด้วยทั้งสองสิ่งที่คุณไม่ต้องการในกรณีนี้ /[A-I][1-9]/gควรทำงานแม้ว่า
LarsW

@LarsW /\w\d/gให้ผลลัพธ์ที่เหมือนกันในกรณีทดสอบ การใช้เทมเพลตตัวอักษรในส่วนของ eval นั้นสามารถบันทึกจำนวนหนึ่งไบต์
powelles

@Powelles ใช่ แต่กรณีทดสอบอาจไม่สมบูรณ์ อย่างไรก็ตามฉันคิดว่าต้องปฏิบัติตามกฎที่เลือกไว้ แต่พวกเขาอาจเป็นข้อ จำกัด การป้อนข้อมูล (หรือทั้งสองอย่าง) ดังนั้นอาจเป็นปัญหาด้วย
LarsW

4

PHP, 265 263 259 258 257 240 224 222 213 202 196 ไบต์

เนื้อเรื่องarray_walk_recursiveเป็นฟังก์ชั่นที่ไม่ระบุชื่อ 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 ใด ๆ (ตัวพิมพ์เล็ก) รวมถึง arithmetics ทั้งหมด

รายละเอียด (รุ่นแรก)

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 ใด ๆ ที่เหมาะสมจะไม่ทำงานใช่ไหม?
2017

1
@ Adámตอนนี้คุณพูดถึงมัน ... ตราบใดที่มันเป็นตัวพิมพ์เล็กใช่ แม้ว่าmax(range(A1,A3))อาจจะสับสน : D
ติตัส

1
นีซกอล์ฟเอาฉันค่อนข้างนานในการหาอะไร: $d=$c;preg_match($x="#[A-Z](.)#",$c=$c[0]การpreg_match($x="#[A-Z](.)#",$c=($d=$c)[0]ควรบันทึก 1 ไบต์
Christoph

เป็นไปได้ไหมที่จะรวมการลองใช้ออนไลน์! link?
Adám

1
@Christoph เอาฉันวิธีใหม่ในการแก้ไขตัวอย่างที่สอง ... และบันทึกจำนวนมากในกระบวนการ ... รวมทั้งการเล่นกอล์ฟต่อไป
ติตัส

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. มาติกา
  6. มาติกา นิพจน์ทางคณิตศาสตร์ตามอำเภอใจที่ไม่ใช้ตัวแปรของแบบฟอร์มRxCyและไม่มีผลข้างเคียงควรใช้

คำอธิบาย

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

เราเริ่มต้นด้วยการแทนที่สตริงว่างทั้งหมดในอินพุต ( #) ด้วยค่าศูนย์และเก็บผลลัพธ์ไว้mเพราะเราต้องการสิ่งนี้อีกครั้งในที่อื่น

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

แทนที่สตริงที่เหลือซ้ำsด้วยสตริงต่อไปนี้ ...

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

จับคู่สตริงย่อยของฟอร์มRxCyในsและแทนที่ด้วย ...

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

ซึ่งจะช่วยให้m[[x,y]]ซึ่งการใช้งานxและเป็นดัชนีลงในเมทริกซ์ym

...ToExpression@...

ในที่สุดประเมินสตริงนี้เป็นนิพจน์ Mathematica


เย็น. ฉันคิดว่ามันจะใช้เวลานานกว่านั้นเล็กน้อย ...
อดัม

@ Adám แต่น่าเสียดายที่ดูเหมือนว่าจะไม่ได้ทำงานในวิชาคณิตศาสตร์ดังนั้นหากไม่มี Mathematica ก็อาจจะไม่ใช่
Martin Ender

ยังคงรอการสร้าง ...
YSC

@YSC Excel ขนาด 0 ไบต์
อดัม

@ Adámที่จะไม่แข่งขันตามกฎของความท้าทายนี้ นอกจากนี้ฉันคิดว่ามาร์ตินสมควรได้รับคุกกี้
Erik the Outgolfer

2

Clojure, 263 281 ไบต์

โอ้ด่าโดยไม่ว่าapply map vectorผลที่ได้คือในไขว้เป็นเป็นตัวอักษรก่อนA2B1

#(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-expressions
  2. A2
  3. ไม่(+ A1 A2)เป็นไร
  4. nilและfalseทำงานเป็นเซลล์ว่าง แต่สตริงว่างไม่มี
  5. Clojure
  6. S-expressions (Clojure + มาโครในตัวใด ๆ )

ตัวอย่างของแมโครแมโครแรก:

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

ค่าเริ่มต้นของCการวนซ้ำเป็น hash-map คีย์คือชื่อเซลล์และค่าเป็นค่าดั้งเดิม จากนั้นการอ้างอิงเซลล์ทั้งหมดจะถูกแทนที่ด้วยเนื้อหาของเซลล์ที่อ้างอิงจนกว่าเราจะได้มาบรรจบกัน ( 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. APL

  6. APL

ลองออนไลน์!

⍎¨ ประเมินแต่ละเซลล์ของผลลัพธ์จาก

(... )⍣≡ แอปพลิเคชั่นสองฟังก์ชันต่อไปนี้อย่างต่อเนื่องจนกว่าจะไม่มีอะไรเปลี่ยนแปลงอีกต่อไป

{ ฟังก์ชั่นแรกที่ไม่ระบุชื่อที่จะใช้ ...

  0 ใน
  :: ข้อผิดพลาดใด ๆ:
    ส่งคืนอาร์กิวเมนต์ที่ไม่ได้แก้ไข

   ตอนนี้ลอง;

   ถ้าอาร์กิวเมนต์ของ
   นับ:
  × เป็นบวก
  : แล้ว:
    stringify
    ประเมิน
    stringified
    โต้แย้ง

   อื่น;

  0 กลับศูนย์

 ... ถึงแต่ละเซลล์

{ ฟังก์ชันที่ไม่ระบุตัวตนที่สองที่จะใช้ ...

  '←',¨ เติมลูกศรที่กำหนดไปยังแต่ละเซลล์ของ
   อาร์กิวเมนต์

  (... เพิ่ม),¨ สิ่งต่อไปนี้ลงในแต่ละเซลล์ของสิ่งนั้น

   1↓ ลดลงเป็นครั้งแรกของ
   ⎕D สตริงของทุกD igits (เช่นศูนย์)

   ⎕A เมื่อตัวอักษรทั้งหมดของA lphabet กำลังลง
   ∘., ให้ทำตารางการต่อข้อมูล (ตัวเลขที่เหลือจะไปทางขวา)

    ไขว้ (เพื่อเพิ่มจำนวนลง, การเลื่อนไปทางขวา)

   ()↑ นำซับเมทริกซ์ด้านซ้ายบนมามีขนาด ...

     ขนาดของ
     การโต้แย้ง

} ... กับผลลัพธ์ของฟังก์ชันก่อนหน้า


1
คำอธิบายของคุณสวยงามเสมอขอบคุณทำให้ฉันต้องการเรียนรู้ APL เกินกว่าที่ฉันรู้จากการอ่านคำตอบเหล่านี้
Magic Octopus Urn

@carusocomputing ขอบคุณ ฉันยินดีที่จะช่วยเหลือคุณ รู้สึกอิสระที่จะคำถามและการร้องขอในห้องแชท APL ฉันจะช่วยคุณติดตั้งด้วยถ้าคุณต้องการ
อดัม

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. การแสดงออกของงูหลาม

คำอธิบายพื้นฐาน:

สำหรับทุกสูตรในรายการย่อยให้แทนที่ด้วยรายการที่สอดคล้องกัน (นั่นคือสำหรับดัชนี B1 s [0] [1]) และประเมินผลลัพธ์!

  • -4 ไบต์โดยเปลี่ยน str () เป็น backticks!

คุณไม่ได้เพิ่มการนำเข้าอีกครั้งในคำตอบของคุณ นอกจากนี้ยังไม่ผ่านการป้อนข้อมูลนี้: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
มันควรจะรวมอยู่ในจำนวนไบต์ เพียงตรวจสอบคำตอบของหลามอื่น ๆ ในเว็บไซต์นี้
Dead Possum

ใช่ไหม? ฉันสุทธิ codeglof ขอบคุณสำหรับความคิดเห็น จะเพิ่มมัน
กีรนาปราการะรัน

เท่าที่คำตอบอื่น ๆ ได้รับการพิจารณาพวกเขายังไม่ได้รวมอินพุต! ฉันแก้ไขด้วยจำนวนลาก่อนการนำเข้า!
กีรนาปราการะรัน
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.