Zsumuj twarze sześcianu sześciennego

13

Ręczne sumowanie ścian Cubic Cubic jest żmudne i czasochłonne, trochę jak pisanie kodu w Cubically.

W „ Najbardziej wydajnym kubizatorze” poprosiłem cię o przetłumaczenie ASCII na źródło sześcienne. Jedna z odpowiedzi tam wykorzystuje sekwencję inicjalizacji kostki, a następnie modyfikuje wynikową kostkę na podstawie sum wstępnie zainicjowanej kostki. Od tego czasu ta metoda jest używana w wielu programach związanych z kubią. Podczas testowania nowej sekwencji inicjalizacji należy zsumować wszystkie wartości na wszystkich twarzach, co zwykle zajmuje dwie lub trzy minuty.

Twoim zadaniem jest zautomatyzowanie tego procesu dla nas!

Weźmiesz dwa dane wejściowe, liczbę całkowitą ni ciąg c. Można je odczytać z argumentów wiersza poleceń, argumentów funkcji, standardowego wejścia, pliku lub dowolnej ich kombinacji. cbędzie sześcianową kostką pamięci o wielkości nwydrukowanej przez tłumacza.

Interpretator sześcienny zrzuca swoją kostkę do STDERR po zakończeniu programu, ładnie sformatowany dla łatwego przeglądania. Uruchom pusty program w interpretatorze sześciennym i otwórz sekcję debugowania, aby zobaczyć zrzut kostki zainicjowanej kostki. Dodaj argument, 4aby zobaczyć 4x4x4 lub 55x5x5 itp.

Jeśli nma wartość 3, czastosuje ten format (liczby całkowite będą zmienne):

   000
   000
   000
111222333444
111222333444
111222333444
   555
   555
   555

Spacje, znaki nowej linii i inne. Jeśli njest 4, cbędzie wyglądać tak (również ze zmiennymi liczbami całkowitymi):

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

I tak dalej.

Twój program wyświetli sześć liczb całkowitych. Pierwsza liczba całkowita będzie sumą wszystkich liczb na górnej powierzchni.

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

Druga liczba całkowita będzie sumą lewej twarzy, trzecia z przodu, czwarta z prawej, piąta z tyłu i szósta z dołu.

Więc jeśli nbyło 3, a cbyło to:

   242
   202
   242
000131555313
010121535343
000131555313
   424
   454
   424

Twój program wyświetli 20 1 14 43 24 33.

Dodatkowe zasady:

  • Wyjściowe liczby całkowite muszą być rozdzielane znakami niecałkowitymi. Możesz także zwrócić tablicę.
  • Możesz założyć, że dane wejściowe są prawidłowe - njest liczbą całkowitą i cjest sześcianem z wyjścia debugowania Cubically . Więc jeśli nbył 3.0i cbył foo bar, twój program może się zepsuć i nadal być ważny.
  • Twój program musi działać tylko dla n > 1i n < 1260. To może (próbować) obsłużyć większe lub mniejsze rozmiary kostki, ale nie jest to konieczne.

To jest , więc wygrywa najkrótszy kod! Jeśli potrzebujesz pomocy, możesz poprosić o pokój na czacie Cubically .

MD XF
źródło
Czy możemy założyć, że dane wejściowe obejmują wszystkie spacje końcowe, tak aby były prostokątem?
fireflame241
@ fireflame241, jeśli masz na myśli nspacje po każdej linii, nie. Nie są uwzględnione w zrzutu.
MD XF,
1
Naprawdę potrzebujemy tagu „sześciennego”.
Pan Xcoder,
@ Status Mr.Xcodera zakończony :) Też o tym myślałem i pracuję nad czterema kolejnymi bankomatami o kubicznym wyzwaniu.
MD XF,

Odpowiedzi:

6

Galaretka , 16 14 13 bajtów

3 bajty dzięki Erikowi Outgolfer.

ḟ⁶ỴV€€sS€ẎsS€

Wypróbuj online!

Leaky Nun
źródło
1
Uratuj kolejnego, pozbywając się Z: ḟ⁶ỴV€€sS€ẎsS€(lub ḟ⁶ỴV€€sS€FsS€)
Erik the Outgolfer,
5

Python 2 , 155 150 147 123 121 120 bajtów

Prawdopodobnie może być trochę golfa

Edytuj: -5 bajtów przy użyciu lepszej metody usuwania białych znaków

Edycja: -3 bajty dzięki @Leaky Nun

Edytuj: -24 bajty, nie usuwając białych znaków

Edytuj: -2 bajty, wykorzystując pierwszeństwo

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

Wypróbuj online!

Halvard Hummel
źródło
3

Łuska , 15 bajtów

3 s i 2 ms

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

Wypróbuj online!

