簡単なスプレッドシートを評価する


13

ルール

  1. セル範囲参照なし(A2:B3)。

  2. 最大9行9列です。

  3. 循環参照や数式エラーはありません。

  4. 空のセルはに評価され0ます。

  5. データは数字のみですが、文字列として解釈される場合があります。

  6. 数式は文字列です。

実装の選択肢

次の事項について選択を述べる必要があります。

  1. 数式の前に任意の単一文字を付ける必要があります(例:=–かどうか)。

  2. 2番目の行の左端のセルは、Excelなどによって使用される2つの規則に従って、A2またはR2C1です。

  3. セル参照に単一文字のプリまたはサフィックスが必要です(例:$-かどうか)。

  4. 0空のセルを表すnull、空の文字列、空のリストなどのいずれか(ただし、ではありません)。

  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のみをサポートする必要があります。加算およびプライムネスの決定。


Excel / VBAで回答を送信することはできませんか?Expand array to cells, evaluate.
魔法のタコUr

@carusocomputing Excelに処理させるだけではない場合は、お気軽に投稿してください。
アダム

セルをゼロベースにすることはできますか?のように、R0C0
コナーオブライエン

@ ConorO'Brienいいえ、それはExcelなどによって使用される2つの規則の
アダム

回答:


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. 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正規表現に使用できない理由はありますか?
powelles

@powellesは\w数字にも\d一致し、0にも一致します。この場合は両方とも望ましくありません。/[A-I][1-9]/gしかし動作するはずです
-LarsW

@LarsW /\w\d/gは、テストケースでまったく同じ結果を生成します。また、評価部分でテンプレートリテラルを使用すると、少数のバイトを節約できます。
powelles

@powellesはい、ただしテストケースは不完全な場合があります。とにかく、選択したルールに従う必要があると思いました。しかし、それらは入力制限(またはその両方)である可能性があるため、それも問題になる可能性があります
-LarsW

4

PHP、265263259258257240224222213202196バイト

特徴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
タイタス

1
ニースのゴルフは、何かを見つけるためにかなり長い連れて行ってくれました:$d=$c;preg_match($x="#[A-Z](.)#",$c=$c[0]preg_match($x="#[A-Z](.)#",$c=($d=$c)[0]1つのバイトを保存する必要があります。
クリストフ

オンラインで試してみることを含めることは可能ですかリンク?
アダム

1
@Christophは私に2番目の例を修正する新しいアプローチを採用しました...そしてその過程で多くを節約しました...さらにゴルフ
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_:>...]

のフォームのサブストリングと一致RxCys、次のものに置き換えます...

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

これはm[[x,y]]、を使用しxyをインデックスとして使用しますm

...ToExpression@...

最後に、この文字列をMathematica式として評価します。


涼しい。それより少し時間がかかると思った...これを試す方法はありますか?
アダム

@Adám残念ながら、Mathicsでは動作しないようです。そのため、おそらくMathematicaのコピーなしでは動作しません。
マーティンエンダー

まだビルトインを待っています
...-YSC

@YSC Excel、0バイト。
アダム

@Adámこれは、この課題のルールに従って競合するものではありません。また、マーティンはクッキーに値すると思います。
エリックアウトゴルファー

2

Clojure、263 281バイト

ああことをせずに畜生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. クロージュア
  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. APL

  6. APL

オンラインでお試しください!

⍎¨ 結果の各セルを評価する

()⍣≡  次の2つの機能を継続して適用し、変更がなくなるまで

{ 適用される最初の匿名関数…

  0
  :: エラーが発生 した場合:
     引数を返す無修正

   今試してください。

   引数の場合
   タリーは:
  × 正の
  : その後:
    文字列化
    、評価
    文字列化を
     引数を

   そうしないと;

  0 ゼロを返す

 …各セルへ

{ 適用される2番目の匿名関数…

  '←',¨ の各セルに割り当て矢印を追加します
   引数のします

  (),¨  その各セルに次を追加します

   1↓
   ⎕D すべてのDの文字列の 最初を削除します igitsの(つまりゼロ)をます

   ⎕AA  アルファベットのすべての文字が下がると、
   ∘.,  、連結テーブルを作成します(残りの数字は右に移動します)

    転置(数字を増やし、進行する文字を正しくするため)

   ()↑ サイズが左上の部分行列を取得します…

    
     引数 のサイズ

} …前の関数の結果へ。


1
あなたの説明はいつも美しいです、ありがとう、私はこれらの答えを読んで少し知っている以上にAPLを学びたいです。
魔法のタコUr

@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. Python式

基本的な説明:

サブリスト内のすべての数式について、対応するリスト(つまり、B1 s [0] [1])インデックスで置き換えて、結果を評価します。

  • str()をバックティックに変更して-4バイト!

回答にreのインポートを追加しませんでした。また、この入力は渡されません:s=[[ 3, 4,"max(A1,B1)"],[ 2, 5,"A2**B2"],[ "", "","C1+C2"]]
デッドポッサムを

入力形式は [[ 3, 4,"=max(A1,B1)"],[ 2, 5,"=A2**B2"],[ "", "","=C1+C2"]]、ヘッダーの一部としてあります!オンラインで試すリンクで確認してください!
Keerthana Prabhakaran

1
バイトカウントに含める必要があります。このサイトで他のPythonの回答をご覧ください
Dead Possum

それは...ですか?私はcodeglofに純真です。コメントありがとうございます。それを追加します。
Keerthana Prabhakaran

他の答えが考慮される限り、彼らは入力を含んでいません!インポートのバイカウントで編集しました!
Keerthana Prabhakaran
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.