Additionner les faces d'un cube cubique


13

La somme manuelle des faces d'un cube Cubically est fastidieuse et prend du temps, comme l'écriture de code dans Cubically lui-même.

Dans Cubifier le plus efficace , je vous ai demandé de traduire ASCII en source cubique. L'une des réponses utilise une séquence d'initialisation de cube, puis modifie le cube résultant en fonction des sommes du cube pré-initialisé. Depuis, cette méthode a été utilisée dans de nombreux programmes liés à Cubic. Lors du test d'une nouvelle séquence d'initialisation, il faut additionner toutes les valeurs sur toutes les faces, ce qui prend généralement deux ou trois minutes.

Votre tâche est d'automatiser ce processus pour nous!

Vous prendrez deux entrées, un entier net une chaîne c. Ceux-ci peuvent être lus à partir des arguments de ligne de commande, des arguments de fonction, de l'entrée standard, d'un fichier ou de toute combinaison de ceux-ci. csera un cube de mémoire cubique de la taille ncomme joliment imprimé par l'interpréteur.

L'interpréteur Cubically transfère son cube vers STDERR à la fin du programme, formaté correctement pour une visualisation simple. Exécutez un programme vide dans l' interpréteur Cubically et ouvrez la section de débogage pour voir le vidage de cube d'un cube initialisé. Ajoutez un argument 4pour voir un 4x4x4, ou 5pour voir un 5x5x5, etc.

Si nest 3, csuivra ce format (les entiers seront variables):

   000
   000
   000
111222333444
111222333444
111222333444
   555
   555
   555

Espaces, nouvelles lignes et tout. Si nest 4, cressemblera à ceci (également avec des entiers variables):

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

Etc.

Votre programme affichera six entiers. Le premier entier sera la somme de tous les nombres sur la face supérieure.

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

Le deuxième entier sera la somme de la face gauche, la troisième de l'avant, la quatrième de droite, la cinquième de l'arrière et la sixième du bas.

Donc, si nc'était 3 et cétait-ce:

   242
   202
   242
000131555313
010121535343
000131555313
   424
   454
   424

Votre programme sortira 20 1 14 43 24 33.

Règles supplémentaires:

  • Les entiers en sortie doivent être délimités par des caractères non entiers. Vous pouvez également choisir de renvoyer un tableau.
  • Vous pouvez supposer que l'entrée est correcte - nest un entier et cest un cube de la sortie de débogage de Cubically . Donc, si nc'était 3.0et cétait foo bar, votre programme pourrait se casser et être toujours valide.
  • Votre programme ne doit fonctionner que pour n > 1et n < 1260. Il peut (tenter de) gérer des tailles de cube plus grandes ou plus petites, mais ce n'est pas nécessaire.

C'est le , donc le code le plus court gagne! Si vous avez besoin d'aide, n'hésitez pas à demander dans le salon de discussion Cubically .


Pouvons-nous supposer que l'entrée inclut tous les espaces de fin de manière à être un rectangle?
fireflame241

@ fireflame241 si vous voulez dire des nespaces après chaque ligne, non. Ils ne sont pas inclus dans le dépotoir.
MD XF

1
Nous avons vraiment besoin d'une balise "cubiquement".
M. Xcoder

@ Le statut Mr.Xcoder est terminé :) J'y pensais aussi, et je travaille sur quatre autres défis Cubically ATM.
MD XF

Réponses:



5

Python 2 , 155 150 147 123 121 120 octets

Pourrait probablement être joué un peu au golf

Modifier: -5 octets en utilisant une meilleure méthode pour supprimer les espaces blancs

Edit: -3 octets grâce à @Leaky Nun

Edit: -24 octets en ne supprimant pas les espaces blancs

Edit: -2 octets en exploitant la priorité

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

Essayez-le en ligne!



3

Husk , 15 octets

3 s et 2 ms

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

Essayez-le en ligne!

Explication

                  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ṁṁiest vraiment agréable!
Zgarb

3

Octave, 64 59 54 octets

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

Essayez-le en ligne!

Réponse précédente:

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

Essayez-le en ligne!

Renvoie un tableau en sortie.


Pas ce à quoi je m'attendais, mais parfaitement valable, et pour être honnête, je ne m'attendais à aucune réponse du tout. +1
MD XF

@MDXF À quoi vous attendiez-vous?
rahnema1

Je ne m'attendais pas à une réponse aussi courte, ni à cette forme d'acceptation de chaînes. Mais c'est comme ça que fait Octave; Je n'ai jamais utilisé Octave.
MD XF



1

Haskell, 128 octets

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

Accepte une chaîne avec des sauts de ligne.


1

PowerShell , 236 octets

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

Essayez-le en ligne!

Ooof, c'est long. Mais, le fractionnement et le tranchage des cordes ne sont pas l'un des points forts de PowerShell, donc je suppose que c'est quelque peu attendu. Aussi - Alors. Beaucoup. Dollars.

Prend respectivement les paramètres $net $zla taille et le cube net. Construit ensuite une fonction qui est utilisée partout. Ici, nous supprimons des espaces, séparons chaque chiffre individuel, supprimons les caractères vides entre les deux, joignons tous les caractères avec un +, puis exécutons l'instruction résultante pour obtenir un nombre. Par exemple, cela se transforme "123"en 1+2+3lequel est exécuté 6.

La ligne suivante splitest le cube d'entrée net sur les sauts de ligne, stockant le résultat dans le tableau$a . Nous effectuons ensuite la fonction sur les premières $nlignes et sortons la face supérieure du cube.

Pour l'ensemble suivant, nous devons épisser les chaînes en fonction de la taille du cube. Donc, nous parcourons chaque ligne, construisant $xcomme le motif d'expression rationnelle approprié (par exemple, pour la taille, $n=3ce sera "(...)"), divisons la chaîne en fonction de ce motif, supprimant à nouveau les éléments vides et stockons ceux-ci en quatre variables représentant les quatre faces. Celles-ci sont ensuite enchaînées de chaîne à htravers k.

La ligne suivante est ensuite envoyée hvia kla fonction pour afficher les côtés (gauche, avant, droit, arrière) du cube.

Enfin, nous exécutons le dernier $n lignes à travers la fonction pour afficher la face inférieure du cube.

Tous les nombres sont laissés sur le pipeline et la sortie est implicite.


1

APL (Dyalog Classic) , 30 27 octets

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

Rasé de 3 octets grâce à @ Adám

est n est c

Explication

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

Essayez-le en ligne!


Il me semble que 59 octets . Le remplacement par ⎕U2286n'ajoutera que 5 octets.
Adám

Mon mauvais, je jouais avec et sans enceinte partitionnée et n'utilisais que le nombre d'octets pour la version classique. Éditera ma réponse pour utiliser le niveau de migration 3 :)
Gil

1
Vous pouvez également supprimer l'espace entre 3et .
Adám

1
(6,⍺*2) → 6(⍺*2)
Adám

1
IFAICT, vous n'avez pas besoin ,après que utilise toujours son bon argument pour ravel.
Adám

0

Cubiquement , 19 octets

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

Prend le cube de STDIN et la taille comme argument de ligne de commande à l'interpréteur. Sort la somme de la face supérieure, d'un octet nul, de la face gauche, d'un octet nul, ... de la face inférieure et d'un octet nul.

Essayez-le en ligne! ... qui affiche apparemment des octets nuls comme une sorte d'espace blanc sur mon navigateur.

Cette langue n'a pas été faite pour ce défi, mais le défi a été fait pour la langue .... est-ce encore de la triche? ;)

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.