ผลิตสแควร์เวทย์มนตร์ของDürer


14

ความท้าทาย

ส่งออกอาร์เรย์หรือสตริงที่เป็นตัวแทนของตารางมายากลที่มีชื่อเสียงของDürer :

ป้อนคำอธิบายรูปภาพที่นี่

นั่นคือ,

16  3  2 13
 5 10 11  8
 9  6  7 12
 4 15 14  1

คุณสมบัติบางอย่างของสี่เหลี่ยมจัตุรัสซึ่งอาจถูกฉวยประโยชน์คือ:

  • มันมีจำนวนเต็มแต่ละค่าจาก1ถึง16หนึ่งครั้ง
  • ผลรวมของแต่ละคอลัมน์หรือแถวเช่นเดียวกับผลรวมของแต่ละเส้นทแยงมุมทั้งสองจะเท่ากัน นี่คือการกำหนดคุณสมบัติของตารางมายากล ผลรวมคือค่าคงที่เวทย์มนตร์ของสแควร์
  • นอกจากนี้สำหรับสี่เหลี่ยมจัตุรัสนี้โดยเฉพาะผลรวมของแต่ละจตุภาคทั้งสี่นั้นก็เท่ากับค่าคงที่เวทย์มนตร์เช่นเดียวกับผลรวมของจุดศูนย์กลางสี่สี่เหลี่ยมและผลรวมของมุมสี่สี่เหลี่ยม

กฎระเบียบ

