Basit bir e-tabloyu değerlendirme


13

kurallar

  1. Hücre aralığı referansları yok ( A2:B3).

  2. Maksimum 9 satır ve 9 sütun.

  3. Dairesel referanslar veya formül hataları yok.

  4. Boş hücreler değerlendirir 0.

  5. Veriler yalnızca sayıdır, ancak dize olarak alınabilir.

  6. Formüller dizgidir.

Uygulama seçenekleri

Seçimlerinizi şu konularda belirtmelisiniz:

  1. Formüllerin herhangi bir tek karakterle önek olarak girilmesini isteyin, örn. =- veya değil.

  2. İkinci sıranın en soldaki hücresi A2veya R2C1Excel ve ark.

  3. Hücre referanslarında herhangi bir tek karakterlik ön veya son eki isteyin, örn. $- veya değil.

  4. 0Boş hücreleri temsil etmek için boş, boş dize, boş liste vb .

  5. Gönderdiğiniz dil (e-tablo yöneticilerine izin verilmez).

  6. Formüllerin dili (yukarıdakilerden farklı olabilir). *

  7. Çözümünüzü açıklamak için Brownie puanları veya çerezler.

Örnekler

Seçenekler: 7 =:; 8 A2:; 9: yok; 10 "":; 12: Excel Formül Dili

İçinde:

[[       2, 3],
 ["=A1+B1",""]]

Dışarı:

[[2,3],
 [5,0]]

İçinde:

[[       2,"=A1+B2"],
 ["=A1+B1",      ""]]

Dışarı:

[[2,2],
 [4,0]]

İçinde:

[[ 3, 4,"=A1*B1"],
 [ 2, 5,"=A2*B2"],
 ["","","=C1+C2"]]

Dışarı:

[[3,4,12],
 [2,5,10],
 [0,0,22]]

İçinde:

[["","=2*B2*B3"     ,""],
 [ 3,"=A1+(A2+C2)/2", 2],
 [ 1,"=C1+(A3+C3)/2", 5]]

Dışarı:

[[0,15,  0],
 [3, 2.5,2],
 [1, 3  ,5]]

* Formül dilinin PPCG'ye izin verilebilir olması gerekir , ancak yalnızca hücre referanslarını ve orada kriter 3 ve 4'ü desteklemeniz gerekir, wiz. toplama ve primite tayini.


Excel / VBA'da bir yanıt gönderilmesine izin verilmedi mi? Expand array to cells, evaluate.
Sihirli Ahtapot Urn

@carusocomputing Yalnızca Excel'in yapmasına izin vermiyorsanız, yayınlamaktan çekinmeyin.
Adám

Sıfır tabanlı hücreler alabilir miyiz? İn olarak, R0C0?
Conor O'Brien

@ ConorO'Brien Hayır, Excel ve ark. Tarafından kullanılan iki sözleşmeden
Adám

Yanıtlar:


6

JavaScript, 125 112 105 bayt

Kullanmak için, f=başlangıçta ekleyin ve beğen 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))

Seçimler:

  1. Gerektirmez =.
  2. İkinci satırın en solundaki hücre A2.
  3. Herhangi bir önek veya sonek gerektirmez.
  4. "" (Boş Dize).
  5. JavaScript.
  6. JavaScript.
  7. Kurabiye. 🍪🍪🍪

Açıklama:

Bu çözüm, çalışma sayfasının tüm hücreleri (belirli bir dizinin alt dizilerinin her bir öğesi) üzerinde yinelenir ve boş olmayan Dize bulunursa, hücre başvurularını verilen dizi açısından karşılık gelen başvurularla değiştirir ve ifadeyi değerlendirir. ile eval()(evet, o kötülük şey kabuslarınızda uğrak sizi ). Bu çözüm, girdi dizisinde sağlanan sabitlerin Tamsayı türünde olduğunu varsayar.

Test Durumları

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]]));


Çok hoş. İşte: 🍪.
Adam

/\w\d/gNormal ifadeniz için kullanamamanızın herhangi bir nedeni var mı?
powelles

@powelles \wrakamlarla da \deşleşir ve bu durumda istemediğiniz her iki şey de 0 ile eşleşir. /[A-I][1-9]/golsa çalışması gerekir
LarsW

