간단한 스프레드 시트 평가


13

규칙

  1. 셀 범위 참조가 없습니다 ( A2:B3).

  2. 최대 9 행 9 열.

  3. 순환 참조 또는 수식 오류가 없습니다.

  4. 빈 셀은로 평가됩니다 0.

  5. 데이터는 숫자 일 뿐이지 만 문자열로 간주 될 수 있습니다.

  6. 수식은 문자열입니다.

구현 선택

다음 사항에서 선택 사항을 진술해야합니다.

  1. 수식 앞에 접두사를 붙여야합니다 (예 : =– 여부).

  2. 두 번째 행의 가장 왼쪽 셀은 Excel 등에서 사용하는 두 가지 규칙에 따라 A2또는 R2C1입니다.

  3. 셀 참조에 단일 문자 접두사 또는 접미사가 필요합니다 (예 : $– 여부).

  4. 0빈 셀을 나타내는 null, 빈 문자열, 빈 목록 등 중 하나입니다 (그러나 아님 ).

  5. 제출 언어 (스프레드 시트 관리자는 허용되지 않음).

  6. 수식 언어 (위와 다를 수 있음). *

  7. 솔루션 설명을위한 브라우니 포인트 또는 쿠키.

예

선택 : 7 : =; 8 : A2; 9 : 없음; 10 : ""; 12 : 엑셀 수식 언어

에:

[[       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.
— Magic Octopus Urn

@carusocomputing 엑셀이 그 일을하도록하는 것이 아니라면, 자유롭게 게시하십시오.
— Adám

우리는 세포가 0을 기반으로 할 수 있습니까? 에서처럼 R0C0?
— Conor O'Brien

@ ConorO'Brien 아니요, Excel 등에서 사용되는 두 가지 규칙
— Adám

답변:


6

자바 스크립트, 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. 자바 스크립트.
  6. 자바 스크립트.
  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]]));


아주 좋아요 여기 : 🍪.
— Adám

/\w\d/g정규식에 사용할 수없는 이유가 있습니까?
— powelles

@powelles \w는 숫자와도 \d일치하고 0 과도 일치합니다 (이 경우 원하지 않는 것 모두). /[A-I][1-9]/g그래도 작동합니다
— LarsW

@LarsW /\w\d/g는 테스트 사례에서 동일한 결과를 생성합니다. 또한 평가 부분에서 템플릿 리터럴을 사용하면 몇 바이트를 절약 할 수 있습니다.
— powelles

@powelles 네,하지만 테스트 사례가 불완전 할 수 있습니다. 어쨌든, 선택한 규칙을 따라야한다고 생각했습니다. 그러나 그것들은 단지 입력 제한 일 수도 있고 (또는 둘 다), 이것이 문제가 될 수도 있습니다
— LarsW

4

PHP, 265263592585757240224222213202196 바이트

특징으로 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 표현이 효과가 있습니까?
— Adám

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

온라인 사용해보기 를 포함시킬 수 있습니까? 링크?
— Adám

1
@Christoph는 두 번째 예제를 해결하기 위해 나에게 새로운 접근을했다 ... 그리고 그 과정에서 많이 저장 ... 플러스 더 골프
— 디도

3

매쓰, 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)

입력 ( #) 의 모든 빈 문자열 을 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

@ Adám 불행하게도, Mathics에서는 작동하지 않는 것 같으므로 Mathematica의 사본이 없으면 아마도 그렇지 않을 것입니다.
— 마틴 엔더

아직도 내장을 기다리는 중 ...
— YSC

@YSC Excel, 0 바이트
— Adám

@ Adám 그것은이 도전의 규칙에 따라 경쟁하지 않을 것입니다. 또한 Martin은 쿠키가 필요하다고 생각합니다.
— Outgolfer Erik

2

클로저, 26381 바이트

오 알파벳 없이 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- 표현입니다
  2. A2
  3. 아냐 (+ A1 A2)괜찮아
  4. nil및 false빈 셀로 작동하지만 빈 문자열은하지 않습니다
  5. 클로저
  6. S- 표현식 (Clojure + 내장 매크로)

스레드 첫 번째 매크로의 예 :

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

C루프에서 시작 값은 해시 맵이고 키는 셀 이름이며 값은 원래 값입니다. 그런 다음 모든 셀 참조는 수렴 될 때까지 참조 된 셀의 내용으로 바뀝니다 ( P심각한 = 긴급 C). 그런 다음 셀이 평가되고 평평한 구조가 다시 중첩 목록으로 분할됩니다.

해결책 찾기 위해 냉각 될 것이다 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 하나에서
  :: 오류 :
   ⍵ 인수를 반환 수정되지 않은

  ⋄ 이제 시도하십시오;

  ⍵ 인수의 경우
  ≢ 집계가 :
  × 긍정적
  : 다음 :
   ⍕ 캐릭터 라인 화
   ⍎ 평가
   ⍕ 도 캐릭터 라인
   ⍵ 인수를

  ⋄ 그밖에;

  0 제로를 돌려 주다

 }¨ … 각 세포에

 { 두 번째 익명 기능 적용…

  '←',¨
  ⍵ 인수의  각 셀에 할당 화살표를 붙입니다

  (… ),¨ 그 각 셀에 다음을 추가하십시오.

   1↓ 의 첫 번째 드롭
   ⎕D 모든 문자열 D의 igits (즉 영)

   ⎕AA lphabet  의 모든 글자가 내려 가고
   ∘., 연결 테이블을 만듭니다 (나머지 숫자가 오른쪽으로 이동)

   ⍉ 조옮김 (숫자를 늘리려면 글자를 올바르게 진행하십시오)

   (… )↑ 크기가 왼쪽 위의 하위 행렬을 취합니다.

    ⍴
    ⍵ 인수  의 크기

 } … 이전 함수의 결과에.


1
당신의 설명은 항상 아름답습니다. 감사합니다. 나는이 답을 읽음으로써 아는 것 이상으로 APL을 배우고 싶습니다.
— Magic Octopus Urn

@carusocomputing 감사합니다. 기꺼이 도와 드리겠습니다. APL 대화방 에서 질문과 요청을 자유롭게하십시오 . 필요한 경우 준비를 도와 드리겠습니다.
— Adám

1

파이썬 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. none

  4. ""

  5. 파이썬 2.7

  6. 파이썬 표현

기본 설명 :

하위 목록의 모든 수식에 대해 해당 목록 (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
바이트 수에 포함되어야합니다. 이 사이트에서 다른 파이썬 답변을 확인하십시오
— Dead Possum

그렇습니까? 나는 codeglof에 순결하다. 의견 주셔서 감사합니다. 추가하겠습니다.
— Keerthana Prabhakaran

다른 답변이 고려되는 한, 그들은 입력을 포함하지 않았습니다! 가져 오기 단위로 편집했습니다!
— Keerthana Prabhakaran
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.