Суммируйте кубические кубические лица

13

Ручное суммирование граней кубического куба утомительно и отнимает много времени, что-то вроде написания кода в самой кубической форме.

В наиболее эффективном кубизаторе я попросил вас перевести ASCII на кубический источник. В одном из ответов используется последовательность инициализации куба, а затем изменяется полученный куб на основе сумм предварительно инициализированного куба. С тех пор этот метод использовался во многих кубических программах. При тестировании новой последовательности инициализации необходимо сложить все значения на всех гранях, что обычно занимает две или три минуты.

Ваша задача - автоматизировать этот процесс для нас!

Вы получите два ввода, целое число nи строку c. Они могут быть прочитаны из аргументов командной строки, аргументов функции, стандартного ввода, файла или любой их комбинации. cбудет куб кубической памяти размером, nкак красиво напечатано переводчиком.

Интерпретатор кубически выдает свой куб в STDERR после завершения программы, отформатированный для простого просмотра. Запустите пустую программу в интерпретаторе Cubical и откройте раздел отладки, чтобы увидеть дамп куба инициализированного куба. Добавьте аргумент, 4чтобы увидеть 4x4x4 или 55x5x5 и т. Д.

Если n3, cбудет следовать этот формат (целые числа будут переменными):

   000
   000
   000
111222333444
111222333444
111222333444
   555
   555
   555

Пробелы, переводы строк и все. Если nравно 4, cбудет выглядеть так (также с переменными целыми числами):

    0000
    0000
    0000
    0000
1111222233334444
1111222233334444
1111222233334444
1111222233334444
    5555
    5555
    5555
    5555

И так далее.

Ваша программа выведет шесть целых чисел. Первое целое число будет суммой всех чисел на верхней грани.

   000
   000          top face
   000
111222333444    left, front, right, and back faces, respectively
111222333444
111222333444
   555
   555          bottom face
   555

Второе целое число будет суммой левой грани, третьей - передней, четвертой - правой, пятой - задней и шестой - нижней.

Так что если nбыло 3 и cбыло это:

   242
   202
   242
000131555313
010121535343
000131555313
   424
   454
   424

Ваша программа будет выводить 20 1 14 43 24 33.

Дополнительные правила:

  • Выходные целые числа должны быть разделены нецелыми символами. Вы также можете вернуть массив.
  • Вы можете предположить, что ввод правильный - nэто целое число и cкуб из кубического отладочного вывода . Так что, если nбыло 3.0и cбыло foo bar, ваша программа могла сломаться и все еще быть действительной.
  • Ваша программа должна работать только для n > 1и n < 1260. Он может (пытаться) обрабатывать кубы большего или меньшего размера, но это не обязательно.

Это , поэтому выигрывает самый короткий код! Если вам нужна помощь, не стесняйтесь спрашивать в кубическом чате .

MD XF
источник
Можем ли мы предположить, что входные данные включают все конечные пробелы, чтобы быть прямоугольником?
fireflame241
@ fireflame241, если вы имеете в виду nпробелы после каждой строки, нет. Они не включены в свалку.
MD XF
1
Нам действительно нужен «кубический» тег.
г-н Xcoder
@ Mr.Xcoder статус завершен :) Я тоже так думал, и работаю над еще четырьмя кубическими вызовами банкомата.
MD XF

Ответы:

6

Желе , 16 14 13 байт

3 байта благодаря Эрику Аутгольферу.

ḟ⁶ỴV€€sS€ẎsS€

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

Дрянная Монахиня
источник
1
Спасите другого, избавившись от Z: ḟ⁶ỴV€€sS€ẎsS€(или ḟ⁶ỴV€€sS€FsS€)
Эрика Outgolfer
5

Python 2 , 155 150 147 123 121 120 байт

Вероятно, может быть в гольф совсем немного

Изменить: -5 байт, используя лучший метод для удаления пробелов

Редактировать: -3 байта благодаря @ Leaky Nun

Изменить: -24 байта, не удаляя пробелы

Изменить: -2 байта, используя приоритет

lambda n,a:[sum(sum(map(int,b[j*n:][:n]))for b in a.split("\n")[i*n:][:n])for i in range(3)for j in range(~i%2,i%2*2+2)]

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

Халвард Хаммель
источник
3

Шелуха , 15 байт

3 с и 2 mс

mṁṁiṁoC⁰TC⁰mf±¶

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

объяснение

                  Takes input as two arguments, the first being n, the second, the cube
              ¶   Split second argument into a list of lines
           m      For each line
            f±    keep only the digits (remove spaces)
         C⁰       Cut into lists of length n
    ṁ             Map then concatenate
        T           transpose
     oC⁰            then cut into lists of length n
mṁṁi              Takes list of lists of strings (or, in Husk, a list of lists of lists of chars) and returns the sum of the digits in each list
m                 Map function over list of lists
 ṁ                  map then sum
  ṁ                   map then sum
   i                  convert character to integer
H.PWiz
источник
1
mṁṁiдействительно приятно!
Згарб
3

Октава, 64 59 54 байта

