ASCII 직소 퍼즐


27

이것은 3x3ASCII 직소 퍼즐입니다.

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

이것은 또한 3x3ASCII 직소 퍼즐입니다.

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

ASCII 직소 퍼즐의 각 줄 (가장자리를 제외하고 가장자리 부분은 제외)은 다음과 같은 패턴으로 구성됩니다.

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

2의 정수를 부여 H하고 W여기서 H높이 (세로 양)이며, W폭 (수평 양)과은 HW있는 >1출력 가능한 HxWASCII 소 퍼즐.

테스트 사례 1

입력: 2, 4

산출:

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

테스트 사례 2

입력: 4, 4

산출:

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

테스트 사례 3

입력: 3, 5

산출:

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

테스트 사례 4

입력: 2, 2

산출:

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

설명

  • 각 퍼즐 조각의 높이와 너비는 확대 또는 축소하지 않아야합니다.
  • H하고 W보다 더되고, 가능한 가장 작은 치수가된다 2x2(IO 4 참조).
  • 당신은 전체 프로그램이나 기능을 가질 수 있습니다.
  • 입력은 H1과 2에 2 줄 W이됩니다. 기능을 사용하는 경우 매개 변수에 입력 할 수 있습니다.
  • stdout (또는 비슷한 것)으로 출력하십시오.
  • 이것은 코드 골프이므로 바이트 단위의 최단 답변이 승리합니다.

조각의 탭이 번갈아 가야합니까?
Zgarb

무작위로 출력해야합니까? 아니면 매번 퍼즐 하나만 출력 할 수 있습니까? 무작위로 모든 퍼즐을 균일하게 사용할 수 있어야합니까?
user48538

@ Zgarb 예, 직소 퍼즐의 각 줄이 다음과 같은 기본 패턴으로 편집했습니다
Bobas_Pett

@ zyabin101 당신은 단지 가능한 "ASCII 직소 퍼즐"을 출력하기 때문에 1 입력에 대해 1 개의 출력 만
Bobas_Pett

1
첫 번째 시도는 약 메가 바이트로 끝나는 것처럼 보입니다. 좋은 질문.
ElPedro

답변:


6

자바 스크립트 (ES6) 272 277 271

버그 수정 편집

@ L.Serné에 저장된 2 바이트 6 바이트 편집

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는 undefined | | ( ) | _ | | (_ _) | | _____ | _____ | _____ | 조각의 상단 테두리가 누락 됨 골프 관련에서 잃어버린 것 같습니다 편집 : "홀수 높이"버그는 골프 코드와 골프가 아닌 코드 모두에서 발생합니다
Bence Joful

@BenceJoful 마지막 골프 후 테스트가 충분하지 않습니다. 수정 됨
edc65

마지막 인수 (t)와 네 번째 인수 (a)의 선언을 for 루프로 옮길 수 있습니다 (그리고 b와 c의 선언을 다음과 같이 t의 선언 내부로 옮길 수 있습니다 :) for(t=z(' _____',0,0)+z('|_ _| ',2,--h)+z(b=' _) (_ _ ')+z(c='|_ _|_( )_',0);--h;a='|_ _| (_) '). 편집 : 테스트 스 니펫은 여전히 ​​버그가 있습니다 ...
Luke

@ L.Serné는 어떻게 버그를 범했습니까? t=...for 안에 넣을 수 없으며 h == 2에 실패합니다. 오늘 내가 고친 버그입니다.
edc65

1
np, 나는 당신의 코드를 가지고 놀았으며 , 루프 의 마지막 부분에서 undefined밝혀진 원인이 밝혀졌습니다 . 코드를 약간 변경하고 이것으로 끝났습니다. 다른 2B 저장을 위해이를 평가와 통합 할 수 있어야합니다. (276B). afor(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)}
Luke

5

파이썬, 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
세미콜론으로 구분 된 한 줄에 전체 내용을 넣으면 7 바이트를 절약 할 수 있습니다.
Blue

@Blue Thanks mate, 지난 골프 이후 오랜 시간이 지났고 몇 가지 트릭을 잊었습니다.
walpen

2

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

예를 들어 계산에 너무 비싸서 수동으로 줄 번호 mod 3을 전달하는 등 반복 작업에 너무 많은 바이트가 소비되는 경향이 있기 때문에 골프에 대한 저항력이 입증되었습니다. 편집 : 또한 |세 번째 줄마다 실수로 여분 의 골프를 쳤습니다 . 이 문제를 해결하면 실제로 2 바이트 (원래 버전에서는 4 바이트)가 절약되었습니다. 설명 : a다양한 조각의 퍼즐이 들어 있습니다. 이 :t함수는 이들을 세 행의 각 세트로 바꾸고 필요한 하위 문자열을 추출하여 :c함수가 쌍으로 반복되지만 w홀수 인 경우 첫 번째 열을 삭제합니다 . 그런 다음 행이 출력되기 전에 왼쪽 및 오른쪽 모서리 케이스가 처리됩니다. 다른 모서리의 경우는 !s가 공백 대신 공백으로 변경 되는 첫 번째 행 입니다.|s (코드는 |배치에서 다루기가 까다로워서 s를 피합니다 ).


2

비 펀지, 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 좌표를 반복 하고 퍼즐 패턴의 x , y 값을 u , v 좌표로 매핑하는 것 입니다 (플레이 필드의 처음 세 줄에 저장 됨). 이 매핑은 다음과 같은 기본 공식으로 이루어집니다.

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

좌표 6 매 3 행만큼 오프셋 할 필요도 모든 12 개 컬럼을 반복하지만. 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 좌표를 12가 아닌 6만큼 수정해야합니다. 6 열마다 반복합니다.

로서는 전자 에지 위치 퍼즐 테두리 다소 불규칙한 영역을 포함하기 때문에, 상당히 복잡한 식을 요구 값 자체.

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

자바 스크립트 (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 개 조각은 퍼즐 내부의 한 열의 두 행을 나타냅니다. 일곱 번째 조각은 네 번째 조각 대신 퍼즐의 두 번째 줄에 사용됩니다. 여덟 번째 조각은 다섯 번째 조각 대신 퍼즐의 두 번째 줄에 사용되며 퍼즐의 왼쪽 가장자리로도 이중 역할을 수행합니다. 아홉 번째 조각은 퍼즐의 마지막 줄입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.