Gambar dan beri label kisi heksagonal ASCII

12

Dalam tantangan saya sebelumnya , saya menggambar diagram pertama sebagian besar dengan tangan (dengan bantuan mode blok visual vim). Tapi tentunya harus ada cara yang lebih baik ...


Diberikan input dari dua dimensi, lebar dan tinggi, output grid heksagonal dengan dimensi dalam seni ASCII.

Berikut diagram yang dirujuk dalam intro (dengan pengeditan kecil), yang seharusnya menjadi output Anda untuk input width=7, height=3:

         _____         _____         _____
        /     \       /     \       /     \
  _____/ -2,-1 \_____/  0,-1 \_____/  2,-1 \_____
 /     \       /     \       /     \       /     \
/ -3,-1 \_____/ -1,-1 \_____/  1,-1 \_____/  3,-1 \
\       /     \       /     \       /     \       /
 \_____/ -2,0  \_____/  0,0  \_____/  2,0  \_____/
 /     \       /     \       /     \       /     \
/ -3,0  \_____/ -1,0  \_____/  1,0  \_____/  3,0  \
\       /     \       /     \       /     \       /
 \_____/ -2,1  \_____/  0,1  \_____/  2,1  \_____/
 /     \       /     \       /     \       /     \
/ -3,1  \_____/ -1,1  \_____/  1,1  \_____/  3,1  \
\       /     \       /     \       /     \       /
 \_____/       \_____/       \_____/       \_____/

Perhatikan beberapa hal:

  • Lebar dan tinggi pada dasarnya setara dengan berapa banyak heksagon yang ada untuk koordinat y dan x yang diberikan masing-masing. Ini akan selalu menjadi angka ganjil.

  • Setiap segi enam diwakili oleh seni ASCII

      _____
     /     \
    /       \
    \       /
     \_____/
    

    tetapi batas "dibagi" antara segi enam tetangga.

  • Koma dalam koordinat selalu tepat dua karakter di bawah tengah tepi atas. Koordinat x kemudian diposisikan tepat sebelum koma, dan koordinat y langsung sesudahnya.

    Anda dapat mengasumsikan bahwa koordinat tidak akan pernah terlalu besar sehingga mereka akan tumpang tindih dengan batas segi enam.

Input dapat diambil sebagai string yang dipisahkan spasi-koma, array bilangan bulat, atau dua argumen fungsi / baris perintah. Output harus berupa string tunggal (untuk STDOUT, sebagai nilai balik, dll.).

Karena ini adalah , kode terpendek dalam byte akan menang.

Kotak di atas dapat digunakan sebagai test case. width=199, height=199Kisi berukuran maksimum jelas tidak praktis untuk disertakan di sini, tetapi beberapa baris dan kolom pertama akan terlihat seperti berikut:

         _____         ___
        /     \       /   
  _____/-98,-99\_____/-96,
 /     \       /     \    
/-99,-99\_____/-97,-99\___
\       /     \       /   
 \_____/-98,-98\_____/-96,
 /     \       /     \    
/-99,-98\_____/-97,-98\___
\       /     \       /   
 \_____/-98,-97\_____/-96,
 /     \       /     \    
/-99,-97\_____/-97,-97\___
\       /     \       /   
Gagang pintu
sumber
Terkait
Alex A.

Jawaban:

2

Ruby, 221 byte

->w,h{s=' '
a=(s*9+?_*5)*(w/2)+$/
(2-h*2).upto(h*2+3){|y|c=y<4-h*2 
a+=[b=c ?s:?\\,s+b,s,''][y%4]
(0-w/2).upto(w/2){|x|a+=["/#{h<y/2?s*7:"%3d,%-3d"}\\",s*7,?_*5,"/     \\"][(y+x*2+w)%4]%[x,y/4]}
a+='//  '[c ?3:y%4]+$/}
a}

Tidak digabungkan dalam program uji

