Summiere die Gesichter eines Würfels

13

Das manuelle Summieren der Gesichter eines Cubical Cubes ist langwierig und zeitaufwendig und ähnelt dem Schreiben von Code in Cubical.

In Most efficiency cubifier habe ich Sie gebeten, ASCII in Cubically Source zu übersetzen. Eine der Antworten verwendet eine Cube-Initialisierungssequenz und modifiziert dann den resultierenden Cube basierend auf den Summen des vorinitialisierten Cubes. Diese Methode wurde seitdem in vielen Cubically-bezogenen Programmen verwendet. Beim Testen einer neuen Initialisierungssequenz müssen alle Werte auf allen Teilflächen addiert werden. Dies dauert normalerweise zwei oder drei Minuten.

Ihre Aufgabe ist es, diesen Prozess für uns zu automatisieren!

Sie nehmen zwei Eingaben, eine Ganzzahl nund eine Zeichenfolge c. Diese können aus Befehlszeilenargumenten, Funktionsargumenten, Standardeingaben, einer Datei oder einer beliebigen Kombination davon gelesen werden. cwird ein kubischer Speicherwürfel sein, dessen Größe nvom Interpreter hübsch gedruckt wird.

Der Cubically-Interpreter legt seinen Cube nach Programmende in STDERR ab und ist für die einfache Anzeige gut formatiert. Führen Sie im Cubically-Interpreter ein leeres Programm aus und öffnen Sie den Debug-Abschnitt, um den Cube-Dump eines initialisierten Cubes anzuzeigen . Fügen Sie ein Argument hinzu 4, um einen 4x4x4 oder 5einen 5x5x5 usw. zu sehen.

Wenn n3 ist, cwird das folgende Format verwendet (die Ganzzahlen sind variabel):

   000
   000
   000
111222333444
111222333444
111222333444
   555
   555
   555

Leerzeichen, Zeilenumbrüche und alles. Wenn n4 ist, csieht das so aus (auch mit variablen ganzen Zahlen):

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

Und so weiter.

Ihr Programm gibt sechs Ganzzahlen aus. Die erste Ganzzahl ist die Summe aller Zahlen auf der Oberseite.

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

Die zweite Ganzzahl ist die Summe der linken Seite, die dritte der Vorderseite, die vierte der rechten, die fünfte der Rückseite und die sechste der Unterseite.

Wenn also n3 war und cdies war:

   242
   202
   242
000131555313
010121535343
000131555313
   424
   454
   424

Ihr Programm würde ausgeben 20 1 14 43 24 33.

Zusätzliche Regeln:

  • Die ausgegebenen Ganzzahlen müssen durch nicht ganzzahlige Zeichen begrenzt werden. Sie können auch ein Array zurückgeben.
  • Sie können davon ausgehen, dass die Eingabe korrekt ist - neine Ganzzahl und cein Würfel aus Cubicals Debugging-Ausgabe . Wenn also nwar 3.0und cwar foo bar, könnte Ihr Programm brechen und immer noch gültig sein.
  • Ihr Programm muss nur für n > 1und arbeiten n < 1260. Es kann (versucht), größere oder kleinere Würfelgrößen zu verarbeiten, ist jedoch nicht erforderlich.

Das ist , also gewinnt der kürzeste Code! Wenn Sie Hilfe benötigen, können Sie im Cubically Chatroom nachfragen .

MD XF
quelle
Dürfen wir annehmen, dass die Eingabe alle nachfolgenden Leerzeichen enthält, um ein Rechteck zu sein?
fireflame241
@ fireflame241 wenn du nLeerzeichen nach jeder Zeile meinst , nein. Sie sind nicht im Dump enthalten.
MD XF
1
Wir brauchen wirklich einen "kubischen" Tag.
Mr. Xcoder
@ Mr.Xcoder-Status abgeschlossen :) Das habe ich mir auch schon gedacht und arbeite an vier weiteren Cubically Challenges ATM.
MD XF

Antworten:

6

Jelly , 16 14 13 Bytes

3 Bytes dank Erik dem Outgolfer.

ḟ⁶ỴV€€sS€ẎsS€

Probieren Sie es online!

Undichte Nonne
quelle
1
Speichern Sie einen anderen, indem Sie Folgendes entfernen Z: ḟ⁶ỴV€€sS€ẎsS€(oder ḟ⁶ỴV€€sS€FsS€)
Folgendes entfernen
5

Python 2 , 155 150 147 123 121 120 Bytes

Könnte wahrscheinlich ziemlich viel Golf spielen

Bearbeiten: -5 Bytes mit einer besseren Methode zum Entfernen der Leerzeichen

Edit: -3 Bytes dank @Leaky Nun

