ความท้าทายของ Hexplosive ASCII-art


20

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

ฉันชอบเกมนี้ แต่บางครั้งก็ยากที่จะรู้ว่ามีโทเค็นจำนวนเท่าใดบนไทล์เฉพาะ ฉันนับจำนวนเพื่อนบ้านเสมอ มันจะสะดวกจริง ๆ ถ้าฉันมี ASCII-art เพื่อช่วยให้ฉันจำได้ว่ามีโทเค็นจำนวนเท่าใดบนแต่ละแผ่น

คุณต้องเขียนโปรแกรมหรือฟังก์ชั่นที่ใช้เป็นจำนวนเต็มบวกเป็น input และผลิตเป็นตัวแทน ASCII นี้หกเหลี่ยมขนาดN แต่ละแผ่นจะเป็นจำนวนของเพื่อนบ้านที่มี เนื่องจาก 1 เป็นกรณีมุมแปลก ๆ ที่มีเพื่อนบ้านเป็นศูนย์คุณจะต้องจัดการอินพุตที่มีขนาดใหญ่กว่า 1

คุณอาจใช้หมายเลขนี้ในรูปแบบที่สมเหตุสมผลเช่น STDIN, อาร์กิวเมนต์ของฟังก์ชัน, อาร์กิวเมนต์บรรทัดคำสั่ง, จากไฟล์ ฯลฯ ผลลัพธ์อาจอยู่ในรูปแบบที่สมเหตุสมผลเช่นการพิมพ์ไปยัง STDOUT การเขียนลงไฟล์ รายการของสตริงสตริงที่ขึ้นบรรทัดใหม่ที่คั่น ฯลฯ

นี่คือตัวอย่างเอาต์พุตสำหรับ 5 อินพุตแรก:

2)

 3 3
3 6 3
 3 3


3)

  3 4 3
 4 6 6 4
3 6 6 6 3
 4 6 6 4
  3 4 3


4)

   3 4 4 3
  4 6 6 6 4
 4 6 6 6 6 4
3 6 6 6 6 6 3
 4 6 6 6 6 4
  4 6 6 6 4
   3 4 4 3

5)

    3 4 4 4 3
   4 6 6 6 6 4
  4 6 6 6 6 6 4
 4 6 6 6 6 6 6 4
3 6 6 6 6 6 6 6 3
 4 6 6 6 6 6 6 4
  4 6 6 6 6 6 4
   4 6 6 6 6 4
    3 4 4 4 3

6)

     3 4 4 4 4 3
    4 6 6 6 6 6 4
   4 6 6 6 6 6 6 4
  4 6 6 6 6 6 6 6 4
 4 6 6 6 6 6 6 6 6 4
3 6 6 6 6 6 6 6 6 6 3
 4 6 6 6 6 6 6 6 6 4
  4 6 6 6 6 6 6 6 4
   4 6 6 6 6 6 6 4
    4 6 6 6 6 6 4
     3 4 4 4 4 3

และรูปแบบยังคงดำเนินต่อไปในลักษณะที่คล้ายกัน ตามปกติจะใช้ช่องโหว่มาตรฐานและคำตอบที่มีจำนวนไบต์ต่ำสุดจะได้รับรางวัลเป็นผู้ชนะ!

ลีดเดอร์

นี่คือ Stack Snippet เพื่อสร้างทั้งกระดานผู้นำปกติและภาพรวมของผู้ชนะตามภาษา

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

# Language Name, N bytes

ที่Nมีขนาดของส่งของคุณ หากคุณปรับปรุงคะแนนของคุณคุณสามารถเก็บคะแนนเก่าไว้ในบรรทัดแรกโดยการตีพวกเขาผ่าน ตัวอย่างเช่น

# Ruby, <s>104</s> <s>101</s> 96 bytes

หากคุณต้องการรวมหลายตัวเลขไว้ในส่วนหัวของคุณ (เช่นเนื่องจากคะแนนของคุณคือผลรวมของไฟล์สองไฟล์หรือคุณต้องการแสดงรายการบทลงโทษการตั้งค่าสถานะของล่ามแยกต่างหาก) ตรวจสอบให้แน่ใจว่าคะแนนจริงเป็นตัวเลขสุดท้ายในส่วนหัว:

# Perl, 43 + 2 (-p flag) = 45 bytes

นอกจากนี้คุณยังสามารถตั้งชื่อภาษาให้เป็นลิงค์ซึ่งจะปรากฏในตัวอย่างกระดานแต้มนำ:

# [><>](http://esolangs.org/wiki/Fish), 121 bytes


