Определить тип кубоида

17

Вступление:

Я коллекционер извилистых головоломок. Здесь вы можете увидеть мою текущую коллекцию из ± 300 головоломок.

Я думаю, что все знают обычный кубик Рубика (куб 3x3x3), который является кубом NxNxN . Существуют также кубоиды (пазлы в форме блоков), которые бывают разных форм, возможно, лучше объясненные SuperAntionioVivaldi здесь :

  • Обычные кубиноиды домино (например, 2x2x3 ; 2x3x3 ; 3x3x4 ; и т. Д.) - они бывают в форме NxNx (N + O) или Nx (N + O) x (N + O) , которые имеют два нечетных измерения и четный или два четных и нечетных.
  • Кубоиды Shapeshifter (например, 2x2x4 ; 3x3x5; 3x3x9 ; 4x4x6 ; и т. Д.) - они имеют форму NxNx (N + P) , которая, как следует из названия, изменяет форму (во всех направлениях). Все три измерения являются нечетными или четными.
  • Floppy Cuboids (например, 1x3x3 ; 2x4x4 и т. Д.). Они бывают в форме Nx (N + P) x (N + P) , которые почти такие же, как Shapeshifters, но с так называемыми Floppy Parities.
  • Кирпичные кубоиды (например, 2x3x4 ; 3x4x5 ; 2x3x5 и т. Д.) - они имеют форму Nx (N + O) x (N + P), которые, как и обычные кубиноиды домино, имеют два нечетных измерения и четное, или два четных и нечетных; но не имеют одинаковых размеров.
  • Окончательный Оборотни (такие как 2x4x6 ; 3x5x7; 2x4x10; и т.д.) - Они приходят в виде Nx (N + O) х (N + R) , и Shapeshift в любом направлении. Все три измерения являются нечетными или четными; но не имеют одинаковых размеров.

Вызов:

Входные данные:

Целое положительное число n со следующим ограничением: 8 <= n <= 125.
n может быть однозначно декодировано как произведение трех значений (измерений), каждое из которых составляет от 2 до 5 включительно.

Причина, по которой я ограничил это значение 2-5, состоит в том, чтобы предотвратить дублирование входов (например, 1x2x4 = 8и 2x2x2 = 8), даже несмотря на то, что существует много кубоидов более низкого / более высокого порядка . Это также означает, что для Ultimate Shapeshifters нет тестовых случаев.

Выход / Тестовые случаи:

Это все случаи, которые ваша программа / функция должна поддерживать, начиная от длин ребер 2 до 5 в каждой возможной трехмерной конфигурации:

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

Правила соревнований:

  • Любые входные данные, не входящие в куб / не кубоидные, в диапазоне 8-125 должны приводить к выводу «none».
  • Формат вывода - ваш собственный выбор. Я думаю, что наиболее разумными являются целые числа, как 0= 'нет'; 1= Куб; 2= Обычный Домино Кубоид; 3= Shapeshifter Cuboid; 4= Гибкий диск Cuboid; 5= Кирпичный кубоид. Любой другой выходной формат также подойдет, если вы укажете, какой вы использовали.

Основные правила:

  • Это , поэтому выигрывает самый короткий ответ в байтах.
    Не позволяйте языкам кода-гольфа отговаривать вас от публикации ответов на языках, не относящихся к кодексу. Попробуйте придумать как можно более короткий ответ для «любого» языка программирования.
  • К вашему ответу применяются стандартные правила , поэтому вы можете использовать STDIN / STDOUT, функции / метод с правильными параметрами, полные программы. Ваш звонок.
  • По умолчанию лазейки запрещены. ( ПРИМЕЧАНИЕ. Поскольку я не знаю, существует ли разумная формула для преобразования ввода-вывода, разрешено жестко кодировать ответы на основе ввода. )
  • Если возможно, добавьте ссылку с тестом для вашего кода.
  • Также, пожалуйста, добавьте объяснение, если это необходимо.
Кевин Круйссен
источник
1
В вашей коллекции нет вертолетного куба?
GB
@ Гб Нет. У меня есть Curvy Copter, Curvy Copter Plus, Curvy Copter III, Curvy Chop Cube, вертолетный додекаэдр и изготовленный на заказ супер усеченный Curvy Copter III, но нет вертолетного куба. :) Это немного похоже на соблазнительный коптер, но я мог бы получить его когда-нибудь.
Кевин Круйссен,
Вход отсортирован? или надо сортировать вручную?
Мэтью Ро
@MatthewRoh Входные данные представляют собой одно целое число (т.е. 24), поэтому я не знаю, что вы хотите отсортировать по этому поводу?
Кевин Круйссен,

