Câu đố ghép hình ASCII


27

Đây là một 3x3trò chơi ghép hình ASCII:

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

Đây cũng là một 3x3trò chơi ghép hình ASCII:

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

Mỗi dòng trong trò chơi ghép hình ASCII (không bao gồm các trường hợp cạnh tức là các mảnh theo nghĩa đen trên các cạnh) bao gồm các mẫu sau:

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

Với 2 số nguyên HWnơi Hlà chiều cao (số tiền dọc) và Wlà chiều rộng (số tiền ngang) và HW>1đầu ra một thể HxWASCII ghép hình câu đố.

Ví dụ

Trường hợp kiểm tra 1

Đầu vào: 2, 4

Đầu ra:

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

Trường hợp thử nghiệm 2

Đầu vào: 4, 4

Đầu ra:

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

Trường hợp thử nghiệm 3

Đầu vào: 3, 5

Đầu ra:

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

Trường hợp thử nghiệm 4

Đầu vào: 2, 2

Đầu ra:

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

Làm rõ

  • Chiều cao và chiều rộng cho mỗi mảnh ghép không nên được thu nhỏ lên hoặc xuống.
  • Với HWlớn hơn một, kích thước nhỏ nhất có thể là 2x2(xem IO 4).
  • Bạn có thể có một chương trình đầy đủ hoặc một chức năng.
  • Đầu vào sẽ là 2 dòng với Htrên 1 và Wtrên 2 nếu bạn đang sử dụng một chức năng, bạn có thể có chúng trong các tham số.
  • Đầu ra cho thiết bị xuất chuẩn (hoặc một cái gì đó tương tự).
  • Đây là mã golf để câu trả lời ngắn nhất trong byte thắng.

Các tab của các mảnh phải theo hướng xen kẽ?
Zgarb

Tôi có nên xuất ngẫu nhiên hay tôi chỉ có thể xuất ra một câu đố mỗi lần? Nếu ngẫu nhiên, tất cả các câu đố nên có sẵn thống nhất?
dùng48538

@Zgarb vâng, tôi đã chỉnh sửa theo mẫu cơ bản từng dòng trong trò chơi ghép hình sau
Bobas_Pett

@ zyabin101 bạn chỉ cần xuất một "trò chơi ghép hình ASCII" có thể để chỉ có 1 đầu ra cho 1 đầu vào
Bobas_Pett

1
Nỗ lực đầu tiên trông giống như nó sẽ kết thúc ở mức khoảng một megabyte. Câu hỏi hay.
ElPedro

Câu trả lời:


6

JavaScript (ES6) 272 277 271

Chỉnh sửa sửa lỗi

Chỉnh sửa 2 lưu 6 byte thx @ L.Serné

Chỉnh sửa 3 sửa lỗi một lần nữa

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

Ít chơi gôn

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

Kiểm tra

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>


