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

13

правила

  1. Нет ссылок на диапазон ячеек ( A2:B3).

  2. Максимум 9 строк и 9 столбцов.

  3. Нет циклических ссылок или формул ошибок.

  4. Пустые клетки оценивают до 0.

  5. Данные являются только числами, но могут быть приняты как строки.

  6. Формулы - это строки.

Варианты реализации

Вы должны указать свой выбор в этих вопросах:

  1. Требуется, чтобы в формулах использовался префикс с любым отдельным символом, например, =- или нет.

  2. Крайняя левая ячейка второй строки - A2или R2C1, согласно двум соглашениям, используемым Excel et al.

  3. Требовать любой односимвольный пре- или суффикс в ссылках на ячейки, например, $- или нет.

  4. Одно из пустых, пустых строк, пустых списков и т. Д. (Но не 0) для представления пустых ячеек.

  5. Язык представления (менеджеры электронных таблиц не допускаются).

  6. Язык для формул (может отличаться от приведенного выше). *

  7. Брауни указывает или печенье для объяснения вашего решения.

Примеры

Выбор: 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,?
Конор О'Брайен
@ ConorO'Brien Нет, это должно быть одно из двух соглашений, используемых Excel et al.
Адам

Ответы:

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 да, но контрольные примеры могут быть неполными. В любом случае, я предполагал, что выбранным правилам нужно следовать; но они могут быть только входными ограничениями (или обоими), так что это тоже может быть проблемой
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
                .';'
            );
        }
    );
}
Titus
источник
+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 предложил мне новый подход к исправлению второго примера ... и много сэкономил в процессе ... плюс дальнейшая игра в гольф
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)

Мы начнем с замены всех пустых строк в input ( #) нулями и сохранения результата в 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 К сожалению, это не работает в математике, поэтому без копии Mathematica, вероятно, нет.
Мартин Эндер
Тем не менее в ожидании ... встроенной команды
СМУ
@ YSC Excel, 0 байт.
Адам
@ Adám Это не будет соревноваться по правилам этого конкурса. Кроме того, я думаю, что Мартин заслуживает печенье.
Эрик 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в цикле - это хэш-карта, ключи - это имена ячеек, а значения - это исходные значения. Затем все ссылки на ячейки заменяются содержимым ссылочных ячеек, пока мы не Pсойдемся ( revious =C urrent), затем ячейки будут оценены, и плоская структура будет разделена обратно во вложенный список.

Было бы здорово найти решение, где A1и A2т. Д. Фактически являются вызываемыми функциями, а затем (* 2 B2 B3)могли бы быть переписаны (* 2 (B2) (B3))и выполнены.

Попробуйте онлайн!

NikoNyrh
источник
2

APL (Дьялог) , 51 байт

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

  2. A2

  3. Никто

  4. Пустая строка

  5. APL

  6. APL

Попробуйте онлайн!

⍎¨ Оцените каждую ячейку результата от

()⍣≡ Непрерывное применение следующих двух функций, пока ничего не изменится

{ первая анонимная функция, которая будет применена ...

  0 при любой
  :: ошибке:
    вернуть аргумент без изменений

   сейчас попробуй;

   если аргумент
   подсчитан:
  × является положительным,
  : то:
    зафиксируйте
    оцененный
    строковый
    аргумент

   еще;

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

 … В каждую клетку

{ вторая анонимная функция для применения ...

  '←',¨ добавить стрелку присваивания каждой ячейке
   аргумента

  (... ),¨ добавьте следующее к каждой ячейке этого

   1↓ опускать первый из
   ⎕D строки всех D igits (т.е. ноль)

   ⎕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. A2

  3. никто

  4. «»

  5. Python 2.7

  6. Выражения Python

Основное объяснение:

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

  • -4 байта путем замены str () на backticks!
Кеертана Прабхакаран
источник
Вы не добавили импорт re в своем ответе. Также он не передает этот вход:s=[[ 3, 4,"max(A1,B1)"],[ 2, 5,"A2**B2"],[ "", "","C1+C2"]]
Мертвый Опоссум
Формат ввода - [[ 3, 4,"=max(A1,B1)"],[ 2, 5,"=A2**B2"],[ "", "","=C1+C2"]]Это как часть заголовков! Проверьте это по ссылке онлайн!
Киртана Прабхакаран
1
Это должно быть включено в число байтов. Просто посмотрите ответы других питонов на этом сайте
Dead Possum
Это? Я чистый для codeglof. Спасибо за комментарий. Добавлю это.
Киртана Прабхакаран
Что касается других ответов, то они не включили вход! Я редактировал с пока счет импорта!
Киртана Прабхакаран