Bestimmen Sie den Typ des Quaders

17

Einführung:

Ich bin ein Puzzlesammler. Hier sehen Sie meine aktuelle Sammlung von ± 300 Puzzles.

Ich denke, jeder kennt den normalen Rubik's Cube (3x3x3 Cube), der ein NxNxN Cube ist. Es gibt auch Cuboids (blockförmige Puzzles), die in verschiedenen Formen vorliegen , vielleicht besser erklärt von SuperAntionioVivaldi hier :

  • Normale Domino Cuboids (wie 2x2x3 ; 2x3x3 ; 3x3x4 ; usw.) - Sie kommen in Form von NxNx (N + O) oder Nx (N + O) x (N + O) , die entweder zwei ungerade Dimensionen und eine haben gerade oder zwei gerade und eine ungerade.
  • Shapeshifter Cuboids (wie die 2x2x4 ; 3x3x5; 3x3x9 ; 4x4x6 ; etc.) - Sie kommen in Form von NxNx (N + P) , was, wie der Name schon sagt, Shapeshifts (in alle Richtungen) bedeutet. Alle drei Dimensionen sind entweder ungerade oder gerade.
  • Floppy Cuboids (wie die 1x3x3 ; 2x4x4 ; etc.) - Sie kommen in Form von Nx (N + P) x (N + P) vor , die fast die gleichen sind wie die Shapeshifters, jedoch mit sogenannten Floppy Parities.
  • Brick Cuboids (wie die 2x3x4 ; 3x4x5 ; 2x3x5; etc.) - Sie kommen in Form von Nx (N + O) x (N + P), die genau wie die Regular Domino Cuboids entweder zwei ungerade Dimensionen und eine gerade haben, oder zwei gerade und eine ungerade; aber haben Sie keine der gleichen Dimensionen.
  • Ultimate Shapeshifters (wie die 2x4x6 ; 3x5x7; 2x4x10; etc.) - Sie kommen in Form von Nx (N + O) x (N + R) und Shapeshift in jede Richtung. Alle drei Dimensionen sind entweder ungerade oder gerade; aber haben Sie keine der gleichen Dimensionen.

Herausforderung:

Eingang:

Eine positive ganze Zahl n mit der folgenden Einschränkung: 8 <= n <= 125.
n kann eindeutig als Produkt von drei Werten (den Dimensionen) dekodiert werden, von denen jeder zwischen 2 und 5 einschließlich liegt.

Ich habe es auf 2-5 beschränkt, um doppelte Eingaben (wie 1x2x4 = 8und 2x2x2 = 8) zu verhindern , obwohl es viele Cuboids niedriger / höherer Ordnung gibt. Dies bedeutet auch, dass es für Ultimate Shapeshifters keine Testfälle gibt.

Ausgabe / Testfälle:

Dies sind alle Fälle, die Ihr Programm / Ihre Funktion unterstützen sollte. Sie reichen von Kantenlängen 2 bis 5 in jeder möglichen dreidimensionalen Konfiguration:

Input   Cuboid/Cube   Type/Output
8       2x2x2         Cube
12      2x2x3         Regular Domino Cuboid
16      2x2x4         Shapeshifter Cuboid
20      2x2x5         Regular Domino Cuboid
18      2x3x3         Regular Domino Cuboid
24      2x3x4         Brick Cuboid
30      2x3x5         Brick Cuboid
32      2x4x4         Floppy Cuboid
40      2x4x5         Brick Cuboid
50      2x5x5         Regular Domino Cuboid
27      3x3x3         Cube
36      3x3x4         Regular Domino Cuboid
45      3x3x5         Shapeshifter Cuboid
48      3x4x4         Regular Domino Cuboid
60      3x4x5         Brick Cuboid
75      3x5x5         Floppy Cuboid
64      4x4x4         Cube
80      4x4x5         Regular Domino Cuboid
100     4x5x5         Regular Domino Cuboid
125     5x5x5         Cube

Herausforderungsregeln:

  • Alle nicht-würfelförmigen / nicht-würfelförmigen Eingaben im Bereich von 8 bis 125 sollten als Ausgabe "keine" ergeben.
  • Das Ausgabeformat ist Ihre eigene Wahl. Ich denke, das vernünftigste sind ganze Zahlen wie 0= 'none'; 1= Würfel; 2= Regular Domino Cuboid; 3= Formwandlerquader; 4= Floppy Cuboid; 5= Ziegelquader. Jedes andere Ausgabeformat ist ebenfalls in Ordnung, solange Sie angeben, welches Sie verwendet haben.