ไม่อนุญาตให้ใช้ Bultins ที่สร้างเวทย์มนตร์สแควร์ส (เช่น Matlab's magicหรือ Mathematica MagicSquare) builtin อื่น ๆ สามารถใช้ได้

รหัสสามารถเป็นโปรแกรมหรือฟังก์ชั่น

ไม่มีอินพุต

ตัวเลขต้องอยู่ในฐาน 10 รูปแบบผลลัพธ์มีความยืดหยุ่นตามปกติ ความเป็นไปได้บางอย่างคือ:

  • อาร์เรย์ที่ซ้อนกัน (ทั้งฟังก์ชั่นเอาท์พุทหรือการเป็นตัวแทนสตริงของมันมีหรือไม่มีตัวคั่นประเภทของการจับคู่วงเล็บ):

    [[16, 3, 2, 13], [5, 10, 11, 8], [9, 6, 7, 12], [4, 15, 14, 1]]
    
  • อาร์เรย์ 2 มิติ:

    {16, 3, 2, 13; 5, 10, 11, 8; 9, 6, 7, 12; 4, 15, 14, 1}
    
  • อาร์เรย์ของสี่สายหรือสตริงที่ประกอบด้วยสี่บรรทัด ตัวเลขอาจจัดชิดขวา

    16  3  2 13
     5 10 11  8
     9  6  7 12
     4 15 14  1
    

    หรือจัดชิดซ้าย

    16 3  2  13
    5  10 11  8
    9  6  7  12
    4  15 14  1
    
  • สตริงที่มีตัวคั่นสองตัวต่างกันสำหรับแถวและคอลัมน์เช่น

    16,3,2,13|5,10,11,8|9,6,7,12|4,15,14,1
    

รูปแบบผลลัพธ์ควรแยกความแตกต่างระหว่างแถวและคอลัมน์อย่างชัดเจน ตัวอย่างเช่นจะไม่ได้รับอนุญาตให้ส่งออกอาร์เรย์แบบแบนหรือสตริงที่มีตัวเลขทั้งหมดคั่นด้วยช่องว่าง

รหัสกอล์ฟ ชนะสั้นที่สุด



4
น่าสนใจตัวเลข 5, 8, 9 และ 12 อยู่ในตำแหน่ง (1 ดัชนี), 6, 7, 10 และ 11 ได้รับการสะท้อนในแนวตั้ง, 2, 3, 14 และ 15 ได้รับการสะท้อนในแนวนอนและ 1, 4, 13 และ 16 ถูกหมุน 180 ° ฉันสงสัยว่าจะช่วยให้ใคร
Neil

2
การสังเกตที่มีประโยชน์อาจเป็นไปได้: ถ้าคุณลด 1 จากแต่ละตัวเลขคุณสามารถสร้างสแควร์โดยเริ่มต้นด้วยอาร์เรย์[15]จากนั้นเชื่อมต่อมันซ้ำ ๆ โดยย้อนกลับกับแต่ละรายการ XORed ด้วย 13, 3, 8 และ 15 ตามลำดับ
ETHproductions

6
ดูเหมือนจะเป็นการยากที่จะบีบอัดในภาษาที่ไม่ใช่กอล์ฟ ฉันคิดว่าตารางเวทย์มนตร์ที่ใหญ่กว่าน่าจะทำได้ดีกว่า
xnor

1
ฉันค่อนข้างแน่ใจว่าแต่ละการหมุนหรือการสะท้อนของสี่เหลี่ยมจัตุรัสจะมีคุณสมบัติเหมือนกัน
เดนนิส

คำตอบ:


7

เยลลี่ 15 ไบต์

“¡6ṡƘ[²Ḳi<’ḃ⁴s4

TryItOnline!

น่าเบื่อมากขอโทษ:

เตรียม: เอาสแควร์, อ่านโดยแถว, แปลงจากฐาน bijective 16, แปลงให้เป็นฐาน 250, ค้นหาดัชนีโค้ดเพจสำหรับ "หลัก" เหล่านั้น (¡6ṡƘ[²Ḳi< )

จากนั้นเยลลี่จะอ่านดัชนีเพื่อทำตัวเลขฐาน 250 แปลงเป็นฐาน bijective 16 ( ḃ⁴) และแยกเป็นชิ้นขนาด 4 ( s4)


ถ้าเราได้รับอนุญาตให้ส่งออกการวางแนวทางที่แตกต่างกันคว่ำลงเป็นไปได้ใน14 :

“#⁷ƙ¤ṆWȷỤ’ḃ⁴s4

ทดสอบ


ในทางทฤษฎีให้หน่วยความจำเพียงพอสำหรับ16!จำนวนเต็มต่อไปนี้จะให้แนวทางที่ถูกต้องใน14 :

⁴Œ!“ŒCġŀḌ;’ịs4

นี้จะสร้างพีชคณิตทั้งหมดของ [1,16] ด้วย⁴Œ!และรับค่าที่ดัชนี 19800593106060 (1-based) ที่มีการใช้ฐาน 250 ตัวแทนŒCġŀḌ;และแยกมันเป็นชิ้นความยาว s44


ตั้งแต่นั้นมาผมได้เพิ่มสี่อะตอมใหม่ ( Œ?, Œ¿, œ?และœ¿) เพื่อ Jelly กับสถานการณ์ดังกล่าวอยู่
monad Œ?ใช้จำนวนเต็ม (หรือวนซ้ำได้) และส่งกลับค่าการเรียงสับเปลี่ยนที่สั้นที่สุดที่เป็นไปได้ของการเรียกใช้ตัวเลขธรรมชาติซึ่งจะมีดัชนีที่กำหนด (หรือดัชนี) ในรายการเรียงลำดับตามพจนานุกรมของการเรียงสับเปลี่ยนทั้งหมดของตัวเลขเหล่านั้น
... และมันก็ทำได้โดยไม่ต้องสร้างรายการการเปลี่ยนแปลงใด ๆ
เช่นนี้ต่อไปนี้จะทำงานเป็นเวลา12 (เห็นได้ชัดว่าไม่ใช่การแข่งขัน):

“ŒCġŀḌ;’Œ?s4

ปล่อยมันไป!


นี่ควรจะสั้นลงในส้อมวุ้นของคุณ (ซึ่งฉันลืมไปจนถึงตอนนี้ขอโทษ)
เดนนิส

โอ้? คุณคิดว่า?
Jonathan Allan

8

Pyth, 18 ไบต์

c4.PC"H#ût"_S16

เรียกใช้รหัส

c4.PC"H#ût"_S16

    C"H#ût"       Convert the packed string to the number 1122196781940
  .P       _S16   Take that-numbered permutation of the reversed range [16,15,...,1]
c4                Chop into piece of length 4

การย้อนกลับของช่วงนั้นหมายถึงการลดดัชนีการเปลี่ยนแปลงเนื่องจากผลผลิตเริ่มต้นด้วย 16 แต่ฉันคิดว่ามันพังได้

วิธีนี้จะทำให้กลยุทธ์ที่น่าเบื่อมากขึ้นในการแปลงตารางเป็นฐาน 17 โดยตรงจากนั้นสตริง ( ลิงก์ ) สำหรับ 20 ไบต์:

c4jC"úz(ás¸H"17 

7

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

4Œ!.ịm0µZḂÞ’×4+

ลองออนไลน์!

พื้นหลัง

หากเราลบ1จากตัวเลขในจตุรัสแล้วหารด้วย4 (คำนวณความฉลาดทางและส่วนที่เหลือ) รูปแบบจะชัดเจนขึ้น

quotients and remainders    quotients    remainders

   3 3  0 2  0 1  3 0        3 0 0 3      3 2 1 0
   1 0  2 1  2 2  1 3        1 2 2 1      0 1 2 3
   2 0  1 1  1 2  2 3        2 1 1 2      0 1 2 3
   0 3  3 2  3 1  0 0        0 3 3 0      3 2 1 0

เมทริกซ์ที่เหลือตามรูปแบบที่ชัดเจนและง่ายต่อการสร้าง เมทริกซ์ความฉลาดสามารถหาได้โดยการเปลี่ยนเมทริกซ์ส่วนที่เหลือและสลับแถวกลาง

มันทำงานอย่างไร

4Œ!.ịm0µZḂÞ’×4+  Main link. No arguments.

4Œ!              Compute the array of all permutations of [1, 2, 3, 4], in
                 lexicographical order.
   .ị            Take the permutations at the indices adjacent to 0.5, i.e., the
                 ones at indices 0 ([4, 3, 2, 1]) and 1 ([1, 2, 3, 4]).
     m0          Concatenate the resulting [[4, 3, 2, 1], [1, 2, 3, 4]] with a
                 reversed copy, yielding the matrix
                 M := [[4, 3, 2, 1], [1, 2, 3, 4], [1, 2, 3, 4], [4, 3, 2, 1]].
       µ         Begin a new, monadic chain. Argument: M
        Z        Zip/transpose M, yielding the matrix
                 [[4, 1, 1, 4], [3, 2, 2, 3], [2, 3, 3, 2], [1, 4, 4, 1]].
         ḂÞ      Sort the rows by the lexicographical order of their parities,
                 yielding [[4, 1, 1, 4], [2, 3, 3, 2], [3, 2, 2, 3], [1, 4, 4, 1]].
           ’     Subtract 1 to yield the matrix of quotients, i.e.,
                 [[3, 0, 0, 3], [1, 2, 2, 1], [2, 1, 1, 2], [0, 3, 3, 0]].
            ×4+  Multiply the quotient by 4 and add the result to M (remainders).

5

J, 37 27 ไบต์

บันทึก 10 ไบต์ด้วยไมล์!

4 4$1+19800593106059 A.i.16

ตอนนี้น่าเบื่อน้อยลง! นี้จะใช้เวลา19800593106059การเปลี่ยนแปลงของรายการซึ่งเป็นi.16 15 2 1 12 4 9 10 7 8 5 6 11 3 14 13 0จากนั้นจะเพิ่มขึ้นจากนั้นจะมีรูปร่างเป็น4โดย4รายการ

รุ่นอื่นที่ไม่มีช่องว่าง:

_4]\1+19800593106059&A.i.16

เอาท์พุทสำหรับลูกหลาน:

   _4]\1+19800593106059&A.i.16
16  3  2 13
 5 10 11  8
 9  6  7 12
 4 15 14  1
   4 4$1+19800593106059 A.i.16
16  3  2 13
 5 10 11  8
 9  6  7 12
 4 15 14  1

ฉันคิดว่าใช้_4]\1+19800593106059&A.i.16งานได้ แต่อาจทำให้สั้นลงได้
ไมล์

