Soma as faces de um cubo cubicamente

13

A soma manual de faces de um cubo Cubically é entediante e demorada, como escrever código no próprio Cubically.

No cubificador Mais eficiente , pedi para você traduzir o ASCII para o código-fonte Cubically. Uma das respostas lá usa uma sequência de inicialização do cubo e modifica o cubo resultante com base nas somas do cubo pré-inicializado. Este método tem sido usado em muitos programas relacionados ao Cubically desde então. Ao testar uma nova sequência de inicialização, é necessário adicionar todos os valores em todas as faces, o que geralmente leva dois ou três minutos.

Sua tarefa é automatizar esse processo para nós!

Você receberá duas entradas, um inteiro ne uma string c. Eles podem ser lidos a partir de argumentos de linha de comando, argumentos de função, entrada padrão, um arquivo ou qualquer combinação desses. cserá um cubo de tamanho cúbico de memória,n conforme impresso pelo intérprete.

O intérprete Cubically despeja seu cubo no STDERR após o término do programa, formatado de maneira agradável para visualização simples. Execute um programa vazio no interpretador Cubically e abra a seção de depuração para ver o despejo de cubo de um cubo inicializado. Adicione um argumento 4para ver um 4x4x4 ou 55x5x5 etc.

Se nfor 3, cseguirá este formato (os números inteiros serão variáveis):

   000
   000
   000
111222333444
111222333444
111222333444
   555
   555
   555

Espaços, novas linhas e tudo. Se nfor 4, cficará assim (também com números inteiros variáveis):

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

Et cetera.

Seu programa produzirá seis números inteiros. O primeiro número inteiro será a soma de todos os números na face superior.

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

O segundo número inteiro será a soma da face esquerda, o terceiro a frente, o quarto a direita, o quinto atrás e o sexto inferior.

Então, se nfoi 3 e cfoi isso:

   242
   202
   242
000131555313
010121535343
000131555313
   424
   454
   424

Seu programa seria exibido 20 1 14 43 24 33.

Regras adicionais:

  • Os números inteiros de saída devem ser delimitados por caracteres não inteiros. Você também pode optar por retornar uma matriz.
  • Você pode assumir que a entrada está correta - né um número inteiro e cé um cubo da saída de depuração do Cubically . Portanto, se nfoi 3.0e cfoi foo bar, seu programa pode ser interrompido e ainda ser válido.
  • Seu programa precisa apenas trabalhar para n > 1e n < 1260. Ele pode (tentar) lidar com tamanhos maiores ou menores do cubo, mas não é necessário.

Isso é , então o código mais curto vence! Se precisar de ajuda, não hesite em perguntar na sala de bate-papo do Cubically .

MD XF
fonte
Podemos assumir que a entrada inclui todos os espaços finais, de modo a ser um retângulo?
Fireflame241
@ fireflame241 se você quer dizer nespaços após cada linha, não. Eles não estão incluídos no despejo.
MD XF
1
Nós realmente precisamos de uma tag "cubicamente".
Mr. Xcoder
@ Status do Mr.Xcoder concluído :) Eu também estava pensando nisso e estou trabalhando em mais quatro desafios do ATM.
MD XF

Respostas:

6

Geléia , 16 14 13 bytes

3 bytes graças a Erik, o Outgolfer.

ḟ⁶ỴV€€sS€ẎsS€

Experimente online!

Freira Furada
fonte
1
Salve outro, livrando-se de Z: ḟ⁶ỴV€€sS€ẎsS€(ou ḟ⁶ỴV€€sS€FsS€)
Erik the Outgolfer
5

Python 2 , 155 150 147 123 121 120 bytes

Provavelmente poderia ser jogado um pouco

Editar: -5 bytes usando um método melhor para remover os espaços em branco

Edit: -3 bytes graças a @Leaky Nun

Editar: -24 bytes, não removendo espaços em branco

Editar: -2 bytes, explorando a precedência

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

Experimente online!

Halvard Hummel
fonte
3

