Determinar o tipo de cubóide

17

Introdução:

Sou um colecionador de quebra-cabeças sinuosos. Aqui você pode ver minha coleção atual de ± 300 quebra-cabeças.

Acho que todo mundo conhece o Cubo de Rubik regular (cubo 3x3x3), que é um cubo NxNxN . Também existem cuboides (quebra-cabeças em forma de bloco), que vêm em diferentes formas, talvez melhor explicados por SuperAntionioVivaldi aqui :

  • Cuboides de dominó regulares (como 2x2x3 ; 2x3x3 ; 3x3x4 ; etc.) - Eles vêm na forma de NxNx (N + O) ou Nx (N + O) x (N + O) , que possuem duas dimensões ímpares e uma par, ou dois pares e um ímpar.
  • Cuboides de cambiaformas (como 2x2x4 ; 3x3x5; 3x3x9 ; 4x4x6 ; etc.) - Eles vêm na forma de NxNx (N + P) , que, como o nome sugere, muda de forma (em todas as direções). Todas as três dimensões são ímpares ou pares.
  • Cuboides de disquete (como 1x3x3 ; 2x4x4 ; etc.) - Eles vêm na forma de Nx (N + P) x (N + P) , que são quase os mesmos que os cambiaformas, mas com as chamadas paridades de disquete.
  • Cuboides de tijolo (como o 2x3x4 ; 3x4x5 ; 2x3x5; etc.) - Eles vêm na forma de Nx (N + O) x (N + P), que, assim como os cuboides regulares do dominó, têm duas dimensões ímpares e um par, ou dois pares e um ímpar; mas não tem as mesmas dimensões.
  • Os cambiaformas finais (como 2x4x6 ; 3x5x7; 2x4x10; etc.) - Eles vêm na forma de Nx (N + O) x (N + R) e mudam de forma em qualquer direção. Todas as três dimensões são ímpares ou pares; mas não tem as mesmas dimensões.

Desafio:

Entrada:

Um número inteiro positivo n com a seguinte restrição: 8 <= n <= 125.
n pode ser decodificado exclusivamente como o produto de três valores (as dimensões), dos quais cada um está entre 2 e 5, inclusive.

A razão pela qual eu o restringi a 2-5 é evitar entradas duplicadas (como 1x2x4 = 8e 2x2x2 = 8), mesmo que haja muitos cuboides de ordem inferior / superior por aí. Isso também significa que não há casos de teste para os Ultimate Shapeshifters.

Casos de saída / teste:

Estes são todos os casos que seu programa / função deve suportar, variando de comprimentos de borda 2 a 5 em todas as configurações tridimensionais possíveis:

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

Regras do desafio:

  • Qualquer entrada não cubo / não cubóide dentro da faixa 8-125 deve resultar em 'nenhum' como saída.
  • O formato de saída é sua própria escolha. Eu acho que o mais razoável é números inteiros, como 0= 'none'; 1= Cubo; 2= Cubo dominó regular; 3= Metamorfo Cubóide; 4= Cubóide de disquete; 5= Cubóide de tijolo. Qualquer outro formato de saída também é bom, desde que você especifique qual você usou.

Regras gerais:

  • Isso é , então a resposta mais curta em bytes vence.
    Não permita que idiomas com código de golfe o desencorajem a postar respostas com idiomas que não sejam codegolf. Tente encontrar uma resposta o mais curta possível para 'qualquer' linguagem de programação.
  • As regras padrão se aplicam à sua resposta, para que você possa usar STDIN / STDOUT, funções / método com os parâmetros adequados, programas completos. Sua chamada.
  • As brechas padrão são proibidas. ( NOTA: Como não sei se existe uma fórmula inteligente para a conversão de entrada para saída, é permitido codificar as respostas com base na entrada. )
  • Se possível, adicione um link com um teste para o seu código.
  • Além disso, adicione uma explicação, se necessário.
Kevin Cruijssen
fonte
11
Não há cubo de helicóptero em sua coleção?
GB
@GB Não. Eu tenho um helicóptero Curvy, Curvy Copter Plus, Curvy Copter III, Curvy Chop Cube, dodecaedro de helicóptero e Super Truncado Curvy Copter III personalizado, mas nenhum cubo de helicóptero. :) É um pouco parecido com o Curvy Copter, mas posso pegá-lo algum dia.
Kevin Cruijssen 8/02
A entrada está classificada? ou temos que ordenar manualmente?
Matthew Roh
@MatthewRoh A entrada é um único inteiro (ou seja 24), então eu não sei o que você quer classificar sobre isso?
Kevin Cruijssen