1
ที่เกี่ยวข้อง (แต่ถามเกี่ยวกับกระบวนการมากกว่าจำนวนเพื่อนบ้าน)
trichoplax

1
ฉันถูกล่อลวงให้เรียนรู้ Hexagony เพียงเพื่อความท้าทายนี้ ;)
Kevin Cruijssen

คำตอบ:


11

MATL , 39 37 ไบต์

4*3-:!G:+o~YRtP*!tPw4LY)vtI5&lZ+47+*c

ลองออนไลน์! หรือตรวจสอบกรณีทดสอบทั้งหมด

คำอธิบาย

ฉันได้รับการใช้อีกครั้ง!

n = 3พิจารณาการป้อนข้อมูล รหัสแรกสร้างเมทริกซ์ขนาด4*n-3× nโดยการเพิ่มเวกเตอร์คอลัมน์[1; 2; ...; 9]ลงในเวกเตอร์แถวที่[1, 2, 3]มีการออกอากาศ นี่หมายถึงการคำนวณอาเรย์อาเรย์ 2 มิติของการเพิ่มตามลำดับคู่ทั้งหมด:

 2  3  4
 3  4  5
 4  5  6
 5  6  7
 6  7  8
 7  8  9
 8  9 10
 9 10 11
10 11 12

แทนที่ตัวเลขโดย1และตัวเลขคี่โดย0ให้รูปแบบกระดานหมากรุก

1 0 1
0 1 0
1 0 1
0 1 0
1 0 1
0 1 0
1 0 1
0 1 0
1 0 1

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

มุมบนขวาจะถูกลบออกโดย zeroing out รายการทั้งหมดเหนือ "diagonal" หลักของเมทริกซ์:

1 0 0
0 1 0
1 0 1
0 1 0
1 0 1
0 1 0
1 0 1
0 1 0
1 0 1

องค์ประกอบที่ชาญฉลาดคูณเมทริกซ์นี้ด้วยเวอร์ชันที่พลิกในแนวตั้งจะลบมุมล่างขวาเช่นกัน การโยกย้ายนั้นให้

1 0 1 0 1 0 1 0 1
0 1 0 1 0 1 0 1 0
0 0 1 0 1 0 1 0 0

สิ่งนี้เริ่มดูเหมือนเป็นรูปหกเหลี่ยม การใช้ความสมมาตรกริดถูกขยายเพื่อสร้างครึ่งบน:

0 0 1 0 1 0 1 0 0
0 1 0 1 0 1 0 1 0
1 0 1 0 1 0 1 0 1
0 1 0 1 0 1 0 1 0
0 0 1 0 1 0 1 0 0

ตอนนี้เราจำเป็นต้องแทนที่แต่ละรายการเท่ากับหนึ่งโดยจำนวนเพื่อนบ้าน สำหรับสิ่งนี้เราใช้การแปลงด้วยย่าน 3 × 5 (นั่นคือเคอร์เนลคือเมทริกซ์ขนาด 3 × 5) ผลลัพธ์,

2 3 4 5 5 5 4 3 2
4 5 7 7 8 7 7 5 4
4 6 7 8 7 8 7 6 4
4 5 7 7 8 7 7 5 4
2 3 4 5 5 5 4 3 2

มีสองประเด็น (ซึ่งจะแก้ไขในภายหลัง):

  1. ค่าได้รับการคำนวณสำหรับทุกตำแหน่งในขณะที่เราต้องการเพียงแค่ที่ตำแหน่งของคนในตารางศูนย์หนึ่ง
  2. 1สำหรับแต่ละตำแหน่งนั้นนับเพื่อนบ้านรวมถึงจุดที่ตัวเองจึงเป็นสิ่งที่ออกโดย

ตอนนี้รหัสจะเพิ่ม47ให้กับแต่ละค่าที่คำนวณ ซึ่งสอดคล้องกับการลบ1เพื่อแก้ปัญหา (2) และการเพิ่ม48(ASCII สำหรับ'0') ซึ่งจะแปลงตัวเลขแต่ละตัวให้เป็นรหัสจุดของอักขระที่เกี่ยวข้อง

เมทริกซ์ที่ได้จะถูกคูณด้วยสำเนาของกริด zero-one วิธีนี้แก้ปัญหา (1) ด้านบนทำให้คะแนนที่ไม่ได้เป็นส่วนหนึ่งของกริดหกเหลี่ยมเท่ากับศูนย์อีกครั้ง:

 0  0 51  0 52  0 51  0  0
 0 52  0 54  0 54  0 52  0
51  0 54  0 54  0 54  0 51
 0 52  0 54  0 54  0 52  0
 0  0 51  0 52  0 51  0  0

