ASCII接続の六角形


21

概要

多数の六角形が与えられたら、それらを50 x 50のASCIIアートイメージの範囲内で接続された形状に配置します。選択する形状は、接続されている限り、ゴルフに最も適していると思うものであれば何でもかまいません。1つの六角形よりも大きい場合は、穴が開いている場合があります(そうでない場合、六角形の数があいまいになります)。


レイアウト

すべての六角形は次の形式である必要があります(このサイズと向きのみが有効です)。

 __
/  \
\__/    Note there are 2 underscores per horizontal edge.

2つの六角形がエッジを共有する場合、それらは直接接続されます。

 __               __
/  \__           /  \
\__/  \          \__/
   \__/    or    /  \
                 \__/

2つの六角形は、頂点のみを共有している場合、接続されていません。

 __  __
/  \/  \
\__/\__/

エッジの半分を共有することも、接続されているとは見なされません。

 __
/  \
\__/
 /  \
 \__/

直接接続された六角形のみを使用して、六角形から他の任意の六角形へのパスが存在する場合、六角形のコレクションが接続されます。

六角形の接続されたコレクション内の六角形のサイズの穴は六角形としてカウントされるため、ASCIIアートのどの部分も明確な六角形カウントになります。

予想される穴は単一の六角形であるため、これは穴としてカウントされませ

    __
 __/  \__
/  \__/  \
\__/  \__/
/  \__/  \
\__/  \__/
   \__/      7 hexagons (not 6 with a hole)

これ、単一の六角形に対応していないため、穴としてカウントされます。

    __
 __/  \__
/  \__/  \__
\__/  \__/  \
/  \__   \__/
\__/  \__/  \
   \__/  \__/
      \__/      8 hexagons with a hole

入出力

入力

1〜255の整数。

出力

上記の接続された六角形の入力数を表すASCIIアート文字列。

  • 行(改行で区切られた部分文字列)の数は最大50で、追加のオプションの末尾の改行があります。
  • 行は同じ長さである必要はありませんが、各行の長さは最大50でなければなりません。
  • 行の総数が50を超えない限り、接続された図形の上または下に長さゼロの行が存在できます。
  • 行の総数が50を超えない限り、スペースのみの行は接続された図形の上または下に存在できます。
  • 行の長さが50を超えない場合、形状の左側にスペースを表示できます(形状を左側に揃える必要はありません)。
  • 行の長さが50を超えない場合、形状の右側にスペースを表示できます。
  • 接続された図形の一部を形成しない文字は、スペースまたは改行でなければなりません。

出力が正しい場合は、実行ごとに一貫性を保つ必要はありません。

入力: 6

有効な出力:

 __    __    __
/  \__/  \__/  \__
\__/  \__/  \__/  \
   \__/  \__/  \__/

 __    __
/  \__/  \
\__/  \__/
/  \__/  \
\__/  \__/
   \__/

          __
 __      /  \
/  \__   \__/
\__/  \__/  \
   \__/  \__/
      \__/
      /  \
      \__/

無効な出力:

    __
 __/  \__
/  \__/  \
\__/  \__/
/  \__/  \
\__/  \__/
   \__/      Invalid for 6 as the centre hole counts as a 7th hexagon.

 __    __    __      __
/  \__/  \__/  \    /  \
\__/  \__/  \__/    \__/
   \__/  \__/                Invalid as the 6 hexagons are not connected.

 __    __    __  __
/  \__/  \__/  \/  \
\__/  \__/  \__/\__/
   \__/  \__/           Invalid as vertex touching does not count as connected.

 __    __       __
/  \__/  \     /  \
\__/  \__/     \__/
/  \__/  \
\__/  \__/
   \__/       Invalid as the 6 connected hexagons are not the only visible characters.

勝ち

バイト単位の最短の有効な回答が優先されます。


リーダーボード

Martinのリーダーボードスニペットを使用)


おそらく最も簡単に実装できるため、誰もが最初の出力パターン例を使用することを恐れています。
15

