ASCII Dama Tahtası Çiz


25

özet

Son zamanlarda ASCII sanat zorluklarının popülaritesinden ilham alan bu mücadelenin amacı, Satranç'ın oynanabileceği bir ASCII dama tahtası çizmek.

Olumlu bir tamsayıyı nargüman olarak, stdinkullanıcı girişi ile veya kullanıcı girişi olarak alan bir program yazın ve 1 karelik bir kenarlık ile birlikte nx nkareleri olan bir dama tahtası çıktılar .

Her kare 2x2 karakter olmalıdır. Kareler, dama tahtası normal beyaz-siyah (önce beyaz, sol üst köşede olduğu gibi) desenini izlemelidir. Beyaz kareler boşluk ( ) karakterlerinden, siyah kareler ise pound ( #) karakterlerinden oluşmalıdır .

Kenarlık , kenarlıktaki ya da bir karenin dik noktası üzerindeki -artı ( +) işaretlerinden ( ) oluşmalıdır .

Giriş

Dama tahtasında çizilecek kare sayısını (kareler halinde boyutlar) gösteren pozitif tamsayı, her kare 2x2 karakterdir.

Örnek Sonuçlar

n=2

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

n=3

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

n=4

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

... ve bunun gibi.


notlar

  • Sondaki boşluklar ve yeni çizgiler kabul edilebilir.
  • Programın tamamını veya bir işlevi yazabilirsiniz.
  • Baştaki boşluk yok.
  • Programınız n = 15 için doğru sonuçları göstermelidir.
  • Daha az bilinen ezoterik diller ve benzerleri için, dilin bir bağlantısını sağlayın.
  • n=0üretmeli +. (isteğe bağlı, ancak şiddetle tavsiye edilir ve teşvik edilir.)
  • Bayt cinsinden en kısa kod, kod golf olduğu için kazanır.

2
Programlama Bulmacaları ve Code Golf'a Hoş Geldiniz! Buradaki iyi iş, özellikle de ilk zorluk için. Daha fazlasını görmek için sabırsızlanıyorum.
Alex A.

Sanırım "Programınız n = 15 için doğru sonuçları göstermeli." "n = 15'e kadar" anlamına mı geliyor?
John Dvorak

"Programınız n = 10 için doğru sonuçları göstermelidir." Eğer programınız n = 15'e kadar düzgün bir şekilde çıkamıyorsa, kaydedilmemesi gerektiği anlamına gelir. Ancak, bundan yararlanmanız / kötüye kullanmanız ve yalnızca n = 15'e kadar çıkabilen bir program yazmanız gerektiği anlamına gelmez.
kdragon

Ben ürettikleri olmasa bile, test çalışma cevapları upvote +için n=0.
kdragon

Üzgünüm kazananı asla kabul etmedim. Şimdi kabul ediyorum.
kdragon

Yanıtlar:


16

J, 24 bayt

Anonim bir işlev:

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

Kullanımı:

   f =: 2 2&$&.>@(' #'{~2|+/~@i.)
   f 4
+--+--+--+--+
|  |##|  |##|
|  |##|  |##|
+--+--+--+--+
|##|  |##|  |
|##|  |##|  |
+--+--+--+--+
|  |##|  |##|
|  |##|  |##|
+--+--+--+--+
|##|  |##|  |
|##|  |##|  |
+--+--+--+--+

1
&.>ondan daha kısa each. Yalnızca BoxFormolarak ayarlanmışsa çalıştığını unutmayın 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]

Her satır için desenlerden birini seçer.

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

ve 3*n+1ondan karakter yazdırır . Desen, aynı zamanda doğru uzunluktaki bir parçacığın ayıklanmasına hizmet eden ip serpiştirme numarasıyla seçilen ilk 6 karakterinin tekrarlanmasıyla seçilir.

Doğru düzen, imodulo 6 sıra indeksinin değerine dayanarak 3**i%7/2%3, tekrar eden paterni veren bir aritmetik ifade ile seçilir [0,1,1,0,2,2]. Doğru olanı elde etmek için x**i%7dönemi olan 6, sonra farklı değerleri xve farklı işlem sonrası deneyimlerini kullanarak buldum .


9

Pyth, 37

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

Aksine birlikte hacklendi, ama kısa.

Gösteri.


9

CJam, 43 42 bayt

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

Çevrimiçi deneyin .

Her koordinat bir karakterle eşleştirilir, örneğin sol üst köşe (0, 0) -> "+". Özellikle hesaplıyoruz

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

ve "#|-+ "buna göre dizgiye indeksleyin .


6

Retina , 106 bayt

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

Tek taraflı olarak girdi alır ( bu meta tartışmaya dayanarak ).

Her satır kendi dosyasına gitmeli nve dosyalardaki yeni satırla değiştirilmelidir. Bu pratik değildir ancak kodu, tek bir dosya gibi -s, nişaretçileri tutarak bayrakla çalıştırabilirsiniz . İsterseniz nokunabilirlik için çıkıştaki yeni satırları değiştirebilirsiniz . Örneğin:

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

Daha fazla golf ve bazı açıklamalar sonra gelir.


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

Pasaj:

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

Anonim işlev Tam bir dizi ile başlar +--+--+--...hatları ve uygun hatlarda yerini +için |ve -için ya da #uygun olarak.

Değiştirme karakterine karar veren ifade "| |##| "[x%6+(i%6>2)*3]muhtemelen daha fazla golf oynayabilir, ancak daha uzun, gereksiz bir dize kullanmanın karmaşık bir hesaplamadan daha fazla karakter kazandırdığını gördüm.


İyi ES6 kullanımı! Pasajdaki kaydırıcıdan gelen etki güzel bir ektir. Bir açıklama ve asılsız bir sürüm verebilir misiniz?
kdragon


3

ES6, 106 bayt olan CoffeeScript

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 bayt

Yeni satırlar önemlidir ve her biri 1 bayt olarak sayılır.

Açık dönüş, biraz daha uzun yaptı:

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}

