Tentukan jenis berbentuk kubus

17

Pengantar:

Saya seorang kolektor teka-teki berkelok-kelok. Di sini Anda dapat melihat koleksi saya saat ini ± 300 teka-teki.

Saya pikir semua orang tahu Rubik's Cube biasa (3x3x3 Cube), yang merupakan NxNxN Cube. Ada juga Cuboids (puzzle berbentuk balok), yang datang dalam berbagai bentuk, mungkin lebih baik dijelaskan oleh SuperAntionioVivaldi di sini :

  • Domino Cuboids biasa (seperti 2x2x3 ; 2x3x3 ; 3x3x4 ; dll.) - Mereka berbentuk NxNx (N + O) atau Nx (N + O) x (N + O) , yang memiliki dua dimensi ganjil dan sebuah bahkan, atau dua bahkan dan yang aneh.
  • Shapeshifter Cuboids (seperti 2x2x4 ; 3x3x5; 3x3x9 ; 4x4x6 ; dll.) - Mereka berbentuk NxNx (N + P) , yang seperti namanya, shapeshifts (di semua arah). Ketiga dimensi itu aneh atau genap.
  • Floppy Cuboids (seperti 1x3x3 ; 2x4x4 ; dll.) - Mereka datang dalam bentuk Nx (N + P) x (N + P) , yang hampir sama dengan Shapeshifters, tetapi dengan apa yang disebut Floppy Parities.
  • Brick Cuboids (seperti 2x3x4 ; 3x4x5 ; 2x3x5; dll.) - Mereka datang dalam bentuk Nx (N + O) x (N + P), yang sama seperti Regular Domino Cuboids memiliki dua dimensi ganjil dan genap, atau dua genap dan ganjil; tetapi tidak memiliki dimensi yang sama.
  • Ultimate Shapeshifters (seperti 2x4x6 ; 3x5x7; 2x4x10; dll.) - Mereka datang dalam bentuk Nx (N + O) x (N + R) , dan perubahan bentuk ke segala arah. Ketiga dimensi itu ganjil atau genap; tetapi tidak memiliki dimensi yang sama.

Tantangan:

Memasukkan:

Integer positif n dengan batasan berikut: 8 <= n <= 125.
n dapat secara unik diterjemahkan sebagai produk dari tiga nilai (dimensi), yang masing-masing antara 2 dan 5 inklusif.

Alasan saya membatasi ini menjadi 2-5 adalah untuk mencegah input yang digandakan (seperti 1x2x4 = 8dan 2x2x2 = 8), meskipun ada banyak Cuboids dengan urutan lebih rendah / lebih tinggi di luar sana. Ini juga berarti tidak ada kasus uji untuk Ultimate Shapeshifters.

Output / Uji kasus:

Inilah semua kasus yang harus didukung oleh program / fungsi Anda, mulai dari panjang tepi 2 hingga 5 di setiap konfigurasi tiga dimensi yang mungkin:

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

Aturan tantangan:

  • Input non-Cube / non-Cuboid dalam rentang 8-125 akan menghasilkan 'tidak ada' sebagai output.
  • Format output adalah pilihan Anda sendiri. Saya pikir yang paling masuk akal adalah bilangan bulat, seperti 0= 'tidak ada'; 1= Kubus; 2= Domino Biasa berbentuk kubus; 3= Shapeshifter berbentuk kubus; 4= Floppy Cuboid; 5= Brick Cuboid. Format output lain juga baik-baik saja, selama Anda menentukan yang mana yang Anda gunakan.

Aturan umum:

  • Ini adalah , jadi jawaban tersingkat dalam byte menang.
    Jangan biarkan bahasa kode-golf mencegah Anda memposting jawaban dengan bahasa non-codegolf. Cobalah untuk memberikan jawaban sesingkat mungkin untuk bahasa pemrograman 'apa saja'.
  • Aturan standar berlaku untuk jawaban Anda, jadi Anda diperbolehkan menggunakan STDIN / STDOUT, fungsi / metode dengan parameter yang tepat, program lengkap. Panggilanmu.
  • Celah default tidak diperbolehkan. ( CATATAN: Karena saya tidak tahu apakah ada rumus pintar untuk konversi input-ke-output, itu diizinkan untuk membuat hardcode jawaban berdasarkan input. )
  • Jika memungkinkan, silakan tambahkan tautan dengan tes untuk kode Anda.
  • Juga, silakan tambahkan penjelasan jika perlu.
Kevin Cruijssen
sumber
1
Tidak ada kubus helikopter di koleksi Anda?
GB
@ GB Tidak. Saya punya Curvy Copter, Curvy Copter Plus, Curvy Copter III, Curvy Chopter, Helikopter Dodecahedron, dan Custom Curved Copter III yang dibuat khusus, tetapi tidak ada Helicopter Cube. :) Ini agak terlalu mirip dengan Curvy Copter, tapi saya mungkin mendapatkannya suatu hari nanti.
Kevin Cruijssen
Apakah input diurutkan? atau apakah kita harus menyortir secara manual?
Matius Roh
@ MatthewRoh Inputnya adalah bilangan bulat tunggal (yaitu 24), jadi saya tidak tahu apa yang ingin Anda urutkan tentang itu?
Kevin Cruijssen

