このダイヤモンドパターンを描く


24

以下のパターンは、この課題の基礎となります。

     /\
     \/
     /\
    /  \
   /    \
/\/      \/\
\/\      /\/
   \    /
    \  /
     \/
     /\
     \/

入力幅と高さを指定すると、それぞれ>=1、上記のASCIIアートパターンを何度も出力し、小さなひし形で結合(および重なり)します。

たとえば、次はwidth = 2andを使用した入力height = 1です。

     /\        /\
     \/        \/
     /\        /\
    /  \      /  \
   /    \    /    \
/\/      \/\/      \/\
\/\      /\/\      /\/
   \    /    \    /
    \  /      \  /
     \/        \/
     /\        /\
     \/        \/

ここで入力されたwidth = 3とはheight = 2

     /\        /\        /\
     \/        \/        \/
     /\        /\        /\
    /  \      /  \      /  \
   /    \    /    \    /    \
/\/      \/\/      \/\/      \/\
\/\      /\/\      /\/\      /\/
   \    /    \    /    \    /
    \  /      \  /      \  /
     \/        \/        \/
     /\        /\        /\
     \/        \/        \/
     /\        /\        /\
    /  \      /  \      /  \
   /    \    /    \    /    \
/\/      \/\/      \/\/      \/\
\/\      /\/\      /\/\      /\/
   \    /    \    /    \    /
    \  /      \  /      \  /
     \/        \/        \/
     /\        /\        /\
     \/        \/        \/

ルールとI / O

  • 入力と出力は、任意の便利な方法で指定できます。
  • STDOUTに出力するか、関数の結果として返すことができます。
  • 完全なプログラムまたは機能のいずれかが受け入れられます。
  • 文字が適切に並んでいる限り、余分な空白は許容されます。
  • 標準的な抜け穴は禁止されています。
  • これはので、通常のゴルフルールがすべて適用され、最短のコード(バイト単位)が勝ちます。

回答:


10

Canvas26 25 24 21 18 バイト

