Bangun piramid ini


21

Piramida Anda

Piramida yang saya ingin Anda bangun seluruhnya terbuat dari kubus. Ini memiliki 24 lapisan, dan lapisan ke- N dari atas berisi N 2 kubus disusun dalam bujur sangkar oleh N. Piramida terlihat seperti ini:

Piramida

Untuk membangun piramida, Anda akan membutuhkan pasokan kubus. Anda diberi 4.900 kubus disusun dalam 70 oleh 70 persegi yang terlihat seperti ini:

Kotak itu

(Oke, saya akui bahwa gambar alun-alun sama sekali tidak perlu.)

Karena 1 2 + 2 2 + 3 2 + ... + 24 2 = 70 2 , Anda memiliki jumlah kubus yang tepat untuk membangun piramida. Yang harus Anda lakukan adalah memberi tahu saya di mana setiap kubus harus pergi.

Tugas Anda

Anda harus memilih bijih acak antara kubus di alun-alun dan kubus di piramida. (Akan lebih baik jika jawaban Anda mengatakan yang mana dari 4900! Biopsi berbeda yang Anda gunakan.)

Kemudian, tulis fungsi atau program yang melakukan hal berikut:

  • Mengingat lokasi kubus di 70 dengan 70 persegi (sebagai pasangan koordinat (X,Y)),
  • Keluarkan lokasinya di piramida (sebagai tiga koordinat (A,B,C)).

Koordinat input dan output semuanya bisa 0-diindeks atau 1-diindeks. Dengan asumsi 1-diindeks, input Anda (X,Y)akan menjadi sepasang bilangan bulat antara 1 dan 70. Output Anda (A,B,C)akan menjadi tiga kali lipat dari bilangan bulat; Aharus menjadi penghitungan lapisan dari atas (antara 1 dan 24) dan (B,C)harus menjadi koordinat kubus itu di dalam lapisan itu (antara 1 dan A).

Sebagai contoh:

  • kubus atas dari piramida memiliki koordinat (1,1,1).
  • Empat sudut dasar piramida memiliki koordinat (24,1,1), (24,1,24), (24,24,1), dan (24,24,24).
  • Jika Anda memutuskan untuk menempatkan sudut-sudut alun-alun di sudut-sudut piramida, maka pada input (70,1)Anda dapat memberikan output (24,24,1).

Anda mungkin menganggap Anda hanya akan diberikan koordinat yang valid (X,Y)sebagai input. Kebenaran sepenuhnya ditentukan oleh aturan berikut: dua input valid berbeda harus selalu memberikan dua onput yang valid berbeda.

Ini adalah : kode terpendek menang.

Jawaban:


7

Jelly , 15 14 byte

24p;€$€Ẏ
ḅ70ị¢

Cobalah online!

Ini cukup sederhana: kami membuat daftar koordinat kubus di dalam piramida sebagai daftar aktual. Maka semua yang perlu kita lakukan adalah biject koordinat input dalam kuadrat ke dalam indeks dalam daftar, yang sepele untuk dilakukan melalui konversi basis.

Kiriman ini berfungsi baik sebagai program penuh (mengambil koordinat [x, y]melalui argumen baris perintah pertama dan menghasilkan keluaran standar), atau sebagai fungsi, secara implisit dinamai 2Ŀ.

Penjelasan

Membangun daftar

Kami mulai dengan angka 24, yang ditafsirkan sebagai kisaran dari 1 hingga 24 inklusif (karena kami mencoba menggunakannya seolah-olah itu adalah daftar). Kemudian kita beralih di atasnya; itulah yang dilakukan oleh program terakhir . Untuk setiap elemen n daftar:

  • Kami membangun daftar pasangan x , y di mana setiap elemen berasal dari 1 .. n ; pmembangun daftar pasangan yang diberi dua set elemen, dan karena hanya satu nilai yang tersedia di sini ( n ), itu secara implisit digunakan untuk kedua set, yang oleh karena itu keduanya menjadi daftar dari 1. n .
  • Kami menambahkan n (lagi, satu-satunya nilai yang kami miliki) untuk setiap elemen daftar ( ;€).
  • Untuk membuat yang kedua menerapkan kedua operasi ini untuk setiap n (yaitu untuk membuat satu loop yang berisi dua instruksi), kita gunakan $untuk mengelompokkan dua instruksi menjadi satu.

Akhirnya, kami gunakan untuk meratakan daftar dengan satu tahap, untuk mendapatkan daftar yang hanya berisi semua koordinat secara berurutan. Dimulai seperti ini:

[1, 1, 1], [1, 1, 2], [1, 2, 2], [2, 1, 2], [2, 2, 2], [1, 1, 3], [1 , 2, 3], [1, 3, 3], [2, 1, 3], [2, 2, 3], [2, 3, 3], [3, 1, 3], [3, 2 , 3], [3, 3, 3], [1, 1, 4], [1, 2, 4], [1, 3, 4], [1, 4, 4], [2, 1, 4 ], [2, 2, 4], [2, 3, 4], [2, 4, 4], [3, 1, 4], [3, 2, 4], [3, 3, 4], [3, 4, 4], [4, 1, 4], [4, 2, 4], [4, 3, 4], [4, 4, 4],…

dan diakhiri dengan [24, 24, 24].

Mengindeks daftar

