ASCIIジグソーパズル


27

これは3x3ASCIIジグソーパズルです。

 _____ _____ _____
|    _|     |_    |
|   (_   _   _)   |
|_   _|_( )_|_   _|
| (_) |_   _| (_) |
|  _   _) (_   _  |
|_( )_|_   _|_( )_|
|    _| (_) |_    |
|   (_       _)   |
|_____|_____|_____|

これも3x3ASCIIジグソーパズルです。

 _____ _____ _____
|     |_   _|     |
|  _   _) (_   _  |
|_( )_|_   _|_( )_|
|    _| (_) |_    |
|   (_   _   _)   |
|_   _|_( )_|_   _|
| (_) |_   _| (_) |
|      _) (_      |
|_____|_____|_____|

ASCIIジグソーパズルの各行(エッジケース、つまり文字通りエッジにあるピースを除く)は、次のパターンで構成されています。

   _           _           _
 _( )_ _   _ _( )_ _   _ _( )_
|_   _| (_) |_   _| (_) |_   _|
 _) (_   _   _) (_   _   _) (_
|_   _|_( )_|_   _|_( )_|_   _| ...
  (_)         (_)         (_)

2つの整数が与えられHWwhere Hは高さ(垂直方向の量)およびWwidth(水平方向の量)であり、Hあり、可能なASCIIジグソーパズルW>1出力されますHxW

テストケース1

入力: 2, 4

出力:

 _____ _____ _____ _____
|     |_   _|     |_    |
|  _   _) (_   _   _)   |
|_( )_|_   _|_( )_|_   _|
|    _| (_) |_   _| (_) |
|   (_       _) (_      |
|_____|_____|_____|_____|

テストケース2

入力: 4, 4

出力:

 _____ _____ _____ _____
|     |_   _|     |_    |
|  _   _) (_   _   _)   |
|_( )_|_   _|_( )_|_   _|
|    _| (_) |_   _| (_) |
|   (_   _   _) (_   _  |
|_   _|_( )_|_   _|_( )_|
| (_) |_   _| (_) |_    |
|  _   _) (_   _   _)   |
|_( )_|_   _|_( )_|_   _|
|    _| (_) |_   _| (_) |
|   (_       _) (_      |
|_____|_____|_____|_____|

テストケース3

入力: 3, 5

出力:

 _____ _____ _____ _____ _____
|     |_   _|     |_   _|     |
|  _   _) (_   _   _) (_   _  |
|_( )_|_   _|_( )_|_   _|_( )_|
|    _| (_) |_   _| (_) |_    |
|   (_   _   _) (_   _   _)   |
|_   _|_( )_|_   _|_( )_|_   _|
| (_) |_   _| (_) |_   _| (_) |
|      _) (_       _) (_      |
|_____|_____|_____|_____|_____|

テストケース4

入力: 2, 2

出力:

 _____ _____
|    _|     |
|   (_   _  |
|_   _|_( )_|
| (_) |_    |
|      _)   |
|_____|_____|

明確化

  • 各パズルのピースの高さと幅は拡大または縮小しないでください。
  • Hし、W1よりも大きいこと、可能な最小寸法は2x2(IO 4を参照します)。
  • 完全なプログラムまたは機能を使用できます。
  • 入力は1行目で2行にHなり、W、あなたはパラメータでそれらを持つことができる機能を使用している場合は2日。
  • stdout(または同様のもの)への出力。
  • これはコードゴルフなので、バイト単位の最短回答が勝ちです。

ピースのタブは交互の方向にある必要がありますか?
ズガルブ16

ランダムに出力する必要がありますか、それとも毎回1つだけのパズルを出力できますか?ランダムな場合、すべてのパズルを均一に使用できるようにする必要がありますか?
user48538 16

はい@Zgarb、私はジグソーパズルの各行は、次の基本パターンで編集
Bobas_Pett

@ zyabin101あなただけの可能な「ASCIIジグソーパズル」を出力する必要があるので、1入力に対して1出力のみ
Bobas_Pett

1
最初の試みは、最終的に約1メガバイトになると思われます。いい質問です。
エルペドロ16

回答:


6

JavaScriptの(ES6)272 277 271

バグ修正を編集

編集2で保存された6バイトthx @L.Serné

再度3つのバグ修正を編集する

(w,h,z=(s,q=3,i=h)=>'|  '.slice(0,q)+s.repeat(w).substr(i%2*6+q,w*6-q-~-q)+`  |
`.slice(~q))=>eval("t=z(' _____',0,0)+z('|_   _|     ',2,--h)+z(b=' _) (_   _  ')+z(c='|_   _|_( )_',0);for(a='|_   _| (_) ';--h;)t+=z(a,2)+z(b)+z(c,0)")+z(a,2)+z(' _) (_      ')+z('|_____',1)

少ないゴルフ

(w,h,
  z=(s,q=3,i=h)=>'|  '.slice(0,q)+s.repeat(w).substr(i%2*6+q,w*6-q-~-q)+'  |\n'.slice(~q),
  a='|_   _| (_) ',
  b=' _) (_   _  ',
  c='|_   _|_( )_',
  t=z(' _____',0,0)+z('|_   _|     ',2,--h)+z(b)+z(c,0)
)=>{
  for(;--h;)
    t+=z(a,2)+z(b)+z(c,0);
  return t+z(a,2)+z(' _) (_      ')+z('|_____',1)
}

テスト

F=
(w,h,z=(s,q=3,i=h)=>'|  '.slice(0,q)+s.repeat(w).substr(i%2*6+q,w*6-q-~-q)+`  |
`.slice(~q))=>eval("t=z(' _____',0,0)+z('|_   _|     ',2,--h)+z(b=' _) (_   _  ')+z(c='|_   _|_( )_',0);for(a='|_   _| (_) ';--h;)t+=z(a,2)+z(b)+z(c,0)")+z(a,2)+z(' _) (_      ')+z('|_____',1)

function update() {
  var w=+W.value,h=+H.value
  O.textContent=F(w,h)
}

update()
W<input id=W value=2 oninput='update()' type=number min=2>
H<input id=H value=2 oninput='update()' type=number min=2>
<pre id=O></pre>


非常に素晴らしい!しかし、ゴルフバージョンでは問題が発生します:Nx2が機能しません(たとえば、3x2は未定義を生成します| |()| _ | |(_ _)| | _____ | _____ | _____ |、奇数の高さを送信すると右上になります。上部の境界線が欠けている部分。ゴルフ関係で何かが失われたように見える編集:「奇数の高さ」バグは、ゴルフとゴルフ以外の両方のコードに起因する
Bence Joful

@BenceJoful最後のゴルフの後の十分なテストではありません。今固定
edc65

最後の引数(t)と4番目の引数(a)の宣言をforループに移動することができます(そして、bとcの宣言をtの宣言内に次のように移動しますfor(t=z(' _____',0,0)+z('|_ _| ',2,--h)+z(b=' _) (_ _ ')+z(c='|_ _|_( )_',0);--h;a='|_ _| (_) ')。これにより、4つのコンマが節約されます。のみ273文字EDIT:テストスニペットはまだ盗聴されています...。
ルーク

@L.Sernéがどのようにバグを起こしましたか?t=...forの中に入れることはできません。h== 2の場合は失敗します。それはまさに私が今日修正したバグです。
edc65 16

1
np、あなたのコードをいじってみたところ、ループの最後の部分でundefined宣言aされていることが判明しましたfor。コードを少し変更して、これで終わりました。それを別の2Bセーブ用のevalと統合できるはずです。(w,h,z=(s,q=3,i=h)=>'| '.slice(0,q)+s.repeat(w).substr(i%2*6+q,w*6-2*q+1)+' |\n'.slice(~q),a='|_ _| (_) ')=>{for(t=z(' _____',0,0)+z('|_ _| ',2,--h)+z(b=' _) (_ _ ')+z(c='|_ _|_( )_',0);--h;)t+=z(a,2)+z(b)+z(c,0);return t+z(a,2)+z(' _) (_ ')+z('|_____',1)}(276 B)。
ルーク

5

Python、513バイト

def r(m,n):
 r=3*m
 c=6*n
 l=3-(n%2)*3
 z=[1,2,3,4,5,0]
 p=zip
 return"\n".join("".join(" |_()"[[[((j%6,i%3)in[(1,0),(5,0)])*2or((j%6,i%3)in[(0,1),(0,0)])or((j%4,i%6)in[(1,1),(1,2),(3,4),(3,5)])*2or((i%6,j%12)in p(z,[10,2,10,4,8,4]))*4or((i%6,j%12)in p(z,[8,4,8,2,10,2]))*3,1,0][j in[0,c]or((j,i%6)in p([1,1,2,2],[1,2]*2)+p([c-1,c-1,c-2,c-2],[1+l,2+l]*2)or(i,j%12)in[(1,8),(1,9),(1,10),(2,8),(2,9),(2,10),(r-1,9)]or(i,j%12)==(r-1,3+6*(m%2)))*2],2*(j%6>0)or i>0][i in[0,r]]]for j in range(c+1))for i in range(r+1))

おそらく、ゴルフよりも難読化のエクササイズの方が多く、これは(x,y)各パターンを文字列で構築するのではなく、各座標がどのキャラクターに行くかを決定することで機能します。それは次のように見えます

char_codes = " |_()"
def base(row, col):
    if col % 6 in [5] and row % 3 in [0, 2]:
        return 1
    if col % 6 in [0, 4] and row % 3 in [2]:
        return 2
    return 0

def underscores(row, col):
    if col % 4 in [0] and row % 6 in [0, 1] or col % 4 in [2] and row % 6 in [3, 4]:
        return 2
    return 0

def parentheses(row, col):
    if (row % 6, col % 12) in [(0, 9), (1, 1), (2, 9), (3, 3), (4, 7), (5, 3)]:
        return 4
    if (row % 6, col % 12) in [(0, 7), (1, 3), (2, 7), (3, 1), (4, 9), (5, 1)]:
        return 3
    return 0

def value(row, col):
    return base(row, col) + underscores(row, col) + parentheses(row, col)

def new_value(last_row, last_col, row, column):
    if row in [0, last_row]:
        return 2*(column % 6 > 0) or row>0
    if column in [0, last_col]:
        return 1
    if column in [1,2] and row % 6 in [1, 2]:
        return 0
    if column in [last_col - 1, last_col - 2] and row % 6 in [[4,5],[1,2]][last_col%12>0]:
        return 0
    if row in [1, 2] and column % 12 in [8,9,10]:
        return 0
    if row == last_row - 1 and column % 12 == 9:
        return 0
    return value(row - 1, column - 1)

def puzzle(rows, cols):
    last_row = rows * 3
    last_col = cols * 6
    return "\n".join("".join(new_value(last_row, last_col, row, col) for col in range(last_col + 1)) for row in range(last_row + 1))

パターン自体は次のようになります

これは、カラムがmod 6、ローがmod 3である整数からのルックアップテーブルとして見ることができます。

 012345
0     |
1
2_   _|

 0123
0_
1_
2
3  _
4  _
5

 0123456789AB
0       ( )
1 ) (
2       ( )
3 ( )
4       ) (
5 ( )

異なるパターンを組み合わせるこの戦略は、ここで実際にうまくいきませんでした。なぜなら、それらを表現することは非常に面倒なので(もっとゴルフをすることができたと思いますが)、エッジケースは修正するために非常に多くのキャラクターを占有するためです。少し時間がかかったので興味があるかもしれないので、私は関係なくこれを付けています。


1
あなたはセミコロンで区切って1行に全体の事を置くことによって7つのバイトを保存することができます
ブルー

@Blue Thanks Mate、前回のゴルフからしばらく経ち、いくつかのトリックを忘れました。
walpen 16

2

Mathematica、384バイト

(m=#~Mod~2&;a=#~Array~Y&;s=(h="   _  ")[o="|_( )_",z="|_   _",w=" _) (_",z,p="| (_) "];l="|  _  "[o,"|    _",u="|   (_",z,p];r=h[o,q="|_    ",t=" _)   ",z,p];{X,Y}=#;a[" _____"&]<>" \n"<>Join[{a[If[#<Y,z,q]["|     "][[m@#]]&]},Table[Which[y<2,l,y<Y,s,0<1,r][[Mod[x+3y,6]]],{x,3,3X-1},{y,1,Y}],{a[If[#<2,"|     "[u],"      "[If[#<Y,w,t]]][[m[X+#]]]&],a["|_____"&]}]~Riffle~"|\n"<>"|")&

引数として順序付けられた整数のペアを取り、適切な改行を含む文字列を返す名前のない関数。スペースと改行が追加されました:

(m = Mod[#1, 2] &; a = Array[#1, Y] &; 
 s = (h = "   _  ")[o = "|_( )_", z = "|_   _", w = " _) (_", z, p = "| (_) "];
 l = "|  _  "[o, "|    _", u = "|   (_", z, p]; 
 r = h[o, q = "|_    ", t = " _)   ", z, p];
 {X, Y} = #1; 
 a[" _____" &] <> " \n" <>
 Riffle[
   Join[
     {a[If[#1 < Y, z, q]["|     "][[m[#1]]] &]}, 
     Table[
       Which[y < 2, l, y < Y, s, 0 < 1, r][[Mod[x + 3 y, 6]]],
       {x, 3, 3 X - 1}, {y, 1, Y}
     ],
     {a[If[#1 < 2, "|     "[u], "      "[If[#1 < Y, w, t]]][[m[X + #1]]] &],
     a["|_____" &]}
   ], "|\n"
 ] <> "|") &

2

バッチ、562 528バイト

@echo off
set t=!  !
set w=%2
set a= _) (_!_   _! (_) !        _  !_( )_!_   _ _) (_
call:d "!     !_   _" 2 " _____ _____" 4
for /l %%j in (2,1,%1)do call:t
call:d "!_____!_____" 1 "%a:~18,6%%a:~-6%" 3
exit/b
:t
set a=%a:~24%%a:~0,24%
call:d "%a:~6,6%%a:~30,6%" 1 "%a:~0,6%%a:~24,6%" 3
call:c "%a:~12,6%%a:~36,6%" 2
exit/b
:d
call:c %3 %4
:c
set s=
for /l %%i in (%w%,-2,1)do call set s=%~1%%s%%&if %%i==1 call set s=%%s:~6%%
if %2 lss 4 set s=%s%!&call set s=%%t:~0,%2%%%%s:~%2,-%2%%%%t:~-%2%%
echo %s:!=^|%

繰り返しは除去するのに多すぎるバイトを費やす傾向があったため、ゴルフに耐性があることが証明されました。編集:さらに、私は誤っ|て3行ごとに余分なsをゴルフしていました。これを修正すると、実際に2バイト節約されました(元のバージョンでは4バイト)。説明:aジグソーパズルのさまざまなビットが含まれています。この:t関数は、3行の各セットでそれらを交換し、必要な部分文字列を抽出:cしてペアで繰り返しますwが、奇数の場合は最初の列を削除します。次に、行が出力される前に、左と右のエッジケースが処理されます。もう一方のエッジケースは、s(コードが回避する最初の行です)! sが代わりにスペースに変更されるです。||sバッチで処理するのが難しいため)。


2

Befunge、263 243バイト

|_   _| (_)
 _) (_   _
|_   _|_( )_

|
|
|_____
 _____
>&:08p3*28p&:18p6*38pv
@#!`g82:,_v0+55+1p84:<_
\g82+g84<| `g83:+1,g\%*6-g852+*6/3+2g84\++%3+2\!:g84*4p85:!!+*`0%6\!*`
6/08g+2%^>>::::48g3/2%2*`\48g3/18g+2%!2*+38g\`*!48g3%0`*\::6/2%!48g\`\

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

これが機能する方法は、出力する領域のx、y座標を反復処理し、それらのxy値をパズルパターン(プレイフィールドの最初の3行に格納)のuv座標にマッピングすることです。このマッピングは、次の基本式で実現されます。

u = (x+(y+2)/3*6) % 12
v = (y+2)%3 + (y==0)

Uは反復ごとに12列座標だけでなく、6つの毎に3行によって相殺される必要があります。Vは、反復ごとに3行の座標が、我々は、追加y==0の非常に最初の行は、特殊なケースとしてレンダリングできるように値。ただし、エッジを処理するには、追加のブール値eを導入する必要があります。これは、さまざまなエッジの位置に当てはまり、次のように式を調整します。

u = (x+(y+2)/3*6) % (e?6:12)
v = (y+2)%3 + (y==0) + e*4

したがって、エッジにいる場合、5から7行目でより単純なエッジパターンを使用するために、v座標に4を追加します。また、uをmodする必要もあります。、このエッジパターン以来、6ではなく12で座標6列ごとに繰り返します。

e値自体については、エッジの位置がパズルの境界のやや不規則な領域を含むため、かなり複雑な式が必要です。

elr = (x <= 2*y/3%2 or x >= w-2*!(y/3+cols)%2) and (y%3 > 0)
etb = (y <= !(x/6%2) or y >= h-(x/6+rows)%2) and (x%6 > 0)
e   = elr or etb

あまり詳細に入るがなければ、基本的な内訳は、あるELRはしばらく、左と右の境界線に沿ってエッジ位置と一致したETB上部と下部の境界線に沿って一致の場所。


1

JavaScript(ES6)、285バイト

f=
(h,w,a=` _) (_|_   _| (_)    _  |_( )_|_   _      |     |_____`.match(/.{6}/g),g=(l,r,j)=>a[7].slice(0,j)+(a[l]+a[r]).repeat(w).slice(j,w*6+1-j)+`  |`.slice(-j))=>[` _____`.repeat(w),g(1,7,2),...[...Array(--h*3)].map((_,i)=>g(i%6,(i+3)%6,"312"[i%3])),g(h=h%2*6,6-h,3),g(8,8,1)].join`
`
<div oninput=o.textContent=+h.value&&+w.value?f(h.value,w.value):''><input id=h type=number min=1><input id=w type=number min=1><pre id=o>

これは、@ edc65の回答と競合するかどうかを確認するための、バッチ回答の移植版です。迷惑なほど長い文字列には、ジグソーパズルのピースが含まれています。最初の6つの部分は、ジグソーパズルの内部の1列の2行を表します。7番目のピースは、4番目のピースの代わりに、ジグソーパズルの最後から2番目の行に使用されます。8番目のピースは、5番目のピースの代わりにジグソーパズルの2行目に使用され、ジグソーパズルの左端としても機能します。9番目のピースは、ジグソーパズルの最後の行です。

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