@miles OO, A.การใช้งานที่ดีของ คุณคิดเลขนั้นยังไง
Conor O'Brien

Monadic A.พบว่าดัชนีการเปลี่ยนแปลงของการเปลี่ยนรูปเป็นศูนย์ที่มีค่า
ไมล์

@miles huh ฉันเดาว่าฉันควรเรียนรู้เพิ่มเติมเกี่ยวกับฟังก์ชั่นเหล่านั้นอีกเล็กน้อย
Conor O'Brien

4

05AB1E , 18 17 ไบต์

ขอบคุณEmigna ที่บันทึกไบต์!

•3øѼž·Üý;•hSH>4ô

ใช้การเข้ารหัสCP-1252 ลองออนไลน์!


การเพิ่มขึ้นก่อนที่จะทำการบันทึกจะเป็นไบต์ ( >4ô)
Emigna

@Emigna Ahh แน่นอน! ขอบคุณ! :)
Adnan

4

Ruby, 49 ไบต์ (สั้นกว่าโซลูชันไร้เดียงสา!)

ต้องใช้ความพยายามสักสองสามนาทีในการเขียนตัวอย่างสำหรับความท้าทายนี้ในภาษากระแสหลักซึ่งสั้นกว่าที่ประเมินไว้! ตามกฎปกติฉันได้ทำโปรแกรมโดยเพิ่มโปรแกรมpเอาท์พุท

