สร้างปิรามิดนี้


21

ปิรามิดของคุณ

ปิรามิดที่ฉันต้องการให้คุณสร้างทำจากลูกบาศก์ทั้งหมด มันมี 24 ชั้นและ N THชั้นจากด้านบนมี N 2ก้อนจัดใน N จาก N ตาราง ปิรามิดมีลักษณะดังนี้:

ปิรามิด

ในการสร้างปิรามิดคุณจะต้องมีลูกบาศก์ คุณจะได้รับ 4900 ลูกบาศก์จัดเรียงใน 70 โดย 70 ตารางที่มีลักษณะเช่นนี้:

สี่เหลี่ยมจตุรัส

(โอเคฉันยอมรับว่ารูปภาพของสแควร์ไม่จำเป็นเลย)

ตั้งแต่ 1 2 + 2 2 + 3 2 + ... + 24 2 = 70 2คุณมีจำนวนลูกบาศก์ที่ถูกต้องในการสร้างปิรามิด สิ่งที่คุณต้องทำคือบอกฉันว่าแต่ละก้อนควรไปที่ไหน

งานของคุณ

คุณควรเลือก bijection ตามอำเภอใจระหว่างลูกบาศก์ในจัตุรัสและก้อนในปิรามิด (มันคงจะดีถ้าคำตอบของคุณบอกว่าอันไหนของ 4900! bijections ที่คุณใช้อยู่)

จากนั้นเขียนฟังก์ชันหรือโปรแกรมที่ทำสิ่งต่อไปนี้:

  • เมื่อกำหนดตำแหน่งของลูกบาศก์ใน 70 ด้วย 70 สี่เหลี่ยมจัตุรัส (เป็นคู่ของพิกัด(X,Y))
  • เอาท์พุทตำแหน่งในปิรามิด (เป็นสามเท่าของพิกัด(A,B,C))

พิกัดอินพุตและเอาต์พุตสามารถเป็น 0 หรือดัชนี 1 ดัชนี สมมติว่ามีการจัดทำดัชนี 1 อินพุทของคุณ(X,Y)จะเป็นจำนวนเต็มคู่ระหว่าง 1 ถึง 70 เอาต์พุตของคุณ(A,B,C)จะเป็นจำนวนเต็มสามเท่า Aควรนับเลเยอร์จากด้านบน (ระหว่าง 1 ถึง 24) และ(B,C)ควรเป็นพิกัดของคิวบ์นั้นภายในเลเยอร์นั้น (ระหว่าง 1 ถึงA)

ตัวอย่างเช่น:

  • (1,1,1)ก้อนด้านบนของปิรามิดมีพิกัด
  • มุมทั้งสี่ของฐานของพีระมิดมีพิกัด(24,1,1), (24,1,24), และ(24,24,1)(24,24,24)
  • หากคุณตัดสินใจที่จะวางมุมของตารางที่มุมของปิรามิดแล้วกับการป้อนข้อมูลที่คุณอาจจะให้การส่งออก(70,1)(24,24,1)

คุณอาจคิดว่าคุณจะได้รับพิกัดที่ถูกต้อง(X,Y)เป็นอินพุตเท่านั้น ความถูกต้องจะถูกกำหนดทั้งหมดโดยกฎต่อไปนี้: อินพุตที่ถูกต้องสองค่าที่ต่างกันควรให้สองค่าที่ต่างกัน

นี่คือ : รหัสที่สั้นที่สุดชนะ

คำตอบ:


7

เยลลี่ , 15 14 ไบต์

24p;€$€Ẏ
ḅ70ị¢

ลองออนไลน์!

นี่ค่อนข้างง่าย: เราสร้างรายการพิกัดของลูกบาศก์ภายในพีระมิดเป็นรายการจริง จากนั้นสิ่งที่เราต้องทำคือ biject พิกัดอินพุตภายในช่องสี่เหลี่ยมเป็นดัชนีภายในรายการซึ่งเป็นเรื่องเล็กน้อยที่ต้องทำผ่านการแปลงฐาน

ส่งนี้ทำงานไม่ว่าจะเป็นโปรแกรมเต็มรูปแบบ (การพิกัดเป็น[x, y]ผ่านอาร์กิวเมนต์บรรทัดคำสั่งครั้งแรกและการแสดงผลในการส่งออกมาตรฐาน) 2Ŀหรือเป็นฟังก์ชั่นการตั้งชื่อโดยปริยาย

คำอธิบาย

การสร้างรายการ

เราเริ่มต้นด้วยตัวเลข24ซึ่งถูกตีความว่าเป็นช่วงตั้งแต่ 1 ถึง 24 รวม (เพราะเรากำลังพยายามใช้มันราวกับว่าเป็นรายการ) จากนั้นเราก็ย้ำมัน นั่นคือสิ่งที่คนสุดท้ายในโปรแกรมทำ สำหรับแต่ละองค์ประกอบnของรายการ:

  • เราสร้างรายการคู่x , yที่แต่ละองค์ประกอบมาจาก 1 .. n ; pสร้างรายชื่อของคู่ให้สองชุดขององค์ประกอบและเพราะเพียงค่าเดียวสามารถใช้ได้ที่นี่ ( n ) ก็ใช้โดยปริยายสำหรับทั้งสองชุดซึ่งทั้งสองจึงกลายเป็นรายการจาก 1 .. n
  • เราผนวกn (อีกครั้งค่าเดียวที่เรามีให้) ไปยังแต่ละองค์ประกอบของรายการ ( ;€)
  • ในการทำให้ครั้งที่สองใช้การดำเนินการทั้งสองนี้กับแต่ละn (เช่นเพื่อสร้างลูปที่มีสองคำแนะนำ) เราใช้$เพื่อจัดกลุ่มคำสั่งสองคำเป็นหนึ่ง