Bearbeiten: -24 Bytes, indem Leerzeichen nicht entfernt werden

Bearbeiten: -2 Bytes durch Ausnutzen der Priorität

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

Probieren Sie es online!

Halvard Hummel
quelle
3

Schale , 15 Bytes

3 s und 2 ms

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

Probieren Sie es online!

Erläuterung

                  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
quelle
1
mṁṁiist wirklich schön!
Zgarb
3

Oktave, 64 59 54 Bytes

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

Probieren Sie es online!

Vorherige Antwort:

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

Probieren Sie es online!

Gibt ein Array als Ausgabe zurück.

rahnema1
quelle
Nicht das, was ich erwartet hatte, aber absolut richtig, und um ehrlich zu sein, hatte ich überhaupt keine Antworten erwartet. +1
MD XF
@MDXF Was hast du erwartet?
Rahnema1
Ich habe weder eine kurze Antwort erwartet, noch diese Form, Zeichenfolgen zu akzeptieren. Aber es ist nur so, wie Octave es tut. Ich habe Octave noch nie benutzt.
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"

Probieren Sie es online!

Xcali
quelle
2

Python 2 , 137 127 Bytes

-10 Bytes dank @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]]]

Probieren Sie es online!

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

Akzeptiert eine Zeichenfolge mit Zeilenumbrüchen.

Leif Willerts
quelle
1

PowerShell , 236 Byte

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

Probieren Sie es online!

Dummkopf, das ist lang. Das Aufteilen und Schneiden von Zeichenfolgen ist jedoch keine der Stärken von PowerShell. Also - So. Viele. Dollar.

Übernimmt Parameter $nund $zals Größe bzw. Würfelnetz. Konstruiert dann eine Funktion, die durchgehend verwendet wird. Hier entfernen wir Leerzeichen, teilen die einzelnen Ziffern auf, entfernen die dazwischen liegenden Leerzeichen, fügen alle Zeichen mit einem zusammen +und führen die resultierende Anweisung aus, um eine Zahl zu erhalten. Zum Beispiel dieser Windungen "123"in 1+2+3dem , wenn sie ausgeführt werden6 .

Die nächste Zeile ist splitdas Eingabewürfelnetz in Zeilenumbrüchen, in dem das Ergebnis in einem Array gespeichert wird $a. Wir führen dann die Funktion in den ersten $nZeilen aus und geben die Oberseite des Würfels aus.

Für den nächsten Satz müssen wir die Zeichenfolgen basierend auf der Würfelgröße verbinden. Wir durchlaufen also jede Zeile, konstruieren sie $xals das entsprechende Regex-Muster (z. B. für die Größe, die $n=3dies sein wird "(...)"), teilen die Zeichenfolge basierend auf diesem Muster auf, entfernen wieder leere Elemente und speichern diese in vier Variablen, die die vier Flächen darstellen. Diese werden dann hdurchgehend verkettet k.

Die nächste Zeile hdurchläuft kdann die Funktion, um die Seiten (links, vorne, rechts, hinten) des Würfels auszugeben.

Schließlich führen wir die letzten $nZeilen durch die Funktion, um die Unterseite des Würfels auszugeben.

Alle Zahlen verbleiben in der Pipeline, und die Ausgabe ist implizit.

AdmBorkBork
quelle
1

APL (Dyalog Classic) , 30 27 Bytes

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

3 Bytes gespart dank @ Adám

ist n ist c

Erläuterung

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

Probieren Sie es online!

Gil
quelle
Sieht aus wie 59 Bytes für mich. Durch Ersetzen durch ⎕U2286werden jedoch nur 5 Bytes hinzugefügt.
Adám
Mein schlechtes, ich habe mit und ohne partitioniertem Enclose gespielt und nur die Byteanzahl für die Classic-Version verwendet. Bearbeitet meine Antwort, um Migrationsstufe 3 zu verwenden :)
Gil
1
Sie können auch das Leerzeichen zwischen 3und entfernen .
Adám
1
(6,⍺*2) → 6(⍺*2)
Adám
1
IFAICT, du brauchst ,nach wie vor nicht das richtige Argument in Ravel-Reihenfolge zu verwenden.
Adám
0

Kubisch 19 Bytes

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

Nimmt den Cube von STDIN und die Größe als Befehlszeilenargument für den Interpreter. Gibt die Summe aus der Oberseite, einem Null-Byte, der linken Seite, einem Null-Byte, der Unterseite und einem Null-Byte aus.

Probieren Sie es online! ... der anscheinend null Bytes als eine Art Leerzeichen in meinem Browser anzeigt.

Diese Sprache wurde nicht für diese Herausforderung gemacht, aber die Herausforderung wurde für die Sprache gemacht ... ist es immer noch Betrug? ;)

MD XF
quelle