ในที่สุดอาร์เรย์ของตัวเลขนี้จะถูกส่งไปยังอาร์เรย์ char Zero chars แสดงเป็นช่องว่างซึ่งให้ผลลัพธ์สุดท้าย:

  3 4 3  
 4 6 6 4 
3 6 6 6 3
 4 6 6 4 
  3 4 3  

15

JavaScript (ES6), 118 117 ไบต์

n=>[...Array(m=n+--n)].map((_,i,a)=>a.map((_,j)=>(k=j-(i>n?i-n:n-i))<0?``:k&&++j<m?i/2%n?6:4:3+!i%n).join` `).join`\n`

โดย\nแสดงถึงอักขระบรรทัดใหม่ตามตัวอักษร คำอธิบาย: n=4สมมติว่า เราเริ่มต้นด้วยตารางหลักที่คั่นด้วยช่องว่างต่อไปนี้:

0 0 0 0 0 0 0
0 0 0 0 0 0 0
0 0 0 0 0 0 0
0 0 0 0 0 0 0
0 0 0 0 0 0 0
0 0 0 0 0 0 0
0 0 0 0 0 0 0

|n-i| 0s แรกถูกลบ แต่ช่องว่างยังคงอยู่:

   0 0 0 0
  0 0 0 0 0
 0 0 0 0 0 0
0 0 0 0 0 0 0
 0 0 0 0 0 0
  0 0 0 0 0
   0 0 0 0

หกเหลี่ยมทันที! จากนั้นก็เพียงพอที่จะคำนวณค่าที่เหมาะสมแทนแต่ละตำแหน่ง0โดยตรวจสอบว่าเราอยู่ในแถวและ / หรือแถวแรกหรือสุดท้าย แก้ไข: บันทึก 1 ไบต์ขอบคุณ @Arnauld


ด้วยการใช้สูตรบางอย่างของฉันฉันมาถึงรุ่น 107 ไบต์ด้วยสำหรับ / console.log ():n=>{for(i=n+--n;i--;)console.log(' '.repeat(l=i>n?i-n:n-i)+(j=3+!l%n)+` ${l-n?6:4}`.repeat(2*n-l-1)+' '+j)}
Arnauld

@Arnauld ฉันชอบที่3+!i%n!
Neil

7

Python 2, 125 123 ไบต์

def h(n):m=n-1;t=[' '*(m-r)+' '.join(('46'[r>0]*(r+m-1)).join('34'[r%m>0]*2))for r in range(n)];print'\n'.join(t+t[-2::-1])

การทดสอบอยู่บนideone

วิ่งผ่านส่วนบนไปยังแถวกลางfor r in range(n), สร้างสตริง:
- ทำสองมุมหรือสองขอบ, '34'[r%m>0]*2;
- กรอกข้อมูลโดยการเข้าร่วมกับพวกเขาด้วยซ้ำ'6'หรือ'4', '46'[r>0]*(r+m-1);
- เข้าร่วมมุมและขอบด้วย' ';
- การเติมด้วยช่องว่าง, ' '*(m-r);

จากนั้นพิมพ์สิ่งนี้และมันจะสะท้อนกลับในแถวกลางที่เข้าร่วมโดยบรรทัดใหม่ print'\n'.join(t+t[-2::-1])


4

Python 2, 96 ไบต์

n=input();m=n-1
while n+m:n-=1;j=abs(n);c='34'[0<j<m];print' '*j+c+' '+'46  '[j<m::2]*(2*m+~j)+c

มันดูยุ่งและค่อนข้างเล่นกอล์ฟได้ ...


3

Java, 375 363 361 339 329 317 293 ไบต์

interface J{static void main(String[]r){int i=0,k,h=Integer.decode(r[0]),a=1,l,n=0;for(;i++<h*2-1;n+=a){if(n==h-1)a=-1;String s="";for(k=0;k<n+h;k++,s+=" ")s+=n==0?k==0||k==n+h-1?3:4:k!=0&&k!=n+h-1?6:n==h-1?3:4;l=(h*4-3-s.trim().length())/2;System.out.printf((l==0?"%":"%"+l)+"s%s\n","",s);}}}

Ungolfed

interface J {
    static void main(String[] r) {
        int i = 0, k, h = Integer.decode(r[0]), a = 1, l, n = 0;
        for (; i++ < h * 2 - 1; n += a) {
            if (n == h - 1) {
                a = -1;
            }
            String s = "";
            for (k = 0; k < n + h; k++, s += " ") {
                s += n == 0 ? k == 0 || k == n + h - 1 ? 3 : 4 : k != 0 && k != n + h - 1 ? 6 : n == h - 1 ? 3 : 4;
            }
            l = (h * 4 - 3 - s.trim().length()) / 2;
            System.out.printf((l == 0 ? "%" : "%" + l) + "s%s\n", "", s);
        }
    }
}