p [15,4,8,3].map{|i|[1+i,1+i^=13,1+i^=3,1+i^=13]}

มันส่งออก (การเป็นตัวแทนของสตริง) อาร์เรย์ของอาร์เรย์ มันยาวกว่าโซลูชัน Ruby ของวัดผลที่ให้ผลลัพธ์สตริงที่มีการจัดรูปแบบที่แตกต่างกัน แต่หนึ่งไบต์นั้นสั้นกว่าโปรแกรมไร้เดียงสาด้านล่างที่จะส่งกลับอาร์เรย์ตามตัวอักษร

p [[16,3,2,13],[5,10,11,8],[9,6,7,12],[4,15,14,1]] #naive solution, 50 bytes
p [15,4,8,3].map{|i|[1+i,1+i^=13,1+i^=3,1+i^=13]}  #submission, 49 bytes

คำอธิบาย: เริ่มต้นด้วยตัวเลข 0..15 (38 ไบต์!)

นี่คือที่ฉันเริ่มและง่ายขึ้นมาก หากเราแปลง 0..15 square เป็น binary เราจะทราบว่าแต่ละเซลล์มีค่าที่ด้านล่างของคอลัมน์ XORed ด้วยค่าทางด้านขวาของแถว:

15 2  1  12            1111 0010 0001 1100
4  9  10 7             0100 1001 1010 0111
8  5  6  11            1000 0101 0110 1011
3  14 13 0             0011 1110 1101 0000

จากนี้เราได้รับรหัสด้านล่าง แต่ด้วยการใช้คอลัมน์แรกแทนที่จะเป็นคอลัมน์สุดท้ายเราจะบันทึกหนึ่งไบต์ดังที่แสดง

p [12,7,11,0].map{|i|[i^3,i^14,i^13,i]}            #0..15 square, 39 bytes         
p [15,4,8,3].map{|i|[i,i^13,i^14,i^3]}             #0..15 square, 38 bytes

เวอร์ชั่น 1..16 ที่ต้องการนั้นยากขึ้น ในที่สุดฉันก็รู้วิธีที่จะทำมันคือการเพิ่ม 1 ไปยังแต่ละเซลล์ของ 0..15 ตาราง แต่เนื่องจาก^มีลำดับความสำคัญต่ำกว่าที่+ฉันต้องการวงเล็บจำนวนมากซึ่งกินจำนวนไบต์ ^=ในที่สุดผมก็ตีอยู่กับความคิดของการใช้ ค่าใหม่ของiจะถูกคำนวณโดยเพิ่มการมอบหมาย^=ก่อนที่จะเพิ่ม 1 เพื่อให้การคำนวณเสร็จในลำดับที่ถูกต้อง


ตัวละครดี! ก่อให้เกิดง่ายในหลามคือ 6 ตัวอักษรดังกล่าวข้างต้น for a in 12,7,11,0:print[(a^b)+1for b in 3,14,13,0]hardcode: มันจะชนะถ้าเราสามารถทำ 0-15 for a in 12,7,11,0:print[a^3,a^14,a^13,a]ด้วย
xnor

