Оцініть просту електронну таблицю


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. Точки Brownie або файли 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, wiz. визначення і додаток і переважність.


Чи надано відповідь у Excel / VBA заборонено? Expand array to cells, evaluate.
Чарівний восьминога Урна

@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()(так, та зла справа, яка переслідує вас у ваших кошмарах ). Це рішення передбачає, що константи, надані у вхідному масиві, мають тип Integer.

Випробування

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 також \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, в рекурсивную анонімну функцію і 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 застосував мене до нового підходу, щоб виправити другий приклад ... і багато врятував у процесі ... плюс подальший гольф
Тіт

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)

Почнемо з заміни всіх порожніх рядків вхідних даних ( #) нулями і збереження результату в m, тому що нам це буде потрібно знову в іншому місці.

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

Неодноразово замінюйте будь-який інший рядок sнаступним ...

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

Що містить будь-які подстроки форми RxCyв sі замінити їх ...

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

Що дає m[[x,y]], що використовує xі yяк індекси в матрицю m.

...ToExpression@...

Фіналлц, оцініть цей рядок як вираз Mathematica.


Класно. Я думав, що це займе трохи більше часу ... Будь-який спосіб спробувати це?
Адам

@ Adám На жаль, схоже, це не працює в Mathics, тому без копії Mathematica, мабуть, не вийде.
Мартін Ендер

Ще чекаю на вбудований ...
YSC

@YSC Excel, 0 байт.
Адам

@ Adám Це не було б конкуренцією за правилами цього виклику. Також я думаю, що Мартін заслуговує на печиво.
Erik the Outgolfer

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. Clojure
  6. S-вирази (Clojure + будь-які вбудовані макроси)

Приклад потоку першого макросу:

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

Вихідне значення Cциклу - це хеш-карта, ключі - імена комірок, а значення - вихідні значення. Тоді всі посилання на клітинки замінюються вмістом посилаються комірок, поки ми не сходимося ( 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
    оціночного
    строкового
    аргументу

   інше;

  0 повернути нуль

 … До кожної комірки

{ друга анонімна функція, що застосовується…

  '←',¨ додати стрілку призначення для кожної комірки
   аргументу

  (),¨ Додайте наступне до кожної комірки цього

   1↓випаде  перший з
   ⎕D рядка всіх D- іг (тобто нуль)

   ⎕A З всі букви A lphabet спускаючись,
   ∘., зробити конкатенації таблиці (а решта цифри ладяться)

    транспонировать (щоб зменшити кількість номерів, прогресуючи літери вправо)

   ()↑ Візьміть верхню ліву підматрицю розміром…

     розмір
     аргументу

} … До результату попередньої функції.


1
Ваші пояснення завжди прекрасні, дякую, змушує мене захотіти вивчити APL понад те, що я мало знаю, читаючи ці відповіді.
Чарівний Восьминіг Урна

@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. А2

  3. жоден

  4. ""

  5. Python 2.7

  6. Вирази пітона

Основне пояснення:

Для кожної формули в підзаписі замініть її відповідним списком (тобто для B1 s [0] [1]) індексом та оцініть результат!

  • -4 байти, змінивши str () на зворотній зв'язок!

Ви не додали імпорту повтору у свою відповідь. Також не проходить цей вхід: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
Він повинен бути включений у кількість байтів. Просто ознайомтесь з іншими відповідями python на цьому сайті
Dead Possum

Є це? Я чистий до codeglof. Дякуємо за коментар Додамо.
Keerthana Prabhakaran

Що стосується інших відповідей, вони не включали вхідні дані! Я відредагував кількість показів імпорту!
Keerthana Prabhakaran
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.