การใช้งาน :

$ java J 5
    3 4 4 4 3     
   4 6 6 6 6 4    
  4 6 6 6 6 6 4   
 4 6 6 6 6 6 6 4  
3 6 6 6 6 6 6 6 3 
 4 6 6 6 6 6 6 4  
  4 6 6 6 6 6 4   
   4 6 6 6 6 4    
    3 4 4 4 3

ฉันแน่ใจว่าบล็อกที่ซ้อนกันที่น่ากลัวถ้า - บล็อกอื่นสามารถเขียนใหม่ให้เล็กลง แต่ฉันไม่สามารถหาได้ในขณะนี้ ข้อเสนอแนะใด ๆ ยินดีต้อนรับ :-)

ปรับปรุง

  • ปฏิบัติตามคำแนะนำของ Kevin Cruijssen และใช้การถอดรหัสแทนการแยกวิเคราะห์
  • เขียนซ้ำ ifs บางอย่างโดยใช้ตัวดำเนินการประกอบ
  • ผู้ประกอบการที่ประกอบไปด้วยมากขึ้น
  • ผู้ประกอบการที่ประกอบไปด้วย Moar! ฉันคิดว่าฉันได้สร้างสัตว์ประหลาด!
  • เขียนบล็อก if-else เกี่ยวกับการพิมพ์

1
ฉันไม่ได้ดูวิธีการที่คุณใช้อย่างใกล้ชิด แต่เคล็ดลับการเล่นกอล์ฟเล็ก ๆ สำหรับรหัสปัจจุบันของคุณ: Integer.parseIntสามารถเล่นกอล์ฟInteger.decodeได้ สามารถที่จะแข็งแรงเล่นกอล์ฟl=(h*4-3-s.trim().length())/2;if(l==0) if((l=(h*4-3-s.trim().length())/2)==0)นอกจากนี้ยังเป็นที่ยอมรับโดยสมบูรณ์เพียงแค่โพสต์เมธอดที่ไม่มีคลาส (เว้นแต่คำถามจะระบุไว้เป็นอย่างอื่น) ดังนั้นvoid f(int i){...use i...}แทนที่จะเป็นinterface J{static void main(String[]r){...i=Integer.decode(r[0])...use i...}เช่นนั้นควรจะช่วยให้คุณประหยัดได้ไม่กี่ไบต์เช่นกัน เมื่อฉันมีเวลามากขึ้นฉันจะดูต่อไป
Kevin Cruijssen

@KevinCruijssen: ขอบคุณสำหรับคำแนะนำของคุณ เป็นจริงระยะเวลาเดียวกันกับl=(h*4-3-s.trim().length())/2;if(l==0) if((l=(h*4-3-s.trim().length())/2)==0)
Master_ex

2

05AB1E , 44 ไบต์

FN_i4ë6}ð«¹ÍN+×ðìN_N¹<Q~i3ë4}.ø¹<N-ð×ì})¦«»

คำอธิบาย

เนื่องจากด้านบนและด้านล่างของรูปหกเหลี่ยมถูกมิเรอร์เราเพียงต้องการสร้างส่วนบน
ดังนั้นสำหรับอินพุตXเราจำเป็นต้องสร้างแถวX นั่นคือสิ่งที่วงหลักทำ

F                                        }

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

N_i4ë6}ð«

จากนั้นเราจะทำซ้ำสตริงนี้X-2 + Nคูณโดยที่ N คือแถวปัจจุบันที่จัดทำดัชนี 0 และเติมอักขระช่องว่างทางด้านซ้าย

¹ÍN+×ðì

หลังจากนี้ถึงเวลาสำหรับมุม พวกเขาจะเป็น3สำหรับแถวแรกและแถวสุดท้ายและ4สำหรับแถวกลาง

N_N¹<Q~i3ë4}.ø

ตอนนี้เราต้องตรวจสอบให้แน่ใจว่าแถวเรียงกันอย่างถูกต้องโดยการเพิ่มช่องว่างด้านหน้าของแต่ละแถว จำนวนของช่องว่างที่เพิ่มจะเป็นX-1-N

¹<N-ð×ì

ตอนนี้เราได้ทำส่วนบนของตารางเสร็จแล้วเราเพิ่มแถวลงในรายการสร้างสำเนาที่กลับด้านและลบรายการแรกจากสำเนานั้น (เมื่อเราต้องการแถวกลางเพียงครั้งเดียว) จากนั้นรวม 2 รายการเหล่านี้เข้าด้วยกันและ พิมพ์.

)¦«»

