ใส่รหัสในกล่อง


17

กล่อง ASCII มีลักษณะดังนี้:

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

นี่คือตัวอย่างบางส่วนของกล่อง ASCII เดียวกันที่ฝังอยู่:

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

นี่คือลิงค์ไปยังกล่องกรณีทดสอบทั้งหมดในรูปแบบที่ง่ายต่อการคัดลอก คำสั่งคืออินพุตทั้งหมดตามด้วยเอาต์พุตทั้งหมดในลำดับเดียวกัน

เป้าหมายของคุณคือการใช้กล่อง ASCII เป็นอินพุตและส่งคืนกล่องที่ถูกฝัง กฎของการระเบิดคือ:

  1. "+" ไม่เปลี่ยนแปลง ไม่ทำ "-" หรือ "|" ติดกับ "+" โดยตรง
  2. เริ่มจากมุม "-" และ "|" ย้ายเข้าด้านในโดยหนึ่งช่องว่างมากกว่าตัวละครเดียวกันที่อยู่ใกล้มุม หาก "-" และ "|" จะย้ายไปที่จุดเดิมไม่เคลื่อนที่
  3. หาก "-" และ "-" ย้ายไปยังจุดเดียวกันให้ใส่ "=" ในจุดนั้น ถ้าเป็น "|" และ "|" ย้ายไปที่จุดเดียวกันใส่ "ในจุดนั้นสิ่งเหล่านี้นับเป็นตัวละครสองตัวของพวกเขาในจุดเดียวกันที่เคลื่อนที่ไปในทิศทางตรงกันข้าม
  4. สอง "-" หรือสอง "|" สามารถเลื่อนผ่านซึ่งกันและกันได้ตามที่เห็นในตัวอย่างด้านล่างซ้าย
  5. หากกล่องมีขนาดเล็กพอก็จะเริ่มขยายออกไปในลักษณะเดียวกันโดยจะขยับออกห่างจากด้านที่มันเริ่มเป็นส่วนหนึ่งเสมอ
  6. ผลลัพธ์ควรมีความสมมาตรข้ามเส้นกลางทั้งในทิศทาง x และ y (ไม่ขึ้นบรรทัดใหม่) ซึ่งรวมถึงช่องว่างดังนั้นผลลัพธ์อาจต้องมีการเว้นวรรคเพื่อตอบสนองความต้องการนั้น

รายละเอียดของกฎ:

  1. นี่คือโค้ดกอล์ฟดังนั้นโปรแกรมที่สั้นที่สุดในหน่วยไบต์ชนะ
  2. ช่องโหว่มาตรฐานใช้
  3. คุณสามารถสมมติว่าแต่ละบรรทัดลงท้ายด้วยอักขระขึ้นบรรทัดใหม่
  4. อักขระเฉพาะในสตริงอินพุตจะเป็น "+", "-", "|", "" และ "\ n" (ขึ้นบรรทัดใหม่) และสตริงเอาต์พุตของคุณควรเป็นไปตามกฎเดียวกันโดยเพิ่ม "=" และ "เป็นอักขระที่เป็นไปได้
  5. คุณอาจเลือกที่จะขึ้นบรรทัดใหม่หนึ่งบรรทัดท้ายบรรทัดสุดท้าย
  6. กล่อง ASCII ที่เล็กที่สุดที่คุณต้องจัดการเป็นตัวอย่างด้านบนซ้าย กล่อง ASCII ทุกกล่องจะมีขนาด 4 "+" ทุกประการตรงมุม
  7. คุณจะต้องจัดการกล่องขนาดm x nสำหรับจำนวนเต็มใด ๆm,nเช่นนั้น2<=m,n<256(ขนาดสตริงที่ใหญ่ที่สุดที่เป็นไปได้ของ255*(255+1))
  8. คุณสามารถสมมติว่าคุณจะได้รับกล่อง ASCII ที่ถูกต้องเสมอเป็นอินพุต

ฉันคิดว่าคุณลืมที่จะเพิ่ม "ตัวละครที่เป็นไปได้ในการส่งออกในตัวเลข 4 ของรายละเอียดกฎแก้ไข: เราสามารถสันนิษฐานว่าการป้อนข้อมูลไม่มีบรรทัดว่างหรือไม่
Theraot

ตัวอย่าง 1x6 นั้นขี้ขลาดทำไมมันถึงระเบิดออกด้านนอก ฉันคิดว่าหนึ่ง||ในนั้นต้องเป็น"อะไรซักอย่าง ...
Magic Octopus Urn