gösteri

Yazma sırasında, Firefox, ES6 ile uyumlu tek büyük tarayıcıdır.

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>


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+"+")


Önceki çözümler

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 (gönderilmedi)

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+"+")

3

CJam, 46 bayt

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

Çevrimiçi deneyin

En azından özgün bir çözüme sahip olduğumu umuyordum (normalde kendi başıma çalışmadan önce diğer cevaplara bakmıyorum). @ Sp3000'in zaten çok daha benzer bir şey yaptığını ancak daha iyi olduğunu ortaya koydu. Ama işi zaten yaptığımdan beri yine de göndereceğimi düşündüm.

Açıklama:

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.

2

HackVM , 158 bayt

Kesinlikle bir kazanan değil, ama bu HVM'de yapılabilecek güzel bir mücadele gibi görünüyordu.

Boyutu ilk bellek hücresine yerleştirin ve aşağıdaki kodu kullanın:

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$

Not: Kodun çalışması için tam olarak bir satırda olması gerekir.

Açıklama:

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$

Kod 2 işlevi çağırır PLUSHDASHLINEve NORMALLINEpariteler için global bir durum sağlar (örneğin ' 'bir'#' bir hücrenin ).

Açıklama 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
$

Açıklama 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
$

Birisi daha fazla geliştirmek için ipuçları verdiyse sevinirim :)


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(*'--+'))

En kısa yol değil, eğlenceli bir yöntem. İşlev fiki dizge a,bve bir ayırıcı alır sve onun gibi argümanları birleştirir saasbbsaasbbsaas. Tahtanın sıraları bu formda kendi karakterleriyle oluşturulur, daha sonra sonucu üretmek için kendi aralarında birleştirilirler.


Bu, için geçersiz çıktı üretir n=0. Çözümlerin çoğunluğu (kabul edilecek) "+" üretir. Bu çözüm, normal izleyen 2 yeni satır (izin verilir) hariç, "++ (newline) ++" üretir.
kdragon

@DragonGuy Sorun, girişin pozitif bir tamsayı olduğunu söylüyor.
xnor

Ancak en az 0 için bir geri dönüş olmalıdır. Olumsuz geri dönüşler gerekli değildir. 0'dan küçük sayılar için kural yoktur. Bu çözüm, 1'den küçük herhangi bir şey için "++ (newline) ++" veriyor gibi görünüyor.
kdragon