@LarsW /\w\d/g, test vakalarında tam olarak aynı sonuçları verir. Ayrıca değerlendirme bölümünde bir şablon hazır bilgisi kullanmak bir avuç bayt tasarrufu sağlayabilir.
powelles

@ powelles evet, ancak test senaryoları eksik olabilir. Her neyse, seçilen kurallara uyulması gerektiğini varsaydım; ancak bunlar yalnızca giriş kısıtlamaları (veya her ikisi) olabilir, bu da sorun olabilir
LarsW

4

PHP, 265263259258257 24022422221320626 bayt

içeren array_walk_recursivebir özyinelemeli anonim işlev ve 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).';');});}

veya

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;});}

girişte çalışır: referans ile çağrı. Çevrimiçi test edin .

  • ifade öneki yok
  • referans formatı R2C1, önek yok
  • boş hücre için sahte bir şey
  • tüm aritmetikler de dahil olmak üzere herhangi bir (küçük harf) PHP ifadesini değerlendirir

arıza (ilk sürüm)

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 Çok hoş; 🍪. Standart aritmetik diyorsunuz, ama gerçekten makul bir PHP ifadesi işe yarayacak, değil mi?
Mart'ta Adám

1
@ Adám Şimdi bahsettiğinize göre ... küçük harf olduğu sürece, evet. Gerçi max(range(A1,A3))kafa karıştırıcı olabilir. : D
Titus

1
Güzel golf şey bulmak oldukça uzun götürdü: $d=$c;preg_match($x="#[A-Z](.)#",$c=$c[0]için preg_match($x="#[A-Z](.)#",$c=($d=$c)[0]1 bayt kaydetmek gerekir.
Christoph

Bir çevrimiçi deneyin dahil etmek mümkün mü? Bağlantı?
Mart'ta Adedi

1
@Christoph ikinci örneği düzeltmek için yeni bir yaklaşım aldı ... ve bu süreçte çok fazla tasarruf etti ... artı daha fazla golf
Titus

3

Mathematica, 119 115 95 bayt

(m=#/.""->0)//.s_String:>ToExpression@StringReplace[s,"R"~~x_~~"C"~~y_:>"m[["<>{x,",",y,"]]"}]&

Seçimler:

  1. Önek yok.
  2. R2C1 tarzı.
  3. Önek veya sonek yok.
  4. "" boş hücreler için.
  5. Mathematica.
  6. Mathematica. Formun değişkenlerini kullanmayan RxCyve yan etkisi olmayan rastgele aritmetik ifadeler çalışmalıdır.

açıklama

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

Girdi ( #) içindeki tüm boş dizeleri sıfırlarla değiştirip sonucu saklayarak mbaşlıyoruz, çünkü buna tekrar başka bir yerde ihtiyacımız olacak.

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

Kalan dizeleri tekrar tekrars aşağıdakilerle değiştirin ...

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

Formun herhangi alt dizeleri Maç RxCyiçinde sve bunların yerine ...

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

Hangi verir m[[x,y]], hangi kullanır xve ymatris içine endeks olarak m.

...ToExpression@...

Finallz, bu dizeyi Mathematica ifadesi olarak değerlendirin.


Güzel. Bundan biraz daha uzun süreceğini düşündüm ... Bunu denemenin bir yolu var mı?
Adam

@ Adám Ne yazık ki, Mathics'te çalışmıyor gibi görünüyor, bu yüzden Mathematica'nın bir kopyası olmadan, muhtemelen değil.
Martin Ender

Hâlâ
yerleşimi

@YSC Excel, 0 bayt.
Adam

@ Adám Bu meydan okuma kurallarına göre rekabet etmezdi. Ayrıca, sanırım Martin bir kurabiyeyi hak ediyor.
Outgolfer Erik

2

Clojure, 263 281 bayt

Bu olmadan lanet olası apply map vectorsonuç, A2daha önce olduğu gibi alfabetik olarak değişebilir 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)))))

Örnekler:

