Визначте тип кубоїда


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) , який, як випливає з назви, формує зміну (у всіх напрямках). Усі три виміри є непарними або парними.
  • Дискети-кубоїди (на зразок 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) x (N + R) і змінюють форму в будь-якому напрямку. Усі три виміри є непарними або парними; але не мають жодних однакових розмірів.

Виклик:

Вхід:

Позитивне ціле 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 повинен спричинити "жодний" як вихід.
  • Формат виводу - це ваш власний вибір. Я вважаю, що найбільш розумними є цілі числа, як 0= 'none'; 1= Куб; 2= Регулярний кубідон доміно; 3= Кубоїд Shapeshifter; 4= Флоппі кубоїд; 5= Цегляна кубоїда. Будь-який інший формат виводу також добре, якщо ви вкажете, який саме ви використовували.

Загальні правила:

  • Це , тому найкоротша відповідь у байтах виграє.
    Не дозволяйте мовам коду-гольфу відштовхувати вас від публікації відповідей з мов, що не кодують гольф. Спробуйте придумати якомога коротшу відповідь на "будь-яку" мову програмування.
  • Для вашої відповіді застосовуються стандартні правила , тому вам дозволяється використовувати STDIN / STDOUT, функції / метод з відповідними параметрами, повноцінні програми. Твій дзвінок.
  • Лазівки за замовчуванням заборонені. ( ПРИМІТКА. Оскільки я не знаю, чи є розумна формула перетворення вхід-вихід, дозволено вводити жорсткі коди відповідей на основі введених даних. )
  • Якщо можливо, додайте посилання з тестом для вашого коду.
  • Також, будь ласка, додайте пояснення, якщо це необхідно.


1
У вашій колекції немає куба вертольота?
ГБ

@GB Ні. У мене є криволінійний вертоліт, кривий коптер плюс, кучерявий вертоліт III, кучевий кубик Chop, вертоліт додекаедр і на замовлення супер усічений кривий коптер III, але немає вертолітного куба. :) Це трохи надто схоже на Curvy Copter, але я можу отримати його колись.
Кевін Круїссен

Чи сортується вхід? чи ми повинні сортувати вручну?
Меттью Ро

@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-значного простору, але це може бути можливою.


Приємно, мені цікаво це пояснення, щоб побачити, яку формулу / химерність / шаблон ви використовували для визначення куба / кубоїда. +1
Кевін Кройсейсен

1
@KevinCruijssen: Можливо, мені вдасться зберегти байт чи два. Я додам пояснення після того, як спробую. У мене є прем'єр, на якому я хочу знайти порядок (але я не знайшов нічого в Інтернеті, щоб мені це допомогло, і я працюю, тому я не
встигаю

@Emigna jeebus 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]

Повертає символ:

  • Н : Ні
  • С : Куб
  • Р : Регулярний доміно кубоїд
  • S : Kuboid Shapeshifter
  • Б : Цегляний кубоїд
  • F : Дискета-кубоїд

Тест


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 = кубоїд шайби; 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(з базового 32-прямого).

  3. %(   Z=>   )

    Створює хеш (асоціативна карта) з першим списком як ключами, а другим списком як значеннями.

  4.    {$_}

    Індексує хеш із вхідним номером ..


Гей, тепер я бачу, що я застосував той самий підхід, що і у відповіді 05AB1E на @ Emigna. Але я придумав це самостійно, чесно! :)
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циклі досить складно, тому я перейшов до цифр, які можна витягувати арифметично. На жаль Batch обмежений 32-бітовими цілими числами, тому я не зміг помістити всі цифри в одну змінну (навіть у базі 5 можна отримати лише 13 цифр), тому замість цього я розділив змінну на дві частини, закодовані в базі 6 для зручності. 29948521знаходиться 2545522321в базі 6, яка кодує 10 найменших кубоїдів у зворотному порядку; коли у нього закінчується цифр, ми додаємо, 14081593що знаходиться 1221452321в базі 6, що кодує 10 найбільших кубоїдів.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.