ASCII 직소 퍼즐


27

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

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

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

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

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

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

2의 정수를 부여 H하고 W여기서 H높이 (세로 양)이며, W폭 (수평 양)과은 H과 W있는 >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.