(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. Formüller S-ifadeleridir
  2. A2
  3. Hayır, (+ A1 A2)iyi
  4. nilve falseboş hücreler olarak çalışır, ancak boş dize
  5. Clojure
  6. S ifadeleri (Clojure + yerleşik makrolar)

İlk iş parçacığı makrosu örneği:

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

CDöngüdeki başlangıç ​​değeri bir karma haritadır, anahtarlar hücre adlarıdır ve değerler orijinal değerlerdir. Daha sonra, tüm hücre referansları, yakınsama ( Previous = Current) olana kadar referans alınan hücrelerin içeriği ile değiştirilir , daha sonra hücreler değerlendirilir ve düz yapı tekrar iç içe bir listeye bölünür.

Bir çözüm bulmak için serin olurdu A1, A2aslında çağrılabilir fonksiyonları vb sonra (* 2 B2 B3)için yeniden yazılabilir (* 2 (B2) (B3))ve idam.

Çevrimiçi deneyin!


2

APL (Dyalog) , 51 bayt

⍎¨({((⍴⍵)↑⍉⎕A∘.,1↓⎕D),¨'←',¨⍵}{0::⍵⋄×≢⍵:⍕⍎⍕⍵⋄0}¨)⍣≡
  1. Yok

  2. A2

  3. Yok

  4. Boş dize

  5. APL

  6. APL

Çevrimiçi deneyin!

⍎¨ Sonucun her hücresini şu kaynaktan değerlendirin:

()⍣≡ Hiçbir şey değişmeyene kadar aşağıdaki iki fonksiyonun sürekli uygulanması

{ uygulanacak ilk anonim işlev…

  0 herhangi bir
  :: hata durumunda:
    değiştirgeyi değiştirmeden döndür

   şimdi dene;

   Tartışmanın eğer
   taksitli:
  × pozitiftir
  : sonra:
    stringify
    değerlendirdi
    dizgelenmiş
    argüman

   Başka;

  0 sıfır döndür

 … Her hücreye

{ uygulanacak ikinci anonim işlev…

  '←',¨
   bağımsız değişkenin  her hücresine atama oku ekle

  (),¨ Her hücresine aşağıdakileri ekle

   1↓ İlk açılan
   ⎕D tüm dize D igits (yani sıfır)

   ⎕AA lafabet'in  tüm harfleri aşağıya inerken,
   ∘., bir birleştirme tablosu yapın (kalan rakamlar sağa doğru olacak şekilde)

    devrik (artan sayıları azaltmak, harfleri doğru ilerletmek için)

   ()↑ Sol üst alt matrisi boyutuyla al…

    
     argümanın  büyüklüğü

} ... önceki işlevin sonucuna.


1
Açıklamalarınız her zaman güzeldir, teşekkürler, bu cevapları okurken bildiklerimin ötesinde APL öğrenmek istiyorum.
Sihirli Ahtapot Urn

@carusocomputing Teşekkür ederim. Size yardımcı olmaktan memnuniyet duyarız. APL sohbet odasında soru ve isteklerinizi iletin . İhtiyacınız olursa kurulum yapmanıza da yardımcı olacağım.
Adám

1

Python 2 273.265.263 , 259 bayt

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

Çevrimiçi deneyin!

Seçimler:

  1. =

  2. A2

  3. Yok

  4. ""

  5. Python 2.7

  6. Python ifadeleri

Temel açıklama:

Alt listedeki her formül için, ilgili listeyle (yani, B1 [0] [1]) indeks ile değiştirin ve sonucu değerlendirin!

  • Str () backticks değiştirerek -4 bayt!

Cevabınıza yeniden içe aktarma eklemediniz. Ayrıca bu girişi geçmez:s=[[ 3, 4,"max(A1,B1)"],[ 2, 5,"A2**B2"],[ "", "","C1+C2"]]
Dead Possum

Girdi biçimi [[ 3, 4,"=max(A1,B1)"],[ 2, 5,"=A2**B2"],[ "", "","=C1+C2"]]başlıkların bir parçası olarak var! Çevrimiçi deneyin bağlantısında kontrol edin!
Keerthana Prabhakaran

1
Bayt sayısına dahil edilmelidir. Bu sitedeki diğer python cevaplarına bir göz
Dead Possum

Bu mu? Ben codeglof için netim. Yorum için teşekkürler. Ekleyeceğim.
Keerthana Prabhakaran

Diğer cevaplar göz önüne alındığında, girdiyi dahil etmediler! Güle güle ithalat sayımı ile düzenledim!
Keerthana Prabhakaran
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.