ASCII bilmecenin


27

Bu bir 3x3ASCII bilmecenin:

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

Bu aynı zamanda bir 3x3ASCII bilmecesidir:

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

Bir ASCII bilmecenin içindeki her satır (kenar kasaları, yani kenarlardaki parçaları hariç) aşağıdaki düzenden oluşur:

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

2 tamsayıları verilen Hve Wburada Hyüksekliği (dikey miktar) ve Wgenişliği (yatay miktarda) ve bir Hve Wvardır >1çıkış olası HxWbir ASCII yapboz.

Örnekler

Test Durumu 1

Giriş: 2, 4

Çıktı:

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

Test Durumu 2

Giriş: 4, 4

Çıktı:

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

Test Durumu 3

Giriş: 3, 5

Çıktı:

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

Test Durumu 4

Giriş: 2, 2

Çıktı:

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

Açıklamalar

  • Her yapboz parçasının yüksekliği ve genişliği yukarı veya aşağı ölçeklenmemelidir.
  • İle Hve Wbir daha büyük olması avantajlıdır, mümkün olan en küçük boyut vardır 2x2(IO 4).
  • Tam bir program veya işlev olabilir.
  • Bir fonksiyon kullanıyorsanız giriş H1 ve 2'de 2 satır olacaktır W. Bunları parametrelerde bulabilirsiniz.
  • Stdout'a çıktı (veya benzer bir şey).
  • Bu kod golf, bayt cinsinden kazanılan cevapların çok kısa olması.

Parçaların tırnakları farklı yönlerde olmalı mı?
Zgarb

Rastgele çıktı mı vermeliyim yoksa her seferinde sadece bir bulmaca çıktırabilir miyim? Rastgele ise, tüm bulmacalar aynı şekilde mevcut olmalıdır?
user48538

@ Zgarb evet, yapbozun takip ettiği her satırdaki temel düzende düzenleme
yaptım

@ zyabin101, olası bir "ASCII bilmecenin" çıktısını almanız gerekiyor, bu yüzden 1 giriş için yalnızca 1 çıkış
Bobas_Pett 11

1
İlk girişim, bir megabaytlık bir son bulacak gibi görünüyor. Güzel soru.
ElPedro,

Yanıtlar:


6

JavaScript (ES6) 272 277 271

Hata düzeltmesini düzenle

Düzenle 2 kaydedilen 6 bayt thx @ L.Serné

3 hata düzeltmesini tekrar düzenle

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

Daha az golf oynadı

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

Ölçek

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>


