Contare gli angoli, i bordi e le facce di un cubo tagliato


9

Proveniente da questo post sandbox

Questo si ispira a un test di matematica di terza elementare

Intro

Abbiamo un cubo con i seguenti angoli

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)

Questo cubo ha chiaramente 8 angoli, 12 bordi e 6 facce. Se ora tagliamo l'angolo G, in modo tale che il nostro piano di taglio attraversi esattamente il centro di ciascun bordo originale adiacente, aggiungiamo 2 nuovi angoli, 3 nuovi bordi e una nuova faccia. Per favore, goditi quest'opera d'arte disegnata a mano, per un migliore chiarimento

inserisci qui la descrizione dell'immagine

Ingresso

Dato un elenco di angoli (in questo esempio identificato da AH), che verranno tagliati, calcola il nuovo numero di angoli, bordi e facce.

Prendi l'input in qualsiasi forma ti piaccia, purché risponda agli stessi angoli (ad es. Invece di AH puoi usare 1-8 o 0-7, puoi assumere che sia un elenco, csv, qualunque cosa)

Puoi presumere che l'elenco sia distinto (ogni angolo apparirà una volta al massimo), ma potrebbe essere vuoto. L'elenco non conterrà mai angoli inesistenti.

Produzione

Stampa tre numeri corrispondenti al numero di angoli, bordi e facce. L'output come elenco è esplicitamente consentito. Gli spazi bianchi finali sono consentiti

Esempi

{}        ->  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  

Infine, questo è codegolf, quindi vince la risposta più breve in byte. Si prega di astenersi da scappatoie standard.


2
Interessante ... Quindi tagliare gli angoli adiacenti significa che condividono un angolo ed eliminano un bordo? Questo è più complesso di quanto sembri inizialmente
Jo King,

Dato che imgur viene bloccato in Turchia, non riesco a vedere l'immagine. Potete per favore inviare un link di immagine alternativo
Windmill Cookies,

@JoKing sì, è corretto.
infinitezero,

@WindmillCookies Mi dispiace, non lo sapevo. Ho usato un host diverso ora.
infinitezero

2
Ad esempio, posso usare 0 per A, 1 per C, 2 per B, 3 per D, 4 per E, 5 per G, 6 per F, 7 per H? O dovrei mantenere l'ordine di ABCDEFGH?
TSH

Risposte:


2

Gelatina , 23 byte

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

Un collegamento monadico. L'input è un elenco di angoli del cubo come coordinate cartesiane (cubo allineato con il sistema di coordinate). L'uscita è un elenco di numeri interi, [faces, corners, edges].

Provalo online!

Come?

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 gli angoli devono essere "ordinati" come sono nella domanda, allora questo funziona con numeri interi 0-7 come AH per 25 byte: 3R×L+“©®€‘ɓŒc^/€ḟ2<5S;`Żạ(riduce usando XOR, filtra due, quindi conta quelli meno di cinque).


1

Carbone , 48 45 byte

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

Provalo online! Il collegamento è alla versione dettagliata del codice. Utilizza le cifre 0-7per rappresentare le lettere ABDCEFHGnel diagramma. Output nell'ordine di facce, angoli, bordi. Spiegazione:

≔Eθ↨℅ι²η

Prendi il codice ASCII di ogni carattere e convertilo in base 2.

≔⊘№⭆η⭆η

Prendi il prodotto cartesiano dell'elenco dei numeri di base 2 con se stesso.

ΣEι↔⁻§λξν1η

XOR insieme le coppie di numeri base 2 e somma il numero di 1 bit. Contare quante coppie hanno una somma di 1 e dividerlo per 2. Questo dà il numero di angoli coincidenti.

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

Calcola e stampa il numero di facce, angoli e bordi.



1

Perl 6 , 59 58 byte

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

Provalo online!

Utilizza i numeri 0per 7rappresentare gli angoli. Probabilmente avrei dovuto abbinarli allo stesso ordine della domanda ... oops? Emette un elenco nell'ordine faces, corners, edges.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.