Kutuyu yerleştir


17

ASCII kutuları şöyle görünür:

++    +---+    +------+    +---+    +---+
++    |   |    |      |    |   |    |   |
      |   |    |      |    |   |    |   |
+-+   |   |    |      |    |   |    |   |
+-+   |   |    |      |    |   |    +---+
      +---+    |      |    |   |
+--+           |      |    |   |    ++
|  |           |      |    |   |    ||
|  |           +------+    |   |    ||
+--+                       |   |    ||
                           +---+    ||
                                    ||
                  +-----+           ||
+------------+    |     |           ++
|            |    |     |
|            |    |     |
+------------+    +-----+

Aşağıda aynı ASCII kutularının bazı örnekleri verilmiştir:

++    +- -+    +-    -+    +- -+    +- -+
++    | - |    | -  - |    | - |    | - |
       | |      | -- |      | |      | |
+-+    | |       |  |        "      | - |
+-+   | - |       ||        | |     +- -+
      +- -+      |  |      |   |
+--+            | -- |      | |     ++
|  |           | -  - |      "      ||
|  |           +-    -+     | |     ||
+--+                       | - |   |  |
                           +- -+   |  |
      --                            ||
     -  -         +-   -+           ||
+-  -    -  -+    | - - |           ++
| --      -- |     | = |
| --      -- |    | - - |
+-  -    -  -+    +-   -+
     -  -
      --

İşte tüm bu test kutusu kutularının kopyalanması kolay bir biçimde bir bağlantısı. Tüm girişler ve ardından tüm çıkışlar aynı sıradadır.

Amacınız bir ASCII kutusunu giriş olarak almak ve yerleştirilen kutuyu geri döndürmektir. Patlama kuralları:

  1. "+" asla değişmez; "-" veya "|" doğrudan "+"
  2. Köşelerden başlayarak, "-" ve "|" köşeye yakın aynı karakterden bir boşluk daha içeriye hareket ettirdi. Bir "-" ve "|" hiçbir zaman aynı noktaya hareket edemez, ikisi de hareket etmez.
  3. "-" ve "-" aynı noktaya hareket ederse, o noktaya "=" koyun. "|" ve "|" aynı noktaya taşıyın, o noktaya bir "koyun. Bunlar, aynı noktada zıt yönlerde hareket ederek ilgili karakterlerinden ikisi olarak sayılır.
  4. İki "-" veya iki "|" sol alt örnekte görüldüğü gibi birbirini geçebilir.
  5. Kutu yeterince sıska ise, aynı şekilde dışarı doğru genişlemeye başlar ve her zaman başladığı taraftan uzaklaşır.
  6. Sonuç, merkez çizgisi boyunca hem x hem de y yönlerinde simetrik olmalıdır (satırsonlarını yoksayarak); buna boşluklar da dahildir, dolayısıyla sonucun bunu karşılamak için boşluklarla doldurulması gerekebilir.

Kural Ayrıntıları:

  1. Bu kod golf, bayt en kısa program kazanır.
  2. Standart boşluklar geçerlidir.
  3. Her satırın bir satırsonu karakterinde biteceğini varsayabilirsiniz.
  4. Giriş dizesindeki tek karakterler "+", "-", "|", "" ve "\ n" (satırsonu) olacaktır ve çıkış dizeniz "=" eklenerek aynı kurallara uymalıdır. ve "olabildiğince karakter.
  5. İsteğe bağlı olarak, son satırın sonunda tek bir son satırınız olabilir.
  6. Ele almanız gereken en küçük ASCII kutusu sol üstteki örnektir. Her ASCII kutusunun köşeleri tam olarak 4 "+" olacak.
  7. m x nHerhangi bir tamsayı için boyut kutularını ele almanız gerekecektir (mümkün m,nolan 2<=m,n<256en büyük dize boyutu 255*(255+1))
  8. Giriş olarak her zaman tek bir geçerli ASCII kutusu alacağınızı varsayabilirsiniz.

.? Sana Kural Ayrıntıları Edit rakamı on 4 çıktıda mümkün karakteri olarak "eklemeyi unuttuğu düşünüyorum: Biz girdi hiç boş hatlara sahip varsayalım Can
Theraot

Bu 1x6 örneği korkak, neden dışa doğru patlıyor? Sanırım ||bu örnekteki kişilerden biri "ya da bir şey olmalı ...
Sihirli Ahtapot Urn

@ carusocomputing sol alt örnekle aynı, duvarlar birbirinden hareket (böylece kutu hacmi negatif) - kural 4 ve 5.
Lyth

@ Yine de bir şey olmamalı "mı? Sanırım "sadece 3 geniş ya da daha büyük görünür?
Sihirli Ahtapot Urn

@carusocomputing Bunu düşünün: Nereye "giderdim? Sol tarafta mı yoksa sağ tarafta mı? Her ikisi de olamaz, ama sonuç da simetrik olduğu için de olamaz.
HyperNeutrino