1
@Fatalizeの例はの入力に対してのみ機能します6255六角形の水平列の入力では、50 x 50のASCIIアートには適合しません。
-trichoplax

あなたは可能性はまだ単純にループバックして、50文字の制限に達するたびに、以下の行を埋める
Fatalize

1
@Fatalize課題は、コード内のバイト数を最小限にすることです。パターンが単純であるかどうかは気にせず、人々が何を試み、さまざまな言語に適しているかを見るのは面白いだけです。
-trichoplax

@Fatalize:短いかどうかはわかりませんが、より「興味深い」答えは、六角形を配置できる場所を確認するために実際の検索を行い、より興味深い出力を得ることができます。
アレックスヴァンリュー

回答:


13

CJam、64 57 55バイト

" __
/  \
\__/"N/{_SS/\+_47>S3*f{\+}_2>\@?}q~(*]:..e>N*

ここでテストしてください。

これにより、列ごとに次のパターンが生成されます。

 __    __    __    __    __    __
/  \__/  \__/  \__/  \__/  \__/  \
\__/  \__/  \__/  \__/  \__/  \__/
/  \__/  \__/  \__/  \__/  \__/  \
\__/  \__/  \__/  \__/  \__/  \__/
/  \__/  \__/  \__/  \__/  \__/  \
\__/  \__/  \__/  \__/  \__/  \__/
/  \__/  \__/  \__/  \__/  \__/  \
\__/  \__/  \__/  \__/  \__/  \__/
/  \__/  \__/  \__/  \__/  \__/  \
\__/  \__/  \__/  \__/  \__/  \__/
/  \__/  \__/  \__/  \__/  \__/  \
\__/  \__/  \__/  \__/  \__/  \__/
/  \__/  \__/  \__/  \__/  \__/  \
\__/  \__/  \__/  \__/  \__/  \__/
/  \__/  \__/  \__/  \__/  \__/  \
\__/  \__/  \__/  \__/  \__/  \__/
/  \__/  \__/  \__/  \__/  \__/  \
\__/  \__/  \__/  \__/  \__/  \__/
/  \__/  \__/  \__/  \__/  \__/  \
\__/  \__/  \__/  \__/  \__/  \__/
/  \__/  \__/  \__/  \__/  \__/  \
\__/  \__/  \__/  \__/  \__/  \__/
/  \__/  \__/  \__/  \__/  \__/  \
\__/  \__/  \__/  \__/  \__/  \__/
/  \__/  \__/  \__/  \__/  \__/  \
\__/  \__/  \__/  \__/  \__/  \__/
/  \__/  \__/  \__/  \__/  \__/  \
\__/  \__/  \__/  \__/  \__/  \__/
/  \__/  \__/  \__/  \__/  \__/  \
\__/  \__/  \__/  \__/  \__/  \__/
/  \__/  \__/  \__/  \__/  \__/  \
\__/  \__/  \__/  \__/  \__/  \__/
/  \__/  \__/  \__/  \__/  \__/  \
\__/  \__/  \__/  \__/  \__/  \__/
/  \__/  \__/  \__/  \__/  \__/  \
\__/  \__/  \__/  \__/  \__/  \__/
/  \__/  \__/  \__/  \__/  \__/  \
\__/  \__/  \__/  \__/  \__/  \__/
/  \__/  \__/  \__/  \__/  \__/  \
\__/  \__/  \__/  \__/  \__/  \__/
/  \__/  \__/  \__/  \__/  \__/
\__/  \__/  \__/  \__/  \__/  \
/  \__/  \__/  \__/  \__/  \__/
\__/  \__/  \__/  \__/  \__/  \
/  \__/  \__/  \__/  \__/  \__/
\__/  \__/  \__/  \__/  \__/  \
/  \__/  \__/  \__/  \__/  \__/
\__/  \__/  \__/  \__/  \__/

説明

