Açıklayıcı ASCII-sanat mücadelesi


20

Strateji oyunu "Hexplode" , oyuncular sırayla altıgen bir tahta üzerine token yerleştirerek. Jeton sayısı, altıgenleri döşeyen bitişik karoların sayısına eşit olduğunda ve üzerindeki tüm tokları çevredeki komşulara taşır. Oyunu online olarak burada oynayabilirsiniz .

Bu oyunu seviyorum, ancak bazen belirli bir karoda kaç jetonun olduğunu tam olarak bilmek zor; Her zaman komşuların sayısını sayıyorum . Her karoda kaç jeton olduğunu hatırlamama yardımcı olacak bir ASCII sanatım olsaydı gerçekten kullanışlı olurdu.

Giriş olarak pozitif bir tamsayı alan ve N boyutunda altıgen bu ASCII gösterimini üreten bir program veya işlev yazmanız gerekir . Her karo, karonun sahip olduğu komşu sayısı olacaktır. 1, sıfır komşusu olan garip bir köşe kasası olduğundan, yalnızca 1'den büyük girişleri işlemeniz gerekir.

Bu sayıyı bir dosyadan STDIN, işlev bağımsız değişkenleri, komut satırı bağımsız değişkenleri gibi herhangi bir makul biçimde alabilirsiniz. Çıktı ayrıca STDOUT'a yazdırma, bir dosyaya yazma, döndürme gibi makul bir biçimde olabilir dizelerin bir listesi, satırsonu ile ayrılmış bir dize vb.

İlk 5 giriş için bazı örnek çıktılar:

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

Desen de benzer şekilde devam ediyor. Her zamanki gibi, standart boşluklar uygulanır ve en düşük bayt sayısına sahip cevap kazananı taçlandırır!

Liderler

İşte hem düzenli bir skor tablosu hem de kazananları dile göre gözden geçirmek için bir Yığın Parçacığı.

Yanıtınızın göründüğünden emin olmak için, lütfen aşağıdaki Markdown şablonunu kullanarak yanıtınızı bir başlıkla başlatın:

# Language Name, N bytes

Ngönderiminizin büyüklüğü nerede . Puanınızı artırmak varsa, olabilir onları içinden vurarak, başlığa eski hesapları tutmak. Örneğin:

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

Başlığınıza birden fazla sayı eklemek istiyorsanız (örneğin, puanınız iki dosyanın toplamı olduğu veya yorumlayıcı bayrak cezalarını ayrı olarak listelemek istediğiniz için), gerçek puanın başlıktaki son sayı olduğundan emin olun :

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

Dil adını, daha sonra skor tablosu snippet'inde görünecek bir bağlantı da yapabilirsiniz:

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


1
İlgili (ancak komşuların sayısı yerine süreci sormak).
trichoplax

1
Sadece bu zorluk uğruna Hexagony öğrenmeye cazipim. ;)
Kevin Cruijssen

Yanıtlar:


11

MATL , 39 37 bayt

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

Çevrimiçi deneyin! Veya tüm test senaryolarını doğrulayın .

açıklama

Tekrar evrişimi kullanıyorum!

Girişi düşünün n = 3. Kod ilk olarak satır vektörüne yayın ile sütun vektörü ekleyerek 4*n-3× boyutunda bir matris oluşturur . Bu, tüm çift eklemelerin 2B dizi dizisini hesaplamak anlamına gelir:n[1; 2; ...; 9][1, 2, 3]

 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

Çift sayıları 1ve tek sayıları değiştirmek 0dama tahtası deseni verir

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

Bu, altıgen ızgarayı (bir kısmını) oluşturmak için kullanılacaktır. Olanlar ızgaradaki noktaları ve sıfırlar boşlukları temsil edecektir.

Sağ üst köşe, matrisin ana "köşegeninin" üzerindeki tüm girişler sıfırlanarak kaldırılır:

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

Element matris olarak bu matrisi dikey olarak çevrilmiş bir versiyonla çarpmak sağ alt köşeyi de kaldırır. Transposing sonra verir

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

Bu bir altıgen gibi görünmeye başlar. Simetri kullanarak, ızgara üst yarıyı üretmek için genişletilir:

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

Şimdi her girişi bire eşit olarak komşuların sayısıyla değiştirmemiz gerekiyor. Bunun için 3 × 5 mahalle ile evrişim kullanıyoruz (yani çekirdek 3 × 5 olan bir matris). Sonuç,

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

(daha sonra çözülecek) iki sorunu var:

  1. Değerler tüm pozisyonlar için hesaplanırken, yalnızca sıfır-sıfır ızgarasındaki konumlarda onlara ihtiyacımız vardır.
  2. Bu konumların her biri için, komşu sayımı noktanın kendisini içerir, bu yüzden kapalıdır 1.

Kod artık 47hesaplanan her değere eklenir . Bu , her sayıyı karşılık gelen karakterin kod noktasına dönüştüren 1sorunu (2) ve eklemeyi 48(ASCII için '0') çıkarmaya karşılık gelir.

Elde edilen matris daha sonra sıfır bir ızgaranın bir kopyasıyla çarpılır. Bu, yukarıdaki (1) sayısını çözerek altıgen ızgaranın parçası olmayan noktaları tekrar sıfıra eşitlemektedir:

 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

Son olarak, bu sayı dizisi bir char dizisine yayınlanır. Sıfır karakterleri boşluk olarak görüntülenir ve bu da nihai sonucu verir:

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

15

