Określ typ prostopadłościanu

17

Wprowadzenie:

Jestem kolekcjonerem łamigłówek. Tutaj możesz zobaczyć moją aktualną kolekcję ± 300 zagadek.

Myślę, że wszyscy znają zwykłą Kostkę Rubika (Kostka 3x3x3), która jest Kostką NxNxN . Istnieją również prostopadłościany (puzzle w kształcie klocków), które występują w różnych formach, być może lepiej wyjaśnione tutaj przez SuperAntionioVivaldi :

  • Zwykłe prostopadłościany Domino (takie jak 2x2x3 ; 2x3x3 ; 3x3x4 ; itp.) - Występują w postaci NxNx (N + O) lub Nx (N + O) x (N + O) , które mają albo dwa nieparzyste wymiary, a parzysty lub dwa parzysty i nieparzysty.
  • Prostopadłościany zmiennokształtne (jak 2x2x4 ; 3x3x5; 3x3x9 ; 4x4x6 ; itd.) - Występują w postaci NxNx (N + P) , które jak sama nazwa wskazuje, zmieniają kształty (we wszystkich kierunkach). Wszystkie trzy wymiary są nieparzyste lub parzyste.
  • Floppy Cuboids (jak 1x3x3 ; 2x4x4 ; itp.) - Występują w postaci Nx (N + P) x (N + P) , które są prawie takie same jak zmiennokształtni, ale z tak zwanymi parytetami dyskietek.
  • Brick Cuboids (jak 2x3x4 ; 3x4x5 ; 2x3x5; itp.) - Występują w postaci Nx (N + O) x (N + P), które podobnie jak zwykłe prostopadłościany Domino mają albo dwa dziwne wymiary, a parzystą, lub dwa parzyste i nieparzyste; ale nie mają takich samych wymiarów.
  • Ultimate Shapeshifters (jak 2x4x6 ; 3x5x7; 2x4x10; itd.) - Występują w postaci Nx (N + O) x (N + R) i zmieniają kształty w dowolnym kierunku. Wszystkie trzy wymiary są albo nieparzyste, albo parzyste; ale nie mają takich samych wymiarów.

Wyzwanie:

Wejście:

Dodatnia liczba całkowita n z następującym ograniczeniem: 8 <= n <= 125.
n można jednoznacznie zdekodować jako iloczyn trzech wartości (wymiarów), z których każda zawiera się między 2 a 5 włącznie.

Powodem, dla którego ograniczyłem go do 2-5, jest zapobieganie powielaniu danych wejściowych (takich jak 1x2x4 = 8i 2x2x2 = 8), mimo że istnieje wiele prostopadłościanów niższego / wyższego rzędu . Oznacza to również, że nie ma przypadków testowych dla Ultimate Shapeshifters.

Przypadki wyjściowe / testowe:

Są to wszystkie przypadki, które powinien obsługiwać Twój program / funkcja, od długości krawędzi od 2 do 5 w każdej możliwej konfiguracji trójwymiarowej:

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

Zasady konkursu:

  • Każde wejście inne niż kostka / prostopadłościan w zakresie 8-125 powinno skutkować „brakiem” jako wyjście.
  • Format wyjściowy jest twoim własnym wyborem. Myślę, że najbardziej rozsądne są liczby całkowite, takie jak 0= „none”; 1= Kostka; 2= Zwykły prostopadłościan domina; 3= Prostopadłościan zmiennokształtny; 4= Floppy Cuboid; 5= Cegła Prostopadłościan. Każdy inny format wyjściowy jest również w porządku, pod warunkiem, że określisz, którego użyłeś.

Główne zasady:

  • To jest , więc wygrywa najkrótsza odpowiedź w bajtach.
    Nie pozwól, aby języki gry w golfa zniechęcały Cię do publikowania odpowiedzi w językach niekodujących golfa. Spróbuj znaleźć możliwie najkrótszą odpowiedź na „dowolny” język programowania.
  • Do odpowiedzi mają zastosowanie standardowe reguły , więc możesz używać STDIN / STDOUT, funkcji / metody z odpowiednimi parametrami, pełnych programów. Twoja decyzja.
  • Domyślne luki są zabronione. ( UWAGA: Ponieważ nie wiem, czy istnieje inteligentna formuła konwersji danych wejściowych na wyjściowe, dozwolone jest kodowanie odpowiedzi na podstawie danych wejściowych ).
  • Jeśli to możliwe, dodaj link z testem swojego kodu.
  • W razie potrzeby dodaj również wyjaśnienie.
Kevin Cruijssen
źródło
2
Jestem
1
W Twojej kolekcji nie ma sześcianu helikoptera?
GB
@GB Nie. Mam Curvy Copter, Curvy Copter Plus, Curvy Copter III, Curvy Chop Cube, Helicopter Dodecahedron i specjalnie skonstruowany Super Truncated Curvy Copter III, ale nie mam helikoptera. :) Jest trochę zbyt podobny do Curvy Copter, ale może kiedyś go dostanę.
Kevin Cruijssen
Czy dane wejściowe są posortowane? czy musimy sortować ręcznie?
Matthew Roh
@MatthewRoh Dane wejściowe to pojedyncza liczba całkowita (tj. 24), Więc nie wiem, co chcesz na ten temat uporządkować?
Kevin Cruijssen

