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 .

MD XF
la source
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:

6

Gelée , 16 14 13 octets

3 octets grâce à Erik l'Outgolfer.

ḟ⁶ỴV€€sS€ẎsS€

Essayez-le en ligne!

Leaky Nun
la source
1
Sauvez-en un autre en vous débarrassant de Z: ḟ⁶ỴV€€sS€ẎsS€(ou ḟ⁶ỴV€€sS€FsS€)
Erik the Outgolfer
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!

Halvard Hummel
la source
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
H.PWiz
la source
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.

rahnema1
la source
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
2

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

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

Essayez-le en ligne!

Xcali
la source
2

Python 2 , 137 127 octets

-10 octets grâce à @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]]]

Essayez-le en ligne!

officialaimm
la source
2
127
Halvard Hummel
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.

Leif Willerts
la source
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.

AdmBorkBork
la source
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!

Gil
la source
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? ;)

MD XF
la source