これは、デニスの優れたヒントに基づいており.e>、いくつかのピースからASCIIアート出力を組み立てるために使用します。彼が言うように.e>、要素ごとに最大2つの配列(または文字列)を取ります。スペースの文字コードは最も低いため、これを使用して文字列グリッドに他の文字を配置できます。さらに、2つの配列の長さが同じでない場合、長い配列の無関係な要素はそのままコピーされます。これは、異なるパターンが同じサイズである必要さえないことを意味します。これを2次元配列に適用するには(最後まで改行を挿入したくないため)、.e>行にペアワイズを適用します。..e>

コードの基本的な考え方はN、正しい位置に移動した単一の六角形のコピーを生成することです。空行を追加することで六角形を垂直方向に、スペースを追加することで水平方向に「移動」します。完了したら、美しい:..e>(おそらく私がCJamプログラムで使用した最長の演算子)を使用して、すべてのコピーをまとめます。

コードは次のとおりです。

" __
/  \
\__/"N/    e# Get a 2D character grid of the hexagon.
{          e# Read input N, repeat this block N-1 times.
  _        e#   Make a copy, so we leave the last hexagon on the stack.
  SS/\+    e#   Prepend two empty lines.
  _47>     e#   Make a copy and discard the first 47 lines.
  S3*f{\+} e#   Prepend 3 spaces to each line. This copy has been moved back to
           e#   the top and one column to the right.
  _2>      e#   Make a copy and discard another two lines.
  \@?      e#   If any lines were left after that, pick the copy in the next column,
           e#   otherwise, stay in the same column.
}q~(*      
]:..e>     e# Wrap all the hexagons in an array and fold them into a single grid.
N*         e# Join them with newline characters.

男、私は本当にこれらのゴルフ言語の一つを学ぶべきです。
アレックスヴァンリュー

@AlexVanLiewあなたがすべき!:)しかし、それはコードゴルフで勝つチャンスを改善するためではなく、CJamはプログラミングするのが楽しい美しい言語であり、上記のソリューションが他の言語(私は非常にエレガントだと思います)を知らないためです理にかなっていたでしょう。;)
マーティンエンダー

私はおそらくPythまたはその両方を習得するでしょう。彼らは両方ともほぼ同じものですか、それとも他のものよりも優れていますか?
アレックスヴァンリュー

@AlexVanLiew Pythのことはあまり知りませんが、同じものとは程遠いことは知っています。CJamはスタックベースの言語であり、PythはPythonの短縮形として生まれました(ただし、独自の組み込みセットがあります)。ゴルフに関しては、Pythが少し優勢かもしれませんが、個人的には異なるパラダイムでプログラミングを楽しんでいるので、CJamに固執します。
マーティンエンダー

あ、なるほど。私はPythonをよく知っているので、Pythを学びたいのですが、時間があれば、CJamも試してみようと思います!
アレックスヴァンリュー

7

Python 2、219 207文字

b=bytearray(' ');h=['__ ','/  \\','\\__/'];k=range;x=input();g=[b*50for _ in k(50)]
for i in k(x):
 c=i*3%48+1;r=(i*3+1)/48*2+i%2
 for m in k(i>15,3):n=m==0;g[r+m][c+n:c+4-n]=h[m]
print"\n".join(map(str,g))

標準入力を入力します。

50x50のスペースのグリッドを作成し、必要に応じて六角形を配置します。16六角形後、私は、最初の行必要がないh私は使用に(2次元配列として六角形)i>151の代わりに0の時範囲を開始するc=i*3%48+1;r=(i*3+1)/48*2+i%2計算のC olumn及びR Iはで開始する必要がOWを。nはブール値ですが、境界を修正するために整数として使用されます(h[0]ものを上書きしないように3文字しかないため)。

私はこれにかなり満足していa[x:y]=bます。特に構文を覚えているときは、初期バージョンから約50バイト削りました。

出力(n = 30):

  __    __    __    __    __    __    __    __
 /  \__/  \__/  \__/  \__/  \__/  \__/  \__/  \__
 \__/  \__/  \__/  \__/  \__/  \__/  \__/  \__/  \
 /  \__/  \__/  \__/  \__/  \__/  \__/  \__/  \__/
 \__/  \__/  \__/  \__/  \__/  \__/  \__/  \
    \__/  \__/  \__/  \__/  \__/  \__/  \__/