Odpowiedzi:

6

05AB1E , 26 21 bajtów

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

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

Wypróbuj online! lub jako pakiet testowy

Wyjaśnienie

•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

Jedyne miejsce, w którym możemy tutaj zapisać bajty, to lepszy sposób na wygenerowanie liczby 123224454212324512210 .

Jest to tylko jeden raz z liczby pierwszej, więc jednym z możliwych zapisów byłoby znalezienie indeksu tej liczby pierwszej i wygenerowanie indeksu w mniej niż 9 bajtach.
Nie wiem, jak dobrze działa funkcja pi dla liczb pierwszych 21-cyfrowych, ale taka może być możliwość.

Emigna
źródło
Fajnie, ciekawi mnie to wyjaśnienie, aby zobaczyć, jakiej formuły / dziwactwa / wzoru użyłeś do określenia Kostki / Prostopadłościanu. +1
Kevin Cruijssen
1
@KevinCruijssen: Być może uda mi się jeszcze zapisać bajt lub dwa. Dodam wyjaśnienie, kiedy spróbuję. Mam Prime Chcę znaleźć kolejność (ale nie znaleziono niczego w Internecie, aby pomóc mi z tym, a ja jestem w pracy, tak naprawdę nie mają czasu, aby zaimplementować coś myself :)
Emigna
@Emigna jeebus creezy, jak długo kistnieje? !! ??!?!?!?!
Magic Octopus Urn
@carusocomputing Od 30 grudnia 2015 r.
Adnan
3

JavaScript (ES6), 97 92 86 bajtów

Ta funkcja najpierw sprawdza poprawność danych wejściowych, a następnie wybiera prawidłową wartość z tabeli odnośników.

Nieoczekiwanie stwierdzono, że jest to najdłuższa sprawdzenie ważności (czy n z formy x * y * oo o x , Y i Z w [2,3,4,5] ?). Musi istnieć krótszy sposób, ale jak dotąd nie mogłem tego rozgryźć.

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

Zwraca postać:

  • N : Brak
  • C : Kostka
  • R : Zwykły prostopadłościan Domina
  • S : Prostopadłościan zmiennokształtny
  • B : Cegła Prostopadłościan
  • F : Floppy Cuboid

Test

Arnauld
źródło
1

Rubin, 106 98 96 bajtów

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

Ponieważ dlaczego nie, na stałe.

Jak podano, 0 = „brak”; 1 = kostka; 2 = Prostopadłościan Domino; 3 = prostopadłościan zmiennokształtny; 4 = dyskietka prostopadłościan; 5 = prostopadłościan

GB
źródło
1

Perl 6 , 69 58 bajtów

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

Wykorzystuje format wyjściowy liczb całkowitych sugerowany w opisie zadania, z tym wyjątkiem, że zwraca niezainicjowaną wartość (Any)zamiast 0w przypadku danych wejściowych, które nie tworzą prawidłowej kostki / prostopadłościanu.

Jak to działa

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

    Generuje listę 8 12 16 20 18 24 30 32 40 50 27 36 45 48 60 75 64 80 100 125.

  2. :32<AM0K21IHN61H5>.comb

    Generuje listę 1 2 3 2 2 5 5 4 5 2 1 2 3 2 5 4 1 2 2 1(z dosłownego base-32).

  3. %(   Z=>   )

    Generuje skrót (mapa asocjacyjna) z pierwszą listą jako kluczami, a drugą listą jako wartości.

  4.    {$_}

    Indeksuje skrót za pomocą numeru wejściowego.

smls
źródło
Heh, teraz widzę, że zastosowałem to samo podejście, co odpowiedź @ Emigna 05AB1E. Ale wymyśliłem to niezależnie, szczerze! :)
smls,
1

Partia, 163 bajty

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

Używa sugerowanego formatu wyjściowego. Objaśnienie: Podstawową ideą jest zapętlenie listy kostek zdefiniowanych w pytaniu. Dla każdej kostki obliczamy, czy jej objętość jest liczbą całkowitą wejściową, a jeśli tak, oblicz typ kostki na podstawie tabeli odnośników.

Oryginalna tabela odnośników była ciągiem liter, ale manipulowanie ciągiem w forpętli jest trudne, więc przełączyłem się na cyfry, które można wyodrębnić arytmetycznie. Niestety Batch jest ograniczony do 32-bitowych liczb całkowitych, więc nie mogłem dopasować wszystkich cyfr do jednej zmiennej (nawet w bazie 5 można uzyskać tylko 13 cyfr), więc zamiast tego podzieliłem zmienną na dwie części, zakodowane w bazie 6 dla wygody. 29948521znajduje się 2545522321w podstawie 6, która koduje 10 najmniejszych prostopadłościanów w odwrotnej kolejności; gdy zabraknie cyfr dodamy 14081593który jest 1221452321w bazie 6 kodującego 10 największych prostopadłościanów.

Neil
źródło