f=->w,h{
  s=' '                                #set s to space for golfing reasons
  a=(s*9+?_*5)*(w/2)+$/                #start building the output with a row of just _ and space

  (2-h*2).upto(h*2+3){|y|              #iterate 4 times for each row of hexagons, plus an extra 2 at the end to finish last row
    c=y<4-h*2                          #condition for first two rows
    a+=[b=c ?s:?\\,s+b,s,''][y%4]      #string to be output before main set of hexagons (spaces for top row, \ for certain other rows

    (0-w/2).upto(w/2){|x|              #iterate through hexagons on each row, 4 lines for each with the following printf type string
      a+=["/#{h<y/2?s*7:"%3d,%-3d"}\\",#line 1:contains ends / \ and numbers 
         s*7,                          #line 2 padding spaces
         ?_*5,                         #line 3 padding ___
         "/     \\"][(y+x*2+w)%4]%     #line 0 top of hexagon / \; formula to select string to be printed
           [x,y/4]                     #numbers to be printed (if format for current line does not require them they are ignored)
    }

    a+='//  '[c ?3:y%4]+$/             #ending alternates between / and space; / are suppressed for first two rows
  }
  a
}

puts g[7,3]
puts g[5,5]

Keluaran

Ketika saya selesai debugging, saya melihat ambiguitas dalam spesifikasi. Di mana w+1habis dibagi 4, koordinat x pertama dan terakhir ganjil, dan tidak ada ambiguitas. Tetapi di mana w-1dibagi 4 oleh koordinat x pertama dan terakhir genap. Saya berasumsi bahwa kolom pertama dan terakhir harus diimbangi di bawah yang berikutnya. Tapi kemudian saya membaca pertanyaan sebelumnya dan mencatat dalam kasus itu adalah kolom aneh yang harus diimbangi di bawah yang genap (catatan untuk w-1habis dibagi 4 tidak mungkin untuk melakukan keduanya.)

Namun, perbedaan itu tidak dibuat dalam pertanyaan ini. Saya akan menyerahkan penilaian OP dan mengerjakannya kembali jika perlu, meskipun saya lebih suka tidak harus melakukannya.

         _____         _____         _____
        /     \       /     \       /     \
  _____/ -2,-1 \_____/  0,-1 \_____/  2,-1 \_____
 /     \       /     \       /     \       /     \
/ -3,-1 \_____/ -1,-1 \_____/  1,-1 \_____/  3,-1 \
\       /     \       /     \       /     \       /
 \_____/ -2,0  \_____/  0,0  \_____/  2,0  \_____/
 /     \       /     \       /     \       /     \
/ -3,0  \_____/ -1,0  \_____/  1,0  \_____/  3,0  \
\       /     \       /     \       /     \       /
 \_____/ -2,1  \_____/  0,1  \_____/  2,1  \_____/
 /     \       /     \       /     \       /     \
/ -3,1  \_____/ -1,1  \_____/  1,1  \_____/  3,1  \
\       /     \       /     \       /     \       /
 \_____/       \_____/       \_____/       \_____/
         _____         _____
        /     \       /     \
  _____/ -1,-2 \_____/  1,-2 \_____
 /     \       /     \       /     \
/ -2,-2 \_____/  0,-2 \_____/  2,-2 \
\       /     \       /     \       /
 \_____/ -1,-1 \_____/  1,-1 \_____/
 /     \       /     \       /     \
/ -2,-1 \_____/  0,-1 \_____/  2,-1 \
\       /     \       /     \       /
 \_____/ -1,0  \_____/  1,0  \_____/
 /     \       /     \       /     \
/ -2,0  \_____/  0,0  \_____/  2,0  \
\       /     \       /     \       /
 \_____/ -1,1  \_____/  1,1  \_____/
 /     \       /     \       /     \
/ -2,1  \_____/  0,1  \_____/  2,1  \
\       /     \       /     \       /
 \_____/ -1,2  \_____/  1,2  \_____/
 /     \       /     \       /     \
/ -2,2  \_____/  0,2  \_____/  2,2  \
\       /     \       /     \       /
 \_____/       \_____/       \_____/
Level River St
sumber