Respostas:

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è

Experimente online! ou como um conjunto de testes

Explicação

•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

O único lugar que vejo que poderíamos salvar bytes aqui é encontrar uma maneira melhor de gerar o número 123224454212324512210 .

É apenas 1-off de um prime, portanto, um possível salvamento seria encontrar o índice desse prime e gerar o índice em menos de 9 bytes.
Não sei como funciona a função pi para números primos de 21 dígitos, mas isso pode ser uma possibilidade.

Emigna
fonte
Bom, estou curioso por essa explicação para ver qual fórmula / peculiaridade / padrão você usou para determinar o Cubo / Cubóide. 1
Kevin Cruijssen
11
@KevinCruijssen: Talvez eu consiga salvar um ou dois bytes. Vou adicionar a explicação depois de tentar. Eu tenho um primo que desejo encontrar a ordem de (mas não encontrei nada on-line para me ajudar com isso e estou no trabalho, por isso não tenho tempo para implementar algo pessoalmente :)
Emigna
@Emigna jeebus creezy, há quanto tempo kexiste? !! ??!?!?!?!
Urna mágica do polvo
@carusocomputing Desde 30 de dezembro de 2015.
Adnan
3

JavaScript (ES6), 97 92 86 bytes

Essa função primeiro verifica a validade da entrada e, em seguida, escolhe o valor correto em uma tabela de pesquisa.

Surpreendentemente, a parte mais longa é a verificação de validade (se n de forma x * y * z com x , y e z em [2,3,4,5] ?). Deve haver uma maneira mais curta de fazer isso, mas eu não conseguia descobrir até agora.

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

Retorna um caractere:

  • N : nenhum
  • C : Cubo
  • R : Dominó regular cubóide
  • S : Metamorfo Cubóide
  • B : Cubóide de tijolo
  • F : Cubóide de disquete

Teste

Arnauld
fonte
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}

Porque, por que não, codificado?

Conforme especificado, 0 = 'nenhum'; 1 = cubo; 2 = Dominó Cubóide Regular; 3 = Cubóide do Metamorfo; 4 = Cubóide de disquete; 5 = Cubóide de tijolo

GB
fonte
1

Perl 6 , 69 58 bytes

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

Usa o formato de saída inteiro sugerido na descrição da tarefa, exceto que ele retorna o valor (Any)não inicializado em vez de 0no caso de entradas que não formam um cubo / cubóide válido.

Como funciona

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

    Gera a lista 8 12 16 20 18 24 30 32 40 50 27 36 45 48 60 75 64 80 100 125.

  2. :32<AM0K21IHN61H5>.comb

    Gera a lista 1 2 3 2 2 5 5 4 5 2 1 2 3 2 5 4 1 2 2 1(de um literal de base 32).

  3. %(   Z=>   )

    Gera um Hash (mapa associativo) com a primeira lista como as chaves e a segunda lista como os valores.

  4.    {$_}

    Indexa o Hash com o número de entrada.

smls
fonte
Heh, agora vejo que usei a mesma abordagem da resposta 05AB1E de @ Emigna. Mas eu vim com ele de forma independente, honesto! :)
smls
1

Lote, 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%

Usa o formato de saída sugerido. Explicação: A idéia básica é fazer um loop sobre a lista de cubos, conforme definido na pergunta. Para cada cubo, calculamos para ver se seu volume é o número inteiro de entrada e, em caso afirmativo, calculamos o tipo de cubo em uma tabela de pesquisa.

A tabela de pesquisa original era uma sequência de letras, mas a manipulação de strings em um forloop é complicada, então mudei para dígitos que podem ser extraídos aritmeticamente. Infelizmente, o Lote é limitado a números inteiros de 32 bits, então eu não conseguia encaixar todos os dígitos em uma única variável (mesmo na base 5 você só pode obter 13 dígitos), então, em vez disso, divido a variável em duas partes, codificadas na base 6 Por conveniência. 29948521está 2545522321na base 6, que codifica os 10 menores cuboides na ordem inversa; quando ficar sem dígitos, adicionamos o 14081593que está 1221452321na base 6, codificando os 10 maiores cuboides.

Neil
fonte