Allgemeine Regeln:

  • Das ist , also gewinnt die kürzeste Antwort in Bytes.
    Lassen Sie sich von Code-Golf-Sprachen nicht davon abhalten, Antworten mit Nicht-Codegolf-Sprachen zu veröffentlichen. Versuchen Sie, für jede Programmiersprache eine möglichst kurze Antwort zu finden.
  • Für Ihre Antwort gelten Standardregeln. Daher dürfen Sie STDIN / STDOUT, Funktionen / Methode mit den richtigen Parametern und vollständige Programme verwenden. Ihr Anruf.
  • Standardlücken sind verboten. ( HINWEIS: Da ich nicht weiß, ob es eine intelligente Formel für die Eingabe-Ausgabe-Konvertierung gibt, ist es zulässig, die Antworten basierend auf der Eingabe fest zu codieren. )
  • Fügen Sie nach Möglichkeit einen Link mit einem Test für Ihren Code hinzu.
  • Fügen Sie ggf. auch eine Erklärung hinzu.
Kevin Cruijssen
quelle
1
Es gibt keinen Hubschrauberwürfel in Ihrer Sammlung?
GB
@ GB Nein. Ich habe einen Curvy Copter, einen Curvy Copter Plus, einen Curvy Copter III, einen Curvy Chop Cube, einen Helicopter Dodecahedron und einen maßgeschneiderten Super Truncated Curvy Copter III, aber keinen Helicopter Cube. :) Es ist dem Curvy Copter ein bisschen zu ähnlich, aber ich könnte es eines Tages bekommen.
Kevin Cruijssen
Ist die Eingabe sortiert? oder müssen wir manuell sortieren?
Matthew Roh
@MatthewRoh Die Eingabe ist eine einzelne Ganzzahl (dh 24), ich weiß also nicht, was Sie darüber sortieren möchten?
Kevin Cruijssen

Antworten:

6

05AB1E , 26 21 Bytes

None: 0 Cube: 1 Regular Domino Cuboid: 2 Shapeshifter Cuboid: 3 Brick Cuboid: 4 Floppy Cuboid: 5

•S3X@I¨%÷'•5L¦3ãPÙIkè

Probieren Sie es online! oder als Testsuite

Erläuterung

•S3X@I¨%÷'•            # push base-214 compression of the number 123224454212324512210
           5L¦         # push the list [2,3,4,5]
              3ã       # cartesian product with repetion of size 3
                P      # product of each sublist
                 Ù     # remove duplicates
                  Ik   # get the index of input in that list (-1 if non-existant)
                    è  # get the element at this index in the above number

Der einzige Ort, an dem wir hier Bytes sparen können, ist die bessere Möglichkeit, die Nummer 123224454212324512210 zu generieren .

Es ist nur eine Abweichung von einer Primzahl, daher besteht eine mögliche Einsparung darin, den Index dieser Primzahl zu finden und den Index in weniger als 9 Bytes zu generieren.
Ich weiß nicht, wie gut die Pi-Funktion für 21-stellige Primzahlen funktioniert, aber das könnte eine Möglichkeit sein.

Emigna
quelle
Schön, ich bin gespannt auf diese Erklärung, um zu sehen, mit welcher Formel / welcher Eigenheit / welchem ​​Muster Sie den Würfel / den Quader bestimmt haben. +1
Kevin Cruijssen
1
@ KevinCruijssen: Vielleicht kann ich noch ein oder zwei Bytes speichern. Ich werde die Erklärung hinzufügen, nachdem ich das ausprobiert habe. Ich habe eine Primzahl, deren Reihenfolge ich finden möchte (aber ich habe nichts online gefunden, was mir dabei helfen könnte, und ich bin auf der Arbeit, also habe ich nicht wirklich Zeit, etwas selbst umzusetzen :)
Emigna
@Emigna jeebus creezy, wie lange gibt es das kschon? !! ??!?!?!?!
Magic Octopus Urn
@carusocomputing Seit dem 30. Dezember 2015.
Adnan
3

JavaScript (ES6), 97 92 86 Bytes