Casca , 15 bytes

3 se 2 ms

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

Experimente online!

Explicação

                  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
fonte
1
mṁṁiÉ realmente bom!
Zgarb 19/08/19
3

Oitava, 64 59 54 bytes

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

Experimente online!

Resposta anterior:

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

Experimente online!

Retorna uma matriz como saída.

rahnema1
fonte
Não o que eu esperava, mas perfeitamente válido, e para ser honesto, eu não esperava nenhuma resposta. +1
MD XF
@MDXF O que você esperava?
precisa saber é o seguinte
Eu não esperava essa resposta curta, nem essa forma de aceitar cordas. Mas é assim que o Octave faz isso; Eu nunca usei o Octave.
MD XF
2

Perl 5 , 66 + 1 (-n) = 67 bytes

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

Experimente online!

Xcali
fonte
2

Python 2 , 137 127 bytes

-10 bytes graças a @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]]]

Experimente online!

officialaimm
fonte
2
127
Halvard Hummel
1

Haskell, 128 bytes

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

Aceita uma string com quebras de linha.

Leif Willerts
fonte
1

PowerShell , 236 bytes

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

Experimente online!

Ooof, isso é longo. Mas dividir e cortar cordas não é um dos pontos fortes do PowerShell, então acho que é algo esperado. Também. Muitos. Dólares.

Toma em parâmetros $ne $zcomo o tamanho e a rede do cubo, respectivamente. Em seguida, constrói uma função que é usada por toda parte. Aqui, estamos removendo espaços, dividindo cada dígito individual, removendo os caracteres vazios no meio, juntando todos os caracteres com +ae executando a instrução resultante para obter um número. Por exemplo, isso se transforma "123"no 1+2+3qual, quando executado, é6 .

A próxima linha splité a rede do cubo de entrada em novas linhas, armazenando o resultado na matriz $a. Em seguida, executamos a função nas primeiras $nlinhas e produzimos a face superior do cubo.

Para o próximo conjunto, precisamos dividir as seqüências de caracteres com base no tamanho do cubo. Então, percorremos cada linha, construindo $xcomo o padrão regex apropriado (por exemplo, para o tamanho que $n=3será esse "(...)"), dividimos a string com base nesse padrão, removendo novamente elementos vazios e armazenando-os em quatro variáveis ​​que representam as quatro faces. Aqueles são então concatenados na hpassagem k.

A próxima linha é enviada hatravés kda função para exibir os lados (esquerdo, dianteiro, direito, traseiro) do cubo.

Finalmente, executamos as últimas $nlinhas através da função para exibir a face inferior do cubo.

Todos os números são deixados no pipeline e a saída está implícita.

AdmBorkBork
fonte
1

APL (Dyalog Classic) , 30 27 bytes

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

Raspou 3 bytes graças a @ Adám

é n é c

Explicação

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

Experimente online!

Gil
fonte
Parece 59 bytes para mim. Substituir por ⎕U2286adicionará apenas 5 bytes.
Adám 22/08/19
Meu mal, eu estava jogando com e sem colocar particionado e usei apenas a contagem de bytes para a versão Classic. Vou editar minha resposta para usar o nível de migração 3 :)
Gil
1
Além disso, você pode remover o espaço entre 3 e .
Adám 22/08/17
1
(6,⍺*2) → 6(⍺*2)
Adám
1
IFAICT, você não precisa ,depois, como sempre, usa o argumento certo em ordem de classificação.
Adám 22/08/19
0

Cubicamente , 19 bytes

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

Leva o cubo de STDIN e o tamanho como argumento da linha de comando para o intérprete. Produz a soma da face superior, um byte nulo, a face esquerda, um byte nulo, ... a face inferior e um byte nulo.

Experimente online!... que aparentemente exibe bytes nulos como algum tipo de espaço em branco no meu navegador.

Esse idioma não foi feito para esse desafio, mas o desafio foi feito para o idioma ... ainda está trapaceando? ;)

MD XF
fonte