Kami mulai dengan mengonversi koordinat input ke angka dengan menafsirkannya sebagai bilangan bulat 70: ḅ70. Ini memberi kami nilai dalam kisaran 71 hingga 4970 inklusif; semua nilai ini adalah mod 4900. diindeks ke dalam modulo daftar panjang, sehingga [1, 1]akan memberi kita elemen 71, [1, 2]elemen 72, semua jalan sampai [70, 70]yang memberi kita elemen ke 70 (yaitu elemen sebelum jawaban untuk [1, 1]). Akhirnya, kita hanya perlu ¢memberi tahu kita daftar mana yang akan diindeks (dalam hal ini, daftar yang ditentukan oleh baris sebelumnya; itulah yang ¢dilakukan, jalankan baris sebelumnya tanpa argumen).



6

PHP, 75 82 78 byte

Diindeks 0 :

atur P = X * 70 + Y lalu kurangi P sebesar A 2 sambil berjalan ke lapisan yang benar. A-1; P / A; P% A - selesai.

(terbalik: sambil menambah A ke lapisan yang benar: P = P + A 2 lalu P = P + A * B + C -> X = P / 70, Y = P% 70)

for($p=$argv[1]*70+$argv[2];$p>=++$a**2;$p-=$a**2);echo$a-1,_,$p/$a|0,_,$p%$a;

Jalankan dengan php -nr '<code>' <X> <Y>; mencetak A_B_C.

1-diindeks, 82 byte :

for($p=$argv[1]*70+$argv[2]-71;$p>++$a**2;$p-=$a**2);echo$a,_,$p/$a+1|0,_,$p%$a+1;

1
Bukankah Anda seharusnya mengatur P ke X * 70 + Y?
Misha Lavrov

4

Python, 80 73 72 byte

Pengajuan pertama, jangan terlalu keras q:

Diindeks 0

lambda x,y:[(a-1,b//a,b%a)for a in range(25)for b in range(a*a)][70*x+y]

Membuat daftar panjang 4900 dengan semua koordinat piramida dan mengembalikan entri daftar yang berbeda untuk setiap input.

Cobalah online!


Selamat datang di situs dan posting pertama yang bagus! Ada banyak pegolf Python yang bersedia mencoba golf solusi Anda di sini, dan saya harap Anda menikmati PPCG!
caird coinheringaahing

Anda bisa mempersingkat a**2untuk a*amenyimpan byte.
Luke

Wow, itu yang sederhana. Terima kasih.
PattuX


3

C 89 , 87 , 82 , 71 byte

Mengambil solusi Python xnor, dan menghapus linebreak

p(x,y){for(x=-70*y-x,y=1;x<0;x+=++y*y);printf("%d %d %d",~-y,x/y,x%y);}

Diindeks 0

z;p(x,y){for(x+=y*70+1,y=z=0;z<x;z+=++y*y);z-=x;printf("%d %d %d\n",y-1,z/y,z%y);}

1-diindeks

z;p(x,y){for(x+=~-y*70,y=z=1;z<x;z+=++y*y);z-=x-y;printf("%d %d %d\n",y,z/y,z%y+1);}

Saya pikir itu harus z / y +1 dalam versi 1-diindeks.
Titus

@Itus Saya tidak mengerti mengapa, itu sesuai dengan pertanyaan OP apa adanya
PrincePolka

2

Batch, 103 byte

@set/an=%1*70+%2,i=0
:l
@set/an-=i*i,j=i,i+=1,k=n%%i,l=n/i
@if %l% geq %i% goto l
@echo %j% %k% %l%

Diindeks 0. Bekerja melalui setiap lapisan mulai dari atas.


2

J, 37 byte

-4 byte terima kasih kepada FrownyFrog

(a:-.~,(<:,&.>{@;~&i.)"0 i.25){~70&#.

Terjemahan yang cukup mudah dari metode Jelly ke pengindeksan J. Menggunakan 0. Kotak piramida atas adalah yang pertama. Sudut kanan bawah pangkalan adalah yang terakhir.

Mayoritas kode adalah boilerplate untuk menghasilkan daftar tiga indeks sebagai konstanta. Menemukan elemen yang benar dalam daftar itu berdasarkan input 2 elemen hanyalah masalah menerjemahkan dari basis 70 dengan70&#.

Cobalah online!


(#~~:&a:)->a:-.~
FrownyFrog

@FrownyFrog Terima kasih. Seperti yang sering terjadi pada saya di J, saya pernah menggunakan trik itu sebelumnya dan melupakannya dalam kasus ini. Btw, Anda mungkin tertarik dengan pertanyaan ini , yang terinspirasi oleh masalah ini.
Jonah

1

Sekam , 13 byte

!foEG▲π3Π4B70

Cobalah online! Indeks mulai dari 1.

Penjelasan

Seperti beberapa jawaban lain, saya membuat daftar lengkap koordinat piramida dan cukup mengindeksnya. Saya melakukan ini dengan mendaftar semua tiga kali lipat di [A,B,C]mana angkanya antara 1 dan 24 (dinyatakan sebagai 4! Untuk menyimpan byte) dan menyimpannya A >= max(B,C).

!foEG▲π3Π4B70  Implicit input: a list of two numbers.
          B70  Interpret in base 70.
!              Modular index into the following list:
        Π4      Factorial of 4: 24
      π3        Take range and 3-fold Cartesian power: [[1,1,1],[1,1,2],..,[24,24,24]]
 f              Filter by
  oE            all values are equal
    G▲          in cumulative reduce by maximum.
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.