@DragonGuy Giriş gereksinimlerini belirlediğinizde, girişin bu gereksinimleri karşıladığı garanti edilir ve durum böyle olmadığında keyfi davranabilir. "N = 0 + eklemeli" sorusunu, yayınlandıktan sonra + yapmalı, ancak cevaplar zaten girdikten sonra kuralları değiştirmek kesinlikle önerilmemiştir .
xnor

Soruyu düzenlemeden önce bu kuralı düşünüyordum (daha önce birçok soru okudum), ancak cevapların çoğunluğunu etkilemeyeceğinden, bunun bir sorun olacağını düşünmedim. Açıklık sağlamak ve bunu isteğe bağlı kılmak için düzenlenmiş bir soru.
kdragon

2

Yakut: 83 karakter

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

Örnek çalışma:

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

2

Ruby, 87

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

Bu anonim bir işlevdir. Buna şu şekilde bakın (0'dan 5'e kadar olan tüm olasılıklar)

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

ljustBoş bir dizedeki yöntemi kullanır . Ruby, bir doldurma dizisinin haklı gösterilmesi için belirtilmesine izin verir, bu nedenle dizi olarak sıralanan ljustüç olası doldurma b,c,ddizisinden biriyle kullanırız .abccbdd


1

Julia, 124 bayt

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)

Bu bir tamsayıyı kabul eden ve stdout'a basan adsız bir fonksiyon yaratır.

Ungolfed + açıklama:

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

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

Biraz uzun olsa da yazmak oldukça eğlenceli

Firefox'ta çalışıyor

1 - Konsolu aç

2 - Aşağıdakini yazın

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

Çıktı (n = 15):

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

Diğer ES6 çözümleri gibi bir snippet ekleyebilir misiniz? Bu, testi kolaylaştırır.
kdragon

Yorumumu 5 dakikalık aralıklarla düzenleyecektim, ancak bağlantım hatalıydı. Diğer ES6 çözümleri gibi bir snippet ekleyebilir misiniz? Bu, testi kolaylaştırır. Bir JavaScript pro ve ES6 noob için bu Firefox Scratchpad'de çalışmaz.
kdragon

@DragonGuy Tamam, sizin için işe yarayıp yaramadığına bakın.
Afonso Matos

1
Sağ sonunda, yine üç bayt tasarrufu ile ikame edebilir join('\n')ile join` `uzay ı belirtir Gerçek bir yeni satır karakterini yazdığı yer.
Chiru

1

Haskell, 99

Bu kısmen catgocat'ın önceki Haskell cevabından esinlenmiştir ; Kendi versiyonumu yazdım, sonra baktım, sonra bir tane daha yazdım. Aynı kurallara göre oynuyorum - giriş bir argüman, ancak çıkış stdout. (Eğer saf bir fonksiyon olabilirse, 7 karakter çıkarın 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

Biz kullanmak t3 bir bölgesini almaya n kullanarak sonsuz dama tahtasından + 1 karakterden inşa cycleve onu olduğunu. Diğer cevaptan aldığım ilk fikir, hem sınır hem de kontrol hücrelerinin kalıplarını bir araya getirmek. dizelerde bir .

İlk versiyonum (140 karakter) her noktada karakteri hesaplama stratejisini kullandı; bu, bundan daha karmaşık bir problem için daha iyi olabilirdi.

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

İlhamınız böyle akıllı bir cevaba yol açtığına sevindim :)
Afonso Matos

Bir dosyaya bu yazarken ben 84 bayt olsun cat <<EOF > sol1.hsve sayma du -b sol1.hs.
kdragon

@DragonGuy Ben de aynı şeyi yaptım ve hala 99 olsun. wcKabul ediyorum ve yazdırılmayan karakterleri kontrol ettim. Bu 84 baytlık sürüm çalışıyor mu? Öyleyse alacağım :)
Kevin Reid

1

Haskell, 118

Bu benim ilk haskell code golf cevap ve işte burada:

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"|##|  ""|"

Daha okunabilir sürüm:

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]

Çıktı

