ASCII Jigsaw Puzzle

27

Ini adalah 3x3puzzle ASCII:

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

Ini juga 3x3puzzle ASCII:

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

Setiap baris dalam puzzle ASCII (tidak termasuk kasus tepi yaitu potongan-potongan secara harfiah di tepi) terdiri dari pola berikut:

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

Diberikan 2 bilangan bulat Hdan di Wmana Htinggi (jumlah vertikal) dan Wlebar (jumlah horizontal) Hdan Wmerupakan >1output HxWpuzzle ASCII yang mungkin .

Contohnya

Test Case 1

Memasukkan: 2, 4

Keluaran:

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

Test Case 2

Memasukkan: 4, 4

Keluaran:

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

Test Case 3

Memasukkan: 3, 5

Keluaran:

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

Test Case 4

Memasukkan: 2, 2

Keluaran:

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

Klarifikasi

  • Tinggi dan lebar untuk setiap potongan puzzle tidak boleh ditingkatkan atau diturunkan.
  • Dengan Hdan Wlebih besar dari satu, dimensi terkecil yang mungkin adalah 2x2(lihat IO 4).
  • Anda dapat memiliki program atau fungsi lengkap.
  • Input akan terdiri dari 2 baris Hpada tanggal 1 dan W2 jika Anda menggunakan fungsi, Anda dapat memilikinya di parameter.
  • Output ke stdout (atau yang serupa).
  • Ini adalah kode-golf sehingga jawaban terpendek dalam byte menang.
Bobas_Pett
sumber
Haruskah tab potongan berada di arah yang bergantian?
Zgarb
Haruskah saya mengeluarkan secara acak atau dapatkah saya mengeluarkan hanya satu puzzle setiap kali? Jika secara acak, apakah semua puzzle harus tersedia secara seragam?
user48538
@Zgarb ya, saya mengedit dalam pola dasar setiap baris dalam teka-teki jigsaw berikut
Bobas_Pett
@ zyabin101 Anda hanya perlu meng-output "puzzle jigsaw ASCII" yang mungkin jadi hanya 1 output untuk 1 input
Bobas_Pett
1
Upaya pertama terlihat seperti akan berakhir pada sekitar satu megabyte. Pertanyaan yang bagus
ElPedro

Jawaban:

6

JavaScript (ES6) 272 277 271

Edit perbaikan bug

Edit 2 disimpan 6 byte thx @ L.Serné

Edit 3 perbaikan bug lagi

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

Kurang golf

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

Uji

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>

edc65
sumber
Sangat bagus! Versi golf memberi saya masalah, meskipun: Nx2 tidak berfungsi (mis. 3x2 menghasilkan undefined | | ( ) | _ | | (_ _) | | _____ | _____ | _____ | dan mengirimkan hasil ketinggian yang aneh di kanan atas) bagian yang hilang dari batas atasnya. Sepertinya ada sesuatu yang hilang dalam golf-lation. Edit: bug "tinggi aneh" dihasilkan dari kode golf dan non-
golf
@ BenceJoful Tidak cukup tes setelah bermain golf terakhir. Sekarang diperbaiki
edc65
Anda bisa memindahkan deklarasi argumen terakhir (t) dan argumen keempat (a) ke for loop (dan memindahkan deklarasi b dan c di dalam deklarasi t seperti ini:. for(t=z(' _____',0,0)+z('|_ _| ',2,--h)+z(b=' _) (_ _ ')+z(c='|_ _|_( )_',0);--h;a='|_ _| (_) ')Ini menyimpan 4 koma, jadi Anda berakhir dengan hanya 273 karakter. EDIT: Cuplikan tes masih disadap ...
Luke
@ L.Serné disadap bagaimana? Anda tidak dapat memasukkan t=...ke dalam untuk, gagal untuk h == 2. Persis seperti bug yang saya perbaiki hari ini.
edc65
1
np, saya bermain-main dengan kode Anda, dan penyebab undefinedternyata menyatakan adi bagian terakhir dari forloop. Saya mengubah kode sedikit, dan berakhir dengan ini. Anda harus dapat mengintegrasikannya dengan eval untuk penyimpanan 2B lainnya. (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).
Lukas
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))

Mungkin lebih merupakan latihan dalam kebingungan daripada di golf, yang satu ini bekerja dengan menentukan karakter apa yang masing-masing (x,y)koordinat lakukan daripada membangun setiap pola dengan string. Sepertinya tidak digabungkan

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

Pola itu sendiri terlihat seperti