ในที่สุดเราใช้เพื่อทำให้รายการแบนขึ้นโดยหนึ่งขั้นตอนเพื่อให้ได้รายการที่มีพิกัดทั้งหมดตามลำดับ มันเริ่มเป็นแบบนี้:

[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], ...

และลงท้ายด้วย [24, 24, 24]

จัดทำดัชนีรายการ

เราเริ่มต้นด้วยการแปลงพิกัดอินพุตให้เป็นตัวเลขโดยการตีความมันเป็นจำนวนเต็ม 70 ฐาน: ḅ70 สิ่งนี้ทำให้เรามีค่าในช่วง 71 ถึง 4970 รวม; ค่าทั้งหมดเหล่านี้เป็น mod 4900 ที่ไม่ซ้ำกันดัชนีลงในรายการ modulo ตามความยาวของรายการดังนั้น[1, 1]จะให้องค์ประกอบ 71st กับเรา[1, 2]72 องค์ประกอบตลอดทางจนถึง[70, 70]องค์ประกอบ 70th (เช่นองค์ประกอบก่อนคำตอบสำหรับ[1, 1]) สุดท้ายเราเพียงแค่ต้อง¢บอกให้เราทราบว่ารายการใดที่จะจัดทำดัชนี (ในกรณีนี้คือรายการที่ระบุโดยบรรทัดก่อนหน้านั่นคือสิ่งที่¢เรียกใช้บรรทัดก่อนหน้าโดยไม่มีอาร์กิวเมนต์)



6

PHP, 75 82 78 ไบต์

ดัชนี 0 :

ตั้งค่า P = X * 70 + Y จากนั้นลด P ด้วย A 2ขณะที่เดินไปยังเลเยอร์ที่ถูกต้อง A-1; P / A; P% A - เสร็จแล้ว

(กลับด้าน: ขณะเพิ่ม A ไปยังเลเยอร์ที่ถูกต้อง: P = P + A 2 และ 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;

ทำงานด้วยphp -nr '<code>' <X> <Y>; พิมพ์ A_B_C

ดัชนี 1 ไบต์, 82 ไบต์ :

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

1
คุณไม่ควรตั้งค่า P เป็น X * 70 + Y แทนใช่ไหม
Misha Lavrov

4

Python, 80 73 72 ไบต์

การส่งครั้งแรกไม่รุนแรงเกินไป q:

0 การจัดทำดัชนี

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

สร้างรายการความยาว 4900 พร้อมพิกัดพีระมิดทั้งหมดและส่งคืนรายการที่แตกต่างกันสำหรับแต่ละอินพุต

ลองออนไลน์!


ยินดีต้อนรับสู่เว็บไซต์และโพสต์แรกที่ดี! มีนักกอล์ฟ Python จำนวนมากที่เต็มใจลองเล่นกอล์ฟที่นี่และหวังว่าคุณจะสนุกกับ PPCG!
caird coinheringaahing

คุณสามารถย่อa**2ให้สั้นลงa*aเพื่อบันทึกไบต์
ลุค

ว้าวนั่นเป็นเรื่องง่าย ขอบคุณ
PattuX


3

C 89 , 87 , 82 , 71 ไบต์

ใช้โซลูชัน Python ของ xnor และลบ 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);}

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 การจัดทำดัชนี

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);}

ฉันคิดว่ามันควรจะเป็น z / y + 1 ในเวอร์ชันที่จัดทำดัชนี 1 ตัว
ติตัส

@Titus ฉันไม่เห็นว่าทำไมมันเป็นไปตามคำถามของ OP ตามที่เป็นอยู่
PrincePolka

2

แบตช์ 103 ไบต์

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

0 การจัดทำดัชนี ทำงานผ่านแต่ละเลเยอร์โดยเริ่มจากด้านบน


2

J, 37 ไบต์

-4 ไบต์ขอบคุณ FrownyFrog

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

การแปลวิธี Jelly อย่างตรงไปตรงมาอย่างยุติธรรมตรงไปตรงมาเป็น J. ใช้ 0 การจัดทำดัชนี ปิรามิดบนสุดเป็นที่แรก มุมล่างขวาของฐานเป็นมุมสุดท้าย

ส่วนใหญ่ของรหัสคือสำเร็จรูปเพื่อสร้างรายการดัชนีสามเท่าเป็นค่าคงที่ การค้นหาองค์ประกอบที่ถูกต้องภายในรายการนั้นตามการป้อนข้อมูลองค์ประกอบ 2 เป็นเรื่องของการแปลจากฐาน 70 ด้วย70&#.

ลองออนไลน์!


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

@FrownyFrog ขอบคุณ เกิดขึ้นกับฉันบ่อยครั้งในเจฉันเคยใช้เคล็ดลับนั้นมาก่อนและลืมเรื่องนี้ไปในกรณีนี้ แต่คุณอาจสนใจคำถามนี้ซึ่งได้รับแรงบันดาลใจจากปัญหานี้
Jonah

1

Husk , 13 ไบต์

!foEG▲π3Π4B70

ลองออนไลน์! ดัชนีเริ่มจาก 1

คำอธิบาย

เช่นเดียวกับคำตอบอื่น ๆ ฉันสร้างรายการพีระมิดพิกัดแบบเต็มและทำดัชนีลงไป ฉันทำสิ่งนี้โดยการแสดงรายการอเนกประสงค์ทั้งหมด[A,B,C]ที่ตัวเลขอยู่ระหว่าง 1 ถึง 24 (แสดงเป็น 4! เพื่อบันทึกไบต์) และเก็บรักษาสิ่งที่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.
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.