*Main> :load test
[1 of 1] Compiling Main             ( test.hs, interpreted )
Ok, modules loaded: Main.
*Main> f 1
+
*Main> f 4
+--+--+--+--+
|  |##|  |##|
|  |##|  |##|
+--+--+--+--+
|##|  |##|  |
|##|  |##|  |
+--+--+--+--+
|  |##|  |##|
|  |##|  |##|
+--+--+--+--+
|##|  |##|  |
|##|  |##|  |
+--+--+--+--+
*Main> f 15
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|  |##|  |##|  |##|  |##|  |##|  |##|  |##|  |
|  |##|  |##|  |##|  |##|  |##|  |##|  |##|  |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|##|  |##|  |##|  |##|  |##|  |##|  |##|  |##|
|##|  |##|  |##|  |##|  |##|  |##|  |##|  |##|
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|  |##|  |##|  |##|  |##|  |##|  |##|  |##|  |
|  |##|  |##|  |##|  |##|  |##|  |##|  |##|  |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|##|  |##|  |##|  |##|  |##|  |##|  |##|  |##|
|##|  |##|  |##|  |##|  |##|  |##|  |##|  |##|
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|  |##|  |##|  |##|  |##|  |##|  |##|  |##|  |
|  |##|  |##|  |##|  |##|  |##|  |##|  |##|  |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|##|  |##|  |##|  |##|  |##|  |##|  |##|  |##|
|##|  |##|  |##|  |##|  |##|  |##|  |##|  |##|
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|  |##|  |##|  |##|  |##|  |##|  |##|  |##|  |
|  |##|  |##|  |##|  |##|  |##|  |##|  |##|  |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|##|  |##|  |##|  |##|  |##|  |##|  |##|  |##|
|##|  |##|  |##|  |##|  |##|  |##|  |##|  |##|
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|  |##|  |##|  |##|  |##|  |##|  |##|  |##|  |
|  |##|  |##|  |##|  |##|  |##|  |##|  |##|  |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|##|  |##|  |##|  |##|  |##|  |##|  |##|  |##|
|##|  |##|  |##|  |##|  |##|  |##|  |##|  |##|
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|  |##|  |##|  |##|  |##|  |##|  |##|  |##|  |
|  |##|  |##|  |##|  |##|  |##|  |##|  |##|  |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|##|  |##|  |##|  |##|  |##|  |##|  |##|  |##|
|##|  |##|  |##|  |##|  |##|  |##|  |##|  |##|
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|  |##|  |##|  |##|  |##|  |##|  |##|  |##|  |
|  |##|  |##|  |##|  |##|  |##|  |##|  |##|  |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|##|  |##|  |##|  |##|  |##|  |##|  |##|  |##|
|##|  |##|  |##|  |##|  |##|  |##|  |##|  |##|
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|  |##|  |##|  |##|  |##|  |##|  |##|  |##|  |
|  |##|  |##|  |##|  |##|  |##|  |##|  |##|  |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+

f 11 boş kutu üretmeli, f 0sadece artı işareti üretmelidir .
Kade

@ Vioz- Benim hatam, bu yüzden kod daha da kısalıyor: P
Afonso Matos

1

C - 119 101

Şimdi @ Sp3000 cevap benzer bir hesaplama kullanır. Ayrıca çift optimizasyonu.

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

Bunun ?:bir GCC uzantısı olduğunu düşünüyorum ...

Eski cevap:

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

2 koordinat tutar ve her çift için hangi karakterin yazdırılacağını dürüstçe hesaplar. Yazdırılacak karakterlerin listesi dizide saklanır ve bu tek başına "renksiz" bir ızgara yazdırır. Dizinin ilk elemanı siyah kareler çizmek için değiştirilir.

Bunu değiştirebilirim, böylece iki bağımsız koordinat yerine, bir değerin sayılması ya da (daha da iyisi) aşağı sayılması, ancak şu anda kafamı sarması mümkün değil.

Bonus - 3'ü başka bir numara ile değiştirmek, farklı hücre boyutunda geçerli bir dama tahtası çizen bir programla sonuçlanır.


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?"-":"|":"+"
}

100'ün altına almak için oldukça savaştı. Geriye doğru saymak ve maç operatörünü kullanmak atılımlardı;) Gerisi oldukça basit bir mantıktı.


0

Pyke, 47 bayt, rakipsiz

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

Burada dene!

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.