kita bisa melihat ini sebagai tabel pencarian dari bilangan bulat dengan kolom yang diambil mod 6 dan baris mod 3

 012345
0     |
1
2_   _|

 0123
0_
1_
2
3  _
4  _
5

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

Strategi menggabungkan pola-pola yang berbeda ini tidak benar-benar berhasil bagi saya di sini karena mengekspresikannya cukup rumit (walaupun saya pikir saya bisa bermain golf lebih banyak) dan karena kasing tepi mengambil begitu banyak karakter untuk diperbaiki. Saya meletakkan ini terlepas karena butuh saya sebentar dan mungkin menarik.

walpen
sumber
1
Anda dapat menyimpan 7 byte dengan meletakkan semuanya pada 1 baris yang dipisahkan oleh titik koma
Biru
@Blue Terima kasih sobat, sudah lama sejak golf terakhir saya dan saya sudah lupa beberapa trik.
walpen
2

Mathematica, 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"<>"|")&

Fungsi yang tidak disebutkan namanya mengambil sepasang integer yang dipesan sebagai argumennya, dan mengembalikan string yang berisi baris baru yang sesuai. Dengan spasi dan baris baru ditambahkan:

(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"
 ] <> "|") &
Greg Martin
sumber
2

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

Terbukti tahan terhadap golf, karena pengulangan cenderung menghabiskan terlalu banyak byte untuk dihilangkan, misalnya, saya secara manual memasukkan nomor baris mod 3 karena terlalu mahal untuk dihitung. Sunting: Selain itu, saya secara tidak sengaja telah melakukan golf ekstra |di setiap baris ketiga, yang tidak benar. Memperbaiki ini sebenarnya menyelamatkan saya 2 byte (4 byte pada versi asli saya). Penjelasan: aberisi berbagai potongan jigsaw. The :tswap fungsi mereka lebih setiap set tiga baris, maka ekstrak substring yang diperlukan yang :cfungsi kemudian mengulangi berpasangan, tetapi menghapus kolom pertama jika wganjil. Kasing tepi kiri dan kanan kemudian ditangani sebelum baris ditampilkan. Kasing tepi lainnya adalah baris paling pertama di mana huruf !s diubah menjadi spasi|s (kode menghindari |s karena sulit ditangani di Batch).

Neil
sumber
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\`\

Cobalah online!

Cara ini bekerja adalah dengan mengulangi koordinat x, y dari area yang ingin kita hasilkan, dan memetakan nilai x , y ke u , koordinat v dalam pola puzzle (disimpan pada tiga baris pertama dari playfield). Pemetaan ini dicapai dengan rumus dasar berikut:

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

The u berkoordinasi berulang setiap 12 kolom, tetapi juga perlu diimbangi dengan 6 setiap 3 baris. The v berkoordinasi mengulangi setiap 3 baris, tapi kita menambahkan y==0dengan nilai sehingga baris pertama dapat diberikan sebagai kasus khusus. Namun, untuk menangani tepi, kita perlu memperkenalkan nilai boolean tambahan, e , yang berlaku untuk berbagai lokasi tepi, dan yang menyesuaikan rumus sebagai berikut:

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

Jadi jika kita berada di tepi, kita tambahkan 4 ke koordinat v sehingga menggunakan pola tepi yang lebih sederhana pada garis 5 hingga 7. Dan kita juga sekarang perlu mod koordinat u dengan 6 daripada 12, karena pola tepi ini ulangi setiap 6 kolom.

Adapun nilai e itu sendiri, yang membutuhkan formula yang cukup kompleks, karena lokasi tepi mencakup area perbatasan puzzle yang agak tidak beraturan.

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

Tanpa terlalu banyak detail, rincian dasarnya adalah bahwa elr cocok dengan lokasi tepi di sepanjang batas kiri dan kanan, sementara etb cocok dengan lokasi di sepanjang batas atas dan bawah.

James Holderness
sumber
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>

Ini adalah port jawaban Batch saya, hanya untuk melihat apakah ia bersaing dengan jawaban @ edc65. Tali panjang yang mengganggu berisi potongan-potongan jigsaw. Enam keping pertama mewakili dua baris dari satu kolom interior jigsaw. Potongan ketujuh digunakan untuk garis kedua dari belakang jigsaw, di tempat potongan keempat. Sepotong kedelapan digunakan pada baris kedua jigsaw, sebagai pengganti keping kelima, dan juga melakukan tugas ganda sebagai tepi kiri jigsaw. Potongan kesembilan adalah baris terakhir dari jigsaw.

Neil
sumber