4/╬/╬⁰r:⤢n↷⁸{A×├m↷

ここで試してみてください!

キャンバスが繰り返されないことを修正することにより、-3バイト

説明:

4/╬                 quad-palindromize a 4-long diagonal - big inner diamond
   /╬               quad-palindromize "/" - small diamond
     ⁰r             join the two vertically, centered
       :⤢n          overlap with transpose
           ↷        and rotate the thing clockwise
            ⁸{      for each input
              A×      times 10
                ├     plus 2
                 m    mold the canvas to that width
                  ↷   and rotate clockwise, setting up for the next iteration

すごいO_Oキャンバスは短すぎる
ASCIIのみ

6

JavaScriptの(ES8)、167の 161 159バイト

注意:これはパターンをエンコードしています。より短い数学的アプローチについては、他の回答をご覧ください。

入力をとして受け取ります(width)(height)

w=>h=>(g=h=>h?g(--h)+`
`+([4106,4016,31305,21504,17010]['0102344320'[h%=10]]+'').replace(/./g,c=>'\\/'[c^h>5]||''.padEnd(c-1)).repeat(w+1).slice(8):'')(h*10+2)

オンラインでお試しください!

どうやって?

パターンの上半分を数字でエンコードします。

  • 0\
  • 1/
  • n=27手段n1空間

これは与える:

0  ···/\·····  -->  [3 spaces] [/] [\] [5 spaces]             -->  4106
1  ···\/·····  -->  [3 spaces] [\] [/] [5 spaces]             -->  4016
0  ···/\·····  -->  [3 spaces] [/] [\] [5 spaces]             -->  4106
2  ··/··\····  -->  [2 spaces] [/] [2 spaces] [\] [4 spaces]  -->  31305
3  ·/····\···  -->  [1 space] [/] [4 spaces] [\] [3 spaces]   -->  21504
4  /······\/\  -->  [/] [6 spaces] [\] [/] [\]                -->  17010

下半分のため、我々は、行使用4,3,2,0/し、\反転します。


6

JavaScript(ES6)、139バイト

これは私の最初の答えとはかなり異なるアプローチを使用しているため、これを個別に投稿しています。

入力をとして受け取ります(width)(height)

w=>h=>(g=x=>y>8?` /\\
`[a=(x+y*9)%10,d=(x+y)%10,x?(y%10>3&&2*(a==8)|d==5)|(y%10<6&&2*(a==6)|d==7):3]+g(x--?x:--y&&w):'')(w=w*10+2,y=-~h*10)

オンラインでお試しください!

どうやって?

wh

  • 10w+3
  • 10h+2

x10w+20y10h+109

w=3h=2

(32,30)(31,30)(0,30)(32,29)(31,29)(0,29)(32,9)(31,9)(0,9)

右端のセル(で x=0

他のすべてのセルについては、次を計算します。

  • a=(xy)mod10
  • d=(x+y)mod10

"/"if を描画します:

((ymod10)>3 and d=5) or ((ymod10)<6 and d=7)

 y  | y % 10 | output (w = 3, h = 1)
----+--------+----------------------------------
 20 |    0   | ...../........./........./......
 19 |    9   | ....../........./........./.....
 18 |    8   | ...../........./........./......
 17 |    7   | ..../........./........./.......
 16 |    6   | .../........./........./........
 15 |    5   | /./......././......././......./.
 14 |    4   | ./......././......././......././
 13 |    3   | ......../........./........./...
 12 |    2   | ......./........./........./....
 11 |    1   | ....../........./........./.....
 10 |    0   | ...../........./........./......
  9 |    9   | ....../........./........./.....

"\"if を描画します:

((ymod10)>3 and a=8) or ((ymod10)<6 and a=6)

 y  | y % 10 | output (w = 3, h = 1)
----+--------+----------------------------------
 20 |    0   | ......\.........\.........\.....
 19 |    9   | .....\.........\.........\......
 18 |    8   | ......\.........\.........\.....
 17 |    7   | .......\.........\.........\....
 16 |    6   | ........\.........\.........\...
 15 |    5   | .\.......\.\.......\.\.......\.\
 14 |    4   | \.\.......\.\.......\.\.......\.
 13 |    3   | ...\.........\.........\........
 12 |    2   | ....\.........\.........\.......
 11 |    1   | .....\.........\.........\......
 10 |    0   | ......\.........\.........\.....
  9 |    9   | .....\.........\.........\......

または、これらの条件のいずれも満たされない場合、スペースを描画します。


これは本当にクールです。
AdmBorkBork


@Arnauldコードを見るだけでこれがあなたの答えだとわかった:D
flawr

6

C ++(gcc)、137バイト

#include<cstdio>
auto p(int x,int y){int n=10,t=x=++x*n;for(++y*=n;y>8;)t>7?putchar(t<9?y--,n:t%n-y%n+4&7?t%n+y%n-5&7?32:47:92),t--:t=x;}

オンラインでお試しください!

説明

_______________________________
   098765432109876.... 
   9    \/    .     factor =y%10 - x10
   8    /\    .     if factor = -4 || 4. Print --> '\'  47
   7   /  \   . 
   6  /    \  .     factor =x%10+y%10;  
   5\/      \/*-.   if factor = 5 || 13 --> /  92
   4/\      /\   `.
   3  \    /       `->  * is 9,5 => \
   2   \  /      
   1    \/   
   0    /\       
   9

1
無効、完全なプログラムでも機能でもない
ASCIIのみ

1
しかし、10月10日非常に素晴らしい方法
ASCIIのみの

1
完全なプログラムや機能ではない答えはどれですか?(尋ねるだけで、見逃しているかもしれません)一部の言語(スクリプト言語など)では、完全なプログラムにボイラープレートを必要としないことに注意してください
ASCIIのみ


1
159ですが、関数からの出力が有効かどうかはわかりません(おそらく有効です)
ASCIIのみ

4

Haskell、179バイト

k '\\'='/'
k '/'='\\'
k x=x
f x=take(10*x+2)
w#h=map(f w.cycle).f h.drop 9.cycle$(++).reverse=<<map(map k)$["\\/\\      /","   \\    / ","    \\  /  ","     \\/   ","     /\\   "]

オンラインでお試しください!


Haskell、181バイト

k '\\'='/'
k '/'='\\'
k x=x
f x=take(10*x+2)
w#h=map(f w.cycle).f h.drop 9.cycle$(++).reverse=<<map(map k)$map t[49200,36058,31630,30010,29038]
t 0=""
t n="\\ /"!!mod n 3:t(div n 3)

オンラインでお試しください!


1
reverse.map(map k)<>idover (++).reverse=<<map(map k)を使用すると、両方のソリューションで3バイト節約できます。
ბიმო

1
ああ、そして第二一つにmap tなることができますt<$>し、take$10*x+2あまりにも別のバイトを保存し、最終的にあなたが使用できるcycle"\\ /"!!nオーバー"\\ /"!!mod n 3-今もう一つは:)短い オンラインそれをお試しください!
ბიმო

3

24 22 20バイト

\/↘²‖M↘LF⊖NCχ⁰F⊖NC⁰χ

オンラインでお試しください!リンクは、コードの詳細バージョンです。説明:

´\/↘²

元のパターンの8分の1を描画します。

‖M↘L

元のパターンを完成させるために3回複製します。

F⊖NCχ⁰

必要な回数を水平方向にコピーします。

F⊖NC⁰χ

必要な回数を垂直にコピーします。


3

Powershell、146バイト

param($w,$h)0..9*$h+0,1|%{$y=$_
-join(0..9*$w+0,1|%{('3  /\33  \/33  /\33 /  \3  /3 \ /\/33\\/\33/3\3 /3  \  /33 \/3'-replace3,'   ')[$y*10+$_]})}

説明

パターンは10x10文字の配列です:

     /\   
     \/   
     /\   
    /  \  
   /    \ 
/\/      \
\/\      /
   \    / 
    \  /  
     \/   

スクリプト:

  • パターンを繰り返します。
  • 各行の末尾に列[0,1]を追加します。
  • 行の[0,1]を出力の最後に追加します。

ゴルフの2つのこと:

  1. 長さ100バイトの文字列にマップされるパターン配列。
  2. 文字列はsimpleによって削減されましたreplace


1

PHP、159バイト

mazzyから取ったパターン。1-2-3に変換、base26に変換->プログラムによってデコード

while($y<$argv[2]*10+2)echo str_pad("",$argv[1]*10+2,strtr(base_convert([jng1,jnnb,jng1,jofn,k333,"1h4p5",23814,k94d,k02h,jnnb][$y++%10],26,4),312,"\ /")),"
";

PHP 5.5以降が必要です。で実行する-nr、オンラインで試してください

計算はより短くなる可能性があります(Arnauldの場合)。私はそれを調べるかもしれません。



1

Pythonの3194 192 187 127バイト

@ASCIIのみのソリューション:

lambda w,h,n=10:"\n".join("".join([" /","\\"][(j%n-i%n)%8==4][(j%n+i%n)%8==5]for i in range(-1,w*n+1))for j in range(-1,h*n+1))

オンラインでお試しください!


オリジナルソリューション

n="\n"
def f(w,h):a=[r"     /\   "*w,r"     \/   "*w,r"    \  /  "*w,r"   \    / "*w,r"\/\      /"*w+r"\/"];return a[0]+n+n.join(([i.translate({47:92,92:47})for i in a]+a[::-1])*h)+n+a[1]

オンラインでお試しください!

-2バイトは@Black Owl Kaiのおかげで、別々の変数ではなく、生成された配列から上部と下部にアクセスできることを示しています。

@Black Owl Kaiのおかげで、より多くのバイトがダイヤモンドを保存するためのより創造的な方法を使用して

各ダイヤモンドのこの部分を生成します。

     /\
     \/
    \  /
   \    /
\/\      /\/

Aは、/\それを完了するために、各列の最後に追加しました。次に、/sと\sを交換して各ダイヤモンドの上部を形成し、線の順序を逆にして下部を形成します。最後に、/\sの一番上の行とsの一番下の行を追加して\/、画像を完成させます。


変数bおよびcを使用しないことによる192バイト
Black Owl Kai

2つの+=/ *=割り当てを削除し、ダイヤモンド全体を上下逆にして、最後の文字列を保存しやすくすることで187バイト
Black Owl Kai


147、使用するC ++ソリューション
ASCIIのみの

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.