Wyjaśnienie

                  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
źródło
1
mṁṁijest naprawdę fajne!
Zgarb,
3

Oktawa, 64 59 54 bajtów

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

Wypróbuj online!

Poprzednia odpowiedź:

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

Wypróbuj online!

Zwraca tablicę jako wynik.

rahnema1
źródło
Nie tego się spodziewałem, ale całkowicie poprawny i szczerze mówiąc nie spodziewałem się żadnych odpowiedzi. +1
MD XF
@MDXF Czego się spodziewałeś?
rahnema1
Nie spodziewałem się takiej krótkiej odpowiedzi, ani tej formy akceptacji ciągów. Ale tak właśnie robi Octave; Nigdy nie korzystałem z Octave.
MD XF,
2

Perl 5 , 66 + 1 (-n) = 67 bajtów

$j=$k<6?$k++/3:5;s/\d{3}/';$r[$j++]+='.$&=~s|.|+$&|gr/gee}{say"@r"

Wypróbuj online!

Xcali
źródło
2

Python 2 , 137 127 bajtów

-10 bajtów dzięki @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]]]

Wypróbuj online!

Officialaimm
źródło
2
127
Halvard Hummel,
1

Haskell, 128 bajtów

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

Akceptuje ciąg znaków z podziałem linii.

Leif Willerts
źródło
1

PowerShell , 236 bajtów

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

Wypróbuj online!

Oj, to jest długie. Ale dzielenie i krojenie łańcuchów nie jest jednym z mocnych kolorów PowerShell, więc myślę, że jest to nieco oczekiwane. Także - So. Wiele. Dolary

Pobiera parametry $noraz $zodpowiednio wielkość i siatkę sześcianu. Następnie konstruuje funkcję, która będzie używana przez cały czas. Tutaj usuwamy spacje, dzielimy na poszczególne cyfry, usuwamy puste znaki pomiędzy, łączymy wszystkie znaki razem z a +, a następnie wykonujemy wynikową instrukcję, aby uzyskać liczbę. Na przykład zmienia się "123"w to, 1+2+3kiedy jest wykonywany 6.

Następny wiersz splitto wejściowa siatka kostki na nowych liniach , przechowująca wynik w tablicy $a. Następnie wykonujemy funkcję w pierwszych $nwierszach i wyprowadzamy górną powierzchnię sześcianu.

W następnym zestawie musimy podzielić łańcuchy na podstawie wielkości kostki. Pętlimy więc każdą linię, konstruując $xjako odpowiedni wzorzec wyrażenia regularnego (np. Dla rozmiaru $n=3to będzie "(...)"), dzielimy ciąg na podstawie tego wzorca, ponownie usuwając puste elementy i przechowujemy je w czterech zmiennych reprezentujących cztery ściany. Te są następnie łączone na ciąg hprzez k.

Następna linia hprzechodzi następnie przez kfunkcję, aby wyprowadzić boki (lewy, przedni, prawy, tylny) sześcianu.

Na koniec uruchamiamy ostatnie $nwiersze przez funkcję, aby wyprowadzić dolną powierzchnię sześcianu.

Wszystkie liczby pozostają w potoku, a dane wyjściowe są niejawne.

AdmBorkBork
źródło
1

APL (Dyalog Classic) , 30 27 bajtów

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

Wygolono 3 bajty dzięki @ Adám

jest n jest c

Wyjaśnienie

                        ⍵⊂⍨⍵∊⎕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)

Wypróbuj online!

Gil
źródło
Wygląda mi na 59 bajtów . Jednak zastąpienie go ⎕U2286spowoduje dodanie tylko 5 bajtów.
Adám
Mój zły, grałem zi bez partycjonowanego załączania i użyłem tylko liczby bajtów dla wersji Classic. Zmodyfikuję moją odpowiedź, aby użyć poziomu migracji 3 :)
Gil
1
Możesz także usunąć spację między 3i .
Adám
1
(6,⍺*2) → 6(⍺*2)
Adám
1
IFAICT, nie trzeba ,potem jak zawsze wykorzystuje swój prawy argument w wystrzępionego kolejności.
Adám
0

Sześciennie , 19 bajtów

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

Pobiera kostkę ze STDIN i rozmiar jako argument wiersza poleceń do interpretera. Zwraca sumę górnej powierzchni, bajtu zerowego, lewej powierzchni, bajtu zerowego, ... dolnej powierzchni i bajtu zerowego.

Wypróbuj online! ... który najwyraźniej wyświetla puste bajty jako rodzaj białych znaków w mojej przeglądarce.

Ten język nie został stworzony dla tego wyzwania, ale wyzwanie zostało stworzone dla języka ... czy nadal oszukuje? ;)

MD XF
źródło