3

JavaScript (ES6), 43 ไบต์

_=>`16,3,2,13
5,10,11,8
9,6,7,12
4,15,14,1`

คั่นด้วยบรรทัดใหม่แล้วคอมม่า ฉันสงสัยว่าจะมีวิธีที่สั้นกว่านี้ ...


ใช่นี่อาจเป็นไปได้ที่สั้นที่สุด
Conor O'Brien


2

เยลลี่ 20 ไบต์

“Ѥ£Æ¦½¿®µ©¬€¥ÐÇ¢‘s4

ลองออนไลน์!

นี้ก็เงยหน้าขึ้นมองจุดรหัสวุ้นของตัวละครแต่ละตัวนั้นเข้าไปในชิ้น subarrays ของความยาว s44


2

DASH , 24 ไบต์

<|>4tc"................"

แทนที่จุดด้วยอักขระของอักขระ charcodes 16, 3, 2, 13, 5, 10, 11, 8, 9, 6, 7, 12, 4, 15, 14 และ 1 ตามลำดับ

คำอธิบาย

เพียงแปลงอักขระเป็นอาร์เรย์ของอักขระและชิ้นโดย 4



2

Groovy, 57 ไบต์ / 46 ไบต์

"F21C49A7856B3ED0".collect{Eval.me("0x$it")+1}​.collate(4)​

แยกแต่ละตัวเป็นเลขฐานสิบหกและเพิ่ม 1 เรียง 4 โดยให้เป็นอาร์เรย์ 2 มิติ

[[16, 3, 2, 13], [5, 10, 11, 8], [9, 6, 7, 12], [4, 15, 14, 1]]

สั้นลง แต่ยังเป็น lamer:

print '16,3,2,13|5,10,11,8|9,6,7,12|4,15,14,1'

2

Javascript ES6, 66 65 55 ไบต์

ใช่มันไม่ใช่อันที่สั้นที่สุด และสามารถลดได้

_=>`f21c
49a7
856b
3ed0`.replace(/./g,_=>'0x'+_-~0+' ')

สำหรับตอนนี้มันไม่สมบูรณ์แบบ แต่เป็นสิ่งที่!


ขอบคุณคำแนะนำของ@Neilที่สามารถประหยัดได้ 5-8 ไบต์และเป็นแรงบันดาลใจ @ETHproductionsข้อเสนอแนะที่ประหยัด 10 ไบต์!

นี้จะทำให้คำตอบเพียง 12 ไบต์นานกว่าการแก้ปัญหา 43 ไบต์ของเขา


1
คุณสามารถใช้gแทน0และparseInt(c,17)แทนซึ่งฉันคิดว่าช่วยให้คุณประหยัด 4 ไบต์หรือคุณสามารถใช้ + 0x${c}|| 16 ซึ่งฉันคิดว่าช่วยให้คุณ 5 ไบต์แล้วคุณสามารถลบ 1 จากตัวเลขทั้งหมดแล้วเพิ่มกลับมาใหม่ในภายหลัง ซึ่งฉันคิดว่าช่วยคุณประหยัดอีกไบต์
Neil

1
อาคาร @ ข้อเสนอแนะของนีลคุณสามารถบันทึกอย่างน้อย10 ไบต์ในทั้งหมด
ETHproductions

@ Neil ขอบคุณมากสำหรับความคิด การใช้ base17 สามารถบันทึกได้สองสามไบต์ มันเป็นสิ่งที่ฉันไม่ได้คิดถึง
Ismael Miguel

@ ETHproductions ขอบคุณมากสำหรับคำแนะนำ! ฉันยังคงพยายามที่จะเข้าใจวิธีการทำงาน แต่ฉันคิดว่าฉันจะไปที่นั่น ตอนนี้ต้องตัดให้สั้นลง 13 ไบต์เพื่อเอาชนะคุณ แต่ดูเหมือนว่าคำตอบของคุณจะสั้นที่สุดใน Javascript
Ismael Miguel

1

PowerShell v2 +, 40 ไบต์

'16,3,2,13
5,10,11,8
9,6,7,12
4,15,14,1'

