Contar os cantos, arestas e faces de um cubo cortado

9

Vindo desta postagem do sandbox

Isso é inspirado em um teste de matemática da 8ª série

Introdução

Temos um cubo com os seguintes cantos

A(0, 0, 0)
B(1, 0, 0)
C(1, 1, 0)
D(0, 1, 0)
E(0, 0, 1)
F(1, 0, 1)
G(1, 1, 1)
H(0, 1, 1)

Este cubo possui claramente 8 cantos, 12 arestas e 6 faces. Se agora cortamos o canto G, de modo que nosso plano de corte passe exatamente no meio de cada aresta original adjacente, adicionamos 2 novos cantos, 3 novas arestas e uma nova face. Por favor, aproveite esta obra de arte desenhada à mão, para melhor esclarecimento

insira a descrição da imagem aqui

Entrada

Dada uma lista de cantos (neste exemplo, identificados por AH), que serão cortados, calcule o novo número de cantos, arestas e faces.

Você faz a entrada da forma que desejar, desde que ela responda aos mesmos cantos (por exemplo, em vez de AH, você pode usar 1-8 ou 0-7, você pode assumir que seja uma lista, csv, o que for)

Você pode supor que a lista seja distinta (todos os cantos aparecerão uma vez no máximo), mas pode estar vazia. A lista nunca conterá cantos inexistentes.

Resultado

Saída de três números correspondentes ao número de cantos, arestas e faces. A saída como uma lista é explicitamente permitida. Espaços em branco à direita são permitidos

Exemplos

{}        ->  8, 12,  6 (empty list)  
{A}       -> 10, 15,  7  
{A,C}     -> 12, 18,  8   
{A,C,F}   -> 14, 21,  9  
{A,B,C}   -> 12, 19,  9  
{A,B,C,D} -> 12, 20, 10  

Finalmente, este é um codegolf, e a resposta mais curta em bytes vence. Evite brechas comuns.

infinitezero
fonte
2
Interessante ... Então, cortar cantos adjacentes significa que eles compartilham um canto e eliminam uma aresta? Este é mais complexa do que parece à primeira
Jo rei
Desde que o imgur está bloqueado na Turquia, não consigo ver a imagem. Você pode, por favor, enviar um link de imagem alternativo
Windmill Cookies
@ JoKing sim, isso está correto.
infinitezero
@WindmillCookies Me desculpe, eu não sabia disso. Eu usei um host diferente agora.
infinitezero
2
Por exemplo, posso usar 0 para A, 1 para C, 2 para B, 3 para D, 4 para E, 5 para G, 6 para F, 7 para H? Ou devo manter a ordem do ABCDEFGH?
Tsh #

Respostas:

2

Gelatina , 23 bytes

3R×L+“©®€‘ɓŒcn/€§ċ1;`Żạ

Um link monádico. Entrada é uma lista de cantos do cubo como coordenadas cartesianas (cubo alinhado com o sistema de coordenadas). Saída é uma lista de números inteiros [faces, corners, edges],.

Experimente online!

Como?

3R×L+“©®€‘ɓŒcn/€§ċ1;`Żạ - Link: list of lists, C          e.g. [[0,1,1],[1,1,0],[1,1,1],[0,0,0]] -- this could represent "FHGA"
3R                      - range of 3                           [1,2,3]
   L                    - length of C                          4
  ×                     - multiply                             [4,8,12]
     “©®€‘              - list of code-page indices            [6,8,12]
    +                   - add                                  [10,16,24]
          ɓ             - start a new dyadic chain, f(C,X) where X is the above result
           Œc           - pairs of C                           [[[0,1,1],[1,1,0]],[[0,1,1],[1,1,1]],[[0,1,1],[0,0,0]],[[1,1,0],[1,1,1]],[[1,1,0],[0,0,0]],[[1,1,1],[0,0,0]]]
              /€        - reduce €ach with:
             n          -   (vectorising) not equal?           [[1,0,1],[1,0,0],[0,1,1],[0,0,1],[1,1,0],[1,1,1]]
                §       - sum each                             [2,1,2,1,2,3]
                 ċ1     - count ones                           2
                   ;`   - concatenate with itself              [2,2]
                     Ż  - prepend a zero                       [0,2,2]
                      ạ - absolute difference with X           [10,14,22]

Se os cantos precisarem ser "ordenados" como estão na pergunta, isso funcionará com números inteiros de 0 a 7 como AH por 25 bytes: 3R×L+“©®€‘ɓŒc^/€ḟ2<5S;`Żạ(reduz usando XOR, filtra dois e depois conta menos de cinco).

Jonathan Allan
fonte
1

Carvão , 48 45 bytes

≔Eθ↨℅ι²η≔⊘№⭆η⭆ηΣEι↔⁻§λξν1ηIE⟦⁶⁻⁸η⁻¹²η⟧⁺ι×⊕κLθ

Experimente online! Link é a versão detalhada do código. Usa dígitos 0-7para representar as letras ABDCEFHGno diagrama. Saídas nas faces, cantos e arestas da ordem. Explicação:

≔Eθ↨℅ι²η

Pegue o código ASCII de cada caractere e converta-o para a base 2.

≔⊘№⭆η⭆η

Pegue o produto cartesiano da lista de números da base 2 consigo mesmo.

ΣEι↔⁻§λξν1η

XOR os pares de números da base 2 juntos e somar o número de 1 bits. Conte quantos pares têm uma soma de 1 e divida-a por 2. Isso fornece o número de cantos coincidentes.

IE⟦⁶⁻⁸η⁻¹²η⟧⁺ι×⊕κLθ

Calcule e imprima o número de faces, cantos e arestas.

Neil
fonte
1

Perl 6 , 59 58 bytes

{6+@_,|((2,3 X*4+@_)X-(@_ X~@_)∩~<<ords "% 286
>C/")}

Experimente online!

Usa os números 0para 7representar os cantos. Eu provavelmente deveria combiná-los com a mesma ordem que na pergunta ... oops? Produz uma lista na ordem faces, corners, edges.

Brincadeira
fonte