Çok hoş! Bununla birlikte, golf oyunu benim için sorun yaratıyor: Nx2 çalışmıyor (örn. 3x2 undefined verir | | ( ) | _ | | ((_ _) | | _____ | _____ | _____ | parça üst sınırını kaybediyor Golf sahasında bir şey kaybolmuş gibi gözüküyor Düzenleme: "tek yükseklik" hatası hem golflü hem de golfsüz koddan kaynaklanıyor
Bence Joful

@BenceJoful Son golf oynadıktan sonra test yeterli değil. Şimdi düzeltildi
edc65

Son argüman (t) 'yi ve dördüncü argüman (a)' yı for döngüsüne taşıyabilirsin (ve b ve c 'nin ilanını şu şekilde bildiririz: - for(t=z(' _____',0,0)+z('|_ _| ',2,--h)+z(b=' _) (_ _ ')+z(c='|_ _|_( )_',0);--h;a='|_ _| (_) ')Bu, 4 virgül kaydeder. sadece 273 karakter EDIT: Test snippet'i hala engellenmiş durumda ...
Luke

@ L.Serné nasıl bozuldu? Bunun t=...içine koyamazsınız , h == 2 için başarısız olur. Bu tam olarak bugün tamir ettiğim hatadır.
edc65

1
np, kodunuzla oynadım ve undefinedsonucun döngünün ason bölümünde bildirilmesinin sebebi ortaya çıktı for. Kodu biraz değiştirdim ve bununla bitirdim. Bunu başka bir 2B tasarruf için eval ile bütünleştirebilmelisiniz. (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).
Luke,

5

Python, 513 bayt

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

Belki de şaşkınlık içinde golf oynamaktan ziyade bir egzersiz yapmak, bu, (x,y)her bir desenin dizge ile oluşturulmasından ziyade, her koordinatın hangi karaktere gideceğine karar vererek çalışır . Ungolfed benziyor

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

Desenler kendileri gibi görünüyor

Bunu, mod 6 ve satır mod 3 alan sütunlara sahip tamsayılardan oluşan bir arama tablosu olarak görebiliriz.

 012345
0     |
1
2_   _|

 0123
0_
1_
2
3  _
4  _
5

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

Farklı kalıpları bir araya getirme stratejisi burada benim için pek işe yaramadı çünkü bunları ifade etmek oldukça zahmetli (sanırım daha fazla golf oynayabileceğimi düşünüyorum) ve kenar davaları düzeltmek için çok fazla karakter alıyor. Bunu ne olursa olsun koyuyorum çünkü beni bir dakika sürdü ve ilgi çekici olabilir.


1
Her şeyi noktalı virgüllerle ayırarak 1 satıra yerleştirerek 7 bayttan tasarruf edebilirsiniz
Blue

@Mavi Teşekkürler dostum, son golf oyunumdan bu yana bir süre geçti ve bazı püf noktaları unuttum.
Walpen

2

Mathematica, 384 bayt

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

Adsız işlev, argüman olarak sipariş edilen bir tam sayı çifti alarak ve uygun yeni satırlar içeren bir dize döndürür. Boşluk ve yeni satır eklenmiş olarak:

(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

Toplu iş, 562 528 bayt

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

Golf oynamaya karşı dayanıklı olduğu kanıtlandı; tekrarlama ortadan kaldırmak için çok fazla bayta mal oldu, örneğin, hesaplamak için çok pahalı olduğu için mod 3 satır numarasını elle geçtim. Düzenleme: Ayrıca, yanlışlıkla |her üçüncü satırda yanlışlıkla fazladan golf oynadım . Bunu düzeltmek aslında 2 baytı kurtardı (orijinal sürümümde 4 bayt). Açıklama: açeşitli yapboz parçaları içerir. :tÜç sıranın her set üzerinde işlev takas bunları, daha sonra gereken alt dizeleri özler :cişlevi daha sonra çift olarak tekrarlanır, ancak ilk sütunu silme ise wgarip. Sol ve sağ kenar kasaları daha sonra satır çıkmadan önce ele alınır. Diğer kenar durumu, !s'nin boşluk yerine boşluk olarak değiştirildiği ilk satırdır .|s (kod |s'yi engeller çünkü Batch'te işlem yapmaları çok zordur).


2

Befunge, 263 243 bayt

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

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

Çevrimiçi deneyin!

Bunun işleyişi, çıktı almak istediğimiz alanın x, y koordinatlarını yinelemek ve bu x , y değerlerini u , v koordinatlarına bulmaca deseninde eşleştirmek (oyun alanının ilk üç satırında saklanmaktır). Bu haritalama, aşağıdaki temel formüllerle gerçekleştirilir:

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

U koordine 6 her 3 satır telafi edilmesi gerekmektedir, aynı zamanda, her 12 sütun tekrarlanır, ancak. V , her 3 sıra tekrarlar koordinat ama eklemek y==0ilk satır özel bir durum olarak da ifade edilebilir, böylece değer. Bununla birlikte, kenarlar işlemek için, ek bir Boole değeri, tanıtmak gerekir e çeşitli kenar konumları için de geçerlidir, ve aşağıdaki gibi formüller ayarlayan:

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

Bu nedenle, bir kenardaysak, 5 - 7 arasındaki daha basit kenar modelini kullanmak için v koordinatına 4 ekleriz. Ayrıca, şimdi de bu kenar düzeninden bu yana u koordinatını 12 yerine 6'ya göre ayarlamamız gerekir. her 6 sütunu tekrarlar.

E değerine gelince , bu oldukça karmaşık bir formül gerektirir, çünkü kenar konumları bulmaca sınırının biraz düzensiz bir alanını içerir.

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

Çok fazla ayrıntıya girmeden, temel dağılım, elr'in sol ve sağ sınırlar boyunca kenar konumlarıyla eşleşirken , etb ise üst ve alt sınır boyunca konumlarla eşleşir.


1

JavaScript (ES6), 285 bayt

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>

Bu benim Batch cevabımın bir limanı, @ edc65'in cevabıyla rekabet edip etmediğini görmek için. Can sıkıcı derecede uzun dize, yapboz parçaları içerir. İlk altı parça, yapbozun iç kısmındaki bir sütunun iki sırasını temsil eder. Yedinci parça, dördüncü parçanın yerine, yapbozun sondan geçen hattı için kullanılır. Sekizinci parça, yapbozun ikinci çizgisinde, beşinci parçanın yerine kullanılır ve aynı zamanda yapbozun sol kenarı olarak çift görev yapar. Dokuzuncu parça yapbozun son satırıdır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.