ลองออนไลน์!

วิธีแก้ปัญหาเพิ่มเติม 44 ไบต์เช่นกัน:

ÍÅ10.øvN_i4ë6}ð«¹ÍN+×ðìyi4ë3}.ø¹<N-ð×ì})¦«»

2

ทับทิม 87 ไบต์

ฟังก์ชั่นที่ไม่ระบุชื่อใช้เวลาเป็นอาร์กิวเมนต์และส่งกลับอาร์เรย์ของสตริง

->n{(1-n..n-=1).map{|i|j=i.abs
" "*j+(e=j%n>0?"4 ":"3 ")+["6 ","4 "][j/n]*(2*n-1-j)+e}}

Ungolfed ในโปรแกรมทดสอบ

อินพุตผ่าน stdin เขียนรูปร่างทั้งหมดไปยัง stdout สวยด้วยตนเองอธิบาย

f=->n{
  (1-n..n-=1).map{|i|            #reduce n by 1 and iterate i from -n to n
    j=i.abs;                     #absolute magnitude of i
    " "*j+                       #j spaces +
    (e=j%n>0?"4 ":"3 ")+         #start the string with 3 or 4 +
    ["6 ","4 "][j/n]*(2*n-1-j)+  #2*n-1-j 6's or 4`s as appropriate +
    e                            #end the string with another 3 or 4
  }
}

puts f[gets.to_i]

1

V , 60 ไบต์

Àé x@aA4 xr3^.òhYpXa 6^òkyHç^/:m0
Pç 3.*6/^r4$.
òÍ6 4./6

ลองออนไลน์!

นี่เป็นวิธีที่ยาวเกินไปจริงๆ นี่คือ hexdump เนื่องจากมีอักขระที่ไม่สามารถพิมพ์ได้:

0000000: c0e9 2078 4061 4134 201b 7872 335e 2ef2  .. x@aA4 .xr3^..
0000010: 6859 7058 6120 361b 5ef2 6b79 48e7 5e2f  hYpXa 6.^.kyH.^/
0000020: 3a6d 300a 50e7 2033 2e2a 362f 5e72 3424  :m0.P. 3.*6/^r4$
0000030: 2e0a f2cd 3620 9334 852e 2f36            ....6 .4../6

1

แร็กเก็ต, 487 ไบต์

(λ(n c e o)(let((sp(append(range(- n 1)-1 -1)(reverse(range(- n 1)0 -1))))
(mm(append(range(- n 2)(-(+ n(- n 1))2))(range(-(+ n(- n 1))2)(-(- n 1)2)-1)))
(r""))(for((i sp)(j mm))(define str"")(for((ss i))(set! str(string-append str" ")))
(set! str(string-append str(if(or(= i 0)(= i(- n 1))(= i(* 2(- n 1))))c e)" "))
(for((jj j))(set! str(string-append str(if(= j(- n 2))e o)" ")))(set! r(if(or(= i 0)
(= i(- n 1))(= i(* 2(- n 1))))c e))(set! str(string-append str r))(displayln str))))

การทดสอบ:

(f 4 "3" "4" "6") 

   3 4 4 3
  4 6 6 6 4
 4 6 6 6 6 4
3 6 6 6 6 6 3
 4 6 6 6 6 4
  4 6 6 6 4
   3 4 4 3

(f 5 "o" "*" "-") 

    o * * * o
   * - - - - *
  * - - - - - *
 * - - - - - - *
o - - - - - - - o
 * - - - - - - *
  * - - - - - *
   * - - - - *
    o * * * o

รุ่นโดยละเอียด:

(define(f1 n c e o)
  (let ((sp(append(range(sub1 n) -1 -1)
                  (reverse(range(sub1 n) 0 -1))))
        (mm(append(range(- n 2)(-(+ n(sub1 n)) 2))
                  (range(-(+ n(sub1 n)) 2)(-(sub1 n)2) -1) ))
        (r ""))
    (for((i sp)(j mm))
      (define str "")
      (for((ss i))(set! str(string-append str " ")))
      (set! str(string-append str
                              (if(or(= i 0)(= i(sub1 n))
                                    (= i(* 2(sub1 n)))) c e)
                              " "))
      (for((jj j))
        (set! str(string-append str
                                (if(= j(- n 2)) e o)
                                " ")))
      (set! r(if(or(= i 0)
                   (= i(sub1 n))
                   (= i(* 2(sub1 n)))) c e))
      (set! str(string-append str r))
      (displayln str))))
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.