Diese Funktion überprüft zuerst die Gültigkeit der Eingabe und wählt dann den richtigen Wert aus einer Nachschlagetabelle aus.

Überraschenderweise ist der längste Teil die Gültigkeitsprüfung (ist n in der Form x * y * z mit x , y und z in [2,3,4,5] ?). Es muss einen kürzeren Weg geben, aber ich konnte es bisher nicht herausfinden.

n=>'NBBF..CRCC.BRR..SFRRRRR.B..C'[[34707324,0x80000800,4240,262208][n&3]>>n/4&1&&n%29]

Gibt ein Zeichen zurück:

  • N : Keine
  • C : Würfel
  • R : Normaler Domino-Quader
  • S : Formwandlerquader
  • B : Ziegelquader
  • F : Floppy Cuboid

Prüfung

Arnauld
quelle
1

Ruby, 106 98 96 Bytes

->n{[[x=25,2421],[15,53],[9,21],[4,1232504350200510002]].any?{|a,b|n%a<1&&x="00#{b}"[n/a]}?x:?0}

Denn warum nicht, hardcoding.

Wie angegeben ist 0 = 'none'; 1 = Würfel; 2 = normaler Domino-Quader; 3 = Formwandlerquader; 4 = Floppy Cuboid; 5 = Ziegelquader

GB
quelle
1

Perl 6 , 69 58 Bytes

{%(unique([X*] (2..5)xx 3)Z=>:32<AM0K21IHN61H5>.comb){$_}}

Verwendet das in der Aufgabenbeschreibung vorgeschlagene ganzzahlige Ausgabeformat, außer dass der nicht initialisierte Wert zurückgegeben wird, (Any)anstatt 0bei Eingaben, die keinen gültigen Würfel / Quader bilden.

Wie es funktioniert

  1. unique([X*] (2..5)xx 3)

    Erzeugt die Liste 8 12 16 20 18 24 30 32 40 50 27 36 45 48 60 75 64 80 100 125.

  2. :32<AM0K21IHN61H5>.comb

    Erzeugt die Liste 1 2 3 2 2 5 5 4 5 2 1 2 3 2 5 4 1 2 2 1(aus einem Basis-32-Literal).

  3. %(   Z=>   )

    Erzeugt ein Hash (Assoziative Map) mit der ersten Liste als Schlüssel und der zweiten Liste als Werten.

  4.    {$_}

    Indiziert den Hash mit der eingegebenen Nummer.

smls
quelle
Heh, ich sehe jetzt, dass ich den gleichen Ansatz wie die 05AB1E-Antwort von @ Emigna verwendet habe. Aber ich habe es selbstständig erfunden, ehrlich! :)
smls
1

Batch, 163 Bytes

@set/as=0,c=29948521
@for /l %%i in (2,1,5)do @for /l %%j in (%%i,1,5)do @for /l %%k in (%%j,1,5)do @set/as+=c%%6*!(%%i*%%j*%%k-%1),c/=6,c+=14081593*!c
@echo %s%

Verwendet das vorgeschlagene Ausgabeformat. Erläuterung: Die Grundidee besteht darin, die Liste der in der Frage definierten Cubes zu durchlaufen. Wir berechnen für jeden Würfel, ob sein Volumen die Eingabe-Ganzzahl ist, und berechnen in diesem Fall den Würfeltyp aus einer Nachschlagetabelle.

Die ursprüngliche Nachschlagetabelle bestand aus einer Folge von Buchstaben, aber die Manipulation von Zeichenfolgen in einer forSchleife ist schwierig. Deshalb habe ich auf Ziffern umgestellt, die sich arithmetisch extrahieren lassen. Leider ist Batch auf 32-Bit-Ganzzahlen beschränkt, sodass ich nicht alle Ziffern in eine einzelne Variable einpassen konnte (selbst in Basis 5 können Sie nur 13 Ziffern erhalten). Stattdessen teile ich die Variable in zwei Teile auf, die in Basis 6 codiert sind zur Bequemlichkeit. 29948521befindet sich 2545522321in der Basis 6, die die 10 kleinsten Quader in umgekehrter Reihenfolge codiert; Wenn es keine Ziffern mehr gibt, addieren wir 14081593diese 1221452321in Basis 6, die die 10 größten Quader codiert.

Neil
quelle