Jawaban:

6

05AB1E , 26 21 byte

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

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

Cobalah online! atau sebagai Test suite

Penjelasan

•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

Satu-satunya tempat saya melihat bahwa kita dapat menyimpan byte di sini adalah menemukan cara yang lebih baik untuk menghasilkan angka 123224454212324512210 .

Hanya 1-off dari prime, jadi satu kemungkinan save adalah menemukan indeks prime itu dan menghasilkan indeks dalam waktu kurang dari 9 byte.
Saya tidak tahu seberapa baik fungsi pi bekerja untuk bilangan prima 21-digit tapi itu bisa menjadi kemungkinan.

Emigna
sumber
Bagus, saya penasaran dengan penjelasan itu untuk melihat rumus / quirk / pola apa yang Anda gunakan untuk menentukan Cube / Cuboid. +1
Kevin Cruijssen
1
@KevinCruijssen: Saya mungkin masih bisa menyimpan satu atau dua byte. Saya akan menambahkan penjelasan setelah saya mencobanya. Saya mempunyai yang utama, saya ingin menemukan urutannya (tapi saya belum menemukan sesuatu yang online untuk membantu saya dengan hal itu dan saya sedang bekerja sehingga saya tidak punya waktu untuk mengimplementasikan sesuatu sendiri :)
Emigna
@Emigna jeebus creezy, sudah berapa lama kada? !! ??!?!?!?!
Magic Gurita Guci
@carusocomputing Sejak 30 Desember 2015.
Adnan
3

JavaScript (ES6), 97 92 86 byte

Fungsi ini pertama-tama memeriksa validitas input, lalu mengambil nilai yang benar dari tabel pencarian.

Anehnya, bagian terpanjang adalah pemeriksaan validitas (apakah n dalam bentuk x * y * z dengan x , y dan z dalam [2,3,4,5] ?). Pasti ada cara yang lebih singkat untuk melakukannya, tetapi saya tidak bisa mengetahuinya sejauh ini.

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

Mengembalikan karakter:

  • N : Tidak ada
  • C : Cube
  • R : Domino Biasa berbentuk kubus
  • S : Shapeshifter Cuboid
  • B : Brick Cuboid
  • F : Berbentuk Kubus Floppy

Uji

Arnauld
sumber
1

Ruby, 106 98 96 byte

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

Karena, mengapa tidak, hardcoding.

Seperti yang ditentukan, 0 = 'tidak ada'; 1 = Kubus; 2 = Domino Cuboid Biasa; 3 = Shapeshifter Cuboid; 4 = Floppy Cuboid; 5 = Brick Cuboid

GB
sumber
1

Perl 6 , 69 58 byte

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

Menggunakan format output integer yang disarankan dalam deskripsi tugas, kecuali bahwa ia mengembalikan nilai yang tidak diinisialisasi (Any)daripada 0dalam kasus input yang tidak membentuk kubus / kuboid yang valid.

Bagaimana itu bekerja

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

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

  2. :32<AM0K21IHN61H5>.comb

    Menghasilkan daftar 1 2 3 2 2 5 5 4 5 2 1 2 3 2 5 4 1 2 2 1(dari basis-32 literal).

  3. %(   Z=>   )

    Menghasilkan hash (peta asosiatif) dengan daftar pertama sebagai kunci, dan daftar kedua sebagai nilai.

  4.    {$_}

    Mengindeks Hash dengan nomor input ..

seseorang
sumber
Heh, saya mengerti sekarang bahwa saya telah menggunakan pendekatan yang sama dengan jawaban 05AB1E @ Emigna. Tapi saya datang dengan itu sendiri, jujur! :)
smls
1

Batch, 163 byte

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

Menggunakan format output yang disarankan. Penjelasan: Ide dasarnya adalah untuk mengulang daftar kubus seperti yang didefinisikan dalam pertanyaan. Untuk setiap kubus, kami menghitung untuk melihat apakah volumenya adalah bilangan bulat input, dan jika demikian, hitung jenis kubus dari tabel pencarian.

Tabel pencarian asli adalah string huruf, tetapi melakukan manipulasi string dalam satu forlingkaran itu rumit, jadi saya beralih ke digit yang dapat diekstraksi secara aritmetika. Sayangnya Batch terbatas pada bilangan bulat 32-bit jadi saya tidak bisa memasukkan semua digit ke dalam variabel tunggal (bahkan di basis 5 Anda hanya bisa mendapatkan 13 digit) jadi alih-alih saya membagi variabel menjadi dua bagian, dikodekan dalam basis 6 untuk kenyamanan. 29948521ada 2545522321di basis 6 yang mengkodekan 10 kuboid terkecil dalam urutan terbalik; ketika kehabisan digit kami tambahkan 14081593yang ada 1221452321di basis 6 pengkodean 10 cuboids terbesar.

Neil
sumber