Головоломка ASCII


27

Це 3x3головоломка ASCII:

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

Це також 3x3головоломка ASCII:

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

Кожен рядок головоломки 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).
  • Ви можете мати повну програму або функцію.
  • Вхід буде двома рядками з Hпершого та Wдругого, якщо ви використовуєте функцію, ви можете мати їх у параметрах.
  • Вихід до stdout (або щось подібне).
  • Це кодовий гольф, тому найкоротша відповідь у виграші байтів.

Потрібно, щоб вкладки шматочків були в змінних напрямках?
Згарб

Чи повинен я виводити випадковим чином чи можу кожен раз виводити лише одну загадку? Якщо випадково всі головоломки повинні бути однаково доступними?
user48538

@ Zgarb так, я редагував у базовій схемі кожен рядок головоломки наступним чином
Bobas_Pett

@ zyabin101 вам просто потрібно вивести можливий "головоломки ASCII", тому лише 1 вихід на 1 вхід
Bobas_Pett

1
Перша спроба виглядає так, ніби вона закінчиться приблизно на мегабайт. Приємне запитання.
ElPedro

Відповіді:


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>


Дуже хороша! Golfed версія дає мені неприємності, хоча: NX2 не працює (наприклад , 3x2 дає невизначеному | | ( ) | _ | | (_ _) | | _____ | _____ | _____ | і уявлення непарних результатів висоти в верхньому правому куті Не вистачає його верхньої межі. Схоже, щось загубилося в гольф-шафі Редагувати: помилка "непарної висоти" є результатом як коду для гольфу, так і не для гольфу
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='|_ _| (_) ')Це зберігає 4 коми, тому ви закінчите всього 273 символи. EDIT: Тестовий фрагмент все ще помиляється ...
Лука

@ L.Serné помилився, як? Ви не можете помістити t=...всередину для, це не вдається для h == 2. Це саме помилка, яку я сьогодні виправив.
edc65

1
np, я розігрувався з вашим кодом, і причиною undefinedвиявилося оголошення aв останній частині forциклу. Я трохи змінив код і закінчив це. Ви повинні мати можливість інтегрувати це з eval для іншого збереження 2B. (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 Б).
Лука

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 байт, поставивши всю річ на 1 рядок, розділений крапками з комою
Синій

@Blue Спасибі, товариш, минув час з мого останнього гольфу, і я забув деякі хитрощі.
проходити

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

Доведено стійкість до гольфу, оскільки повторення, як правило, коштувало занадто багато байтів, щоб усунути, наприклад, я вручну передаю рядок номер 3, оскільки це занадто дорого для обчислення. Редагувати: Крім того, у мене траплялися випадково гольові додаткові |кожні третій рядок, що невірно. Виправлення цього фактично врятувало мене 2 байти (4 байти в моїй оригінальній версії). Пояснення: aмістить різні біти лобзика. Ці :tфункції свопи їх над кожним набором з трьох рядків, а потім отримують необхідні підрядка , які :cфункція потім повторює в парах, але видалення першого стовпчика , якщо wнепарне. Лівий і правий край справа обробляються перед виведенням рядка. Інший крайній випадок - це перший рядок, у якому! замість s замінено пробіли|s (код уникає |s, оскільки вони складні для обробки в Batch).


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 координатами області, яку ми хочемо вивести, і відображення цих x , y значень у , v координат у малюнку головоломки (зберігається в перших трьох рядках ігрового поля). Таке відображення досягається за допомогою наступних основних формул:

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

Таким чином, якщо ми знаходимось на ребрі, ми додаємо 4 до координати v , щоб використовувати більш простий шаблон ребра на рядках 5 - 7. І нам також тепер потрібно модифікувати координату u на 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>

Це порт моєї відповіді Batch, просто щоб побачити, чи конкурує він з відповіддю @ edc65. Дратівливо довга струна містить фрагменти головоломки. Перші шість штук являють собою два ряди одного стовпчика внутрішньої частини лобзика. Сьомий шматок використовується для передостанньої лінії лобзика, замість четвертої частини. Восьмий шматок використовується на другій лінії лобзика, замість п’ятої частини, а також виконує подвійне виконання, як лівий край лобзика. Дев'ятий фрагмент - останній рядок лобзика.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.