자바 7, 927 924 923 바이트
import java.util.*;int l,k;char[][]z;Set p=new HashSet();String c(String[]a){int x=0,y=0,n,t,u,v,w=t=u=v=-1;l=a.length;k=a[0].length();z=new char[l][k];for(String s:a){for(char c:s.toCharArray())z[x][y++]=c;}x++;y=0;}for(x=0;x<l;x++)for(y=0;y<k;y++){n=0;if(z[x][y]>32){if(x<1|(x>0&&z[x-1][y]<33))n++;if(y<1|(y>0&&z[x][y-1]<33))n++;if(x>l-2|(x<l-1&&z[x+1][y]<33))n++;if(y>k-2|(y<k-1&&z[x][y+1]<33))n++;}if(n>2&t<0){t=x;u=y;}if(n>2&t>v){v=x;w=y;}}if(v+w>t+u){p(t,u);return n(""+z[t][u],t,u);}p(v,w);return n(""+z[v][w],v,w);}String n(String r,int x,int y){int a,b;if(x>0&&z[a=x-1][b=y]>32&q(a,b)){p(a,b);return n(r+z[a][b],a,b);}if(y>0&&z[a=x][b=y-1]>32&q(a,b)){p(a,b);return n(r+z[a][b],a,b);}if(x<l-1&&z[a=x+1][b=y]>32&q(a,b)){p(a,b);return n(r+z[a][b],a,b);}if(y<k-1&&z[a=x][b=y+1]>32&q(a,b)){p(a,b);return n(r+z[a][b],a,b);}return r;}boolean q(int x,int y){return!p.contains(x+","+y);}void p(int x,int y){p.add(x+","+y);}
좋아, 잠시했다가 .. 일부 프로그래밍 언어에서 당신의 배열 x와 y는 2 차원 배열의 경계 밖에있는,하지만 자바는 던질거야 경우 문제가되지 않습니다 ArrayIndexOutOfBoundsExceptions
, 그래서 모든 것을 확인해야합니다 ..
먼저 시작점을 결정한 다음 재귀 메서드를 사용하여 문자열을 작성합니다. 또한 목록을 사용하여 이미 발생한 조정을 추적하므로 루프 백 포스 백 포스 (스택 오버 플로우 예외 발생)로 이동하지 않습니다.
이것은 아마도 내가 지금까지 게시 한 가장 긴 대답 일지 모르지만 일부 부분은 골프를 칠 수 있지만 Java에서는이 과제가 그렇게 짧을 수 있다고 생각하지 않습니다. Java는 그리드의 경로를 따르는 데 적합하지 않습니다. 그럼에도 불구하고 이해하기는 재미있는 도전이었습니다. :)
언 골프 및 테스트 사례 :
여기에서 시도하십시오.
import java.util.*;
class M{
static int l,
k;
static char[][] z;
static Set p = new HashSet();
static String c(String[] a){
int x=0,
y=0,
n,
t,
u,
v,
w = t = u = v = -1;
l = a.length;
k = a[0].length();
z = new char[l][k];
for(String s:a){
for(char c:s.toCharArray()){
z[x][y++] = c;
}
x++;
y = 0;
}
for(x=0; x<l; x++){
for(y=0; y<k; y++){
n = 0;
if(z[x][y] > 32){ // [x,y] is not a space
if(x < 1 | (x > 0 && z[x-1][y] < 33)){
n++;
}
if(y < 1 | (y > 0 && z[x][y-1] < 33)){
n++;
}
if(x > l-2 | (x < l-1 && z[x+1][y] < 33)){
n++;
}
if(y > k-2 | (y < k-1 && z[x][y+1] < 33)){
n++;
}
}
if(n > 2 & t < 0){
t = x;
u = y;
}
if(n > 2 & t > v){
v = x;
w = y;
}
}
}
if(v+w > t+u){
p(t, u);
return n(""+z[t][u], t, u);
}
p(v, w);
return n(""+z[v][w], v, w);
}
static String n(String r, int x, int y){
int a,b;
if(x > 0 && z[a=x-1][b=y] > 32 & q(a,b)){
p(a, b);
return n(r+z[a][b], a, b);
}
if(y > 0 && z[a=x][b=y-1] > 32 & q(a,b)){
p(a, b);
return n(r+z[a][b], a, b);
}
if(x < l-1 && z[a=x+1][b=y] > 32 & q(a,b)){
p(a, b);
return n(r+z[a][b], a, b);
}
if(y < k-1 && z[a=x][b=y+1] > 32 & q(a, b)){
p(a, b);
return n(r+z[a][b], a, b);
}
return r;
}
static boolean q(int x, int y){
return !p.contains(x+","+y);
}
static void p(int x, int y){
p.add(x+","+y);
}
public static void main(String[] a){
System.out.println(c(new String[]{ "Hel ",
" l rin",
" o,IAmASt g",
" S",
" !ekan" }));
p = new HashSet();
System.out.println(c(new String[]{ "Python" }));
p = new HashSet();
System.out.println(c(new String[]{ "P ngPu Code ",
"r i z d G",
"o m z n o",
"gram lesA lf" }));
p = new HashSet();
System.out.println(c(new String[]{ " ~ zyx tsr XWVUTSR",
" }|{ wvu q Y Q",
"! p Z `ab P",
"\"#$ 6789:; o [ _ c O",
" % 5 < n \\]^ d N",
"('& 432 = m e M",
") 1 > lkjihgf L",
"*+,-./0 ? K",
" @ABCDEFGHIJ" }));
p = new HashSet();
System.out.println(c(new String[]{ " tSyrep ",
" r p ",
" in Sli ",
" g Sile",
" Snakes n",
"Ser ylt",
"a eh ilS ",
"fe w t ",
" emo h ",
" Sre " }));
}
}
산출:
Hello,IAmAStringSnake!
Python
ProgrammingPuzzlesAndCodeGolf
!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~
SlipperyStringSnakesSilentlySlitherSomewhereSafe