Gambar Kotak-kotak ASCII

25

Ringkasan

Terinspirasi oleh popularitas baru-baru ini tantangan seni ASCII, tujuan tantangan ini adalah untuk menggambar kotak-kotak ASCII, seperti yang di mana Catur dapat dimainkan.

Tulis program yang menggunakan bilangan bulat positif nsebagai argumen, dalam stdin, atau sebagai input pengguna, dan output kotak-kotak dengan nx nkotak, bersama dengan perbatasan yang tebal 1 karakter.

Setiap kotak harus 2x2 karakter. Kotak harus mengikuti pola bolak-balik putih-hitam normal (putih pertama, seperti di sudut kiri atas) dari kotak-kotak. Kotak putih harus dibuat dari karakter space ( ), dan kotak hitam harus dibuat dari #karakter pound ( ).

Perbatasan harus dibuat dari tanda hubung ( -) dengan tanda tambah ( +) pada batas atau titik tegak lurus sebuah kotak.

Memasukkan

Bilangan bulat positif dalam merepresentasikan jumlah kotak (dimensi dalam kotak) untuk menggambar di kotak-kotak, dengan setiap kotak menjadi 2x2 karakter.

Contoh Hasil

n=2

+--+--+
|  |##|
|  |##|
+--+--+
|##|  |
|##|  |
+--+--+

n=3

+--+--+--+
|  |##|  |
|  |##|  |
+--+--+--+
|##|  |##|
|##|  |##|
+--+--+--+
|  |##|  |
|  |##|  |
+--+--+--+

n=4

+--+--+--+--+
|  |##|  |##|
|  |##|  |##|
+--+--+--+--+
|##|  |##|  |
|##|  |##|  |
+--+--+--+--+
|  |##|  |##|
|  |##|  |##|
+--+--+--+--+
|##|  |##|  |
|##|  |##|  |
+--+--+--+--+

... dan seterusnya.


Catatan

  • Ruang tambahan dan garis baru dapat diterima.
  • Anda dapat menulis seluruh program atau fungsi.
  • Tidak ada ruang utama.
  • Program Anda harus menampilkan hasil yang benar untuk n = 15.
  • Untuk bahasa esoteris yang kurang dikenal dan sejenisnya, berikan tautan ke bahasa tersebut.
  • n=0harus menghasilkan +. (opsional, tetapi sangat dianjurkan dan dianjurkan.)
  • Kode terpendek dalam byte menang, karena ini adalah kode golf.
kdragon
sumber
2
Selamat Datang di Programming Puzzles dan Code Golf! Kerja bagus di sini, terutama untuk tantangan pertama Anda. Saya berharap dapat melihat lebih banyak barang Anda.
Alex A.
Saya kira "Program Anda harus menampilkan hasil yang benar untuk n = 15." berarti "hingga n = 15"?
John Dvorak
"Program Anda harus menampilkan hasil yang benar untuk n = 10." berarti jika program Anda tidak dapat merender dengan benar hingga n = 15, itu tidak boleh diposting. Tapi itu tidak berarti Anda harus mengeksploitasi / menyalahgunakannya dan menulis sebuah program yang hanya bisa naik hingga n = 15.
kdragon
Aku upvote jawaban bekerja diuji, bahkan jika mereka tidak menghasilkan +untuk n=0.
kdragon
Maaf saya tidak pernah menerima pemenang. Menerima sekarang
kdragon

Jawaban:

16

J, 24 byte

Fungsi anonim:

2 2&$&.>@(' #'{~2|+/~@i.)

Pemakaian:

   f =: 2 2&$&.>@(' #'{~2|+/~@i.)
   f 4
+--+--+--+--+
|  |##|  |##|
|  |##|  |##|
+--+--+--+--+
|##|  |##|  |
|##|  |##|  |
+--+--+--+--+
|  |##|  |##|
|  |##|  |##|
+--+--+--+--+
|##|  |##|  |
|##|  |##|  |
+--+--+--+--+
Lynn
sumber
1
&.>lebih pendek dari satu each. Layak untuk dicatat bahwa ini hanya berfungsi jika BoxFormdiatur ke ASCII.
randomra
10

Python 2, 79

N=3*input()+1
for i in range(N):print('+||- #- #+||-# -# '*N)[3**i%7/2%3:3*N:3]

Untuk setiap baris, pilih salah satu pola

+--+--+--+--+--+
|  |##|  |##|  |
|##|  |##|  |##|

dan mencetak 3*n+1karakter dari itu. Pola ini dipilih dengan mengulangi 6 karakter pertama, dipilih dengan trik interleaving string, yang juga berfungsi untuk mengekstrak potongan dari panjang yang benar.

Pola yang benar dipilih berdasarkan nilai indeks baris imodulo 6 oleh ekspresi aritmatika 3**i%7/2%3yang memberikan pola berulang [0,1,1,0,2,2]. Saya menemukannya menggunakan fakta yang x**i%7memiliki periode 6, kemudian mencoba nilai yang xberbeda dan postprocessing yang berbeda untuk mendapatkan pola yang tepat.

Tidak
sumber
9

Pyth, 37

VJh*3Qsm@?+\|*2@" #"+/N3/d3%N3"+--"dJ

Agak diretas bersama, tapi pendek.

Demonstrasi.

isaacg
sumber
9

CJam, 43 42 byte

ri3*)_2m*{_3f%:!2b\3f/:+2%(e|"#|-+ "=}%/N*

Cobalah online .

Setiap koordinat dipetakan ke char, misalnya sudut kiri atas (0, 0) -> "+". Secara khusus, kami menghitung

[(y%3 == 0)*2 + (x%3 == 0)] or [(x//3 + y//3) % 2 - 1]

dan indeks ke dalam string yang "#|-+ "sesuai.

Sp3000
sumber
6

Retina , 106 byte

1
$_0$_x
1(?=1*0)
+--
1(?=1*x)
s
(0s.*?0)s
$1o
(s\D*?)s
$1o
s
|  
o
|##
\D*?x
$0$0
0
+n
x
|n
(.*?n).*
$0$1

Mengambil input sebagai unary (berdasarkan diskusi meta ini ).

Setiap baris harus menuju ke file sendiri dan nharus diubah ke baris baru di file. Ini tidak praktis tetapi Anda dapat menjalankan kode seperti, sebagai satu file, dengan -sbendera, menjaga nspidol. Anda dapat mengubah n's ke baris baru di output untuk dibaca jika Anda inginkan. Misalnya:

> echo -n 111|retina -s checkerboard|tr n '\n'
+--+--+--+
|  |##|  |
|  |##|  |
+--+--+--+
|##|  |##|
|##|  |##|
+--+--+--+
|  |##|  |
|  |##|  |
+--+--+--+

Golf lebih lanjut dan beberapa penjelasan datang kemudian.

randomra
sumber
4

JavaScript (ES6), 117

n=>Array(n*3+1).fill("+--".repeat(n)+"+").map((v,i)=>v.replace(/./g,(k,x)=>i%3?"|  |##|  "[x%6+(i%6>2)*3]:k)).join`
`

Potongan:

<input type="range" min=2 max=15 step=1 value=1 id="i" oninput="o.textContent=f(this.value)"><pre id="o"></pre><script>function f(n){ return Array.apply(0,Array(n*3+1)).map(function(){return "+--".repeat(n)+"+"}).map(function(v,i){ return v.replace(/./g,function(k,x) { return i%3?"|  |##|  "[x%6+(i%6>2)*3]:k}) }).join("\n") };o.textContent=f(2)</script>

Fungsi anonim. Mulai dengan serangkaian penuh +--+--+--...garis, dan pada garis yang sesuai, menggantikan +untuk |dan -untuk atau yang #sesuai.

Ekspresi yang menentukan karakter pengganti,, "| |##| "[x%6+(i%6>2)*3]mungkin bisa di-golf lebih lanjut, tetapi saya telah menemukan bahwa menggunakan string yang lebih lama dan redundan menyimpan lebih banyak karakter daripada perhitungan yang rumit.

apsillers
sumber
Penggunaan ES6 bagus! Efek dari slider di snippet adalah tambahan yang bagus. Bisakah Anda memberikan penjelasan dan versi yang tidak disatukan?
kdragon
3

CJam, 59 byte

Ini .. terlalu .. panjang ..

ri:I," #"f=2f*_I({__sff^_}*]'|I)*f.\2/Nf*'+I)*"--"*aI)*.\N*

Cobalah online di sini

Pengoptimal
sumber
3

CoffeeScript dengan ES6, 106 byte

f=(n,y=z='+--'[r='repeat'](n)+'+\n')->y+=('|##|  '[r](n).substr(i%2*3,n*3)+'|\n')[r](2)+z for i in[1..n];y

JavaScript (ES6), 111 byte

Baris baru signifikan dan masing-masing dihitung sebagai 1 byte.

Pengembalian eksplisit membuatnya sedikit lebih lama:

f=n=>{for(i=0,y=z='+--'[r='repeat'](n)+`+
`;i<n;)y+=('|##|  '[r](n).substr(++i%2*3,n*3)+`|
`)[r](2)+z;return y}

Demo

Pada saat penulisan, Firefox adalah satu-satunya browser utama yang kompatibel dengan ES6.

f=n=>{for(i=0,y=z='+--'[r='repeat'](n)+`+
`;i<n;)y+=('|##|  '[r](n).substr(++i%2*3,n*3)+`|
`)[r](2)+z;return y}

// Demonstration related things
document.getElementById('O').innerHTML = f(document.getElementById('n').value);

document.getElementById('n').addEventListener('change', function () {
  document.getElementById('O').innerHTML = f(this.value);
});
<p><input id=n type=number min=0 step=1 value=6></p>
<pre><output id=O></output></pre>

rink.attendant.6
sumber
3

Python 3, 114 108 100

def f(n):
 for i in range(3*n+1):print(("|##|  "*n+"|")[::i//3%2*2-1][:3*n+1]if i%3 else"+--"*n+"+")


Solusi sebelumnya

108

def f(n):
 for i in range(3*n+1):
  a=("|##|  "*n+"|")[::i//3%2*2-1][:3*n+1];print(a if i%3 else"+--"*n+"+")

114

def f(n):a="+--"*n+"+\n";b="|  |##"*n+"|";print(a+a.join(([(b[:3*n+1]+"\n")*2,(b[::-1][:3*n+1]+"\n")*2]*n)[:n])+a)

118 (tidak dikirim)

def f(n):
 for i in range(3*n+1):print((("|##|  "*n)[:3*n+1]if i//3%2 else("|  |##"*n)[:3*n+1])if i%3 else"+--"*n+"+")
satu-satunya
sumber
3

CJam, 46 byte

li3*)_2m*[{_3f/2f%:=\3f%:g+2b"+-|#+-| "=}/]/N*

Cobalah online

Yah, saya berharap bahwa saya setidaknya akan memiliki solusi asli (saya biasanya tidak melihat jawaban lain sebelum mengerjakan sendiri). Ternyata @ Sp3000 sudah melakukan sesuatu yang sangat mirip, hanya saja lebih baik. Tapi karena saya sudah melakukan pekerjaan, saya pikir saya akan tetap mempostingnya.

Penjelasan:

li    Get input n.
3*)   Calculate 3*n+1, which is the total width/height.
_     Copy size. We'll need it at the end to insert the newlines.
2m*   Calculate cartesian power with 2. This enumerates all coordinate pairs.
[     Wrap characters in array for split operation at the end.
  {     Loop over all coordinate pairs.
    _     Copy coordinate pair.
    3f/   Divide coordinates by 3.
    2f%   Modulo 2. This characterizes even/odd squares.
    :=    Compare the two coordinates. This gives 0/1 for white/black squares.
    \3f%  Grab second copy of coordinates, and calculate modulo 3.
    :g    Sign. This gives 0 for grid lines, 1 for interior of squares.
    +     Concatenate the two results. We now have a 3 bit code.
    2b    Convert the 3 bits to a number in range 0..7.
    "+-|#+-| "
          Lookup table to convert 0..7 number to character.
    =     Lookup character.
  }/    End loop over coordinate pairs.
]     End wrapping characters.
/     Split character array into lines.
N*    And join them with newlines.
Reto Koradi
sumber
2

HackVM , 158 byte

Jelas bukan pemenang, tetapi ini tampak seperti tantangan yang bagus untuk dilakukan di HVM.

Tempatkan ukuran ke dalam sel memori pertama dan gunakan kode berikut:

77*1+c0<0^84*1+?1-11<-1>99*85++0^cc77*1+c066*5+-g!0<0^45*2+?1-95*0^0^2-PPP064*-6-gd95*2-P25*P$1<2>555**1-P0<0^76*6-?1-12<-2>2<3*48*+0^PP555**1-P076*2+-gd25*P$

Catatan: Kode harus tepat dalam satu baris agar berfungsi.

Penjelasan:

Call PLUSHDASHLINE
77*2+c

Read the cell and skip if done
0<0^84*1+?1-

  Flip row parity
  11<-1>

  Call NORMALLINE twice
  99*85++0^cc

  Call PLUSHDASHLINE
  77*1+c

Jump back to start of loop
066*5+-g!


DEFINE_PLUSDASHLINE
0<0^45*2+?1-95*0^0^2-PPP064*-6-gd95*2-P25*P$

DEFINE_NORMALLINE
1<2>555**1-P0<0^76*6-?1-12<-2>2<3*48*+0^PP555**1-P076*2+-gd25*P$

Kode ini memanggil 2 fungsi PLUSHDASHLINEdan NORMALLINE, mempertahankan status global untuk paritas (yaitu apakah akan menempatkan a ' 'atau a '#'di dalam sel).

Penjelasan untuk PLUSDASHLINE:

Repeat N times
0<0^45*2+?1-

  Print "+--"
  95*0^0^2-PPP

End Repeat
064*-6-g

Print "+"
d95*2-P

Print "\n"
25*P

Return
$

Penjelasan untuk NORMALLINE:

Copy Parity into Cell 2
1<2>

Print '|'
555**1-P

Repeat N times
0<0^76*6-?1-

  Flip Cell 2 (i.e. Flip Column Parity)
  12<-2>

  Calculate ' ' or '#' based upon parity
  2<3*48*+0^

  Print it twice
  PP

  Print '|'
  555**1-P

End Repeat
076*2+-g

Print "\n"
d25*P

Return
$

Sangat menghargai jika seseorang memberikan tips untuk meningkatkannya lebih lanjut :)

Jay Bosamiya
sumber
2

Python 2, 98

n=input()
f=lambda a,b,s:s+s.join(([a*2,b*2]*n)[:n])+s+'\n'
print f(f(*' #|'),f(*'# |'),f(*'--+'))

Bukan cara terpendek, tetapi metode yang lucu. Fungsi fmengambil dua string a,bdan pemisah sdan interleave argumennya seperti saasbbsaasbbsaas. Baris-baris papan dibuat dalam bentuk ini dengan karakter masing-masing, kemudian disisipkan sendiri dengan cara ini untuk menghasilkan hasilnya.

Tidak
sumber
Ini menghasilkan output yang tidak valid untuk n=0. Mayoritas solusi (yang akan diterima) menghasilkan "+". Solusi ini menghasilkan "++ (baris baru) ++", tidak termasuk baris normal 2 baru (yang diizinkan).
kdragon
@DragonGuy Masalahnya mengatakan input adalah bilangan bulat positif.
xnor
Tetapi harus ada fallback untuk setidaknya 0. Fallback negatif tidak diperlukan. Tidak akan ada aturan untuk angka kurang dari 0. Solusi ini tampaknya memberikan "++ (baris baru) ++" untuk apa pun yang kurang dari 1.
kdragon
@DragonGuy Ketika Anda menentukan persyaratan input, itu berarti input dijamin untuk memenuhi persyaratan tersebut, dan dapat bertindak sewenang-wenang ketika tidak demikian. Saya perhatikan Anda mengedit pertanyaan untuk menambahkan "n = 0 harus menghasilkan +" setelah ini diposting, tetapi mengubah aturan setelah jawaban sudah masuk sangat tidak disarankan .
xnor
Saya memikirkan aturan itu (baca banyak pertanyaan sebelumnya) sebelum mengedit pertanyaan, tetapi karena itu tidak akan mempengaruhi sebagian besar jawaban, saya tidak berpikir itu akan menjadi masalah. Pertanyaan diedit untuk memberikan kejelasan dan menjadikannya opsional.
kdragon
2

Ruby: 83 karakter

f=->n{puts d=?++'--+'*n,(0...n).map{|i|[?|+'%2s|'*n%(['','##',''][i%2,2]*n)]*2<<d}}

Contoh dijalankan:

irb(main):001:0> f=->n{puts d=?++'--+'*n,(0...n).map{|i|[?|+'%2s|'*n%(['','##',''][i%2,2]*n)]*2<<d}}
=> #<Proc:0x000000007c51a0@(irb):1 (lambda)>

irb(main):002:0> f[0]
+
=> nil

irb(main):003:0> f[1]
+--+
|  |
|  |
+--+
=> nil

irb(main):004:0> f[2]
+--+--+
|  |##|
|  |##|
+--+--+
|##|  |
|##|  |
+--+--+
=> nil

irb(main):005:0> f[3]
+--+--+--+
|  |##|  |
|  |##|  |
+--+--+--+
|##|  |##|
|##|  |##|
+--+--+--+
|  |##|  |
|  |##|  |
+--+--+--+
=> nil
manatwork
sumber
2

Ruby, 87

->n{a=[b="+--",c="|  |##",c,b,d="|##|  ",d]
0.upto(n*3){|i|puts"".ljust(n*3+1,a[i%6])}}

Ini adalah fungsi anonim. Sebut saja seperti ini (semua kemungkinan dari 0 hingga 5)

f=->n{a=[b="+--",c="|  |##",c,b,d="|##|  ",d]
0.upto(n*3){|i|puts"".ljust(n*3+1,a[i%6])}}

6.times{|j|f.call(j)}

Itu menggunakan ljustmetode pada string kosong. Ruby memungkinkan string padding ditentukan untuk justifikasi, jadi kami menggunakan ljustdengan salah satu dari tiga string padding yang mungkin b,c,dper array a, dipesan sebagai bccbdd.

Level River St
sumber
1

Julia, 124 byte

n->(t="+--"^n*"+";a="|  ";b="|##";m=n÷2;c=n%2>0;p=println;p(t);for i=1:n p(((i%2<1?(b*a)^m*b^c:(a*b)^m*a^c)*"|\n")^2*t)end)

Ini menciptakan fungsi tanpa nama yang menerima integer dan mencetak ke stdout.

Penjelasan + tidak dikumpulkan:

function f(n)
    # Define the portions of the board
    t = "+--"^n * "+"
    a = "|  "
    b = "|##"

    # There will be n÷2 repeated a*b or b*a per line
    m = n ÷ 2

    # If n is odd, there will be an extra a or b
    c = n % 2 != 0

    # Print the top
    println(t)

    # Print each horizontal section of the board
    for i = 1:n
        # In even numbered sections, b precedes a
        j = (i % 2 == 0 ? (b*a)^m * b^c : (a*b)^m * a^c) * "|\n"
        println(j^2 * t)
    end
end
Alex A.
sumber
1

Javascript, ES6 149

n=>(r="+--".repeat(n)+"+",[...r].map((_,i)=>i%3?(x=i%6&&i%6<3?" ":"#",[...r].map((_,e)=>e%3?e%6&&e%6<3?x:"#"==x?" ":"#":"|").join('')):r).join('\n'))

Cukup menyenangkan untuk menulis meskipun agak panjang

Bekerja pada firefox

1 - Buka konsol

2 - Ketikkan yang berikut ini

console.log((n=>(r="+--".repeat(n)+"+",[...r].map((_,i)=>i%3?(x=i%6&&i%6<3?" ":"#",[...r].map((_,e)=>e%3?e%6&&e%6<3?x:"#"==x?" ":"#":"|").join('')):r).join('\n')))(15));

Output (n = 15):

+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|  |##|  |##|  |##|  |##|  |##|  |##|  |##|  |
|  |##|  |##|  |##|  |##|  |##|  |##|  |##|  |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|##|  |##|  |##|  |##|  |##|  |##|  |##|  |##|
|##|  |##|  |##|  |##|  |##|  |##|  |##|  |##|
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|  |##|  |##|  |##|  |##|  |##|  |##|  |##|  |
|  |##|  |##|  |##|  |##|  |##|  |##|  |##|  |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|##|  |##|  |##|  |##|  |##|  |##|  |##|  |##|
|##|  |##|  |##|  |##|  |##|  |##|  |##|  |##|
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|  |##|  |##|  |##|  |##|  |##|  |##|  |##|  |
|  |##|  |##|  |##|  |##|  |##|  |##|  |##|  |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|##|  |##|  |##|  |##|  |##|  |##|  |##|  |##|
|##|  |##|  |##|  |##|  |##|  |##|  |##|  |##|
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|  |##|  |##|  |##|  |##|  |##|  |##|  |##|  |
|  |##|  |##|  |##|  |##|  |##|  |##|  |##|  |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|##|  |##|  |##|  |##|  |##|  |##|  |##|  |##|
|##|  |##|  |##|  |##|  |##|  |##|  |##|  |##|
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|  |##|  |##|  |##|  |##|  |##|  |##|  |##|  |
|  |##|  |##|  |##|  |##|  |##|  |##|  |##|  |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|##|  |##|  |##|  |##|  |##|  |##|  |##|  |##|
|##|  |##|  |##|  |##|  |##|  |##|  |##|  |##|
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|  |##|  |##|  |##|  |##|  |##|  |##|  |##|  |
|  |##|  |##|  |##|  |##|  |##|  |##|  |##|  |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|##|  |##|  |##|  |##|  |##|  |##|  |##|  |##|
|##|  |##|  |##|  |##|  |##|  |##|  |##|  |##|
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|  |##|  |##|  |##|  |##|  |##|  |##|  |##|  |
|  |##|  |##|  |##|  |##|  |##|  |##|  |##|  |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|##|  |##|  |##|  |##|  |##|  |##|  |##|  |##|
|##|  |##|  |##|  |##|  |##|  |##|  |##|  |##|
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|  |##|  |##|  |##|  |##|  |##|  |##|  |##|  |
|  |##|  |##|  |##|  |##|  |##|  |##|  |##|  |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
Afonso Matos
sumber
Bisakah Anda menambahkan potongan seperti solusi ES6 lainnya? Ini akan membuat pengujian lebih mudah.
kdragon
Saya akan mengedit komentar saya dalam kisaran 5 menit, tetapi koneksi saya salah. Bisakah Anda menambahkan potongan seperti solusi ES6 lainnya? Ini akan membuat pengujian lebih mudah. Untuk JavaScript pro dan ES6 noob, ini tidak berfungsi di Firefox Scratchpad.
kdragon
@DragonGuy Selesai, lihat apakah itu bekerja untuk Anda.
Afonso Matos
1
Tepat di akhir, Anda masih menyimpan tiga byte dengan dapat mengganti join('\n')dengan join` `, di mana ruang saya menulis menunjukkan suatu karakter baris baru yang sebenarnya.
Chiru
1

Haskell, 99

Ini sebagian terinspirasi oleh jawaban Haskell sebelumnya oleh catgocat ; Saya menulis versi saya sendiri, lalu melihatnya, lalu menulis yang lain. Saya bermain dengan aturan yang sama - input adalah argumen, tetapi outputnya stdout. (Jika itu bisa menjadi fungsi murni, kurangi 7 karakter putStr$.)

f n=putStr$unlines$t$map t$y[a,b,b,a,c,c]where t=take(n*3+1)
a=y"+--"
b=y"|  |##"
c=drop 3b
y=cycle

Kami menggunakan tuntuk mengambil wilayah 3 n +1 karakter dari kotak-kotak tak terbatas yang dibangun menggunakan cycle, dan hanya itu. Gagasan utama yang saya ambil dari jawaban lain adalah bahwa menempatkan pola-pola sel perbatasan dan pemeriksa bersama-sama dalam string.

Versi pertama saya (140 karakter) menggunakan strategi penghitungan karakter di setiap titik, yang mungkin lebih baik untuk masalah yang lebih kompleks daripada yang ini.

f n=putStr$unlines$map(\y->map(g y)r)r where r=[0..n*3]
g y x=s(s '+'y '|')x$s '-'y$cycle" #"!!(x`div`3+y`div`3)
s c i d|i`mod`3==0=c|True=d
Kevin Reid
sumber
Saya senang inspirasi Anda mengarah pada jawaban yang cerdas :)
Afonso Matos
Saya mendapatkan 84 byte saat menulis ini ke file dengan cat <<EOF > sol1.hsdan terus bertambah du -b sol1.hs.
kdragon
@DragonGuy Saya hanya melakukan hal yang sama dan masih mendapatkan 99. wcsetuju, dan saya memeriksa karakter yang tidak tercetak. Apakah versi 84 byte ini berjalan ? Jika demikian, saya akan menerimanya :)
Kevin Reid
1

Haskell, 118

Ini adalah jawaban kode haskell golf pertama saya dan ini dia:

f n=mapM_(putStrLn.s)[0..3*n]where;d x=(++)$take(3*n)$cycle x;s x|x`mod`3<1=d"+--""+"|x`mod`6<3=d"|  |##""|"|1<2=d"|##|  ""|"

Versi yang lebih mudah dibaca:

func num = do
    let -- Range
        rag = 3 * num
        -- `+--+`
        a = d "+--" "+"
        -- `|  |##`
        b = d "|  |##" "|"
        -- `|##|  `
        c = d "|##|  " "|"
        -- generate line
        d x y = take rag (cycle x) ++ y
        -- step
        step x
            | x `mod` 6 `elem` [1, 2] = b
            | x `mod` 3 == 0          = a
            | otherwise               = c

    mapM_ (putStrLn . step) [0..rag]

Keluaran

*Main> :load test
[1 of 1] Compiling Main             ( test.hs, interpreted )
Ok, modules loaded: Main.
*Main> f 1
+
*Main> f 4
+--+--+--+--+
|  |##|  |##|
|  |##|  |##|
+--+--+--+--+
|##|  |##|  |
|##|  |##|  |
+--+--+--+--+
|  |##|  |##|
|  |##|  |##|
+--+--+--+--+
|##|  |##|  |
|##|  |##|  |
+--+--+--+--+
*Main> f 15
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|  |##|  |##|  |##|  |##|  |##|  |##|  |##|  |
|  |##|  |##|  |##|  |##|  |##|  |##|  |##|  |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|##|  |##|  |##|  |##|  |##|  |##|  |##|  |##|
|##|  |##|  |##|  |##|  |##|  |##|  |##|  |##|
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|  |##|  |##|  |##|  |##|  |##|  |##|  |##|  |
|  |##|  |##|  |##|  |##|  |##|  |##|  |##|  |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|##|  |##|  |##|  |##|  |##|  |##|  |##|  |##|
|##|  |##|  |##|  |##|  |##|  |##|  |##|  |##|
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|  |##|  |##|  |##|  |##|  |##|  |##|  |##|  |
|  |##|  |##|  |##|  |##|  |##|  |##|  |##|  |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|##|  |##|  |##|  |##|  |##|  |##|  |##|  |##|
|##|  |##|  |##|  |##|  |##|  |##|  |##|  |##|
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|  |##|  |##|  |##|  |##|  |##|  |##|  |##|  |
|  |##|  |##|  |##|  |##|  |##|  |##|  |##|  |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|##|  |##|  |##|  |##|  |##|  |##|  |##|  |##|
|##|  |##|  |##|  |##|  |##|  |##|  |##|  |##|
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|  |##|  |##|  |##|  |##|  |##|  |##|  |##|  |
|  |##|  |##|  |##|  |##|  |##|  |##|  |##|  |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|##|  |##|  |##|  |##|  |##|  |##|  |##|  |##|
|##|  |##|  |##|  |##|  |##|  |##|  |##|  |##|
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|  |##|  |##|  |##|  |##|  |##|  |##|  |##|  |
|  |##|  |##|  |##|  |##|  |##|  |##|  |##|  |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|##|  |##|  |##|  |##|  |##|  |##|  |##|  |##|
|##|  |##|  |##|  |##|  |##|  |##|  |##|  |##|
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|  |##|  |##|  |##|  |##|  |##|  |##|  |##|  |
|  |##|  |##|  |##|  |##|  |##|  |##|  |##|  |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|##|  |##|  |##|  |##|  |##|  |##|  |##|  |##|
|##|  |##|  |##|  |##|  |##|  |##|  |##|  |##|
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|  |##|  |##|  |##|  |##|  |##|  |##|  |##|  |
|  |##|  |##|  |##|  |##|  |##|  |##|  |##|  |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
Afonso Matos
sumber
f 1harus menghasilkan 1 kotak kosong, f 0hanya menghasilkan tanda plus.
Kade
@ Vioz- Buruk saya, jadi ini membuat kode lebih pendek: P
Afonso Matos
1

C - 119 101

Menggunakan perhitungan yang mirip dengan jawaban @ Sp3000 sekarang. Juga beberapa optimasi.

i,j;f(n){for(i=j=0;j<=n*3;i++)putchar(i-n*3-1?" -|+#"[!(j%3)+2*!(i%3)?:(i/3+j/3)%2*4]:(j-=i=-1,10));}

Saya pikir itu ?:adalah ekstensi GCC ...

Jawaban lama:

f(n){int i,j;char p[]=" -|+";for(i=j=0;j<=n*3;*p=" #"[(i++/3+j/3)%2])putchar(i-n*3-1?p[!(j%3)+2*!(i%3)]:(j-=i=-1,10));}

Ia memelihara 2 koordinat dan dengan jujur ​​menghitung karakter mana yang akan dicetak untuk setiap pasangan. Daftar karakter yang akan dicetak disimpan dalam array dan ini saja mencetak kotak "tidak berwarna". Elemen pertama array dimodifikasi untuk menggambar kotak hitam.

Saya mungkin mengubah ini sehingga alih-alih dua koordinat independen itu satu nilai menghitung atau (mungkin bahkan lebih baik) turun, tetapi tidak dapat membungkus kepala saya di sekitar itu sekarang.

Bonus - mengganti 3 dengan nomor lainnya menghasilkan program yang menarik kotak-kotak yang valid dengan ukuran sel yang berbeda.

aragaer
sumber
1

awk - 91

{
    for(k=i=3*$0+1;i--;print"")
        for(j=k;j--;)printf i%3?j%3?234~(i+j)%6?FS:"#":j%3?"-":"|":"+"
}

Cukup perjuangan untuk mendapatkannya di bawah 100. Menghitung mundur dan menggunakan operator pertandingan adalah terobosan;) Sisanya cukup banyak logika langsung.

Cabbie407
sumber
0

Pyke, 47 byte, tidak bersaing

"+--"Q*\+j+i
QQ]Uas 2%" #"@2*)F\|JjR+"+
"+2*pi
<Newline needed>

Coba di sini!

Biru
sumber