@(c,n)sum(im2col(c'-48,[n n],'distinct'))([2 5:8 10])

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

Предыдущий ответ:

@(c,n)sparse(kron((1:4)+[0;4;8],!!e(n)),1,c-48)([2 5:8 10])

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

Возвращает массив в качестве вывода.

rahnema1
источник
Не то, что я ожидал, но совершенно правильно, и, честно говоря, я не ожидал никаких ответов вообще. +1
MD XF
@MDXF Чего ты ожидал?
rahnema1
Я не ожидал ни короткого ответа, ни такой формы принятия строк. Но это то, как Октав это делает; Я никогда не использовал Октаву.
MD XF
2

Python 2 , 137 127 байт

-10 байт благодаря @Halvard Hummel

lambda x,n:[sum(sum(map(int,x.split('\n')[b+j][a:a+n]))for j in range(n))for a,b in[[n,0],[0,n],[n,n],[2*n,n],[3*n,n],[n,2*n]]]

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

officialaimm
источник
2
127
Халвард Хаммель
1

Haskell, 128 байт

s n c=filter(>=0)$map(\[x,y]->sum$map(\[v,w]->fromEnum((lines c)!!(x*n+v)!!(y*n+w))-48)$n%n)$3%4
n%m=sequence[[0..n-1],[0..m-1]]

Принимает строку с разрывом строки.

Лейф Виллертс
источник
1

PowerShell , 236 байт

param($n,$z)
function f($y){$y-replace' '-split'(.)'-ne''-join'+'|iex}
$a=$z-split"`n"
f $a[0..($n-1)]
$a[$n..(2*$n-1)]|%{$x="($('.'*$n))";$1,$2,$3,$4=$_-split$x-ne'';$h+=$1;$i+=$2;$j+=$3;$k+=$4}
$h,$i,$j,$k|%{f $_}
f $a[(2*$n)..(3*$n)]

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

Ох, это долго. Но разбиение и нарезка строк не является сильной стороной PowerShell, поэтому я думаю, что это вполне ожидаемо. Также - итак. Много. Доллары.

Принимает в качестве параметров $nи $zразмер, и размер куба соответственно. Затем конструирует функцию, которая используется во всем. Здесь мы удаляем пробелы, разделяя каждую отдельную цифру, удаляя пустые символы между ними, соединяя все символы вместе с a +, а затем выполняя результирующий оператор, чтобы получить число. Например, это превращается "123"в то, 1+2+3когда выполняется 6.

Следующая строка - splitэто входная сеть кубов на новых строках, где результат сохраняется в массиве $a. Затем мы выполняем функцию в первых $nстроках и выводим верхнюю грань куба.

Для следующего набора нам нужно соединить строки в зависимости от размера куба. Итак, мы перебираем каждую строку, $xсоздавая соответствующий шаблон регулярного выражения (например, для размера, $n=3который будет "(...)"), разбиваем строку на основе этого шаблона, снова удаляя пустые элементы, и сохраняем их в четыре переменные, представляющие четыре грани. Это то строка сцеплены на hсчет k.

Следующая строка затем hпроходит kчерез функцию для вывода сторон (слева, спереди, справа, сзади) куба.

Наконец, мы $nпропускаем последние строки через функцию для вывода нижней грани куба.

Все числа остаются на конвейере, и вывод неявен.

AdmBorkBork
источник
1

APL (Dyalog Classic) , 30 27 байтов

{+/⍎¨6(⍺*2)⍴⍉⊃,⌿3⍺⍴⍵⊂⍨⍵∊⎕D}

Скинул 3 байта благодаря @ Adám

это н с

объяснение

                        ⍵⊂⍨⍵∊⎕D   c partitioned by D (digits 0..9)
                    3⍺⍴           reshape into 3 by n matrix
                 ,⌿              concatenate on first axis (results in n vectors)
              ⍉⊃                  ravel transpose mix (results in a simple string with all digits in side order)
      6(⍺*2)⍴                     reshape into 6 by n squared matrix (one row per side)
 +/⍎¨                            sum rows execute each (execute will turn characters into numbers)

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

Гил
источник
Похоже, 59 байтов для меня. Замена с ⎕U2286только добавит 5 байт , хотя.
Адам
Плохо, я играл с разделенным вложением и без него и использовал только количество байтов для классической версии.
Gil
1
Также вы можете убрать пробел между 3и .
Адам
1
(6,⍺*2) → 6(⍺*2)
Адам
1
IFAICT, вам не нужно ,после того, как всегда использует правильный аргумент в порядке расстановки.
Адам
0

Кубически 19 байтов

r%0@%1@%2@%3@%4@%5@

Принимает куб из STDIN и размер в качестве аргумента командной строки для интерпретатора. Выводит сумму верхней грани, нулевого байта, левой грани, нулевого байта, ... нижней грани и нулевого байта.

Попробуйте онлайн! ... который, по-видимому, отображает нулевые байты в качестве своего рода пробела в моем браузере.

Этот язык не был создан для этой проблемы, но проблема была сделана для языка .... это все еще обман? ;)

MD XF
источник