Ответы:

6

05AB1E , 26 21 байт

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

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

Попробуйте онлайн! или как тестовый набор

объяснение

•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

Единственное место, где я вижу, что мы могли бы сохранить байты здесь, это найти лучший способ генерации числа 123224454212324512210 .

Это только 1 от простого числа, поэтому одним из возможных вариантов сохранения было бы найти индекс этого простого числа и сгенерировать индекс менее чем в 9 байтов.
Я не знаю, насколько хорошо функция pi работает для 21-значных простых чисел, но это может быть возможно.

Emigna
источник
Хорошо, мне интересно это объяснение, чтобы увидеть, какую формулу / причуду / шаблон вы использовали для определения куба / кубоида. +1
Кевин Круйссен
1
@KevinCruijssen: Я мог бы сохранить еще один или два байта. Я добавлю объяснение после того, как попробую. У меня есть простое число, которое я хочу найти в порядке (но я не нашел в Интернете ничего, что могло бы помочь мне в этом, и я на работе, поэтому у меня нет времени самому что-то реализовывать :)
Emigna
@ Emigna, Jeeebus Creezy, как долго kсуществует? !! ??!?!?!?!
Волшебная Урна Осьминога
@carusocomputing с 30 декабря 2015 г.
Аднан,
3

JavaScript (ES6), 97 92 86 байт

Эта функция сначала проверяет правильность ввода, а затем выбирает правильное значение из справочной таблицы.

Удивительно, но самая длинная часть - проверка достоверности ( n имеет вид x * y * z с x , y и z в [2,3,4,5] ?). Должен быть более короткий способ сделать это, но я не мог понять это до сих пор.

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

Возвращает символ:

  • N : нет
  • C : куб
  • R : Обычный Домино Кубоид
  • S : Shapeshifter Cuboid
  • B : Кирпичный кубоид
  • F : гибкий диск

Тестовое задание

Arnauld
источник
1

Рубин, 106 98 96 байт

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

Потому что, почему бы и нет, жесткое кодирование.

Как указано, 0 = «нет»; 1 = куб; 2 = Обычный Домино Кубоид; 3 = кубоид Shaifhifter; 4 = гибкий диск; 5 = кирпичный кубоид

гигабайт
источник
1

Perl 6 , 69 58 байт

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

Использует целочисленный формат вывода, предложенный в описании задачи, за исключением того, что он возвращает неинициализированное значение (Any)вместо0 в случае входных данных, которые не образуют действительный куб / кубоид.

Как это устроено

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

    Создает список 8 12 16 20 18 24 30 32 40 50 27 36 45 48 60 75 64 80 100 125.

  2. :32<AM0K21IHN61H5>.comb

    Создает список 1 2 3 2 2 5 5 4 5 2 1 2 3 2 5 4 1 2 2 1(из литерала base-32).

  3. %(   Z=>   )

    Создает Hash (ассоциативную карту) с первым списком в качестве ключей и вторым списком в качестве значений.

  4.    {$_}

    Индексирует хеш с введенным номером.

SMLS
источник
Хех, теперь я вижу, что использовал тот же подход, что и ответ @ Emigna's 05AB1E. Но я придумал это самостоятельно, честно! :)
Smls
1

Пакетный, 163 байта

@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%

Использует предложенный формат вывода. Объяснение: Основная идея состоит в том, чтобы перебрать список кубов, как определено в вопросе. Для каждого куба мы вычисляем, чтобы увидеть, является ли его объем входным целым числом, и, если это так, вычисляем тип куба из справочной таблицы.

Исходная таблица поиска представляла собой строку букв, но выполнять операции со строками в forцикле довольно сложно, поэтому я переключился на цифры, которые можно извлечь арифметически. К сожалению, пакетная обработка ограничена 32-разрядными целыми числами, поэтому я не смог уместить все цифры в одну переменную (даже в базе 5 вы можете получить только 13 цифр), поэтому вместо этого я разделил переменную на две части, закодированные в базе 6 для удобства. 29948521находится 2545522321в базе 6, которая кодирует 10 самых маленьких кубоидов в обратном порядке; когда у него заканчиваются цифры, мы добавляем, 14081593который находится 1221452321в базе 6, кодирующей 10 самых больших кубоидов.

Нил
источник