Yanıtlar:


15

Python 2 , 591 555 545 527 525 496 436 351 334 333 303 bayt

s=input()
w=len(s[0])
h=len(s)
V=max(0,w/2-h)
H=max(0,h/2-w)
p=[[' ']*w]*V
q=[' ']*H
s=[q+k+q for k in p+s+p]
d,c=' -=',' |"'
exec"c,d,V,H,w,h=d,c,H,V,h,w;s=map(list,zip(*s))[::-1]\nfor j in range(h-4):q=s[V+j+2];q[H]=c[q[H]==c[2]];r=H+min(j+1,h-4-j);q[r]=c[1+(q[r]>' ')]\n"*4
for x in s:print''.join(x)

Çevrimiçi deneyin!

EDIT : Benim eski yöntem önce üst ve alt, sonra sol ve sağ yerleştirdi. Bunun yerine, tepeyi yerleştirebilir, 90 derece döndürebilir ve bunu 4 kez yapabiliriz. Ayrıca, kullanıcı dostu kod kullanıyordum, bu giriş [['+', '-', '-', '-', '-', '-', '+'], ['|', ' ', ' ', ' ', ' ', ' ', '|'], ['|', ' ', ' ', ' ', ' ', ' ', '|'], ['|', ' ', ' ', ' ', ' ', ' ', '|'], ['+', '-', '-', '-', '-', '-', '+']]çirkin ama program için daha kısa olan formda olmasını gerektirir : P (Bunu yakalamak için Phoenix'e teşekkürler)

İnsan tarafından okunabilir girişi bilgisayar tarafından okunabilir girişe dönüştürmek için kullanılan TIO bağlantısındaki başlık kodu için Leaky Nun'e verilen krediler.

Leaky Nun sayesinde -85 bayt!
-17 bayt, üst sıradan sol sıraya geçiş yaparak tüm satırın bir değişkene kaydedilmesini ve değiştirilmesini sağlar. Leaky Nun için öneri için teşekkürler!
-1 bayt boşluk kaldırarak şeyleri değiştirerek.
Leaky Nun sayesinde -30 bayt!


Birkaç bayt kaydetmek için s[0]ve S[0]değişkenleri atayın
caird coinheringaahing

@Ilikemydog Oh, doğru. Teşekkürler!
HyperNeutrino

Sen değiştirebilir p=s[0]ve P=S[0]ile p=z(s[0])ve P=z(S[0])sırasıyla, sonra tüm tekrarlamalarını değiştirmek z(p)ile pve tüm z(P)ile Pkaydet 18 bayt.
R. Kap

Ayrıca yerini alabilir (z(s)-1)/2-pile z(s)/2-.5-pve (p-1)/2-z(s)ile p/2-.5-z(s)2 daha bayt kaydedin.
R. Kap

@ R.Kap Oh tamam. Her iki öneri için teşekkürler!
HyperNeutrino

1

C (clang) , 693 bayt

Okunabilirlik için yeni satırlar eklendi. İlk ikisi zorunlu, gerisi değil.

#define P B[i][l]
#define m malloc(8)
I(B,h,V,S,J,Z,i,j,l,n,H,W,c,C,a,z,_,L,G,u,N,M)char**B,**Z;char*L,*G,*u;{
V=strlen(B[0]);
S=J=0;
Z=m;
for(i=0,j=h-1;i<h/2+h%2;i++,j--){
for(l=0,n=V-1;l<V/2+V%2;l++,n--){
if(P!=43&&((B[i][l-1]!=43&&i<1)||(B[i-1][l]!=43&&l<1))){
H=P==45;
W=P=='|';
P=B[j][l]=B[i][n]=B[j][n]=32;
if(H){
c=(N=i+l-1)==(M=j-l+1)?61:45;
if(M<0)L=m,sprintf(L,"%*s",V,""),L[l]=L[n]=c,Z[J]=L,J++;
else B[N][l]=B[N][n]=B[M][l]=B[M][n]=c;
}
if(W){
c=(N=l+i-1)==(M=n-i+1)?34:'|';
if(M<0)G=m,sprintf(G,"|%*s%s%*s|",i-n-2,"",B[i],i-n-2,""),B[i]=B[j]=G,S++;
else B[i][N]=B[j][N]=B[i][M]=B[j][M]=c;
}
}
}
}
for(a=-J+1;a<=h+J;u=a<1?Z[-a]:a<=h?B[a-1]:Z[a-h-1],C=S+1-strlen(u)/2,printf("%*s%s\n",C>0?C:0,"",u),a++);
}

Büyük meydan okuma için teşekkürler! Oldukça zor ama yine de çok eğlendim.

Bu, girdiyi komut satırı bağımsız değişkenleri olarak alır ve yerleştirilen kutunun çok satırlı bir dizesi olan STDOUT'a çıkar. Her zaman olduğu gibi, golf ipuçları çok takdir edilmektedir.

Çevrimiçi deneyin!

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.