간단한 스프레드 시트 평가


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. nilfalse빈 셀로 작동하지만 빈 문자열은하지 않습니다
  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.