สตริงหลายบรรทัดตัวอักษรเหลืออยู่บนไพพ์ไลน์ เอาต์พุตโดยนัยWrite-Outputเกิดขึ้นเมื่อโปรแกรมเสร็จสิ้น ดีและน่าเบื่อ


รุ่นที่สร้างขึ้น 77 ไบต์

'f21c59a7856b3dc0'-split'(....)'-ne''|%{([char[]]$_|%{"0x$_+1"|iex})-join','}

รับค่าสตริง-splitมันคือทุก ๆ สี่อิลิเมนต์ลูปเปลี่ยนแต่ละค่าเป็นเลขฐานสิบหก0x$_และเพิ่ม1ไพพ์นั้นไปที่iex(ย่อมาจากInvoke-Expressionและคล้ายกับeval) จากนั้นก็-joinส่งผลลัพธ์เป็นสตริงที่มี,ตัวคั่น ส่งออกสี่สายไปยังไปป์ไลน์ด้วยการพิมพ์โดยนัย


1

Ruby, 60 ไบต์ - ความพยายามครั้งแรก

%w(f21c 49a7 856b 3ed0).map{|i|i.chars.map{|i|i.to_i(16)+1}}

Ruby, 45 ไบต์ - ราคาถูก

puts '16,3,2,13|5,10,11,8|9,6,7,12|4,15,14,1'

1

Pyth - 17 ไบต์

การแปลงฐาน วิธีนี้น่าเสียดายที่การเต้นของ @ xnor

c4jC"úz(ás¸H"17

ลองมันออนไลน์ได้ที่นี่


1

05AB1E , 15 ไบต์

16Lœ•iPNÍš¯•è4ä

คำอธิบาย

16L              # range [1 ... 16]
   œ             # compute all permutations of the range
    •iPNÍš¯•è    # take the permutation at index 19800593106059
             4ä  # split the permutation into 4 parts

พบดัชนีการเปลี่ยนแปลงโดยใช้สูตร:

a*15! + b*14! + c*13!+ ... + o*1! + p*0!

ตำแหน่งที่ตัวแปรถูกแทนที่ด้วยจำนวนองค์ประกอบที่ประสบความสำเร็จซึ่งน้อยกว่าจำนวนที่ดัชนีปัจจุบันของแต่ละหมายเลขในรายการเป้าหมาย
[16, 3, 2, 13, 5, 10, 11, 8, 9, 6, 7, 12, 4, 15, 14, 1]

ซึ่งสิ่งที่เราต้องการหลังจากการเปลี่ยนแปลงคือ
a=15, b=2, c=1, d=10, e=2, f=6, g=6, h=4, i=4, j=2, k=2, l=2, m=1, n=2 o=1, p=0

นี่ทำให้เราสูตร: 15*15!+2*14!+1*13!+10*12!+2*11!+6*10!+6*9!+4*8!+4*7!+2*6!+2*5!+2*4!+1*3!+2*2!+1*1!+0*0!

19800593106059ซึ่งเท่ากับ


1

Matlab, 38 35 ไบต์

ฟังก์ชั่นไม่ระบุชื่อ:

@()['pcbm';'ejkh';'ifgl';'dnoa']-96

การพิมพ์โดยตรง (38 ไบต์):

disp(['pcbm';'ejkh';'ifgl';'dnoa']-96)

ใน Matlab วิธีที่ดีที่สุดในการสร้างอาร์เรย์ของจำนวนเต็มนั้นจะเป็นสตริง


การใช้ฟังก์ชั่นนิรนามจะช่วยประหยัดสองสามไบต์:@()['pcbm';'ejkh';'ifgl';'dnoa']-96
Luis Mendo

@ LuisMendo ฉันไม่ได้สังเกตว่าการคืนค่าเป็นที่ยอมรับเช่นกันขอบคุณ!
pajonk

1

สกาลา 52 ไบต์

()=>Seq(15,4,8,3)map(x=>Seq(x,x^13,x^14,x^3)map(1+))

Ungolfed:

()=>
  Seq(15, 4, 8, 3)
  .map(x=>
    Seq(x, x^13, x^14, x^3)
    .map(1+)
  )

แรงบันดาลใจจากระดับแม่น้ำเซนต์ของคำตอบทับทิม

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.