Підсумовуйте грані кубика


13

Вручну підсумовувати обличчя кубичного куба є втомливим і трудомістким, таким чином, як написання коду в самому кубічно.

У найефективнішому кубіфікаторі я попросив вас перекласти ASCII на кубічний джерело. Один з відповідей там використовує послідовність ініціалізації куба, а потім модифікує отриманий куб на основі сум попередньо ініціалізованого куба. Цей метод застосовується у багатьох програмах, пов’язаних з кубікою. Під час тестування нової послідовності ініціалізації потрібно додати всі значення на всіх гранях, що зазвичай займає дві-три хвилини.

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

Ви візьмете два входи, ціле число nта рядок c. Вони можуть бути прочитані з аргументів командного рядка, аргументів функції, стандартного введення, файлу або будь-якої їх комбінації. cбуде кубиком пам'яті куба розміром, nяк симпатично надрукований перекладачем.

Кубічний перекладач скидає свій куб на STDERR після завершення програми, відформатований для простого перегляду. Запустіть порожню програму в інтерпретаторі Куб і відкрийте розділ налагодження, щоб побачити куб скидання ініціалізованого куба. Додайте аргумент, 4щоб побачити 4x4x4 або 5переглянути 5x5x5 тощо.

Якщо nце 3, cдотримуйтесь цього формату (цілі числа будуть змінними):

   000
   000
   000
111222333444
111222333444
111222333444
   555
   555
   555

Простори, нові лінії та інше. Якщо n4, cбуде виглядати так (також зі змінними цілими числами):

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

Et cetera.

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

   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є кубом з виводу налагодження Cubically . Тож якщо nбула 3.0і cбула foo bar, ваша програма може зламатись і все-таки діяти.
  • У вашій програмі потрібно працювати лише для n > 1та n < 1260. Він може (намагатися) обробляти більші або менші розміри кубів, але це не обов'язково.

Це , тому найкоротший код виграє! Якщо вам потрібна допомога, не соромтеся запитати у кубічній кімнаті .


Чи можемо ми припустити, що вхід включає всі проміжки, що знаходяться в кінці, щоб бути прямокутником?
fireflame241

@ fireflame241, якщо ви маєте на увазі nпробіли після кожного рядка, ні. Вони не включаються до сміттєзвалища.
MD XF

1
Нам дійсно потрібна «кубічна» бирка.
Містер Xcoder

@ Mr.Xcoder статус завершено :) Я теж думав про це, і я працюю над ще чотирма кубічно викликами банкоматів.
MD XF

Відповіді:



5

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

Можливо, можливо, було б багато в гольфі

Редагувати: -5 байт, використовуючи кращий метод видалення пробілів

Редагувати: -3 байти завдяки монахині @Leaky

Редагувати: -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

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

Спробуйте в Інтернеті!

Повертає масив як вихід.


Не те, що я очікував, але цілком справедливо, і якщо чесно, я взагалі не очікував відповідей. +1
MD XF

@MDXF Що ти очікував?
rahnema1

Я не очікував такої відповіді, як і такої форми прийняття рядків. Але це просто так, як це робить Октав; Я ніколи не використовував Octave.
MD XF



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рядки через функцію для виведення нижньої грані куба.

Всі номери залишаються на конвеєрі, а вихід непрямий.


1

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

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

Поголив 3 байти завдяки @ Adám

є n є c

Пояснення

                        ⍵⊂⍨⍵∊⎕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 байт.
Адам

Моє погано, я грав з додаванням і без розділів, і лише використовував кількість байтів для класичної версії. Відредагую мою відповідь, щоб використовувати рівень міграції 3 :)
Жил

1
Також можна видалити пробіл між 3і .
Адам

1
(6,⍺*2) → 6(⍺*2)
Адам

1
IFAICT, вам не потрібно ,після того, як завжди використовує правильний аргумент у несанкціонованому порядку.
Адам

0

Кубічно , 19 байт

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

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

Спробуйте в Інтернеті! ... який, мабуть, відображає нульові байти як якийсь пробіл у моєму браузері.

Ця мова не була зроблена для цього виклику, але виклик був зроблений для мови .... це все-таки обман? ;)

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