@carusocomputing เดียวกันเป็นตัวอย่างด้านล่างซ้ายผนังย้ายผ่านแต่ละอื่น ๆ (ดังนั้นปริมาณกล่องเป็นลบ) - กฎ 4 และ 5
Lyth

@Lyth ไม่ควรที่จะมี"อะไรอีกไหม? ฉันเดาว่าสิ่ง"เดียวที่ปรากฏบนหน้าจอกว้างกว่าหรือมากกว่า?
Magic Octopus Urn

@carusocomputing พิจารณาสิ่งนี้: จะ"ไปที่ไหน? ด้านซ้ายหรือด้านขวา มันไม่สามารถเป็นได้ทั้งคู่ แต่ไม่สามารถเป็นได้ทั้งคู่เพราะผลลัพธ์นั้นสมมาตร
HyperNeutrino

คำตอบ:


15

Python 2 , 591 555 545 527 525 496 436 351 334 333 303 ไบต์

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)

ลองออนไลน์!

แก้ไข : วิธีเก่าของฉันก่อน imploded ด้านบนและด้านล่างจากนั้นทางซ้ายและขวา แต่เราสามารถใส่ส่วนบนหมุน 90 องศาและทำ 4 ครั้งแทน นอกจากนี้ฉันใช้รหัสที่เป็นมิตรกับผู้ใช้สิ่งนี้ต้องการอินพุตอยู่ในรูปแบบ[['+', '-', '-', '-', '-', '-', '+'], ['|', ' ', ' ', ' ', ' ', ' ', '|'], ['|', ' ', ' ', ' ', ' ', ' ', '|'], ['|', ' ', ' ', ' ', ' ', ' ', '|'], ['+', '-', '-', '-', '-', '-', '+']]ที่น่าเกลียด แต่สั้นกว่าสำหรับโปรแกรม: P (ขอบคุณ Phoenix ที่จับได้)

มอบเครดิตให้แก่ Leaky Nun สำหรับรหัสส่วนหัวในลิงก์ TIO ที่ใช้สำหรับการแปลงอินพุตที่มนุษย์อ่านได้ให้เป็นอินพุตที่คอมพิวเตอร์อ่านได้

-85 ไบต์ขอบคุณ Leaky Nun!
-17 ไบต์โดยเปลี่ยนจากการฝังตัวด้านบนเป็นซ้ายระเบิดซึ่งทำให้แถวทั้งหมดจะถูกเก็บไว้ในตัวแปรและแก้ไข ขอบคุณ Leaky Nun สำหรับคำแนะนำ!
-1 ไบต์โดยสลับไปมาเพื่อลบพื้นที่
-30 ไบต์ขอบคุณ Leaky Nun!


กำหนดs[0]และS[0]ให้ตัวแปรบันทึกสองสามไบต์
caird coinheringaahing

@Ilikemydog โอ้ถูกต้อง ขอบคุณ!
HyperNeutrino

คุณสามารถแทนที่p=s[0]และP=S[0]ด้วยp=z(s[0])และP=z(S[0])ตามลำดับจากนั้นแทนที่เหตุการณ์ทั้งหมดz(p)ด้วยpและทั้งหมดz(P)ด้วยPเพื่อบันทึก 18 ไบต์
R. Kap

คุณสามารถแทนที่(z(s)-1)/2-pด้วยz(s)/2-.5-pและ(p-1)/2-z(s)ด้วยp/2-.5-z(s)เพื่อบันทึกอีก 2 ไบต์
R. Kap

@ R.Kap โอ้โอเค ขอบคุณสำหรับคำแนะนำทั้งสอง!
HyperNeutrino

1

C (เสียงดังกราว) 693 ไบต์

มีการเพิ่มบรรทัดใหม่เพื่อให้สามารถอ่านได้ ต้องใช้สองคนแรก แต่ส่วนที่เหลือไม่ใช่

#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++);
}

ขอบคุณสำหรับความท้าทายที่ยิ่งใหญ่! มันค่อนข้างยุ่งยาก แต่ฉันก็ยังสนุกมาก

สิ่งนี้ใช้อินพุตเป็นอาร์กิวเมนต์บรรทัดรับคำสั่งและเอาต์พุตไปยัง STDOUT สตริงแบบหลายบรรทัดของกล่อง imploded และเช่นเคยเคล็ดลับการเล่นกอล์ฟได้รับการชื่นชมอย่างมาก

ลองออนไลน์!

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.