Rất đẹp! Phiên bản chơi gôn đang gây rắc rối cho tôi, mặc dù: Nx2 không hoạt động (ví dụ: 3x2 mang lại kết quả không xác định | | ( ) | _ | | (_ _) | | __ | _ | | mảnh thiếu biên giới hàng đầu của nó trông giống như một cái gì đó đã bị mất trong sân-lation Edit: các "height lẻ" Kết quả lỗi từ cả hai mã golfed và phi golfed...
Bence Joful

@BenceJoful Không đủ bài kiểm tra sau lần đánh gôn cuối cùng. Hiện đã được sửa
edc65

Bạn có thể di chuyển khai báo của đối số cuối (t) và đối số thứ tư (a) sang vòng lặp for (và di chuyển khai báo của b và c bên trong khai báo của t như thế này : for(t=z(' _____',0,0)+z('|_ _| ',2,--h)+z(b=' _) (_ _ ')+z(c='|_ _|_( )_',0);--h;a='|_ _| (_) '). Điều này giúp tiết kiệm 4 dấu phẩy, vì vậy bạn kết thúc bằng Chỉ có 273 ký tự. EDIT: Đoạn kiểm tra vẫn còn lỗi ...
Luke

@ L.Serné mắc lỗi thế nào? Bạn không thể đặt t=...bên trong for, nó thất bại trong h == 2. Đó chính xác là lỗi tôi đã sửa hôm nay.
edc65

1
np, tôi đã chơi xung quanh với mã của bạn và nguyên nhân của việc undefinedhóa ra là khai báo atrong phần cuối của forvòng lặp. Tôi đã thay đổi mã một chút, và kết thúc với điều này. Bạn sẽ có thể tích hợp điều đó với eval để tiết kiệm 2B khác. (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).
Lu-ca

5

Python, 513 byte

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

Có lẽ nhiều bài tập trong obfuscation hơn là chơi golf, bài này hoạt động bằng cách quyết định nhân vật mà mỗi (x,y)tọa độ đi đến thay vì xây dựng từng mẫu theo chuỗi. Trông giống như

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

Các mẫu trông giống như

chúng ta có thể thấy đây là bảng tra cứu từ các số nguyên với các cột được lấy mod 6 và hàng mod 3

 012345
0     |
1
2_   _|

 0123
0_
1_
2
3  _
4  _
5

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

Chiến lược kết hợp các mô hình khác nhau này không thực sự hiệu quả đối với tôi ở đây vì việc thể hiện chúng khá cồng kềnh (mặc dù tôi nghĩ rằng tôi có thể chơi gôn nhiều hơn) và vì các trường hợp biên phải mất quá nhiều nhân vật để khắc phục. Tôi đang đặt vấn đề này lên bất kể vì tôi mất một phút và nó có thể được quan tâm.


1
Bạn có thể lưu 7 byte bằng cách đặt toàn bộ thứ trên 1 dòng cách nhau bằng dấu chấm phẩy
Blue

@Blue Cảm ơn bạn, đã một thời gian kể từ lần chơi golf cuối cùng của tôi và tôi đã quên một số thủ thuật.
walpen

2

Toán học, 384 byte

(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"<>"|")&

Hàm không tên lấy một cặp số nguyên có thứ tự làm đối số của nó và trả về một chuỗi chứa các dòng mới phù hợp. Với không gian và dòng mới được thêm vào:

(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

Hàng loạt, 562 528 byte

@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:!=^|%

Chứng tỏ khả năng chống lại việc chơi golf, vì sự lặp lại có xu hướng tốn quá nhiều byte để loại bỏ, ví dụ, tôi chuyển thủ công ở dòng số 3 vì nó quá đắt để tính toán. Chỉnh sửa: Hơn nữa, tôi đã vô tình đánh gôn thêm |mỗi dòng thứ ba, điều này không chính xác. Việc sửa lỗi này thực sự giúp tôi tiết kiệm được 2 byte (4 byte trên phiên bản gốc của tôi). Giải thích: achứa các bit khác nhau của ghép hình. Các :tgiao dịch hoán đổi chức năng cho họ trên mỗi bộ ba hàng, sau đó trích xuất các chuỗi con cần mà :cchức năng sau đó lặp đi lặp lại theo cặp, nhưng xóa cột đầu tiên nếu wlà số lẻ. Các trường hợp cạnh trái và phải sau đó được xử lý trước khi hàng được xuất. Trường hợp cạnh khác là hàng đầu tiên trong đó !s được thay đổi thành khoảng trắng thay vì|s (mã tránh |s vì chúng khó xử lý trong Batch).


2

Befunge, 263 243 byte

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

|
|
|_____
 _____
>&: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\`\

Hãy thử trực tuyến!

Cách thức hoạt động này là bằng cách lặp qua các tọa độ x, y của khu vực chúng ta muốn xuất và ánh xạ các giá trị x , y đó sang tọa độ u , v trong mẫu câu đố (được lưu trữ trên ba dòng đầu tiên của sân chơi). Ánh xạ này đạt được với các công thức cơ bản sau:

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

Các u phối hợp lặp đi lặp lại mỗi 12 cột, nhưng cũng cần phải được bù đắp bằng 6 mỗi 3 dòng. Các v phối hợp lặp đi lặp lại mỗi 3 hàng, nhưng chúng ta thêm y==0giá trị vì thế hàng đầu tiên có thể được trả lại như một trường hợp đặc biệt. Tuy nhiên, để xử lý các cạnh, chúng ta cần phải giới thiệu thêm boolean giá trị, e , đó là đúng đối với các địa điểm cạnh khác nhau, và có thể điều chỉnh các công thức như sau:

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

Do đó, nếu chúng ta ở cạnh, chúng ta thêm 4 vào tọa độ v để sử dụng mẫu cạnh đơn giản hơn trên các dòng 5 đến 7. Và bây giờ chúng ta cũng cần sửa đổi tọa độ u bằng 6 thay vì 12, vì mẫu cạnh này lặp lại cứ sau 6 cột.

Đối với chính giá trị e , đòi hỏi một công thức khá phức tạp, vì các vị trí cạnh bao gồm một khu vực hơi bất thường của đường viền câu đố.

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

Không đi sâu vào chi tiết, sự cố cơ bản là elr khớp với các vị trí cạnh dọc theo biên trái và phải, trong khi etb khớp với các vị trí dọc theo viền trên và dưới.


1

JavaScript (ES6), 285 byte

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>

Đây là một cổng của câu trả lời Batch của tôi, chỉ để xem liệu nó có cạnh tranh với câu trả lời của @ edc65 không. Chuỗi dài khó chịu chứa các mảnh ghép hình. Sáu mảnh đầu tiên đại diện cho hai hàng của một cột của nội thất của trò chơi ghép hình. Mảnh thứ bảy được sử dụng cho dòng áp chót của trò chơi ghép hình, thay cho mảnh thứ tư. Mảnh thứ tám được sử dụng trên dòng thứ hai của hình ghép, thay cho mảnh thứ năm, và cũng thực hiện nhiệm vụ kép như cạnh trái của hình ghép. Mảnh thứ chín là dòng cuối cùng của trò chơi ghép hình.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.