(plus 44 lines of spaces each 50 wide)

空白の末尾の行が許可されているため、の作成を変更しました g必要な行の正確な数である12バイトを削除するbytearrayの代わりに50を作成し3+(x>1)+x/16*2ます。


6

Swift 2.0、 601の 591バイト

import Cocoa
var a=Int(Process.arguments[1])!,b="/  \\__".join([String](count:9,repeatedValue:""))+"/",c="\\__/  ".join([String](count:9,repeatedValue:""))+"\\",d=c.startIndex,e=c.endIndex,j=[c.stringByReplacingOccurencesOfString("\\",withString:" ").stringByReplacingOccurencesOfString("/",withString:" ").substringToIndex(advance(d,3*a,e)),b.substringToIndex(advance(d,3*a+a%2,advance(e,-1)))]
while a>0{j+=[c.substringToIndex(advance(d,3*a+1,e)),b.substringToIndex(advance(d,3*a+(a+1)%2,e)]
a<=16 ?j+=[" "+j.removeLast().substringFromIndex(advance(d,1))]:()
a-=16}
for l in j{print(l)}

走る: swift hexagons.swift 21

出力:

 __    __    __    __    __    __    __    __    
/  \__/  \__/  \__/  \__/  \__/  \__/  \__/  \__
\__/  \__/  \__/  \__/  \__/  \__/  \__/  \__/  \
/  \__/  \__/  \__/  \__/  \__/  \__/  \__/  \__/
\__/  \__/  \__/
   \__/  \__/  

スウィフトsubstringToIndexstringByReplacingOccurencesOfString非常に多くのキャラクターを取ります...


私はSwiftをまったく知りませんが、より少ないコードでその繰り返し文字列を構築する方法はありませんか?
レトコラディ

私が知っている唯一の方法は、文字列を繰り返すことですがstringByPaddingToLength、この場合、文字列全体を入力するよりも11文字長くなります。
デビッド・スクランズ

6
Appleは本当に過度に冗長な文字列連結を好むようです。stringByAppendingStringObjective-C ほど悪くはないが、それでも…
15

コードゴルフ以外では、メソッドの検索が非常に簡単になるため、これは非常に便利です。
JustSid

4

C、238バイト

#define h(A) c[m+A/4][n+A%4]
i,m,n;
f(a)
{
    char c[50][51];
    for(i=0;i<50;i++)for(m=0;m<51;m++)c[i][m]=m-50?32:0;
    for(;a;)
        m=a/12*2,n=a%12*3,a--%2?m=a/12*2+1,n=a%12*3+3:0,
        h(1)=h(2)=h(9)=h(10)=95,h(4)=h(11)=47,h(7)=h(8)=92;
    for(;i;)puts(c-i--+50);
}

文字数に考慮される必要なスペースと改行のみ。

文字のマトリックスを作成し、それらを逆の順序で埋めてから、全体を印刷します。


2

JavaScript(ES6)、265バイト

A=Array;f='forEach';U=x=1;y=0;a=A.from(A(51),_=>A.from(A(51),_=>' '));d=h=>(` __
/  \\
\\__/`.split`
`[f]((l,i)=>[...l][f]((c,j)=>{if('_/\\'.indexOf(a[x+i][y+j])<0)a[x+i][y+j]=c})),(x+=U*-2+1),(U=!U),(C-y<=3?((U=x+=2),y=0):y+=3),--h?d(h):a.map(d=>d.join``).join`
`)

行の終わりに達するまで、六角形を左から右に、ハニカムのように上下に交互にテッセレーションします。

説明のないゴルフ(Firefoxで動作):

'use strict';
const CAP = 51;
var a = Array.from(Array(51), () => Array.from(Array(51),() => ' '))

function draw (hexagons, x, y, a, up) {
  // x, y (row, col) represents the current position of the cursor
  /*
  
    Here's a map of the first three iterations:
    
            01234567
     0        __
     1     __/  \__
     2    /  \__/  \
     3    \__/  \__/

    For the first 17 iterations, the cursor will be at:
    
      # | x | y
      ----------
      1 | 1 | 0
      2 | 0 | 3
      3 | 1 | 6
      4 | 0 | 9
      5 | 1 | 12
      6 | 0 | 15
      7 | 1 | 18
      8 | 0 | 21
      9 | 1 | 24
     10 | 0 | 27
     11 | 1 | 30
     12 | 0 | 33
     13 | 1 | 36
     14 | 0 | 39
     15 | 1 | 42
     16 | 0 | 45
     17 | 3 | 0      <- moves back to the first row

  */
` __
/  \\
\\__/`
  // split the hexagon into three lines
  .split('\n').forEach((line, index) => {
    // and for each line
    ;[...line].forEach((char, j) => {
      // if the cursor position (x, y) translated
      // by (index, j) is not already part of a hexagon
      // then replace it with the current (index, j) piece
      // of the hexagon
      /*
         0123
       0  __
       1 /  \
       2 \__/
       
      */
      if ('_/\\'.indexOf(a[x + index][y + j]) < 0)
        a[x + index][y + j] = char
    })
  })
  
  // `up` represents the next hexagon
  // if true, the next hexagon will be drawn attached to
  // the top right edge of the current hexagon
  if (up) {
    x -= 1
  // otherwise, it'll be drawn attached to the bottom right edge
  } else {
    x += 1
  }

  // move three columns to the right
  y += 3
  // change directions
  up = !up

  // if within the right boundary of the 51x51 matrix,
  // move back to the left edge and down 2 rows
  // and draw the next hexagon as an `up` hexagon
  if (51 - y <= 3) {
    y = 0
    x += 2
    up = true
  }

  // if hexagons > 0, then recurse and draw the next hexagon
  // otherwise, return the array (join the columns in each row, then join each row
  // by a new line)
  return --hexagons ?
    draw(hexagons, x, y, a, up)
    : a.map(d => d.join('')).join('\n')
}

var n = parseInt(prompt('Number to draw:'))
var r = draw(n, 1, 0, a, true)
document.write('<pre>' + r.replace(/\n/g, '<br>') + '</pre>')


2

ルビー、120

->n{a=(1..50).map{' '*50}
n.times{|i|x=i%16*3
3.times{|j|a[47-i/16*2-x/3+j][x..x+3]=[' __ ','/  \\','\__/'][j]}}
puts a}

50個のスペースから成る50個の文字列の配列を作成し、3行で4文字を置換して六角形を追加します。

" __ "
"/  \"
"\__/"

最初の行にはスペースが含まれているため、一度六角形をプロットすると、その下に別の六角形をプロットできません。スペースが前の六角形を上書きするためです。

したがって、六角形は16x16の菱形(ゆがんだ長方形)の形で下から上に追加され、左下から右上に傾斜しています。

" __ "その後、文字列は追加で上書きされ\/ neccessary。

テストプログラムでゴルフをしていない

g=->n{
  a=(1..50).map{' '*50}              #make an array of 50 strings of 50 spaces
  n.times{|i|                        #loop through all hexagons
    x=i%16*3                         #x coordinate of top left corner of hexagon, 16 per row
    3.times{|j|                      #loop through 3 lines to print hexagon.
      a[47-i/16*2-x/3+j][x..x+3]=    #47-i/16*2 : start at the bottom and work up. each row is 2 lines high and contains 16 hexagons. x/3 : slant upwards as the row moves right. 
       [' __ ','/  \\','\__/'][j]    #These are the symbols for each of the 3 lines required for a hexagon. [x..x+3] defines which characters have to be replaced in each string.
    }      
  }
  puts a                             #print to stdout
}

N=gets.to_i
g.call(N) 

典型的な出力(n = 250)

ここには、さらに50行になるように、さらにいくつかの空白行がありますが、Stackexchangeでそれらを含めるようにフォーマットする方法があるかどうかはわかりません。

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