JavaScript (ES6), 118 117 bayt

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`

Burada \ngerçek bir satırsonu karakteri temsil edilir. Açıklama: Varsayalım n=4. Aşağıdaki boşlukla ayrılmış rakam karesiyle başlıyoruz:

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

İlk |n-i| 0siler silinir, ancak boşluklar kalır:

   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

Anında altıgen! Daha sonra 0, ilk veya son satırda ve / veya sütunda olup olmadığımızı kontrol ederek her birinin yerine uygun değeri hesaplamak yeterlidir . Düzenleme: @Arnauld sayesinde 1 bayt kaydedildi.


Formülünüzün bir kısmını kullanarak, for / console.log () ile 107 baytlık bir sürüme geldim: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

@ Bunu beğenebilir miyim 3+!i%n!
Neil

7

Python 2, 125 123 bayt

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])

Testler ideone'de

for r in range(n)Dizeleri oluşturarak yukarıdan orta sıralara doğru ilerler :
- iki köşe veya iki kenar yapmak '34'[r%m>0]*2,;
- tekrarlananlarla birleştirerek doldurma '6'veya '4','46'[r>0]*(r+m-1) ;
- köşeleri ve kenarları birleştirmek ' ';
- boşluklu prepending ' '*(m-r);

Sonra bunu yazdırır ve orta satırdaki yansıması yeni çizgilerle birleşir, print'\n'.join(t+t[-2::-1])


4

Python 2, 96 bayt

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

Bu oldukça dağınık ve biraz golf edilebilir görünüyor ...


3

Java, 375 363 361 339 329 317 293 bayt

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

Kullanımı :

$ 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

Korkunç iç içe if-else bloğunun daha küçük olması için yeniden yazılabileceğinden eminim ama şu anda anlayamıyorum. Herhangi bir öneri bekliyoruz :-)

Güncelleştirme

  • Kevin Cruijssen'in önerisini takip etti ve parseInt yerine kod çözme kullandı.
  • Üçlü işleci kullanarak bazı ifs'leri yeniden yazdı.
  • Daha fazla üçlü operatör.
  • Moar üçlü operatörleri! Sanırım bir canavar yarattım!
  • Yazdırma ile ilgili if-else bloğunu yeniden yazdı.

1
Kendini kullandığınız yönteme yakından bakmadım, ancak mevcut kodunuz için bazı küçük golf ipuçları: golf Integer.parseIntedilebilir Integer.decode. l=(h*4-3-s.trim().length())/2;if(l==0)golf edilebilir if((l=(h*4-3-s.trim().length())/2)==0). Ayrıca, sınıfsız bir yöntem yayınlamak tamamen kabul edilebilirdir (soru aksi belirtilmedikçe), bunun void f(int i){...use i...}yerine interface J{static void main(String[]r){...i=Integer.decode(r[0])...use i...}sizi birkaç bayt tasarruf etmelidir. Daha fazla zamanım olduğunda daha fazla bakacağım.
Kevin Cruijssen

@KevinCruijssen: Önerileriniz için teşekkür ederim. l=(h*4-3-s.trim().length())/2;if(l==0)aslında ile aynı uzunluktadır if((l=(h*4-3-s.trim().length())/2)==0).
Master_ex

2

05AB1E , 44 bayt

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

açıklama

Altıgenin üst ve alt kısmı yansıtıldığından, sadece üst kısmı üretmemiz gerekir.
Yani bir X girdisi için X satırları üretmemiz gerekiyor. Ana döngü bunu yapar.

F                                        }

Sonra sıraların orta kısmını yaparız.
Bu, ilk satır için 4 ve geri kalanı için 6'dır (yalnızca üst kısmı yapıyoruz).
Modelde sayılar arasında boşluk olmasını gerektireceğinden bu sayıyı boşlukla birleştiririz.

N_i4ë6}ð«

Daha sonra bu dizeyi X-2 + N kez tekrarlıyoruz , burada N 0-endeksli geçerli satırdır ve sol taraftaki boşluk karakterinin başına gelir.

¹ÍN+×ðì

Bundan sonra köşeler zamanı. Onlar olacak 3 ilk ve son satır için ve 4 orta sıralar için.

N_N¹<Q~i3ë4}.ø

Şimdi, her bir satırın önüne boşluk ekleyerek satırların doğru sıralandığından emin olmalıyız. Eklenen boşluk sayısı X-1-N olacaktır .

¹<N-ð×ì

Şimdi ızgaranın üst kısmına sahip olduğumuza göre, satırları bir listeye ekliyoruz, tersine çevrilmiş bir kopya oluşturuyoruz ve ilk öğeyi bu kopyadan kaldırıyoruz (yalnızca merkezi satıra bir kez ihtiyacımız olduğu için), ardından bu 2 listeyi birleştiriyoruz ve Yazdır.

)¦«»

Çevrimiçi deneyin!

Ek çözüm, ayrıca 44 bayt:

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

2

Ruby, 87 bayt

Anonim işlev n'yi bağımsız değişken olarak alır ve bir dizgi dizisi döndürür.

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

Test programında yönlendirilmemiş

Stdin üzerinden giriş. Tüm şekli stdout'a yazar. Kendini açıklayıcı.

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 bayt

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

Çevrimiçi deneyin!

Bu gerçekten çok uzun. İşte yazdırılamayan karakterler içerdiğinden bir 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

Raket, 487 bayt

(λ(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))))

Test yapmak:

(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

Ayrıntılı sürüm:

(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))))
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.